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
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{b as w}from"./chunk-P6GO5KT4.js";import{a as q,c as re,i as Ce,k as D,p as E}from"./chunk-QFMH6ITB.js";import{a as pe,r as fe}from"./chunk-CUV65BIQ.js";import{a as Pe}from"./chunk-SYC6D5XU.js";import{a as ke,d as oe}from"./chunk-5THX4DI2.js";import{c as te}from"./chunk-7SZRL6FY.js";var f=te(ke(),1);var y=te(ke(),1);var a=te(oe(),1),Oe=["transcript_received","chat_received","participant_joined","participant_left","magic_share_started","magic_share_ended"],me=8e3,xe=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,Be="\u6301\u7EED\u6574\u7406\u4F1A\u8BAE\u7EAA\u8981\uFF0C\u91CD\u70B9\u8BB0\u5F55\u5DF2\u786E\u8BA4\u7684\u51B3\u7B56\u3001\u5F85\u529E\u4E8B\u9879\uFF08\u542B\u8D1F\u8D23\u4EBA\u548C\u622A\u6B62\u65F6\u95F4\uFF09\u4EE5\u53CA\u672A\u89E3\u51B3\u98CE\u9669\uFF1B\u5B57\u5E55\u4FEE\u8BA2\u65F6\u66F4\u65B0\u5DF2\u6709\u6761\u76EE\uFF0C\u4E0D\u91CD\u590D\u8BB0\u5F55\u540C\u4E00\u4E8B\u9879\u3002\u4EC5\u5728\u51FA\u73B0\u65B0\u7684\u5173\u952E\u51B3\u7B56\u3001\u660E\u786E\u5F85\u529E\u6216\u98CE\u9669\uFF0C\u6216\u88AB\u7528\u6237\u70B9\u540D\u65F6\uFF0C\u624D\u5728\u76D1\u542C\u7FA4\u8F93\u51FA\u7B80\u6D01\u589E\u91CF\uFF1B\u65E0\u5B9E\u8D28\u589E\u91CF\u65F6\u4FDD\u6301\u9759\u9ED8\uFF0C\u4E0D\u53D1\u9001\u786E\u8BA4\u6216\u5FC3\u8DF3\u3002\u9700\u8981\u5411\u4F1A\u8BAE\u5185\u53D1\u9001\u6587\u5B57\u6216\u8BED\u97F3\u65F6\uFF0C\u5FC5\u987B\u901A\u8FC7 botmux \u53D7\u7BA1 request-output/action gate \u63D0\u4EA4\uFF0C\u4E0D\u5F97\u7ED5\u8FC7\u6743\u9650\u3001\u6240\u6709\u6743\u4E0E\u5BA1\u6838\u7B56\u7565\u3002",Ne=0;function Se(){return Ne+=1,`p${Ne}`}function Te(e){return{...e,uiKey:Se(),isNew:!1}}function Le(e){let{uiKey:t,isNew:i,...g}=e;return g}function Q(e){return(0,a.jsxs)("span",{className:"vc-profile-field-head",children:[e.title,(0,a.jsx)(Ce,{label:e.title,children:(0,a.jsx)("span",{className:"vc-profile-help",children:e.help})})]})}function Me(e){let t=w();return e.enabled?e.canWrite?(0,a.jsx)(Ue,{canWrite:e.canWrite,listenerBotAppId:e.listenerBotAppId,listenerBotOptions:e.listenerBotOptions}):(0,a.jsx)("p",{className:"hint",children:t("settings.vcProfiles.needAuth")}):null}function Ue(e){let t=w(),i=(0,y.useRef)(!1),g=e.listenerBotOptions,[m,v]=(0,y.useState)(e.listenerBotAppId??g[0]?.larkAppId??""),[c,N]=(0,y.useState)(null),[I,S]=(0,y.useState)(null),[k,z]=(0,y.useState)(!1),[B,H]=(0,y.useState)(!1),[M,r]=(0,y.useState)(!1),[p,P]=(0,y.useState)(!1),[j,L]=(0,y.useState)({}),[G,ie]=(0,y.useState)(!1);(0,y.useEffect)(()=>(i.current=!0,()=>{i.current=!1}),[]);let V=(0,y.useRef)(0);(0,y.useEffect)(()=>{e.listenerBotAppId&&e.listenerBotAppId!==m&&!B&&v(e.listenerBotAppId)},[B,e.listenerBotAppId,m]);let J=(0,y.useCallback)(async s=>{let o=++V.current;if(N(null),H(!1),P(!1),L({}),!s){S(null);return}z(!0);try{let l=await fetch(`/api/vc-meeting/consumer-profiles?listenerBotAppId=${encodeURIComponent(s)}`),u=await l.json().catch(()=>({}));if(!i.current||V.current!==o)return;!l.ok||u?.ok!==!0?(N(null),S(typeof u?.error=="string"?u.error:`HTTP ${l.status}`)):(N({forBot:s,revision:u.revision,catalogState:u.catalogState==="explicit_empty"||u.catalogState==="legacy_or_partial"||u.catalogState==="profiles"?u.catalogState:"uninitialized",defaultMode:u.defaultMode==="agents"?"agents":"listenOnly",defaultConsumerIds:Array.isArray(u.defaultConsumerIds)?u.defaultConsumerIds:[],profiles:(Array.isArray(u.profiles)?u.profiles:[]).map(Te),agentOptions:Array.isArray(u.agentOptions)?u.agentOptions:[],...u.migrationOffer==="enable_seeded_minutes_default"?{migrationOffer:u.migrationOffer}:{}}),S(null),H(!1))}catch(l){if(!i.current||V.current!==o)return;N(null),S(l instanceof Error?l.message:String(l))}finally{i.current&&V.current===o&&z(!1)}},[]);(0,y.useEffect)(()=>{J(m)},[J,m]);let T=(0,y.useCallback)(s=>{N(o=>o&&s(o)),H(!0),ie(!1)},[]),Z=(0,y.useCallback)((s,o)=>{T(l=>({...l,profiles:l.profiles.map(u=>u.uiKey===s?{...u,...o}:u)}))},[T]),ne=(0,y.useCallback)(async()=>{if(!c||M||k||!c.forBot||c.forBot!==m)return;let s={};if(c.profiles.forEach((o,l)=>{xe.test(o.id)||(s[`profiles[${l}].id`]=t("settings.vcProfiles.idInvalid")),(o.instructions??"").length>me&&(s[`profiles[${l}].instructions`]=t("settings.vcProfiles.instructionsTooLong"))}),Object.keys(s).length>0){L(s);return}r(!0),P(!1),L({});try{let o=await fetch("/api/vc-meeting/consumer-profiles",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({listenerBotAppId:c.forBot,expectedRevision:c.revision,defaultMode:c.defaultMode,defaultConsumerIds:c.defaultConsumerIds,profiles:c.profiles.map(Le)})}),l=await o.json().catch(()=>({}));if(!i.current||c.forBot!==m)return;if(o.status===409){P(!0);return}if(o.status===422){let u={};for(let O of Array.isArray(l?.fieldErrors)?l.fieldErrors:[])typeof O?.path=="string"&&typeof O?.message=="string"&&(u[O.path]=O.message);L(Object.keys(u).length>0?u:{profiles:t("settings.vcProfiles.validationFailed")});return}if(!o.ok||l?.ok!==!0){L({profiles:typeof l?.error=="string"?l.error:`HTTP ${o.status}`});return}N({forBot:c.forBot,revision:l.revision,catalogState:l.catalogState==="explicit_empty"||l.catalogState==="legacy_or_partial"||l.catalogState==="profiles"?l.catalogState:"uninitialized",defaultMode:l.defaultMode==="agents"?"agents":"listenOnly",defaultConsumerIds:Array.isArray(l.defaultConsumerIds)?l.defaultConsumerIds:[],profiles:(Array.isArray(l.profiles)?l.profiles:[]).map(Te),agentOptions:Array.isArray(l.agentOptions)?l.agentOptions:[],...l.migrationOffer==="enable_seeded_minutes_default"?{migrationOffer:l.migrationOffer}:{}}),H(!1),ie(!0)}catch(o){if(!i.current)return;L({profiles:o instanceof Error?o.message:String(o)})}finally{i.current&&r(!1)}},[c,M,m,t]),X=(0,y.useMemo)(()=>g.map(s=>({value:s.larkAppId,label:s.botName||s.larkAppId})),[g]),Y=X.find(s=>s.value===m)?.label??m,ce=(0,y.useMemo)(()=>c?c.agentOptions.map(s=>{let o=[s.online?void 0:t("settings.vcProfiles.agentOffline"),s.workingDirReady?void 0:t("settings.vcProfiles.agentNoWorkingDir"),s.reliableTurnTerminal?void 0:t("settings.vcProfiles.agentNoReliableTerminal"),s.managedSideEffectIsolation?void 0:t("settings.vcProfiles.agentNoManagedIsolation")].filter(Boolean);return{value:s.appId,label:(0,a.jsxs)("span",{className:"vc-agent-option",children:[(0,a.jsxs)("span",{className:"vc-agent-option-name",children:[s.label,s.cliId?(0,a.jsx)("em",{className:"vc-agent-option-cli",children:s.cliId}):null]}),o.length>0?(0,a.jsxs)("span",{className:"vc-agent-option-warn",children:["\u26A0 ",o.join(" \xB7 ")]}):null]})}}):[],[c,t]),se=s=>{let o=c?.agentOptions.find(u=>u.appId===s);return o?!o.online||!o.workingDirReady||!o.reliableTurnTerminal||!o.managedSideEffectIsolation?`\u26A0 ${o.label}`:o.label:s},ae=(0,y.useCallback)(s=>{let l=["observe_only","meeting_text","meeting_voice","meeting_text_voice"].map(u=>({value:u,label:t(`settings.vcProfiles.preset.${u}`)}));return(!s.isNew||s.permissionPreset==="custom")&&l.push({value:"custom",label:t("settings.vcProfiles.preset.custom")}),l},[t]),de=(0,y.useCallback)(()=>{T(s=>({...s,profiles:[...s.profiles,{uiKey:Se(),isNew:!0,id:"",agentAppId:s.agentOptions[0]?.appId??"",responseMode:"silent",permissionPreset:"observe_only"}]}))},[T]),ue=(0,y.useCallback)(s=>{T(o=>({...o,profiles:o.profiles.filter(l=>l.uiKey!==s),defaultConsumerIds:o.defaultConsumerIds.filter(l=>o.profiles.some(u=>u.uiKey!==s&&u.id===l))}))},[T]);if(g.length===0)return null;let b=s=>j[s],x=!e.canWrite||M||k,R=c?.agentOptions.some(s=>s.workingDirReady&&s.reliableTurnTerminal&&s.managedSideEffectIsolation)??!1;return(0,a.jsxs)("div",{className:"vc-profiles-section",children:[(0,a.jsxs)("div",{className:"settings-field-row",children:[(0,a.jsx)(D,{help:t("settings.vcProfiles.help"),children:t("settings.vcProfiles.title")}),e.listenerBotAppId===null&&X.length>1?(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:t("settings.vcProfiles.listenerOwner")}),(0,a.jsx)(E,{className:"settings-field-menu",ariaLabel:t("settings.vcProfiles.listenerOwner"),disabled:k||M,value:m,label:q(X,m),options:X,onChange:s=>{s!==m&&(B&&!window.confirm(t("settings.vcProfiles.discardConfirm"))||v(s))}})]}):(0,a.jsx)("span",{className:"vc-profile-config-target",children:t("settings.vcProfiles.configuringBot",{bot:Y})})]}),(0,a.jsx)("p",{className:"hint vc-profiles-freeze",children:t("settings.vcProfiles.freezeNotice")}),k?(0,a.jsx)("p",{className:"hint",children:t("settings.vcProfiles.loading")}):null,I?(0,a.jsx)("p",{className:"hint-warn",children:I==="bot_not_in_config"?t("settings.vcProfiles.botNotInConfig"):`${t("settings.vcProfiles.loadFailed")}: ${I}`}):null,p?(0,a.jsxs)("p",{className:"hint-warn",children:[t("settings.vcProfiles.conflict")," ",(0,a.jsx)("button",{type:"button",className:"vc-profiles-link",onClick:()=>{J(m)},children:t("settings.vcProfiles.reload")})]}):null,b("profiles")?(0,a.jsx)("p",{className:"hint-warn",children:b("profiles")}):null,c?(0,a.jsxs)(a.Fragment,{children:[c.migrationOffer==="enable_seeded_minutes_default"?(0,a.jsxs)("p",{className:"hint-warn vc-profile-migration-offer",children:[t("settings.vcProfiles.migrationOffer")," ",(0,a.jsx)("button",{type:"button",className:"vc-profiles-link",disabled:x||B,onClick:()=>T(s=>({...s,defaultMode:"agents",defaultConsumerIds:["minutes"],profiles:s.profiles.map(o=>o.id==="minutes"?{...o,instructions:Be,responseMode:"listener_thread",permissionPreset:"meeting_text_voice"}:o),migrationOffer:void 0})),children:t("settings.vcProfiles.migrationEnable")})]}):null,c.catalogState==="uninitialized"&&c.profiles.length===0&&!R?(0,a.jsx)("p",{className:"hint-warn",children:t("settings.vcProfiles.noEligibleDefaultAgent")}):null,c.catalogState==="legacy_or_partial"?(0,a.jsx)("p",{className:"hint",children:t("settings.vcProfiles.legacyCatalog")}):null,c.profiles.map((s,o)=>(0,a.jsxs)("div",{className:"vc-profile-card",children:[(0,a.jsxs)("div",{className:"vc-profile-grid",children:[(0,a.jsxs)("label",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldId"),help:t("settings.vcProfiles.idHelp")})}),(0,a.jsx)("input",{type:"text",value:s.id,disabled:x||!s.isNew,placeholder:"minutes",onChange:l=>{let u=l.target.value,O=s.id;T($=>({...$,profiles:$.profiles.map(F=>F.uiKey===s.uiKey?{...F,id:u}:F),defaultConsumerIds:$.defaultConsumerIds.map(F=>F===O&&O?u:F).filter(F=>!!F)}))}}),b(`profiles[${o}].id`)?(0,a.jsx)("em",{className:"vc-profile-err",children:b(`profiles[${o}].id`)}):null]}),(0,a.jsxs)("label",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldLabel"),help:t("settings.vcProfiles.labelHelp")})}),(0,a.jsx)("input",{type:"text",value:s.label??"",disabled:x,onChange:l=>Z(s.uiKey,{label:l.target.value||void 0})}),b(`profiles[${o}].label`)?(0,a.jsx)("em",{className:"vc-profile-err",children:b(`profiles[${o}].label`)}):null]}),(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldAgent"),help:t("settings.vcProfiles.agentHelp")})}),(0,a.jsx)(E,{className:"vc-profile-agent-menu",ariaLabel:t("settings.vcProfiles.fieldAgent"),disabled:x,value:s.agentAppId,label:se(s.agentAppId),options:ce,onChange:l=>Z(s.uiKey,{agentAppId:l})}),b(`profiles[${o}].agentAppId`)?(0,a.jsx)("em",{className:"vc-profile-err",children:b(`profiles[${o}].agentAppId`)}):null]}),(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldResponseMode"),help:t("settings.vcProfiles.responseModeHelp")})}),(0,a.jsx)(E,{ariaLabel:t("settings.vcProfiles.fieldResponseMode"),disabled:x,value:s.responseMode,label:s.responseMode==="listener_thread"?t("settings.vcProfiles.responseListener"):t("settings.vcProfiles.responseSilent"),options:[{value:"silent",label:t("settings.vcProfiles.responseSilent")},{value:"listener_thread",label:t("settings.vcProfiles.responseListener")}],onChange:l=>Z(s.uiKey,{responseMode:l})}),b(`profiles[${o}].responseMode`)?(0,a.jsx)("em",{className:"vc-profile-err",children:b(`profiles[${o}].responseMode`)}):null]}),(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldPreset"),help:t("settings.vcProfiles.presetHelp")})}),(0,a.jsx)(E,{ariaLabel:t("settings.vcProfiles.fieldPreset"),disabled:x,value:s.permissionPreset,label:q(ae(s),s.permissionPreset),options:ae(s),onChange:l=>Z(s.uiKey,{permissionPreset:l})}),b(`profiles[${o}].permissionPreset`)?(0,a.jsx)("em",{className:"vc-profile-err",children:b(`profiles[${o}].permissionPreset`)}):null]})]}),(0,a.jsxs)("label",{className:"vc-profile-field vc-profile-instructions",children:[(0,a.jsxs)("span",{children:[(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldInstructions"),help:t("settings.vcProfiles.instructionsHelp")}),(0,a.jsxs)("em",{className:"vc-profile-count",children:[(s.instructions??"").length,"/",me]})]}),(0,a.jsx)("textarea",{rows:4,maxLength:me,value:s.instructions??"",disabled:x,placeholder:t("settings.vcProfiles.instructionsPlaceholder"),onChange:l=>Z(s.uiKey,{instructions:l.target.value||void 0})}),b(`profiles[${o}].instructions`)?(0,a.jsx)("em",{className:"vc-profile-err",children:b(`profiles[${o}].instructions`)}):null]}),(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:(0,a.jsx)(Q,{title:t("settings.vcProfiles.fieldActivityTypes"),help:t("settings.vcProfiles.activityHelp")})}),(0,a.jsx)("div",{className:"vc-profile-activity",children:Oe.map(l=>{let u=s.activityTypes?.includes(l)??!1;return(0,a.jsxs)("label",{className:"vc-profile-check",children:[(0,a.jsx)("input",{type:"checkbox",checked:u,disabled:x,onChange:O=>{let $=new Set(s.activityTypes??[]);O.target.checked?$.add(l):$.delete(l),Z(s.uiKey,{activityTypes:$.size>0?[...$]:void 0})}}),t(`settings.vcProfiles.activity.${l}`)]},l)})}),(0,a.jsx)("em",{className:"vc-profile-hint",children:t("settings.vcProfiles.activityAllHint")}),b(`profiles[${o}].activityTypes`)?(0,a.jsx)("em",{className:"vc-profile-err",children:b(`profiles[${o}].activityTypes`)}):null]}),e.canWrite?(0,a.jsx)("button",{type:"button",className:"vc-profiles-link vc-profile-remove",disabled:M||k,onClick:()=>ue(s.uiKey),children:t("settings.vcProfiles.remove")}):null]},s.uiKey)),e.canWrite?(0,a.jsx)("button",{type:"button",className:"vc-profiles-link",disabled:M||k,onClick:de,children:t("settings.vcProfiles.add")}):null,(0,a.jsxs)("div",{className:"settings-field-row",children:[(0,a.jsx)(D,{help:t("settings.vcProfiles.defaultModeHelp"),children:t("settings.vcProfiles.defaultMode")}),(0,a.jsx)(E,{className:"settings-field-menu",ariaLabel:t("settings.vcProfiles.defaultMode"),disabled:x,value:c.defaultMode,label:c.defaultMode==="agents"?t("settings.vcProfiles.defaultModeAgents"):t("settings.vcProfiles.defaultModeListenOnly"),options:[{value:"listenOnly",label:t("settings.vcProfiles.defaultModeListenOnly")},{value:"agents",label:t("settings.vcProfiles.defaultModeAgents")}],onChange:s=>T(o=>({...o,defaultMode:s==="agents"?"agents":"listenOnly"}))})]}),c.defaultMode==="agents"?(0,a.jsxs)("div",{className:"vc-profile-field",children:[(0,a.jsx)("span",{children:t("settings.vcProfiles.defaultConsumers")}),(0,a.jsx)("div",{className:"vc-profile-activity",children:c.profiles.filter(s=>s.id).map(s=>{let o=c.defaultConsumerIds.includes(s.id);return(0,a.jsxs)("label",{className:"vc-profile-check",children:[(0,a.jsx)("input",{type:"checkbox",checked:o,disabled:x,onChange:l=>{T(u=>({...u,defaultConsumerIds:l.target.checked?[...u.defaultConsumerIds,s.id]:u.defaultConsumerIds.filter(O=>O!==s.id)}))}}),s.label||s.id]},s.uiKey)})}),b("defaultConsumerIds")?(0,a.jsx)("em",{className:"vc-profile-err",children:b("defaultConsumerIds")}):null,b("defaultMode")?(0,a.jsx)("em",{className:"vc-profile-err",children:b("defaultMode")}):null]}):null,e.canWrite?(0,a.jsxs)("div",{className:"vc-profiles-actions",children:[(0,a.jsx)("button",{type:"button",className:"vc-profiles-save",disabled:!B||M||p,onClick:()=>{ne()},children:t(M?"settings.vcProfiles.saving":"settings.vcProfiles.save")}),G?(0,a.jsx)("span",{className:"vc-profile-hint",children:t("settings.vcProfiles.saved")}):null,B&&!M?(0,a.jsx)("span",{className:"vc-profile-hint",children:t("settings.vcProfiles.unsaved")}):null]}):null]}):null]})}var n=te(oe(),1),ve=["Asia/Shanghai","Asia/Hong_Kong","Asia/Tokyo","Asia/Singapore","Asia/Kolkata","UTC","Europe/London","Europe/Paris","Europe/Moscow","America/Los_Angeles","America/New_York","America/Sao_Paulo","Australia/Sydney"];function De(e,t){if(!e||typeof e!="object")return null;if(e.failed){let i=e.failed.step==="install"?t("settings.herdrTraexInstallStepInstall"):t("settings.herdrTraexInstallStepAction");return{text:`${t("settings.herdrTraexInstallFailed")}\uFF08${i}\uFF09: ${e.failed.reason??""}`,cls:"hint-warn-inline"}}if(e.skippedReason==="plugin_unsupported"){let i=typeof e.herdrVersion=="string"&&e.herdrVersion?` (${e.herdrVersion})`:"";return{text:`${t("settings.herdrTraexUnsupported")}${i}`,cls:"hint-warn-inline"}}return e.installed||e.actionInvoked?{text:t("settings.herdrTraexInstalled"),cls:"hint-ok"}:e.alreadyInstalled?{text:t("settings.herdrTraexAlreadyInstalled"),cls:"hint-ok"}:null}function he(e){return{publicReadOnly:e?.publicReadOnly===!0,openTerminalInFeishu:e?.openTerminalInFeishu===!0,enableLocalCliOpen:e?.enableLocalCliOpen===!0,localCliOpenMode:e?.localCliOpenMode==="resume"?"resume":"attach",chatBotDiscovery:e?.chatBotDiscovery!==!1,herdrTraexPlugin:{enabled:e?.herdrTraexPlugin?.enabled===!0,source:typeof e?.herdrTraexPlugin?.source=="string"?e.herdrTraexPlugin.source:"",ref:typeof e?.herdrTraexPlugin?.ref=="string"?e.herdrTraexPlugin.ref:"",recommendedSource:typeof e?.herdrTraexPlugin?.recommendedSource=="string"?e.herdrTraexPlugin.recommendedSource:"",recommendedRef:typeof e?.herdrTraexPlugin?.recommendedRef=="string"?e.herdrTraexPlugin.recommendedRef:""},codexRpcInput:e?.codexRpcInput===!0,vcMeetingAgent:{enabled:e?.vcMeetingAgent?.enabled!==!1,listenerBotAppId:typeof e?.vcMeetingAgent?.listenerBotAppId=="string"?e.vcMeetingAgent.listenerBotAppId:null,listenerBotOptions:Array.isArray(e?.vcMeetingAgent?.listenerBotOptions)?e.vcMeetingAgent.listenerBotOptions:[],larkCliVersion:e?.vcMeetingAgent?.larkCliVersion===void 0?void 0:e.vcMeetingAgent.larkCliVersion??null,larkCliMeetsRequirement:e?.vcMeetingAgent?.larkCliMeetsRequirement===!0,larkCliMinVersion:typeof e?.vcMeetingAgent?.larkCliMinVersion=="string"?e.vcMeetingAgent.larkCliMinVersion:void 0},repoPickerMode:e?.repoPickerMode==="repos"?"repos":"all",maintenance:e?.maintenance&&typeof e.maintenance=="object"?e.maintenance:{},localDevInstall:e?.localDevInstall===!0,autoUpdateSupported:e?.autoUpdateSupported!==!1,whiteboard:{enabled:e?.whiteboard?.enabled===!0},remoteAccess:e?.remoteAccess===!0,scheduleTimeZone:typeof e?.scheduleTimeZone=="string"?e.scheduleTimeZone:"",hostTimeZone:typeof e?.hostTimeZone=="string"&&e.hostTimeZone?e.hostTimeZone:"UTC",effectiveScheduleTimeZone:typeof e?.effectiveScheduleTimeZone=="string"&&e.effectiveScheduleTimeZone?e.effectiveScheduleTimeZone:typeof e?.scheduleTimeZone=="string"&&e.scheduleTimeZone?e.scheduleTimeZone:typeof e?.hostTimeZone=="string"&&e.hostTimeZone?e.hostTimeZone:"UTC"}}function Ee(e,t){let i=e?.[t]??{};return{enabled:i.enabled===!0,time:typeof i.time=="string"?i.time:"04:00"}}function we(e,t){return t(e==="npm-global"?"update.kindNpm":e==="pnpm-global"?"update.kindPnpm":e==="yarn-global"?"update.kindYarn":e==="bun-global"?"update.kindBun":e==="source-checkout"?"update.kindSource":"update.kindUnknown")}function _e(){let e=w(),t=(0,f.useRef)(!1),i=(0,f.useRef)(new Set),[g,m]=(0,f.useState)(null),[v,c]=(0,f.useState)(!1),[N,I]=(0,f.useState)(null),[S,k]=(0,f.useState)(!0),[z,B]=(0,f.useState)(!1),[H,M]=(0,f.useState)(null),[r,p]=(0,f.useState)(null),[P,j]=(0,f.useState)(null),[L,G]=(0,f.useState)(null),[ie,V]=(0,f.useState)(null),[J,T]=(0,f.useState)(null),[Z,ne]=(0,f.useState)(!1),[X,Y]=(0,f.useState)(!0),[ce,se]=(0,f.useState)(!1),[ae,de]=(0,f.useState)(""),[ue,b]=(0,f.useState)(!1),[x,R]=(0,f.useState)(null),s=(0,f.useCallback)(()=>{for(let d of i.current)window.clearTimeout(d);i.current.clear()},[]),o=(0,f.useCallback)((d,h)=>{let C=window.setTimeout(()=>{i.current.delete(C),d()},h);return i.current.add(C),C},[]),l=(0,f.useCallback)(async()=>{try{let d=await fetch("/api/update/status"),h=await d.json().catch(()=>({}));if(!t.current)return;if(!d.ok){G(null),V(h?.error??`HTTP ${d.status}`);return}G(h),V(null)}catch(d){if(!t.current)return;G(null),V(d instanceof Error?d.message:String(d))}},[]),u=(0,f.useCallback)(async()=>{try{let d=await fetch("/api/settings"),h=await d.json().catch(()=>({}));if(!t.current)return;if(!d.ok){m(null),I(h?.error??`HTTP ${d.status}`),c(!0);return}m(he(h.settings)),k(h.authed===!0),B(h.bound===!0),I(null),c(!0)}catch(d){if(!t.current)return;m(null),I(d instanceof Error?d.message:String(d)),c(!0)}},[]);(0,f.useEffect)(()=>(t.current=!0,u(),()=>{t.current=!1,s()}),[s,u]),(0,f.useEffect)(()=>{v&&(b(!1),R(null),ne(!1),S&&l())},[S,l,v]);async function O(d,h,C){if(!g)return;let A=g;m(C(g)),M(d),p({text:e("settings.saving")});try{let K=await fetch("/api/settings",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(h)}),U=await K.json().catch(()=>({}));if(!t.current)return;if(!K.ok||U.ok===!1)throw typeof U?.feishuLoginQr=="string"&&U.feishuLoginQr&&j(U.feishuLoginQr),new Error(U?.error??`HTTP ${K.status}`);j(null);let ee=he(U.settings);m(ee),fe.publicReadOnly=ee.publicReadOnly,pe.setScheduleTimeZone(ee.effectiveScheduleTimeZone);let le=De(U.herdrTraexInstall,e);p(le??{text:e("settings.saved"),cls:"hint-ok"})}catch(K){if(!t.current)return;let U=!1;try{let le=await fetch("/api/settings"),ye=await le.json().catch(()=>({}));if(t.current&&le.ok&&ye?.settings){let ge=he(ye.settings);m(ge),fe.publicReadOnly=ge.publicReadOnly,pe.setScheduleTimeZone(ge.effectiveScheduleTimeZone),U=!0}}catch{}if(!t.current)return;U||m(A);let ee=K instanceof Error?K.message:String(K);p({text:U?`${e("settings.saveReconciled")}: ${ee}`:`${e("settings.saveFailed")}: ${ee}`,cls:"hint-warn-inline"})}finally{t.current&&M(null)}}async function $(){T(null),Y(!0),se(!1);try{let d=await fetch("/api/update/changelog"),h=await d.json().catch(()=>({}));if(!t.current)return;de(typeof h?.releasesUrl=="string"?h.releasesUrl:""),d.ok?(T(Array.isArray(h.releases)?h.releases:[]),Y(h.ok!==!1),se(h.rateLimited===!0)):(T([]),Y(!1))}catch{if(!t.current)return;T([]),Y(!1)}}function F(){let d=Date.now(),h=async()=>{if(t.current){if(Date.now()-d>9e4){b(!1),R({text:e("update.restartSlow"),cls:"hint-warn-inline"});return}try{let C=await fetch("/__health",{cache:"no-store"});if(!t.current)return;if(C.ok){location.reload();return}}catch{}t.current&&o(()=>{h()},2e3)}};o(()=>{h()},3e3)}async function be(d){b(!0),R({text:e("update.restarting")});try{let h=await fetch("/api/update/restart",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(d?{update:d}:{})}),C=await h.json().catch(()=>({}));if(!h.ok||C.ok===!1)throw new Error(String(C.detail??C.error??`HTTP ${h.status}`));if(!t.current)return}catch(h){if(!t.current)return;b(!1),R({text:e("update.restartFailed",{detail:h instanceof Error?h.message:String(h)}),cls:"hint-warn-inline"});return}F()}async function Ie(){let d=L;if(!d)return;if(!d.node.ok){window.alert(e("update.nodeTooOldAlert",{version:d.node.version,required:d.node.required}));return}if(!d.updateSupported||!d.updateCommand){window.alert(e("update.unsupportedInstall"));return}if(d.installs.multiple){let C=d.installs.entries.map(A=>`\u2022 ${A.binPath} (${we(A.kind,e)})`).join(`
|
|
2
|
-
`);if(!window.confirm(e("update.confirmMultiInstall",{paths:C})))return}let h=d.latest?e("update.confirmUpdate",{version:`v${d.latest}`,command:d.updateCommand}):e("update.confirmUpdateNoVer",{command:d.updateCommand});if(window.confirm(h)){b(!0),R({text:e("update.updating",{command:d.updateCommand})});try{let C=await fetch("/api/update/run",{method:"POST"}),A=await C.json().catch(()=>({}));if(!t.current)return;if(!C.ok||A.ok===!1){let K=A?.detail??A?.error??`HTTP ${C.status}`;b(!1),R({text:e("update.updateFailed",{detail:K}),cls:"hint-warn-inline"});return}A.changed?(b(!1),R({text:e("update.updatedChanged",{old:`v${A.oldVersion}`,new:`v${A.newVersion}`}),cls:"hint-ok"}),window.confirm(e("update.confirmRestart"))?await be({oldVersion:A.oldVersion,newVersion:A.newVersion}):t.current&&R({text:e("update.noRestartHint"),cls:"hint-ok"})):(b(!1),R({text:e("update.alreadyLatestRun",{version:`v${A.newVersion}`}),cls:"hint-ok"}),await l())}catch(C){if(!t.current)return;b(!1),R({text:e("update.updateFailed",{detail:C instanceof Error?C.message:String(C)}),cls:"hint-warn-inline"})}}}let Re=g?(0,n.jsx)($e,{settings:g,canWrite:S,bound:z,savingKey:H,message:r,updateBlock:(0,n.jsx)(Ze,{canWrite:S,status:L,statusError:ie,changelog:J,changelogOpen:Z,changelogOk:X,changelogRateLimited:ce,releasesUrl:ae,busy:ue,message:x,onCheck:()=>{G(null),T(null),ne(!1),R(null),V(null),l()},onToggleChangelog:()=>{let d=!Z;ne(d),d&&J===null&&$()},onUpdate:()=>{Ie()},onRestart:()=>{window.confirm(e("update.confirmPlainRestart"))&&be(null)}}),feishuLoginQr:P,onCloseFeishuLoginQr:()=>j(null),onSave:O}):N?(0,n.jsxs)("p",{className:"hint-warn",children:[e("settings.loadFailed"),": ",N]}):(0,n.jsx)(re,{label:e("settings.loading")});return(0,n.jsxs)("section",{className:"page settings-page",children:[(0,n.jsx)("div",{className:"page-heading",children:(0,n.jsxs)("div",{children:[(0,n.jsx)("p",{className:"eyebrow",children:e("nav.settings")}),(0,n.jsx)("h1",{children:e("settings.title")})]})}),Re]})}function $e(e){let t=w(),{settings:i,canWrite:g,bound:m,savingKey:v}=e,c=!g,N=Ee(i.maintenance,"autoUpdate"),I=!g||i.localDevInstall||!i.autoUpdateSupported,S=!g||i.maintenance.autoUpdate?.enabled!==!0,k=(r,p)=>{e.onSave(r,{[r]:p},P=>({...P,[r]:p}))},z=r=>e.onSave("herdrTraexPlugin",{herdrTraexPlugin:r},p=>({...p,herdrTraexPlugin:{...p.herdrTraexPlugin,...r}})),B=(0,f.useMemo)(()=>[{value:"all",label:t("settings.repoPickerModeAll")},{value:"repos",label:t("settings.repoPickerModeRepos")}],[t]),H=(0,f.useMemo)(()=>[{value:"attach",label:t("settings.localCliOpenModeAttach")},{value:"resume",label:t("settings.localCliOpenModeResume")}],[t]),M=(0,f.useMemo)(()=>[{value:"",label:t("settings.vcMeetingListenerBotAuto")},...i.vcMeetingAgent.listenerBotOptions.map(r=>{let p=r.botName||r.larkAppId,P=r.cliId?` \xB7 ${r.cliId}`:"",j=[r.vcMeetingAgentEnabled===!0?void 0:t("settings.vcMeetingListenerBotDisabled"),r.hasLarkCliProfile===!0?void 0:t("settings.vcMeetingListenerBotNoProfile")].filter(Boolean),L=j.length>0?` \xB7 ${j.join(" \xB7 ")}`:"";return{value:r.larkAppId,label:`${p}${P}${L}`}})],[i.vcMeetingAgent.listenerBotOptions,t]);return(0,n.jsxs)("div",{className:"settings-layout",children:[g?null:(0,n.jsx)("article",{className:"bd-card settings-card settings-alert-card",children:(0,n.jsx)("p",{className:"hint-warn",children:t("settings.readOnlyVisitor")})}),(0,n.jsxs)(Ae,{className:"settings-group-main",children:[(0,n.jsxs)(W,{title:t("settings.sectionAccess"),children:[(0,n.jsx)(_,{title:t("settings.publicReadOnly"),help:t("settings.publicReadOnlyHelp"),checked:i.publicReadOnly,disabled:c||v==="publicReadOnly",onChange:r=>k("publicReadOnly",r)}),m?(0,n.jsx)(_,{title:t("settings.remoteAccess"),help:t("settings.remoteAccessHelp"),checked:i.remoteAccess,disabled:c||v==="remoteAccess",onChange:r=>k("remoteAccess",r)}):null]}),(0,n.jsxs)(W,{title:t("settings.sectionCards"),children:[(0,n.jsx)(_,{title:t("settings.openTerminalInFeishu"),help:t("settings.openTerminalInFeishuHelp"),checked:i.openTerminalInFeishu,disabled:c||v==="openTerminalInFeishu",onChange:r=>k("openTerminalInFeishu",r)}),(0,n.jsx)(_,{title:t("settings.enableLocalCliOpen"),help:t("settings.enableLocalCliOpenHelp"),checked:i.enableLocalCliOpen,disabled:c||v==="enableLocalCliOpen",onChange:r=>k("enableLocalCliOpen",r)}),(0,n.jsxs)("div",{className:"settings-field-row",children:[(0,n.jsx)(D,{help:t("settings.localCliOpenModeHelp"),children:t("settings.localCliOpenMode")}),(0,n.jsx)(E,{className:"settings-field-menu",ariaLabel:t("settings.localCliOpenMode"),disabled:c||!i.enableLocalCliOpen||v==="localCliOpenMode",value:i.localCliOpenMode,label:q(H,i.localCliOpenMode),options:H,onChange:r=>{e.onSave("localCliOpenMode",{localCliOpenMode:r},p=>({...p,localCliOpenMode:r}))}})]})]}),(0,n.jsxs)(W,{title:t("settings.sectionExperimental"),children:[(0,n.jsx)(_,{title:t("settings.chatBotDiscovery"),help:t("settings.chatBotDiscoveryHelp"),checked:i.chatBotDiscovery,disabled:c||v==="chatBotDiscovery",onChange:r=>k("chatBotDiscovery",r)}),(0,n.jsx)(_,{title:t("settings.herdrTraexPlugin"),help:t("settings.herdrTraexPluginHelp"),checked:i.herdrTraexPlugin.enabled,disabled:c||v==="herdrTraexPlugin",onChange:r=>z({enabled:r})}),i.herdrTraexPlugin.enabled?(0,n.jsx)(Ve,{value:i.herdrTraexPlugin,disabled:c||v==="herdrTraexPlugin",onSave:r=>z(r)}):null,(0,n.jsx)(_,{title:t("settings.codexRpcInput"),help:t("settings.codexRpcInputHelp"),checked:i.codexRpcInput,disabled:c||v==="codexRpcInput",onChange:r=>k("codexRpcInput",r)})]}),(0,n.jsx)(W,{title:t("settings.sectionWhiteboard"),children:(0,n.jsx)(_,{title:t("settings.whiteboardEnable"),help:t("settings.whiteboardEnableHelp"),checked:i.whiteboard.enabled,disabled:c||v==="whiteboard",onChange:r=>{e.onSave("whiteboard",{whiteboard:{enabled:r}},p=>({...p,whiteboard:{enabled:r}}))}})}),(0,n.jsx)(W,{title:t("settings.sectionRepoPicker"),children:(0,n.jsxs)("div",{className:"settings-field-row",children:[(0,n.jsx)(D,{help:t("settings.repoPickerModeHelp"),children:t("settings.repoPickerMode")}),(0,n.jsx)(E,{className:"settings-field-menu",ariaLabel:t("settings.repoPickerMode"),disabled:c||v==="repoPickerMode",value:i.repoPickerMode,label:q(B,i.repoPickerMode),options:B,onChange:r=>{e.onSave("repoPickerMode",{repoPickerMode:r},p=>({...p,repoPickerMode:r}))}})]})}),(0,n.jsx)(W,{title:t("settings.sectionSchedule"),children:(0,n.jsx)(He,{value:i.scheduleTimeZone,host:i.hostTimeZone,effective:i.effectiveScheduleTimeZone,disabled:c||v==="scheduleTimeZone",onSave:r=>{e.onSave("scheduleTimeZone",{scheduleTimeZone:r},p=>({...p,scheduleTimeZone:r??""}))}})}),(0,n.jsxs)(W,{className:"settings-vc-block",title:t("settings.sectionVcMeetingAgent"),children:[(0,n.jsx)(_,{title:t("settings.vcMeetingAgent"),help:t("settings.vcMeetingAgentHelp"),checked:i.vcMeetingAgent.enabled,disabled:c||v==="vcMeetingAgent",onChange:r=>{e.onSave("vcMeetingAgent",{vcMeetingAgent:{enabled:r}},p=>({...p,vcMeetingAgent:{...p.vcMeetingAgent,enabled:r}}))}}),(0,n.jsxs)("div",{className:"settings-field-row",children:[(0,n.jsx)(D,{help:t("settings.vcMeetingListenerBotHelp"),children:t("settings.vcMeetingListenerBot")}),(0,n.jsx)(E,{className:"settings-field-menu",ariaLabel:t("settings.vcMeetingListenerBot"),disabled:c||v==="vcMeetingAgent",value:i.vcMeetingAgent.listenerBotAppId??"",label:q(M,i.vcMeetingAgent.listenerBotAppId??""),options:M,onChange:r=>{let p=r||null;e.onSave("vcMeetingAgent",{vcMeetingAgent:{listenerBotAppId:p}},P=>({...P,vcMeetingAgent:{...P.vcMeetingAgent,listenerBotAppId:p}}))}})]}),(0,n.jsx)(Fe,{settings:i.vcMeetingAgent}),(0,n.jsx)(Me,{enabled:i.vcMeetingAgent.enabled,canWrite:g,listenerBotAppId:i.vcMeetingAgent.listenerBotAppId,listenerBotOptions:i.vcMeetingAgent.listenerBotOptions}),e.feishuLoginQr?(0,n.jsxs)("div",{className:"settings-feishu-login",children:[(0,n.jsx)("button",{type:"button",className:"settings-feishu-login-close","aria-label":t("settings.feishuLoginClose"),title:t("settings.feishuLoginClose"),onClick:e.onCloseFeishuLoginQr}),(0,n.jsx)("p",{children:t("settings.feishuLoginRequired")}),(0,n.jsx)("img",{src:e.feishuLoginQr,alt:t("settings.feishuLoginQrAlt")})]}):null]})]}),(0,n.jsxs)(Ae,{className:"settings-group-ops",children:[(0,n.jsx)(W,{title:t("settings.sectionMaintenance"),titleExtra:i.localDevInstall?(0,n.jsx)("span",{className:"settings-title-note",children:t("settings.autoUpdateLocalDev")}):i.autoUpdateSupported?null:(0,n.jsx)("span",{className:"settings-title-note",children:t("settings.autoUpdateUnsupportedInstall")}),children:(0,n.jsxs)("div",{className:"settings-maintenance-grid",children:[(0,n.jsxs)("div",{className:"settings-maintenance-update",children:[(0,n.jsx)(_,{title:t("settings.autoUpdate"),help:t("settings.autoUpdateHelp"),checked:N.enabled,disabled:I||v==="autoUpdate",onChange:r=>{let p={enabled:r,time:N.time};e.onSave("autoUpdate",{maintenance:{autoUpdate:p}},P=>({...P,maintenance:{...P.maintenance,autoUpdate:p}}))}}),(0,n.jsx)("div",{className:"maint-time",children:(0,n.jsxs)("label",{children:[(0,n.jsx)("span",{children:t("settings.maintenanceTime")}),(0,n.jsx)("input",{type:"time",value:N.time,disabled:I||v==="autoUpdate",onChange:r=>{let p={enabled:N.enabled,time:r.currentTarget.value||"04:00"};e.onSave("autoUpdate",{maintenance:{autoUpdate:p}},P=>({...P,maintenance:{...P.maintenance,autoUpdate:p}}))}})]})})]}),(0,n.jsx)("div",{className:"settings-maintenance-restart",children:(0,n.jsx)(_,{title:t("settings.autoRestart"),help:t("settings.autoRestartHelp"),checked:i.maintenance.autoRestart?.enabled===!0,disabled:S||v==="autoRestart",onChange:r=>{let p={enabled:r};e.onSave("autoRestart",{maintenance:{autoRestart:p}},P=>({...P,maintenance:{...P.maintenance,autoRestart:p}}))}})})]})}),e.updateBlock]}),(0,n.jsx)("div",{className:"settings-status-row",children:(0,n.jsx)("span",{className:`oncall-status ${e.message?.cls??""}`,"data-settings-status":!0,children:e.message?.text??""})})]})}function Fe(e){let t=w(),i=e.settings.larkCliVersion,g=typeof i=="string"&&e.settings.larkCliMeetsRequirement===!0,m=g?t("settings.larkCliReady",{version:i}):typeof i=="string"?t("settings.larkCliOutdated",{version:i,minimum:e.settings.larkCliMinVersion??"-"}):t("settings.larkCliMissing");return(0,n.jsxs)("div",{className:`settings-lark-cli-status ${g?"is-ready":"is-warning"}`,children:[(0,n.jsx)("span",{"aria-hidden":"true"}),(0,n.jsx)("strong",{children:m}),g?null:(0,n.jsx)("code",{children:"npm i -g @larksuite/cli@latest"})]})}function Ae(e){let t=["settings-group",e.className].filter(Boolean).join(" ");return(0,n.jsx)("section",{className:t,children:(0,n.jsx)("article",{className:"bd-card settings-group-card",children:e.children})})}function W(e){let t=["settings-block",e.className].filter(Boolean).join(" ");return(0,n.jsx)("section",{className:t,children:(0,n.jsxs)("article",{className:"bd-card settings-card",children:[(0,n.jsxs)("div",{className:"settings-block-title-row",children:[(0,n.jsx)("h2",{className:"bd-section-title",children:e.title}),e.titleExtra?(0,n.jsx)("div",{className:"settings-block-title-extra",children:e.titleExtra}):null]}),e.children]})})}function He(e){let t=w(),i=e.value.trim(),g=e.effective||e.value.trim()||e.host,m=(0,f.useMemo)(()=>{let v=i&&!ve.includes(i)?[i,...ve]:ve;return[{value:"",label:t("settings.scheduleTimeZoneHost",{host:e.host})},...v.map(c=>({value:c,label:c}))]},[e.host,t,i]);return(0,n.jsxs)("div",{className:"settings-field-row settings-timezone-row",children:[(0,n.jsx)(D,{help:t("settings.scheduleTimeZoneHelp",{host:e.host,effective:g}),children:t("settings.scheduleTimeZone")}),(0,n.jsx)(E,{className:"settings-field-menu settings-timezone-menu",ariaLabel:t("settings.scheduleTimeZone"),value:i,label:q(m,i),options:m,disabled:e.disabled,onChange:v=>e.onSave(v===""?null:v)})]})}function _(e){return(0,n.jsxs)("label",{className:"toggle-row",children:[(0,n.jsx)("input",{type:"checkbox",checked:e.checked,disabled:e.disabled,onChange:t=>e.onChange(t.currentTarget.checked)}),(0,n.jsx)("span",{className:"switch","aria-hidden":"true"}),(0,n.jsx)("span",{className:"toggle-tx",children:(0,n.jsx)("strong",{children:(0,n.jsx)(D,{className:"settings-toggle-title",help:e.help,children:e.title})})})]})}function Ve(e){let t=w(),[i,g]=(0,f.useState)(e.value.source),[m,v]=(0,f.useState)(e.value.ref);(0,f.useEffect)(()=>{g(e.value.source),v(e.value.ref)},[e.value.source,e.value.ref]);let c=i.trim(),N=m.trim(),I=c!==e.value.source.trim()||N!==e.value.ref.trim(),S=()=>{e.disabled||!I||e.onSave({source:c,ref:N})};return(0,n.jsxs)("div",{className:"settings-subfield",children:[(0,n.jsxs)("div",{className:"settings-field-row",children:[(0,n.jsx)(D,{help:t("settings.herdrTraexPluginSourceHelp"),children:t("settings.herdrTraexPluginSource")}),(0,n.jsx)("input",{className:"settings-text-input",type:"text",value:i,placeholder:t("settings.herdrTraexPluginSourcePlaceholder"),disabled:e.disabled,onChange:k=>g(k.currentTarget.value),onKeyDown:k=>{k.key==="Enter"&&(k.preventDefault(),S())}})]}),(0,n.jsxs)("div",{className:"settings-field-row",children:[(0,n.jsx)(D,{help:t("settings.herdrTraexPluginRefHelp"),children:t("settings.herdrTraexPluginRef")}),(0,n.jsx)("input",{className:"settings-text-input",type:"text",value:m,placeholder:t("settings.herdrTraexPluginRefPlaceholder"),disabled:e.disabled,onChange:k=>v(k.currentTarget.value),onKeyDown:k=>{k.key==="Enter"&&(k.preventDefault(),S())}})]}),c?null:(0,n.jsx)("p",{className:"hint-warn-inline settings-subfield-hint",children:t("settings.herdrTraexPluginSourceRequired")}),e.value.recommendedSource&&(c!==e.value.recommendedSource||N!==e.value.recommendedRef)?(0,n.jsxs)("p",{className:"settings-subfield-hint",children:[t("settings.herdrTraexPluginRecommended")," ",(0,n.jsxs)("button",{type:"button",className:"settings-inline-link",disabled:e.disabled,onClick:()=>{g(e.value.recommendedSource),v(e.value.recommendedRef)},children:[e.value.recommendedSource,e.value.recommendedRef?` @ ${e.value.recommendedRef}`:""]})]}):null,(0,n.jsx)("div",{className:"actions",children:(0,n.jsx)("button",{type:"button",className:"page-primary-action",disabled:e.disabled||!I,onClick:S,children:t("settings.herdrTraexPluginSave")})})]})}function Ze(e){let t=w(),i;if(!e.canWrite)i=(0,n.jsx)("p",{className:"hint-warn",children:t("update.loginRequired")});else if(e.statusError)i=(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{className:"hint-warn",children:[t("update.checkFailed"),": ",e.statusError]}),(0,n.jsx)("div",{className:"update-actions",children:(0,n.jsx)("button",{type:"button","data-up":"check",onClick:e.onCheck,children:t("update.btnCheck")})})]});else if(!e.status)i=(0,n.jsx)(re,{label:t("update.loading"),compact:!0});else{let g=e.status,m=g.localDevInstall||!g.updateSupported||e.busy;i=(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{className:"update-version",children:[(0,n.jsxs)("span",{children:[t("update.current"),": ",(0,n.jsxs)("strong",{children:["v",g.current]})]})," ",(0,n.jsx)(We,{status:g})]}),g.node.ok?null:(0,n.jsx)("p",{className:"hint-warn",children:t("update.nodeWarn",{version:g.node.version,required:g.node.required})}),!g.localDevInstall&&!g.updateSupported?(0,n.jsx)("p",{className:"hint-warn",children:t("update.unsupportedInstall")}):null,g.installs.multiple?(0,n.jsx)(je,{entries:g.installs.entries}):null,(0,n.jsxs)("div",{className:"update-actions",children:[(0,n.jsx)("button",{type:"button","data-up":"check",disabled:e.busy,onClick:e.onCheck,children:t("update.btnCheck")}),(0,n.jsx)("button",{type:"button","data-up":"changelog",disabled:e.busy,onClick:e.onToggleChangelog,children:e.changelogOpen?t("update.btnChangelogHide"):t("update.btnChangelog")}),(0,n.jsx)("button",{type:"button",className:"page-primary-action","data-up":"update",disabled:m,onClick:e.onUpdate,children:t("update.btnUpdate")}),(0,n.jsx)("button",{type:"button","data-up":"restart",disabled:e.busy,onClick:e.onRestart,children:t("update.btnRestart")})]}),g.cliUpdates?.length?(0,n.jsx)(Ke,{entries:g.cliUpdates}):null,e.changelogOpen?(0,n.jsx)(qe,{changelog:e.changelog,ok:e.changelogOk,rateLimited:e.changelogRateLimited,releasesUrl:e.releasesUrl}):null,e.message?(0,n.jsx)("p",{className:`oncall-status ${e.message.cls??""}`,children:e.message.text}):null]})}return(0,n.jsx)(W,{className:"settings-update-block",title:t("update.section"),titleExtra:e.status?.localDevInstall?(0,n.jsx)("span",{className:"settings-title-note",children:t("update.localDev")}):e.status&&!e.status.updateSupported?(0,n.jsx)("span",{className:"settings-title-note",children:t("update.unsupportedInstall")}):null,children:i})}function Ke(e){let t=w();return(0,n.jsxs)("div",{className:"cli-runtime-updates",children:[(0,n.jsx)("strong",{children:t("update.runtimeTitle")}),(0,n.jsx)("ul",{children:e.entries.map(i=>(0,n.jsxs)("li",{className:i.updateAvailable?"is-behind":"",children:[(0,n.jsxs)("div",{className:"cli-runtime-update-head",children:[(0,n.jsx)("span",{children:"Codex"}),i.updateAvailable&&i.latest?(0,n.jsx)("span",{className:"update-badge update-badge-new",children:t("update.runtimeAvailable",{current:i.current??"?",latest:i.latest})}):i.latest?(0,n.jsx)("span",{className:"update-badge update-badge-ok",children:t("update.upToDate")}):(0,n.jsx)("span",{className:"hint-warn-inline",children:t("update.checkUnavailable")})]}),(0,n.jsx)("code",{children:i.binPath}),i.updateAvailable?(0,n.jsxs)("small",{children:[t("update.runtimeCommand"),": ",(0,n.jsx)("code",{children:i.updateCommand})]}):null]},`${i.cliId}:${i.binPath}`))}),(0,n.jsx)("p",{className:"settings-help",children:t("update.runtimeHelp")})]})}function We(e){let t=w(),i=e.status;return i.latest?i.behind?(0,n.jsx)("span",{className:"update-badge update-badge-new",children:t("update.newAvailable",{version:`v${i.latest}`})}):(0,n.jsx)("span",{className:"update-badge update-badge-ok",children:t("update.upToDate")}):(0,n.jsx)("span",{className:"hint-warn-inline",children:t("update.checkUnavailable")})}function je(e){let t=w();return(0,n.jsxs)("div",{className:"hint-warn",children:[(0,n.jsx)("p",{children:t("update.multiInstallWarn")}),(0,n.jsx)("ul",{className:"update-install-list",children:e.entries.map(i=>(0,n.jsxs)("li",{children:[(0,n.jsx)("code",{children:i.binPath})," \u2192 ",we(i.kind,t)," ",(0,n.jsx)("small",{children:i.root})]},`${i.binPath}:${i.root}`))})]})}function qe(e){let t=w();if(e.changelog===null)return(0,n.jsx)(re,{label:t("update.changelogLoading"),compact:!0});if(!e.ok){let i=e.rateLimited?t("update.changelogRateLimited"):t("update.changelogFailed");return(0,n.jsxs)("p",{className:"hint-warn-inline",children:[i,e.releasesUrl?(0,n.jsxs)(n.Fragment,{children:[" ",(0,n.jsx)("a",{href:e.releasesUrl,target:"_blank",rel:"noopener",children:t("update.changelogViewOnGitHub")})]}):null]})}return e.changelog.length===0?(0,n.jsx)("p",{className:"empty",children:t("update.changelogEmpty")}):(0,n.jsx)("div",{className:"update-changelog",children:e.changelog.map(i=>{let g=i.name&&i.name!==`v${i.version}`?i.name:"",m=i.publishedAt?new Date(i.publishedAt).toLocaleDateString():"";return(0,n.jsxs)("details",{className:"update-release",open:!0,children:[(0,n.jsxs)("summary",{children:[(0,n.jsxs)("strong",{children:["v",i.version]})," ",g," ",(0,n.jsx)("small",{children:m})," ",(0,n.jsx)("a",{href:i.url,target:"_blank",rel:"noopener",children:"\u2197"})]}),(0,n.jsx)("pre",{className:"update-release-body",children:i.body||""})]},i.version)})})}function st(e){return Pe(e,(0,n.jsx)(_e,{}))}export{He as TimeZoneRow,st as renderSettingsPage};
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { type Locale } from '../i18n/index.js';
|
|
2
|
-
export interface LandDiff {
|
|
3
|
-
ok: true;
|
|
4
|
-
empty: boolean;
|
|
5
|
-
patch: string;
|
|
6
|
-
statText: string;
|
|
7
|
-
files: number;
|
|
8
|
-
insertions: number;
|
|
9
|
-
deletions: number;
|
|
10
|
-
}
|
|
11
|
-
export interface LandError {
|
|
12
|
-
ok: false;
|
|
13
|
-
error: string;
|
|
14
|
-
}
|
|
15
|
-
/** Locate the project overlay UPPER dir (= SandboxSpawn.workDir) for a session. */
|
|
16
|
-
export declare function upperDir(dataDir: string, sessionId: string): string;
|
|
17
|
-
/**
|
|
18
|
-
* Compute the agent's changeset from the session's overlay upper layer, with a
|
|
19
|
-
* human-readable preview (per-file `git diff --no-index` vs the real project).
|
|
20
|
-
*/
|
|
21
|
-
export declare function computeSandboxDiff(dataDir: string, sessionId: string, locale?: Locale): LandDiff | LandError;
|
|
22
|
-
/**
|
|
23
|
-
* Apply the session's overlay upper changeset onto the real target project:
|
|
24
|
-
* - regular file in upper → mkdir -p parent, copy over the real file
|
|
25
|
-
* - symlink in upper → recreate the link (NOT a dereferenced copy)
|
|
26
|
-
* - whiteout → remove the corresponding real file/dir
|
|
27
|
-
* - opaque dir → only when the dir ALSO exists in the target (= a
|
|
28
|
-
* wholesale replace): drop the stale lower contents,
|
|
29
|
-
* then re-create it (its surviving files arrive as
|
|
30
|
-
* separate 'file'/'symlink' changes). A purely-new
|
|
31
|
-
* opaque dir is just mkdir'd (never rm -rf'd).
|
|
32
|
-
*
|
|
33
|
-
* Two-phase for safety:
|
|
34
|
-
* 1) PRE-VALIDATE every source is landable (dangling symlink, unreadable regular
|
|
35
|
-
* file, undeterminable opacity on a dir that exists in the target) BEFORE we
|
|
36
|
-
* mutate anything — so the common mid-loop failure (a dangling relative
|
|
37
|
-
* symlink) is caught up front and the real project is left untouched.
|
|
38
|
-
* 2) APPLY; if a per-file op still throws (race / permission / ENOSPC), we
|
|
39
|
-
* report which files were already applied so the owner isn't told "failed"
|
|
40
|
-
* with the repo silently half-landed and no clue about its state.
|
|
41
|
-
*/
|
|
42
|
-
export declare function applySandboxDiff(targetDir: string, dataDir: string, sessionId: string, locale?: Locale): {
|
|
43
|
-
ok: true;
|
|
44
|
-
} | LandError;
|
|
45
|
-
//# sourceMappingURL=sandbox-land.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-land.d.ts","sourceRoot":"","sources":["../../src/services/sandbox-land.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAK,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAUlD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,IAAI,CAAC;IACT,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,SAAS;IAAG,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAavD,mFAAmF;AACnF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnE;AAmGD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CA+E5G;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,SAAS,CAwFjI"}
|
|
@@ -1,394 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sandbox landing (overlayfs model): the project overlay UPPER dir IS the
|
|
3
|
-
* changeset the sandboxed agent produced. We compute a human-readable diff from
|
|
4
|
-
* it (preview/patch via `git diff --no-index` against the real project), and on
|
|
5
|
-
* the owner's confirmation copy the changed files back into the real project.
|
|
6
|
-
*
|
|
7
|
-
* The agent in the sandbox is oblivious it's overlaid — it thinks it edits the
|
|
8
|
-
* real files. So landing is owner-triggered only (the `/land` command or the
|
|
9
|
-
* dashboard button), never by the agent.
|
|
10
|
-
*
|
|
11
|
-
* Upper-layer semantics (overlayfs):
|
|
12
|
-
* - a regular file in upper → a new-or-modified file
|
|
13
|
-
* - a symlink in upper → a symlink the agent created/changed
|
|
14
|
-
* - a character device with rdev 0 → a WHITEOUT (the agent deleted the file)
|
|
15
|
-
* - a dir with xattr trusted.overlay.opaque=y → the dir's lower contents are
|
|
16
|
-
* hidden. NOTE: overlayfs sets this xattr on BOTH a freshly-created dir AND a
|
|
17
|
-
* wholesale-replaced dir, so opacity ALONE cannot tell "new" from "replaced".
|
|
18
|
-
* The real discriminator is whether the dir also exists in the lower (= the
|
|
19
|
-
* target). We therefore only treat an opaque dir as a wholesale REPLACE (drop
|
|
20
|
-
* the lower's stale contents) when it ALSO exists in the target; a purely-new
|
|
21
|
-
* opaque dir is just mkdir'd — never rm -rf'd over unrelated real files.
|
|
22
|
-
*/
|
|
23
|
-
import { spawnSync } from 'node:child_process';
|
|
24
|
-
import { existsSync, readdirSync, lstatSync, copyFileSync, mkdirSync, rmSync, readFileSync, readlinkSync, symlinkSync, unlinkSync, realpathSync, } from 'node:fs';
|
|
25
|
-
import { join, dirname, relative, resolve } from 'node:path';
|
|
26
|
-
import { t } from '../i18n/index.js';
|
|
27
|
-
/** Canonicalize dataDir the same way prepareSandbox does: the sandbox tree is
|
|
28
|
-
* created under the CANONICAL dataDir, so a symlink `config.session.dataDir`
|
|
29
|
-
* would otherwise make `/land` / diff / patch look under the wrong path and
|
|
30
|
-
* find no changeset. Best-effort — falls back to a plain normalize. */
|
|
31
|
-
function canonicalDataDir(dataDir) {
|
|
32
|
-
try {
|
|
33
|
-
return realpathSync(dataDir);
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return resolve(dataDir);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/** Locate the project overlay UPPER dir (= SandboxSpawn.workDir) for a session. */
|
|
40
|
-
export function upperDir(dataDir, sessionId) {
|
|
41
|
-
return join(canonicalDataDir(dataDir), 'sandboxes', sessionId, 'proj-upper');
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* The project LOWER source recorded by prepareSandbox at create time (meta.json).
|
|
45
|
-
* Used to tell a wholesale-REPLACED opaque dir (existed in the lower) from a
|
|
46
|
-
* purely-NEW opaque dir (didn't) — overlayfs marks BOTH opaque, so the lower is
|
|
47
|
-
* the only reliable discriminator, and the LIVE landing target may have drifted
|
|
48
|
-
* (concurrent work) so we must NOT use it for this. Returns '' when unknown
|
|
49
|
-
* (older session / meta missing) → callers fall back to the target.
|
|
50
|
-
*/
|
|
51
|
-
function projectLower(dataDir, sessionId) {
|
|
52
|
-
try {
|
|
53
|
-
const meta = JSON.parse(readFileSync(join(canonicalDataDir(dataDir), 'sandboxes', sessionId, 'meta.json'), 'utf8'));
|
|
54
|
-
return typeof meta?.projectLower === 'string' ? meta.projectLower : '';
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return '';
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/** True if a path is an overlayfs whiteout (char device, rdev 0). */
|
|
61
|
-
function isWhiteout(p) {
|
|
62
|
-
try {
|
|
63
|
-
const st = lstatSync(p);
|
|
64
|
-
return st.isCharacterDevice() && st.rdev === 0;
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Read the overlay opaque xattr for a dir.
|
|
72
|
-
* - 'y' → the dir is opaque
|
|
73
|
-
* - '' → the dir is present and NOT opaque (xattr absent)
|
|
74
|
-
* - null → could NOT determine (no xattr tooling available / read failed)
|
|
75
|
-
*
|
|
76
|
-
* `getfattr` is provided by the `attr` package and is frequently NOT installed;
|
|
77
|
-
* `trusted.overlay.*` also requires CAP_SYS_ADMIN to read (we run as root). We
|
|
78
|
-
* try getfattr first, then python3's os.getxattr (commonly present), and return
|
|
79
|
-
* null when neither can answer — callers must NOT silently treat null as "not
|
|
80
|
-
* opaque" (that would leak stale lower files); they fail-closed where it matters.
|
|
81
|
-
*/
|
|
82
|
-
function readOpaqueXattr(p) {
|
|
83
|
-
// getfattr (attr package). --only-values prints just the value; ENOATTR → exit≠0.
|
|
84
|
-
const gf = spawnSync('getfattr', ['-n', 'trusted.overlay.opaque', '--only-values', '-h', p], { encoding: 'utf8' });
|
|
85
|
-
if (gf.error == null && typeof gf.status === 'number') {
|
|
86
|
-
if (gf.status === 0)
|
|
87
|
-
return (gf.stdout ?? '').trim() === 'y' ? 'y' : '';
|
|
88
|
-
// exit≠0 with stderr mentioning "No such attribute"/ENOATTR → present, not opaque.
|
|
89
|
-
const se = (gf.stderr ?? '').toLowerCase();
|
|
90
|
-
if (se.includes('no such attribute') || se.includes('enoattr') || se.includes('not found'))
|
|
91
|
-
return '';
|
|
92
|
-
// other failure (e.g. permission) → fall through to python.
|
|
93
|
-
}
|
|
94
|
-
// python3's os.getxattr — exit 0 + 'y' on stdout when opaque; exit 0 + '' when
|
|
95
|
-
// the attr is absent; exit 2 only if python itself is unavailable.
|
|
96
|
-
const py = spawnSync('python3', [
|
|
97
|
-
'-c',
|
|
98
|
-
"import os,sys\n" +
|
|
99
|
-
"try:\n" +
|
|
100
|
-
" v=os.getxattr(sys.argv[1],'trusted.overlay.opaque')\n" +
|
|
101
|
-
" sys.stdout.write(v.decode('latin1','replace'))\n" +
|
|
102
|
-
"except OSError as e:\n" +
|
|
103
|
-
" import errno\n" +
|
|
104
|
-
" sys.exit(0) if e.errno in (errno.ENODATA,errno.ENOATTR if hasattr(errno,'ENOATTR') else errno.ENODATA) else sys.exit(3)\n",
|
|
105
|
-
p,
|
|
106
|
-
], { encoding: 'utf8' });
|
|
107
|
-
if (py.error == null && py.status === 0)
|
|
108
|
-
return (py.stdout ?? '').trim() === 'y' ? 'y' : '';
|
|
109
|
-
return null; // undeterminable
|
|
110
|
-
}
|
|
111
|
-
/** Walk the upper layer, classifying every entry into an UpperChange. */
|
|
112
|
-
function walkUpper(upper) {
|
|
113
|
-
const changes = [];
|
|
114
|
-
const recurse = (dir) => {
|
|
115
|
-
let entries = [];
|
|
116
|
-
try {
|
|
117
|
-
entries = readdirSync(dir);
|
|
118
|
-
}
|
|
119
|
-
catch {
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
for (const name of entries) {
|
|
123
|
-
const full = join(dir, name);
|
|
124
|
-
const rel = relative(upper, full);
|
|
125
|
-
if (isWhiteout(full)) {
|
|
126
|
-
changes.push({ rel, kind: 'delete' });
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
let st;
|
|
130
|
-
try {
|
|
131
|
-
st = lstatSync(full);
|
|
132
|
-
}
|
|
133
|
-
catch {
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
136
|
-
if (st.isSymbolicLink()) {
|
|
137
|
-
// A symlink is landed as a symlink (NOT dereferenced into a content copy,
|
|
138
|
-
// which would destroy the link and could snapshot out-of-tree host data).
|
|
139
|
-
let linkTarget = '';
|
|
140
|
-
try {
|
|
141
|
-
linkTarget = readlinkSync(full);
|
|
142
|
-
}
|
|
143
|
-
catch { /* */ }
|
|
144
|
-
changes.push({ rel, kind: 'symlink', linkTarget });
|
|
145
|
-
}
|
|
146
|
-
else if (st.isDirectory()) {
|
|
147
|
-
// Opacity is recorded; the new-vs-replace decision is deferred to apply
|
|
148
|
-
// (where the target — the lower — is known). Either way we recurse so the
|
|
149
|
-
// dir's surviving children land as their own 'file'/'symlink' changes.
|
|
150
|
-
const opaque = readOpaqueXattr(full);
|
|
151
|
-
if (opaque === 'y' || opaque === null)
|
|
152
|
-
changes.push({ rel, kind: 'opaque' });
|
|
153
|
-
recurse(full);
|
|
154
|
-
}
|
|
155
|
-
else if (st.isFile()) {
|
|
156
|
-
changes.push({ rel, kind: 'file' });
|
|
157
|
-
}
|
|
158
|
-
// other special files (fifos/sockets/non-whiteout devices) are skipped.
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
recurse(upper);
|
|
162
|
-
return changes;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Compute the agent's changeset from the session's overlay upper layer, with a
|
|
166
|
-
* human-readable preview (per-file `git diff --no-index` vs the real project).
|
|
167
|
-
*/
|
|
168
|
-
export function computeSandboxDiff(dataDir, sessionId, locale) {
|
|
169
|
-
const upper = upperDir(dataDir, sessionId);
|
|
170
|
-
if (!existsSync(upper))
|
|
171
|
-
return { ok: false, error: t('sandbox.no_clone', undefined, locale) };
|
|
172
|
-
let changes;
|
|
173
|
-
try {
|
|
174
|
-
changes = walkUpper(upper);
|
|
175
|
-
}
|
|
176
|
-
catch (e) {
|
|
177
|
-
return { ok: false, error: t('sandbox.diff_failed', { detail: (e?.message ?? e).toString().slice(0, 300) }, locale) };
|
|
178
|
-
}
|
|
179
|
-
if (changes.length === 0) {
|
|
180
|
-
return { ok: true, empty: true, patch: '', statText: '', files: 0, insertions: 0, deletions: 0 };
|
|
181
|
-
}
|
|
182
|
-
// Diff each upper file against the SAME-NAMED real file in the overlay lower
|
|
183
|
-
// (the recorded project root) so modified files show a true unified diff (not
|
|
184
|
-
// the whole file as "added"), then rewrite git's --no-index headers to
|
|
185
|
-
// project-relative a/<rel> b/<rel> — clean for the card AND `git apply`-able as
|
|
186
|
-
// the .patch file. New files diff vs /dev/null; deletions diff lower vs /dev/null.
|
|
187
|
-
const lower = projectLower(dataDir, sessionId); // real project root ('' if unknown)
|
|
188
|
-
const relDiff = (oldPath, newPath, rel) => {
|
|
189
|
-
let out = '';
|
|
190
|
-
try {
|
|
191
|
-
out = spawnSync('git', ['diff', '--no-index', '--', oldPath, newPath], { encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 }).stdout ?? '';
|
|
192
|
-
}
|
|
193
|
-
catch { /* */ }
|
|
194
|
-
if (!out)
|
|
195
|
-
return '';
|
|
196
|
-
return out.split('\n').map(line => {
|
|
197
|
-
if (line.startsWith('diff --git '))
|
|
198
|
-
return `diff --git a/${rel} b/${rel}`;
|
|
199
|
-
if (line.startsWith('--- '))
|
|
200
|
-
return line.includes('/dev/null') ? '--- /dev/null' : `--- a/${rel}`;
|
|
201
|
-
if (line.startsWith('+++ '))
|
|
202
|
-
return line.includes('/dev/null') ? '+++ /dev/null' : `+++ b/${rel}`;
|
|
203
|
-
return line;
|
|
204
|
-
}).join('\n');
|
|
205
|
-
};
|
|
206
|
-
const countPlus = (b) => b.split('\n').filter(l => l.startsWith('+') && !l.startsWith('+++')).length;
|
|
207
|
-
const countMinus = (b) => b.split('\n').filter(l => l.startsWith('-') && !l.startsWith('---')).length;
|
|
208
|
-
const statLines = [];
|
|
209
|
-
const patchParts = [];
|
|
210
|
-
let insertions = 0, deletions = 0, fileCount = 0;
|
|
211
|
-
for (const c of changes) {
|
|
212
|
-
if (c.kind === 'delete') {
|
|
213
|
-
const lowFile = lower ? join(lower, c.rel) : '';
|
|
214
|
-
const body = (lowFile && existsSync(lowFile))
|
|
215
|
-
? relDiff(lowFile, '/dev/null', c.rel)
|
|
216
|
-
: `diff --git a/${c.rel} b/${c.rel}\ndeleted file\n--- a/${c.rel}\n+++ /dev/null\n`;
|
|
217
|
-
statLines.push(`D ${c.rel}`);
|
|
218
|
-
deletions += countMinus(body) || 1;
|
|
219
|
-
patchParts.push(body);
|
|
220
|
-
fileCount++;
|
|
221
|
-
continue;
|
|
222
|
-
}
|
|
223
|
-
if (c.kind === 'symlink') {
|
|
224
|
-
statLines.push(`L ${c.rel} -> ${c.linkTarget ?? ''}`);
|
|
225
|
-
patchParts.push(`# symlink ${c.rel} -> ${c.linkTarget ?? ''} (recreated on land; not in this text patch)`);
|
|
226
|
-
fileCount++;
|
|
227
|
-
continue;
|
|
228
|
-
}
|
|
229
|
-
if (c.kind === 'opaque') {
|
|
230
|
-
// Replaced directory; its surviving children land as their own 'file'
|
|
231
|
-
// changes (walkUpper recursed), so no diff body here — just note it.
|
|
232
|
-
statLines.push(`R ${c.rel}/ (directory replaced)`);
|
|
233
|
-
continue;
|
|
234
|
-
}
|
|
235
|
-
// regular file: modified (exists in lower) vs new
|
|
236
|
-
const upPath = join(upper, c.rel);
|
|
237
|
-
const lowFile = lower ? join(lower, c.rel) : '';
|
|
238
|
-
const isMod = !!(lowFile && existsSync(lowFile));
|
|
239
|
-
const body = relDiff(isMod ? lowFile : '/dev/null', upPath, c.rel)
|
|
240
|
-
|| `diff --git a/${c.rel} b/${c.rel}\n(binary or unreadable: ${c.rel})\n`;
|
|
241
|
-
statLines.push(`${isMod ? 'M' : 'A'} ${c.rel}`);
|
|
242
|
-
insertions += countPlus(body);
|
|
243
|
-
deletions += countMinus(body);
|
|
244
|
-
patchParts.push(body);
|
|
245
|
-
fileCount++;
|
|
246
|
-
}
|
|
247
|
-
return {
|
|
248
|
-
ok: true,
|
|
249
|
-
empty: false,
|
|
250
|
-
patch: patchParts.join('\n'),
|
|
251
|
-
statText: statLines.join('\n'),
|
|
252
|
-
files: fileCount,
|
|
253
|
-
insertions,
|
|
254
|
-
deletions,
|
|
255
|
-
};
|
|
256
|
-
}
|
|
257
|
-
/**
|
|
258
|
-
* Apply the session's overlay upper changeset onto the real target project:
|
|
259
|
-
* - regular file in upper → mkdir -p parent, copy over the real file
|
|
260
|
-
* - symlink in upper → recreate the link (NOT a dereferenced copy)
|
|
261
|
-
* - whiteout → remove the corresponding real file/dir
|
|
262
|
-
* - opaque dir → only when the dir ALSO exists in the target (= a
|
|
263
|
-
* wholesale replace): drop the stale lower contents,
|
|
264
|
-
* then re-create it (its surviving files arrive as
|
|
265
|
-
* separate 'file'/'symlink' changes). A purely-new
|
|
266
|
-
* opaque dir is just mkdir'd (never rm -rf'd).
|
|
267
|
-
*
|
|
268
|
-
* Two-phase for safety:
|
|
269
|
-
* 1) PRE-VALIDATE every source is landable (dangling symlink, unreadable regular
|
|
270
|
-
* file, undeterminable opacity on a dir that exists in the target) BEFORE we
|
|
271
|
-
* mutate anything — so the common mid-loop failure (a dangling relative
|
|
272
|
-
* symlink) is caught up front and the real project is left untouched.
|
|
273
|
-
* 2) APPLY; if a per-file op still throws (race / permission / ENOSPC), we
|
|
274
|
-
* report which files were already applied so the owner isn't told "failed"
|
|
275
|
-
* with the repo silently half-landed and no clue about its state.
|
|
276
|
-
*/
|
|
277
|
-
export function applySandboxDiff(targetDir, dataDir, sessionId, locale) {
|
|
278
|
-
const upper = upperDir(dataDir, sessionId);
|
|
279
|
-
if (!existsSync(upper))
|
|
280
|
-
return { ok: false, error: t('sandbox.no_clone', undefined, locale) };
|
|
281
|
-
if (!existsSync(targetDir))
|
|
282
|
-
return { ok: false, error: t('sandbox.target_not_git', { dir: targetDir }, locale) };
|
|
283
|
-
let changes;
|
|
284
|
-
try {
|
|
285
|
-
changes = walkUpper(upper);
|
|
286
|
-
}
|
|
287
|
-
catch (e) {
|
|
288
|
-
return { ok: false, error: t('sandbox.apply_failed', { detail: (e?.message ?? e).toString().slice(0, 300) }, locale) };
|
|
289
|
-
}
|
|
290
|
-
if (changes.length === 0)
|
|
291
|
-
return { ok: false, error: t('sandbox.nothing_to_land', undefined, locale) };
|
|
292
|
-
// Project LOWER (create-time) — the reliable new-vs-replace discriminator for
|
|
293
|
-
// opaque dirs; '' when unknown → fall back to the live target.
|
|
294
|
-
const lower = projectLower(dataDir, sessionId);
|
|
295
|
-
// Does dir `rel` count as a REPLACE (existed in the lower) vs a fresh NEW dir?
|
|
296
|
-
const existedInLower = (rel) => lower ? existsSync(join(lower, rel)) : existsSync(join(targetDir, rel));
|
|
297
|
-
// ── Phase 1: pre-validate — fail-closed BEFORE any mutation ────────────────
|
|
298
|
-
const preErrors = [];
|
|
299
|
-
for (const c of changes) {
|
|
300
|
-
if (c.kind === 'file') {
|
|
301
|
-
const src = join(upper, c.rel);
|
|
302
|
-
// Resolve via lstat: a regular file must be readable; a broken/special src
|
|
303
|
-
// would make the in-loop copyFileSync throw mid-land. Catch it now.
|
|
304
|
-
try {
|
|
305
|
-
lstatSync(src);
|
|
306
|
-
}
|
|
307
|
-
catch (e) {
|
|
308
|
-
preErrors.push(`${c.rel}: source missing (${e?.code ?? e})`);
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
else if (c.kind === 'symlink') {
|
|
312
|
-
if (!c.linkTarget)
|
|
313
|
-
preErrors.push(`${c.rel}: unreadable symlink target`);
|
|
314
|
-
}
|
|
315
|
-
else if (c.kind === 'opaque') {
|
|
316
|
-
// Only an opaque dir that existed in the LOWER triggers a destructive
|
|
317
|
-
// rm -rf (a wholesale replace). For such a dir, if we could NOT determine
|
|
318
|
-
// opacity (readOpaqueXattr → null, no xattr tooling) we MUST NOT guess
|
|
319
|
-
// "not opaque" (that leaks stale lower files); fail-closed with a clear
|
|
320
|
-
// message. A purely-NEW opaque dir needs no opacity read at all.
|
|
321
|
-
if (existedInLower(c.rel)) {
|
|
322
|
-
const opaque = readOpaqueXattr(join(upper, c.rel));
|
|
323
|
-
if (opaque === null) {
|
|
324
|
-
preErrors.push(`${c.rel}/: cannot determine overlay opacity (install the "attr" package, i.e. getfattr) — refusing to land a possibly-replaced directory without knowing whether to drop its stale contents`);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
if (preErrors.length > 0) {
|
|
330
|
-
return { ok: false, error: t('sandbox.apply_failed', { detail: `pre-flight (no changes applied): ${preErrors.slice(0, 8).join('; ').slice(0, 380)}` }, locale) };
|
|
331
|
-
}
|
|
332
|
-
// ── Phase 2: apply ─────────────────────────────────────────────────────────
|
|
333
|
-
const applied = [];
|
|
334
|
-
try {
|
|
335
|
-
for (const c of changes) {
|
|
336
|
-
const real = join(targetDir, c.rel);
|
|
337
|
-
if (c.kind === 'delete') {
|
|
338
|
-
try {
|
|
339
|
-
rmSync(real, { recursive: true, force: true });
|
|
340
|
-
}
|
|
341
|
-
catch { /* already gone */ }
|
|
342
|
-
applied.push(`-${c.rel}`);
|
|
343
|
-
continue;
|
|
344
|
-
}
|
|
345
|
-
if (c.kind === 'opaque') {
|
|
346
|
-
// Wholesale REPLACE only when the dir existed in the LOWER (create-time)
|
|
347
|
-
// — drop its stale contents. A purely-NEW opaque dir is just mkdir'd, so
|
|
348
|
-
// we never rm -rf unrelated real files that drifted into the live target
|
|
349
|
-
// under a path the agent merely created fresh (the new-dir clobber).
|
|
350
|
-
if (existedInLower(c.rel) && existsSync(real)) {
|
|
351
|
-
try {
|
|
352
|
-
rmSync(real, { recursive: true, force: true });
|
|
353
|
-
}
|
|
354
|
-
catch { /* */ }
|
|
355
|
-
}
|
|
356
|
-
mkdirSync(real, { recursive: true });
|
|
357
|
-
applied.push(`R ${c.rel}/`);
|
|
358
|
-
continue;
|
|
359
|
-
}
|
|
360
|
-
if (c.kind === 'symlink') {
|
|
361
|
-
// Recreate the link verbatim (preserve symlink-ness; do NOT dereference).
|
|
362
|
-
mkdirSync(dirname(real), { recursive: true });
|
|
363
|
-
try {
|
|
364
|
-
unlinkSync(real);
|
|
365
|
-
}
|
|
366
|
-
catch { /* not present */ }
|
|
367
|
-
try {
|
|
368
|
-
rmSync(real, { recursive: true, force: true });
|
|
369
|
-
}
|
|
370
|
-
catch { /* was a dir */ }
|
|
371
|
-
symlinkSync(c.linkTarget ?? '', real);
|
|
372
|
-
applied.push(`L ${c.rel}`);
|
|
373
|
-
continue;
|
|
374
|
-
}
|
|
375
|
-
// regular file: copy the upper content over the real file.
|
|
376
|
-
mkdirSync(dirname(real), { recursive: true });
|
|
377
|
-
// If a symlink/dir is squatting the target path, clear it first so copy lands a file.
|
|
378
|
-
try {
|
|
379
|
-
const st = lstatSync(real);
|
|
380
|
-
if (st.isSymbolicLink() || st.isDirectory())
|
|
381
|
-
rmSync(real, { recursive: true, force: true });
|
|
382
|
-
}
|
|
383
|
-
catch { /* */ }
|
|
384
|
-
copyFileSync(join(upper, c.rel), real);
|
|
385
|
-
applied.push(c.rel);
|
|
386
|
-
}
|
|
387
|
-
return { ok: true };
|
|
388
|
-
}
|
|
389
|
-
catch (e) {
|
|
390
|
-
const detail = `${(e?.message ?? e).toString().slice(0, 240)} — already applied (${applied.length}): ${applied.slice(0, 12).join(', ').slice(0, 200)}`;
|
|
391
|
-
return { ok: false, error: t('sandbox.apply_failed', { detail }, locale) };
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
//# sourceMappingURL=sandbox-land.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-land.js","sourceRoot":"","sources":["../../src/services/sandbox-land.ts"],"names":[],"mappings":"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"}
|