botmux 3.10.0 → 3.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.runtime-build-id +1 -1
- package/dist/adapters/backend/herdr-backend.d.ts +4 -3
- package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
- package/dist/adapters/backend/herdr-backend.js +11 -8
- package/dist/adapters/backend/herdr-backend.js.map +1 -1
- package/dist/adapters/backend/pty-backend.d.ts +1 -1
- package/dist/adapters/backend/pty-backend.d.ts.map +1 -1
- package/dist/adapters/backend/pty-backend.js +4 -1
- package/dist/adapters/backend/pty-backend.js.map +1 -1
- package/dist/adapters/backend/riff-backend.d.ts +29 -5
- package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
- package/dist/adapters/backend/riff-backend.js +302 -31
- package/dist/adapters/backend/riff-backend.js.map +1 -1
- package/dist/adapters/backend/sandbox.d.ts +6 -0
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +7 -0
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +4 -1
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +37 -3
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.js.map +1 -1
- package/dist/adapters/backend/zellij-backend.d.ts +3 -3
- package/dist/adapters/backend/zellij-backend.d.ts.map +1 -1
- package/dist/adapters/backend/zellij-backend.js +9 -3
- package/dist/adapters/backend/zellij-backend.js.map +1 -1
- package/dist/adapters/backend/zellij-observe-backend.d.ts +3 -3
- package/dist/adapters/backend/zellij-observe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/zellij-observe-backend.js +12 -7
- package/dist/adapters/backend/zellij-observe-backend.js.map +1 -1
- package/dist/adapters/cli/codex-app.d.ts.map +1 -1
- package/dist/adapters/cli/codex-app.js +11 -2
- package/dist/adapters/cli/codex-app.js.map +1 -1
- package/dist/adapters/cli/read-isolation.d.ts +35 -2
- package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
- package/dist/adapters/cli/read-isolation.js +88 -7
- package/dist/adapters/cli/read-isolation.js.map +1 -1
- package/dist/adapters/cli/runner-input.d.ts +15 -14
- package/dist/adapters/cli/runner-input.d.ts.map +1 -1
- package/dist/adapters/cli/runner-input.js +64 -26
- package/dist/adapters/cli/runner-input.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +20 -5
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/bot-registry.d.ts +24 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +110 -5
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/fleet-shutdown.d.ts +47 -0
- package/dist/cli/fleet-shutdown.d.ts.map +1 -0
- package/dist/cli/fleet-shutdown.js +387 -0
- package/dist/cli/fleet-shutdown.js.map +1 -0
- package/dist/cli/pm2-descriptor-guard.d.ts +19 -0
- package/dist/cli/pm2-descriptor-guard.d.ts.map +1 -0
- package/dist/cli/pm2-descriptor-guard.js +122 -0
- package/dist/cli/pm2-descriptor-guard.js.map +1 -0
- package/dist/cli/pm2-exact-start.d.ts +16 -0
- package/dist/cli/pm2-exact-start.d.ts.map +1 -0
- package/dist/cli/pm2-exact-start.js +63 -0
- package/dist/cli/pm2-exact-start.js.map +1 -0
- package/dist/cli/pm2-god-admission.d.ts +8 -0
- package/dist/cli/pm2-god-admission.d.ts.map +1 -0
- package/dist/cli/pm2-god-admission.js +25 -0
- package/dist/cli/pm2-god-admission.js.map +1 -0
- package/dist/cli/pm2-jlist.d.ts +13 -0
- package/dist/cli/pm2-jlist.d.ts.map +1 -0
- package/dist/cli/pm2-jlist.js +108 -0
- package/dist/cli/pm2-jlist.js.map +1 -0
- package/dist/cli/pm2-preflight.d.ts +10 -0
- package/dist/cli/pm2-preflight.d.ts.map +1 -0
- package/dist/cli/pm2-preflight.js +23 -0
- package/dist/cli/pm2-preflight.js.map +1 -0
- package/dist/cli/pm2-shutdown-capability.d.ts +27 -0
- package/dist/cli/pm2-shutdown-capability.d.ts.map +1 -0
- package/dist/cli/pm2-shutdown-capability.js +161 -0
- package/dist/cli/pm2-shutdown-capability.js.map +1 -0
- package/dist/cli/pm2-start-transaction.d.ts +55 -0
- package/dist/cli/pm2-start-transaction.d.ts.map +1 -0
- package/dist/cli/pm2-start-transaction.js +220 -0
- package/dist/cli/pm2-start-transaction.js.map +1 -0
- package/dist/cli/send-dispatch.d.ts +12 -0
- package/dist/cli/send-dispatch.d.ts.map +1 -1
- package/dist/cli/send-dispatch.js +31 -4
- package/dist/cli/send-dispatch.js.map +1 -1
- package/dist/cli/session-list-liveness.d.ts +1 -0
- package/dist/cli/session-list-liveness.d.ts.map +1 -1
- package/dist/cli/session-list-liveness.js +6 -0
- package/dist/cli/session-list-liveness.js.map +1 -1
- package/dist/cli/session-picker-layout.d.ts +26 -0
- package/dist/cli/session-picker-layout.d.ts.map +1 -0
- package/dist/cli/session-picker-layout.js +123 -0
- package/dist/cli/session-picker-layout.js.map +1 -0
- package/dist/cli/session-picker-viewport.d.ts +49 -0
- package/dist/cli/session-picker-viewport.d.ts.map +1 -0
- package/dist/cli/session-picker-viewport.js +46 -0
- package/dist/cli/session-picker-viewport.js.map +1 -0
- package/dist/cli/supervisor-shutdown-client.d.ts +31 -0
- package/dist/cli/supervisor-shutdown-client.d.ts.map +1 -0
- package/dist/cli/supervisor-shutdown-client.js +146 -0
- package/dist/cli/supervisor-shutdown-client.js.map +1 -0
- package/dist/cli/terminal-width.d.ts +48 -0
- package/dist/cli/terminal-width.d.ts.map +1 -0
- package/dist/cli/terminal-width.js +119 -0
- package/dist/cli/terminal-width.js.map +1 -0
- package/dist/cli/vc-agent.d.ts.map +1 -1
- package/dist/cli/vc-agent.js +1 -1
- package/dist/cli/vc-agent.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2269 -716
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-runner.js +1630 -125
- package/dist/codex-app-runner.js.map +1 -1
- package/dist/core/ask-api.d.ts +8 -1
- package/dist/core/ask-api.d.ts.map +1 -1
- package/dist/core/ask-api.js +18 -0
- package/dist/core/ask-api.js.map +1 -1
- package/dist/core/ask-broker.d.ts +20 -0
- package/dist/core/ask-broker.d.ts.map +1 -1
- package/dist/core/ask-broker.js +467 -47
- package/dist/core/ask-broker.js.map +1 -1
- package/dist/core/ask-persist-store.d.ts +126 -0
- package/dist/core/ask-persist-store.d.ts.map +1 -0
- package/dist/core/ask-persist-store.js +188 -0
- package/dist/core/ask-persist-store.js.map +1 -0
- package/dist/core/ask-types.d.ts +80 -0
- package/dist/core/ask-types.d.ts.map +1 -1
- package/dist/core/ask-types.js +62 -0
- package/dist/core/ask-types.js.map +1 -1
- package/dist/core/cli-session-id-publisher.d.ts +20 -0
- package/dist/core/cli-session-id-publisher.d.ts.map +1 -0
- package/dist/core/cli-session-id-publisher.js +21 -0
- package/dist/core/cli-session-id-publisher.js.map +1 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +427 -255
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/cost-calculator.d.ts +13 -0
- package/dist/core/cost-calculator.d.ts.map +1 -1
- package/dist/core/cost-calculator.js +385 -26
- package/dist/core/cost-calculator.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +9 -0
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +842 -288
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/explicit-session-backing-cleanup.d.ts +49 -0
- package/dist/core/explicit-session-backing-cleanup.d.ts.map +1 -0
- package/dist/core/explicit-session-backing-cleanup.js +76 -0
- package/dist/core/explicit-session-backing-cleanup.js.map +1 -0
- package/dist/core/idle-worker-sweeper.d.ts +20 -0
- package/dist/core/idle-worker-sweeper.d.ts.map +1 -1
- package/dist/core/idle-worker-sweeper.js +18 -0
- package/dist/core/idle-worker-sweeper.js.map +1 -1
- package/dist/core/inflight-input-tracker.d.ts +10 -0
- package/dist/core/inflight-input-tracker.d.ts.map +1 -1
- package/dist/core/inflight-input-tracker.js +7 -0
- package/dist/core/inflight-input-tracker.js.map +1 -1
- package/dist/core/managed-origin-attestation.d.ts +51 -0
- package/dist/core/managed-origin-attestation.d.ts.map +1 -0
- package/dist/core/managed-origin-attestation.js +208 -0
- package/dist/core/managed-origin-attestation.js.map +1 -0
- package/dist/core/managed-origin-capability.d.ts +62 -3
- package/dist/core/managed-origin-capability.d.ts.map +1 -1
- package/dist/core/managed-origin-capability.js +419 -9
- package/dist/core/managed-origin-capability.js.map +1 -1
- package/dist/core/pending-repo-journal.d.ts +6 -0
- package/dist/core/pending-repo-journal.d.ts.map +1 -0
- package/dist/core/pending-repo-journal.js +85 -0
- package/dist/core/pending-repo-journal.js.map +1 -0
- package/dist/core/persistent-backend.d.ts +6 -1
- package/dist/core/persistent-backend.d.ts.map +1 -1
- package/dist/core/persistent-backend.js +12 -6
- package/dist/core/persistent-backend.js.map +1 -1
- package/dist/core/process-start-identity.d.ts +3 -0
- package/dist/core/process-start-identity.d.ts.map +1 -0
- package/dist/core/process-start-identity.js +62 -0
- package/dist/core/process-start-identity.js.map +1 -0
- package/dist/core/raw-command-writer.d.ts +34 -0
- package/dist/core/raw-command-writer.d.ts.map +1 -0
- package/dist/core/raw-command-writer.js +48 -0
- package/dist/core/raw-command-writer.js.map +1 -0
- package/dist/core/reply-target.d.ts +85 -22
- package/dist/core/reply-target.d.ts.map +1 -1
- package/dist/core/reply-target.js +267 -32
- package/dist/core/reply-target.js.map +1 -1
- package/dist/core/resource-monitor/runtime.d.ts.map +1 -1
- package/dist/core/resource-monitor/runtime.js +4 -1
- package/dist/core/resource-monitor/runtime.js.map +1 -1
- package/dist/core/restart-report.d.ts +6 -1
- package/dist/core/restart-report.d.ts.map +1 -1
- package/dist/core/restart-report.js +22 -4
- package/dist/core/restart-report.js.map +1 -1
- package/dist/core/riff-shutdown-detach.d.ts +164 -0
- package/dist/core/riff-shutdown-detach.d.ts.map +1 -0
- package/dist/core/riff-shutdown-detach.js +787 -0
- package/dist/core/riff-shutdown-detach.js.map +1 -0
- package/dist/core/riff-worker-shutdown-readiness.d.ts +17 -0
- package/dist/core/riff-worker-shutdown-readiness.d.ts.map +1 -0
- package/dist/core/riff-worker-shutdown-readiness.js +21 -0
- package/dist/core/riff-worker-shutdown-readiness.js.map +1 -0
- package/dist/core/session-manager.d.ts +6 -6
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +1227 -594
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-marker.d.ts +1 -1
- package/dist/core/session-marker.d.ts.map +1 -1
- package/dist/core/session-marker.js +2 -2
- package/dist/core/session-marker.js.map +1 -1
- package/dist/core/session-mutation-guard.d.ts +17 -0
- package/dist/core/session-mutation-guard.d.ts.map +1 -0
- package/dist/core/session-mutation-guard.js +33 -0
- package/dist/core/session-mutation-guard.js.map +1 -0
- package/dist/core/shutdown-budgets.d.ts +27 -0
- package/dist/core/shutdown-budgets.d.ts.map +1 -0
- package/dist/core/shutdown-budgets.js +47 -0
- package/dist/core/shutdown-budgets.js.map +1 -0
- package/dist/core/supervisor-shutdown-ipc.d.ts +10 -0
- package/dist/core/supervisor-shutdown-ipc.d.ts.map +1 -0
- package/dist/core/supervisor-shutdown-ipc.js +10 -0
- package/dist/core/supervisor-shutdown-ipc.js.map +1 -0
- package/dist/core/supervisor-shutdown-protocol.d.ts +16 -0
- package/dist/core/supervisor-shutdown-protocol.d.ts.map +1 -0
- package/dist/core/supervisor-shutdown-protocol.js +16 -0
- package/dist/core/supervisor-shutdown-protocol.js.map +1 -0
- package/dist/core/trigger-final-suppression.d.ts +4 -0
- package/dist/core/trigger-final-suppression.d.ts.map +1 -1
- package/dist/core/trigger-final-suppression.js +6 -11
- package/dist/core/trigger-final-suppression.js.map +1 -1
- package/dist/core/trigger-session.d.ts +70 -0
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +923 -145
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +94 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +9 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +194 -13
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +2597 -547
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +76 -2
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +2255 -773
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/bot-payload.d.ts +20 -0
- package/dist/dashboard/bot-payload.d.ts.map +1 -1
- package/dist/dashboard/bot-payload.js +24 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/feed-groups.d.ts +17 -0
- package/dist/dashboard/feed-groups.d.ts.map +1 -0
- package/dist/dashboard/feed-groups.js +75 -0
- package/dist/dashboard/feed-groups.js.map +1 -0
- package/dist/dashboard/session-card-model.d.ts +1 -1
- package/dist/dashboard/session-card-model.d.ts.map +1 -1
- package/dist/dashboard/session-card-model.js +8 -5
- package/dist/dashboard/session-card-model.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +4 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +139 -46
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +4 -0
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
- package/dist/dashboard/web/connectors-page.js +40 -3
- package/dist/dashboard/web/connectors-page.js.map +1 -1
- package/dist/dashboard/web/groups-page.d.ts.map +1 -1
- package/dist/dashboard/web/groups-page.js +95 -2
- package/dist/dashboard/web/groups-page.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +86 -40
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/kanban-model.js +1 -1
- package/dist/dashboard/web/kanban-model.js.map +1 -1
- package/dist/dashboard/web/overview-page.d.ts.map +1 -1
- package/dist/dashboard/web/overview-page.js +3 -2
- package/dist/dashboard/web/overview-page.js.map +1 -1
- package/dist/dashboard/web/overview.d.ts +3 -0
- package/dist/dashboard/web/overview.d.ts.map +1 -1
- package/dist/dashboard/web/overview.js +2 -0
- package/dist/dashboard/web/overview.js.map +1 -1
- package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-kanban.js +2 -0
- 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 +103 -2
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +3 -2
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/ui.d.ts +8 -0
- package/dist/dashboard/web/ui.d.ts.map +1 -1
- package/dist/dashboard/web/ui.js +15 -0
- package/dist/dashboard/web/ui.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-GED4FEMS.js +10 -0
- package/dist/dashboard-web/chunks/chunk-6J5LS5AU.js +51 -0
- package/dist/dashboard-web/chunks/{chunk-ZU3UUKAR.js → chunk-HK7NIBJG.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-3UE7S77S.js → chunk-KRHWZEXU.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-VBXJOJFH.js +1 -0
- package/dist/dashboard-web/chunks/connectors-page-EELM66G3.js +1 -0
- package/dist/dashboard-web/chunks/groups-page-WKUV6E42.js +8 -0
- package/dist/dashboard-web/chunks/{insights-page-T2ZX2RWL.js → insights-page-54UBPPOC.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-YNVBAGR6.js → monitor-room-PORHVKRH.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-LHM55YWN.js → monitoring-page-XGA7AXNL.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-ATXVP7PW.js → office-page-AO3AFG45.js} +1 -1
- package/dist/dashboard-web/chunks/overview-page-F5BUTYR6.js +1 -0
- package/dist/dashboard-web/chunks/{roles-page-56VWM6CD.js → roles-page-M5GIASJU.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-S5K6U4EO.js → schedules-page-O232WQRR.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-YFRPSTIL.js +6 -0
- package/dist/dashboard-web/chunks/{settings-page-QUZDQARR.js → settings-page-OJAZLZQT.js} +1 -1
- package/dist/dashboard-web/chunks/{skills-page-IFY7AEND.js → skills-page-EFZQPWV4.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-C7FJQPFZ.js → team-federation-page-ZJVAP7HW.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-2LMF3WWR.js → v3-page-GYWTRGO2.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-3XC6QRMY.js → whiteboards-page-MSDAG6P7.js} +1 -1
- package/dist/dashboard-web/style.css +255 -0
- package/dist/dashboard.js +172 -7
- package/dist/dashboard.js.map +1 -1
- package/dist/desktop/renderer/app.js +21 -0
- package/dist/desktop/renderer/app.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +35 -9
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +35 -9
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/ask-card.d.ts +23 -0
- package/dist/im/lark/ask-card.d.ts.map +1 -1
- package/dist/im/lark/ask-card.js +94 -4
- package/dist/im/lark/ask-card.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +6 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +112 -15
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +496 -310
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +7 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +39 -26
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/doc-comment.d.ts +7 -4
- package/dist/im/lark/doc-comment.d.ts.map +1 -1
- package/dist/im/lark/doc-comment.js +19 -6
- package/dist/im/lark/doc-comment.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +16 -0
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +88 -23
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/forward-followup-content.d.ts.map +1 -1
- package/dist/im/lark/forward-followup-content.js +9 -1
- package/dist/im/lark/forward-followup-content.js.map +1 -1
- package/dist/im/lark/grant-command.d.ts.map +1 -1
- package/dist/im/lark/grant-command.js +7 -4
- package/dist/im/lark/grant-command.js.map +1 -1
- package/dist/im/lark/md-card.d.ts +11 -0
- package/dist/im/lark/md-card.d.ts.map +1 -1
- package/dist/im/lark/md-card.js +46 -0
- package/dist/im/lark/md-card.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts +23 -2
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +58 -3
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/im/lark/overview-card.d.ts.map +1 -1
- package/dist/im/lark/overview-card.js +2 -1
- package/dist/im/lark/overview-card.js.map +1 -1
- package/dist/services/async-trigger-state.d.ts +6 -1
- package/dist/services/async-trigger-state.d.ts.map +1 -1
- package/dist/services/async-trigger-state.js +21 -0
- package/dist/services/async-trigger-state.js.map +1 -1
- package/dist/services/async-trigger-store.d.ts +23 -1
- package/dist/services/async-trigger-store.d.ts.map +1 -1
- package/dist/services/async-trigger-store.js +96 -13
- package/dist/services/async-trigger-store.js.map +1 -1
- package/dist/services/bridge-fallback-gate.d.ts +40 -0
- package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
- package/dist/services/bridge-fallback-gate.js +124 -24
- package/dist/services/bridge-fallback-gate.js.map +1 -1
- package/dist/services/codex-app-runner-protocol.d.ts +8 -0
- package/dist/services/codex-app-runner-protocol.d.ts.map +1 -1
- package/dist/services/codex-app-runner-protocol.js +9 -2
- package/dist/services/codex-app-runner-protocol.js.map +1 -1
- package/dist/services/codex-bridge-queue.d.ts +1 -0
- package/dist/services/codex-bridge-queue.d.ts.map +1 -1
- package/dist/services/codex-bridge-queue.js +1 -0
- package/dist/services/codex-bridge-queue.js.map +1 -1
- package/dist/services/codex-service-tier.d.ts +2 -0
- package/dist/services/codex-service-tier.d.ts.map +1 -1
- package/dist/services/codex-service-tier.js +1 -0
- package/dist/services/codex-service-tier.js.map +1 -1
- package/dist/services/codex-transcript.d.ts +27 -0
- package/dist/services/codex-transcript.d.ts.map +1 -1
- package/dist/services/codex-transcript.js +340 -2
- package/dist/services/codex-transcript.js.map +1 -1
- package/dist/services/grant-policy.d.ts +3 -0
- package/dist/services/grant-policy.d.ts.map +1 -1
- package/dist/services/grant-policy.js +5 -0
- package/dist/services/grant-policy.js.map +1 -1
- package/dist/services/grant-prefs-store.d.ts +6 -3
- package/dist/services/grant-prefs-store.d.ts.map +1 -1
- package/dist/services/grant-prefs-store.js +42 -12
- package/dist/services/grant-prefs-store.js.map +1 -1
- package/dist/services/hook-runner.d.ts +20 -1
- package/dist/services/hook-runner.d.ts.map +1 -1
- package/dist/services/hook-runner.js +17 -13
- package/dist/services/hook-runner.js.map +1 -1
- package/dist/services/idempotency-store.d.ts +134 -0
- package/dist/services/idempotency-store.d.ts.map +1 -0
- package/dist/services/idempotency-store.js +299 -0
- package/dist/services/idempotency-store.js.map +1 -0
- package/dist/services/jsonl-cursor.d.ts +7 -3
- package/dist/services/jsonl-cursor.d.ts.map +1 -1
- package/dist/services/jsonl-cursor.js +55 -31
- package/dist/services/jsonl-cursor.js.map +1 -1
- package/dist/services/open-platform-rename.d.ts.map +1 -1
- package/dist/services/open-platform-rename.js +1 -108
- package/dist/services/open-platform-rename.js.map +1 -1
- package/dist/services/restart-intent-store.d.ts +22 -2
- package/dist/services/restart-intent-store.d.ts.map +1 -1
- package/dist/services/restart-intent-store.js +160 -18
- package/dist/services/restart-intent-store.js.map +1 -1
- package/dist/services/sandbox-store.d.ts +22 -0
- package/dist/services/sandbox-store.d.ts.map +1 -1
- package/dist/services/sandbox-store.js +37 -8
- package/dist/services/sandbox-store.js.map +1 -1
- package/dist/services/send-policy.d.ts +41 -33
- package/dist/services/send-policy.d.ts.map +1 -1
- package/dist/services/send-policy.js +39 -40
- package/dist/services/send-policy.js.map +1 -1
- package/dist/services/session-store.d.ts +66 -0
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +403 -67
- package/dist/services/session-store.js.map +1 -1
- package/dist/services/submit-notification.d.ts +3 -0
- package/dist/services/submit-notification.d.ts.map +1 -0
- package/dist/services/submit-notification.js +15 -0
- package/dist/services/submit-notification.js.map +1 -0
- package/dist/services/traex-transcript.d.ts +25 -2
- package/dist/services/traex-transcript.d.ts.map +1 -1
- package/dist/services/traex-transcript.js +133 -1
- package/dist/services/traex-transcript.js.map +1 -1
- package/dist/services/trigger-types.d.ts +13 -1
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js +39 -0
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/services/voice/index.d.ts +3 -2
- package/dist/services/voice/index.d.ts.map +1 -1
- package/dist/services/voice/index.js +5 -5
- package/dist/services/voice/index.js.map +1 -1
- package/dist/services/voice/openai.d.ts +2 -1
- package/dist/services/voice/openai.d.ts.map +1 -1
- package/dist/services/voice/openai.js +2 -1
- package/dist/services/voice/openai.js.map +1 -1
- package/dist/services/voice/sami.d.ts +5 -2
- package/dist/services/voice/sami.d.ts.map +1 -1
- package/dist/services/voice/sami.js +19 -4
- package/dist/services/voice/sami.js.map +1 -1
- package/dist/setup/bots-store.d.ts.map +1 -1
- package/dist/setup/bots-store.js +10 -4
- package/dist/setup/bots-store.js.map +1 -1
- package/dist/setup/lark-scopes.json +2 -0
- package/dist/setup/open-platform-automation.d.ts +9 -1
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +44 -15
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/setup/open-platform-visibility.d.ts +42 -0
- package/dist/setup/open-platform-visibility.d.ts.map +1 -0
- package/dist/setup/open-platform-visibility.js +133 -0
- package/dist/setup/open-platform-visibility.js.map +1 -0
- package/dist/setup/verify-permissions.d.ts.map +1 -1
- package/dist/setup/verify-permissions.js +6 -0
- package/dist/setup/verify-permissions.js.map +1 -1
- package/dist/skills/definitions.js +2 -2
- package/dist/types.d.ts +290 -13
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/bot-routing.d.ts +1 -0
- package/dist/utils/bot-routing.d.ts.map +1 -1
- package/dist/utils/bot-routing.js +1 -1
- package/dist/utils/bot-routing.js.map +1 -1
- package/dist/utils/child-env.d.ts +1 -1
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +9 -0
- package/dist/utils/child-env.js.map +1 -1
- package/dist/utils/codex-app-control.d.ts +438 -0
- package/dist/utils/codex-app-control.d.ts.map +1 -0
- package/dist/utils/codex-app-control.js +2336 -0
- package/dist/utils/codex-app-control.js.map +1 -0
- package/dist/utils/codex-app-dispatch-ledger.d.ts +78 -0
- package/dist/utils/codex-app-dispatch-ledger.d.ts.map +1 -0
- package/dist/utils/codex-app-dispatch-ledger.js +149 -0
- package/dist/utils/codex-app-dispatch-ledger.js.map +1 -0
- package/dist/utils/codex-app-turn-dispatch.d.ts +77 -0
- package/dist/utils/codex-app-turn-dispatch.d.ts.map +1 -0
- package/dist/utils/codex-app-turn-dispatch.js +141 -0
- package/dist/utils/codex-app-turn-dispatch.js.map +1 -0
- package/dist/utils/codex-app-turn-liveness.d.ts +125 -0
- package/dist/utils/codex-app-turn-liveness.d.ts.map +1 -0
- package/dist/utils/codex-app-turn-liveness.js +301 -0
- package/dist/utils/codex-app-turn-liveness.js.map +1 -0
- package/dist/utils/idle-detector.d.ts +12 -0
- package/dist/utils/idle-detector.d.ts.map +1 -1
- package/dist/utils/idle-detector.js +19 -0
- package/dist/utils/idle-detector.js.map +1 -1
- package/dist/utils/input-gate.d.ts +87 -0
- package/dist/utils/input-gate.d.ts.map +1 -1
- package/dist/utils/input-gate.js +86 -0
- package/dist/utils/input-gate.js.map +1 -1
- package/dist/utils/lark-upload.d.ts.map +1 -1
- package/dist/utils/lark-upload.js +52 -1
- package/dist/utils/lark-upload.js.map +1 -1
- package/dist/utils/pending-input-queue.d.ts +15 -0
- package/dist/utils/pending-input-queue.d.ts.map +1 -1
- package/dist/utils/pending-input-queue.js +5 -1
- package/dist/utils/pending-input-queue.js.map +1 -1
- package/dist/utils/user-token.d.ts.map +1 -1
- package/dist/utils/user-token.js +53 -2
- package/dist/utils/user-token.js.map +1 -1
- package/dist/worker-ipc-preload.d.ts +12 -0
- package/dist/worker-ipc-preload.d.ts.map +1 -0
- package/dist/worker-ipc-preload.js +44 -0
- package/dist/worker-ipc-preload.js.map +1 -0
- package/dist/worker.js +2604 -325
- package/dist/worker.js.map +1 -1
- package/dist/workflows/v3/session-relay-client.d.ts +1 -0
- package/dist/workflows/v3/session-relay-client.d.ts.map +1 -1
- package/dist/workflows/v3/session-relay-client.js +12 -3
- package/dist/workflows/v3/session-relay-client.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-LTVOUDIS.js +0 -10
- package/dist/dashboard-web/chunks/chunk-DCS35UMD.js +0 -1
- package/dist/dashboard-web/chunks/chunk-MFQPCVHY.js +0 -51
- package/dist/dashboard-web/chunks/connectors-page-5KWDIMKC.js +0 -1
- package/dist/dashboard-web/chunks/groups-page-FHOKYXMW.js +0 -8
- package/dist/dashboard-web/chunks/overview-page-QYI3KBDD.js +0 -1
- package/dist/dashboard-web/chunks/sessions-page-WBP4N7D2.js +0 -6
|
@@ -2287,6 +2287,7 @@ button.primary {
|
|
|
2287
2287
|
.status-analyzing { background: var(--warning-soft); color: var(--warning); }
|
|
2288
2288
|
.status-starting { background: var(--success-soft); color: var(--success); }
|
|
2289
2289
|
.status-limited { background: var(--danger-soft); color: var(--danger); }
|
|
2290
|
+
.status-stalled { background: var(--danger-soft); color: var(--danger); }
|
|
2290
2291
|
|
|
2291
2292
|
/* ── Sessions board — "control-room signal wall" ─────────────────────────────
|
|
2292
2293
|
Each column is a signal channel: a LED dot + uppercase channel label in the
|
|
@@ -4363,6 +4364,18 @@ td code,
|
|
|
4363
4364
|
justify-content: flex-start;
|
|
4364
4365
|
}
|
|
4365
4366
|
|
|
4367
|
+
#g-drawer.groups-create-modal .g-feed-group-new {
|
|
4368
|
+
display: grid;
|
|
4369
|
+
gap: 6px;
|
|
4370
|
+
margin-top: 10px;
|
|
4371
|
+
}
|
|
4372
|
+
|
|
4373
|
+
#g-drawer.groups-create-modal .g-feed-group-new > span {
|
|
4374
|
+
color: var(--muted);
|
|
4375
|
+
font-size: 12px;
|
|
4376
|
+
font-weight: 700;
|
|
4377
|
+
}
|
|
4378
|
+
|
|
4366
4379
|
#g-drawer.groups-create-modal .g-create-status:empty {
|
|
4367
4380
|
display: none;
|
|
4368
4381
|
}
|
|
@@ -9201,6 +9214,7 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
|
|
|
9201
9214
|
color: var(--warning);
|
|
9202
9215
|
}
|
|
9203
9216
|
.status-limited { background: var(--danger-soft); color: var(--danger); }
|
|
9217
|
+
.status-stalled { background: var(--danger-soft); color: var(--danger); }
|
|
9204
9218
|
|
|
9205
9219
|
/* ── 玻璃面板(dark 下生效;light 保持实底)─────────────────────────────── */
|
|
9206
9220
|
:root[data-theme="dark"] .panel,
|
|
@@ -9901,6 +9915,7 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
|
|
|
9901
9915
|
border: 1px solid var(--border-soft);
|
|
9902
9916
|
background: var(--surface);
|
|
9903
9917
|
box-shadow: var(--shadow);
|
|
9918
|
+
position: relative;
|
|
9904
9919
|
}
|
|
9905
9920
|
:root[data-theme="dark"] .mate {
|
|
9906
9921
|
background: rgba(255, 255, 255, 0.045);
|
|
@@ -9913,8 +9928,33 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
|
|
|
9913
9928
|
}
|
|
9914
9929
|
.mate-off { opacity: 0.55; }
|
|
9915
9930
|
.mate-top { display: flex; align-items: center; gap: 11px; }
|
|
9931
|
+
.mate-console {
|
|
9932
|
+
position: absolute;
|
|
9933
|
+
top: 11px;
|
|
9934
|
+
right: 12px;
|
|
9935
|
+
display: inline-flex;
|
|
9936
|
+
align-items: center;
|
|
9937
|
+
justify-content: center;
|
|
9938
|
+
width: 26px;
|
|
9939
|
+
height: 26px;
|
|
9940
|
+
border-radius: 8px;
|
|
9941
|
+
color: var(--faint);
|
|
9942
|
+
background: var(--surface-muted);
|
|
9943
|
+
border: 1px solid var(--border-soft);
|
|
9944
|
+
text-decoration: none;
|
|
9945
|
+
transition: color 0.15s, border-color 0.15s, background 0.15s;
|
|
9946
|
+
}
|
|
9947
|
+
.mate-console:hover {
|
|
9948
|
+
color: var(--accent);
|
|
9949
|
+
background: var(--accent-soft);
|
|
9950
|
+
border-color: color-mix(in srgb, var(--accent) 42%, transparent);
|
|
9951
|
+
}
|
|
9952
|
+
:root[data-theme="dark"] .mate-console { background: rgba(255, 255, 255, 0.07); border-color: rgba(255, 255, 255, 0.1); }
|
|
9916
9953
|
.mate-id { min-width: 0; }
|
|
9917
9954
|
.mate-id b { display: block; font-size: 14px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
|
|
9955
|
+
/* 只给名字这一行右侧留出 ↗ 按钮宽度:长名字(如「哆啦A(dev)-claude」)提前省略号,
|
|
9956
|
+
* 不会滑到绝对定位的按钮底下;cliId 标签在下一行、按钮只占顶部,均不受影响。 */
|
|
9957
|
+
.mate-console ~ .mate-top .mate-id b { padding-right: 24px; }
|
|
9918
9958
|
.mate-role {
|
|
9919
9959
|
display: inline-block;
|
|
9920
9960
|
margin-top: 3px;
|
|
@@ -9946,6 +9986,15 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
|
|
|
9946
9986
|
font-size: 11px;
|
|
9947
9987
|
color: var(--faint);
|
|
9948
9988
|
}
|
|
9989
|
+
/* 右侧活跃时间不换行、不被长状态 tag(如「执行中 · N 会话」)挤成两行;
|
|
9990
|
+
* 窄卡 + 双长文本时由状态 tag 收缩省略来吸收溢出(时间短、优先保住)。 */
|
|
9991
|
+
.mate-foot > span { white-space: nowrap; flex: 0 0 auto; }
|
|
9992
|
+
.mate-foot .tag {
|
|
9993
|
+
min-width: 0;
|
|
9994
|
+
flex: 0 1 auto;
|
|
9995
|
+
overflow: hidden;
|
|
9996
|
+
text-overflow: ellipsis;
|
|
9997
|
+
}
|
|
9949
9998
|
.tag {
|
|
9950
9999
|
padding: 3px 10px;
|
|
9951
10000
|
border-radius: var(--radius-sm);
|
|
@@ -10514,6 +10563,22 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
|
|
|
10514
10563
|
color: var(--faint);
|
|
10515
10564
|
font-size: 10.5px;
|
|
10516
10565
|
}
|
|
10566
|
+
.bd-profile-appid-row {
|
|
10567
|
+
display: flex;
|
|
10568
|
+
align-items: center;
|
|
10569
|
+
gap: 10px;
|
|
10570
|
+
flex-wrap: wrap;
|
|
10571
|
+
}
|
|
10572
|
+
.bd-console-link {
|
|
10573
|
+
display: inline-flex;
|
|
10574
|
+
align-items: center;
|
|
10575
|
+
gap: 3px;
|
|
10576
|
+
font-size: 11px;
|
|
10577
|
+
font-weight: 600;
|
|
10578
|
+
color: var(--accent);
|
|
10579
|
+
text-decoration: none;
|
|
10580
|
+
}
|
|
10581
|
+
.bd-console-link:hover { color: var(--accent-strong); text-decoration: underline; }
|
|
10517
10582
|
/* 机器人改名(档案头 ✎ → 行内编辑器) */
|
|
10518
10583
|
.bd-name-edit {
|
|
10519
10584
|
position: absolute;
|
|
@@ -10599,6 +10664,7 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
|
|
|
10599
10664
|
align-items: center;
|
|
10600
10665
|
justify-content: center;
|
|
10601
10666
|
padding: 20px;
|
|
10667
|
+
overflow: auto;
|
|
10602
10668
|
background: var(--modal-backdrop);
|
|
10603
10669
|
backdrop-filter: blur(3px);
|
|
10604
10670
|
}
|
|
@@ -10606,6 +10672,11 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
|
|
|
10606
10672
|
position: relative;
|
|
10607
10673
|
display: grid;
|
|
10608
10674
|
gap: 12px;
|
|
10675
|
+
/* margin:auto 让 modal 在极矮视口高于视口时,靠 overlay 的 overflow:auto 也能
|
|
10676
|
+
完整滚到顶部。纯 flex 居中(align-items:center)下,超高子元素会上下等量溢出,
|
|
10677
|
+
顶部溢出无法滚回(flexbox 通用行为),标题/关闭按钮够不着;auto margin 在负
|
|
10678
|
+
可用空间下归 0、子元素落到滚动起点,正常视口仍由 auto margin 居中。 */
|
|
10679
|
+
margin: auto;
|
|
10609
10680
|
width: min(360px, 92vw);
|
|
10610
10681
|
padding: 18px;
|
|
10611
10682
|
border-radius: var(--radius-lg);
|
|
@@ -23149,6 +23220,20 @@ dialog select[multiple]:hover:not(:disabled) {
|
|
|
23149
23220
|
}
|
|
23150
23221
|
.bot-defaults-page .toggle-row .switch {
|
|
23151
23222
|
margin-top: 0;
|
|
23223
|
+
transition: background 140ms ease, transform 100ms ease;
|
|
23224
|
+
}
|
|
23225
|
+
.bot-defaults-page .toggle-row:active:not(:has(input:disabled)) .switch {
|
|
23226
|
+
transform: scale(0.96);
|
|
23227
|
+
}
|
|
23228
|
+
.bot-defaults-page .toggle-row input:focus-visible + .switch {
|
|
23229
|
+
outline: 2px solid var(--accent);
|
|
23230
|
+
outline-offset: 3px;
|
|
23231
|
+
}
|
|
23232
|
+
.bot-defaults-page .toggle-row:has(input:disabled) {
|
|
23233
|
+
cursor: not-allowed;
|
|
23234
|
+
}
|
|
23235
|
+
.bot-defaults-page .toggle-row input:disabled ~ .toggle-tx {
|
|
23236
|
+
color: var(--faint);
|
|
23152
23237
|
}
|
|
23153
23238
|
|
|
23154
23239
|
.bot-defaults-page .bd-tile :where(input[type="text"], input[type="number"], textarea) {
|
|
@@ -23231,6 +23316,117 @@ dialog select[multiple]:hover:not(:disabled) {
|
|
|
23231
23316
|
margin: 0;
|
|
23232
23317
|
}
|
|
23233
23318
|
|
|
23319
|
+
.bot-defaults-page .bd-grant-defaults {
|
|
23320
|
+
margin-top: 16px;
|
|
23321
|
+
}
|
|
23322
|
+
|
|
23323
|
+
.bot-defaults-page .bd-grant-defaults > .actions {
|
|
23324
|
+
justify-content: flex-end;
|
|
23325
|
+
}
|
|
23326
|
+
|
|
23327
|
+
.bot-defaults-page .bd-field-error {
|
|
23328
|
+
display: block;
|
|
23329
|
+
margin-top: 6px;
|
|
23330
|
+
color: var(--danger);
|
|
23331
|
+
font-size: 11px;
|
|
23332
|
+
line-height: 1.5;
|
|
23333
|
+
}
|
|
23334
|
+
|
|
23335
|
+
.bot-defaults-page .bd-grant-defaults input[aria-invalid="true"] {
|
|
23336
|
+
border-color: var(--danger);
|
|
23337
|
+
}
|
|
23338
|
+
|
|
23339
|
+
.bot-defaults-page .bd-card-settings {
|
|
23340
|
+
display: grid;
|
|
23341
|
+
gap: 16px;
|
|
23342
|
+
margin-top: 12px;
|
|
23343
|
+
}
|
|
23344
|
+
|
|
23345
|
+
.bot-defaults-page .bd-card-setting-group {
|
|
23346
|
+
min-width: 0;
|
|
23347
|
+
}
|
|
23348
|
+
|
|
23349
|
+
.bot-defaults-page .bd-card-setting-group + .bd-card-setting-group {
|
|
23350
|
+
padding-top: 16px;
|
|
23351
|
+
border-top: 1px solid color-mix(in srgb, var(--border-soft) 82%, transparent);
|
|
23352
|
+
}
|
|
23353
|
+
|
|
23354
|
+
.bot-defaults-page .bd-card-setting-heading {
|
|
23355
|
+
margin: 0 0 8px;
|
|
23356
|
+
color: var(--fg);
|
|
23357
|
+
font-size: 12px;
|
|
23358
|
+
font-weight: 700;
|
|
23359
|
+
line-height: 1.35;
|
|
23360
|
+
}
|
|
23361
|
+
|
|
23362
|
+
.bot-defaults-page .bd-card-setting-copy {
|
|
23363
|
+
margin: -2px 0 8px;
|
|
23364
|
+
color: var(--muted);
|
|
23365
|
+
font-size: 11.5px;
|
|
23366
|
+
line-height: 1.5;
|
|
23367
|
+
}
|
|
23368
|
+
|
|
23369
|
+
.bot-defaults-page .bd-card-settings .toggle-row {
|
|
23370
|
+
min-width: 0;
|
|
23371
|
+
margin: 0;
|
|
23372
|
+
}
|
|
23373
|
+
|
|
23374
|
+
.bot-defaults-page .bd-card-settings .toggle-tx small {
|
|
23375
|
+
display: block;
|
|
23376
|
+
overflow: visible;
|
|
23377
|
+
margin-top: 3px;
|
|
23378
|
+
color: var(--muted);
|
|
23379
|
+
font-size: 11.5px;
|
|
23380
|
+
line-height: 1.45;
|
|
23381
|
+
-webkit-box-orient: initial;
|
|
23382
|
+
-webkit-line-clamp: unset;
|
|
23383
|
+
}
|
|
23384
|
+
|
|
23385
|
+
.bot-defaults-page .bd-card-primary-toggle {
|
|
23386
|
+
padding: 4px 0;
|
|
23387
|
+
}
|
|
23388
|
+
|
|
23389
|
+
.bot-defaults-page .bd-card-dependent {
|
|
23390
|
+
display: grid;
|
|
23391
|
+
gap: 7px;
|
|
23392
|
+
margin: 8px 0 0 48px;
|
|
23393
|
+
padding: 10px 12px;
|
|
23394
|
+
border-left: 2px solid color-mix(in srgb, var(--accent) 58%, var(--border-soft));
|
|
23395
|
+
border-radius: 0 var(--radius-md) var(--radius-md) 0;
|
|
23396
|
+
background: color-mix(in srgb, var(--accent) 5%, transparent);
|
|
23397
|
+
}
|
|
23398
|
+
|
|
23399
|
+
.bot-defaults-page .bd-card-dependent[hidden] {
|
|
23400
|
+
display: none;
|
|
23401
|
+
}
|
|
23402
|
+
|
|
23403
|
+
.bot-defaults-page .bd-card-dependent .toggle-row {
|
|
23404
|
+
padding: 0;
|
|
23405
|
+
}
|
|
23406
|
+
|
|
23407
|
+
.bot-defaults-page .bd-card-mode-note {
|
|
23408
|
+
margin: 0 0 0 48px;
|
|
23409
|
+
color: var(--muted);
|
|
23410
|
+
font-size: 11.5px;
|
|
23411
|
+
line-height: 1.5;
|
|
23412
|
+
}
|
|
23413
|
+
|
|
23414
|
+
.bot-defaults-page .bd-card-setting-group > .bd-row {
|
|
23415
|
+
margin-top: 0;
|
|
23416
|
+
}
|
|
23417
|
+
|
|
23418
|
+
.bot-defaults-page .bd-card-control-list {
|
|
23419
|
+
display: grid;
|
|
23420
|
+
gap: 10px;
|
|
23421
|
+
margin-top: 10px;
|
|
23422
|
+
}
|
|
23423
|
+
|
|
23424
|
+
@media (prefers-reduced-motion: reduce) {
|
|
23425
|
+
.bot-defaults-page .toggle-row .switch {
|
|
23426
|
+
transition: none;
|
|
23427
|
+
}
|
|
23428
|
+
}
|
|
23429
|
+
|
|
23234
23430
|
.bot-defaults-page .bd-substitute-target-list {
|
|
23235
23431
|
display: grid;
|
|
23236
23432
|
gap: 8px;
|
|
@@ -23333,6 +23529,10 @@ dialog select[multiple]:hover:not(:disabled) {
|
|
|
23333
23529
|
grid-template-columns: 1fr;
|
|
23334
23530
|
}
|
|
23335
23531
|
|
|
23532
|
+
.bot-defaults-page .bd-card-dependent {
|
|
23533
|
+
margin-left: 0;
|
|
23534
|
+
}
|
|
23535
|
+
|
|
23336
23536
|
.bot-defaults-page .bd-runtime-fields {
|
|
23337
23537
|
grid-template-columns: 1fr;
|
|
23338
23538
|
}
|
|
@@ -25769,3 +25969,58 @@ button.ui-refresh-button.is-loading .ui-action-icon {
|
|
|
25769
25969
|
color: var(--danger, #e5484d) !important;
|
|
25770
25970
|
border-color: color-mix(in srgb, var(--danger, #e5484d) 48%, var(--border-soft)) !important;
|
|
25771
25971
|
}
|
|
25972
|
+
.feed-group-auth-overlay {
|
|
25973
|
+
position: fixed;
|
|
25974
|
+
inset: 0;
|
|
25975
|
+
z-index: 10000;
|
|
25976
|
+
display: grid;
|
|
25977
|
+
place-items: center;
|
|
25978
|
+
padding: 20px;
|
|
25979
|
+
background: rgb(15 23 42 / 62%);
|
|
25980
|
+
}
|
|
25981
|
+
|
|
25982
|
+
.feed-group-auth-card {
|
|
25983
|
+
width: min(520px, 100%);
|
|
25984
|
+
padding: 24px;
|
|
25985
|
+
border: 1px solid var(--border);
|
|
25986
|
+
border-radius: 14px;
|
|
25987
|
+
background: var(--panel, #fff);
|
|
25988
|
+
color: #111827;
|
|
25989
|
+
box-shadow: 0 24px 70px rgb(0 0 0 / 28%);
|
|
25990
|
+
}
|
|
25991
|
+
|
|
25992
|
+
.feed-group-auth-card h3 { margin-top: 0; }
|
|
25993
|
+
.feed-group-auth-card p,
|
|
25994
|
+
.feed-group-auth-card label,
|
|
25995
|
+
.feed-group-auth-card label span { color: #111827; }
|
|
25996
|
+
.feed-group-auth-card label { display: grid; gap: 8px; margin-top: 18px; }
|
|
25997
|
+
.feed-group-auth-card input { width: 100%; box-sizing: border-box; color: #111827; background: #fff; }
|
|
25998
|
+
.feed-group-auth-card input::placeholder { color: #4b5563; opacity: 1; }
|
|
25999
|
+
.feed-group-auth-card .actions { margin-top: 20px; justify-content: flex-end; }
|
|
26000
|
+
.feed-group-auth-open {
|
|
26001
|
+
display: inline-flex;
|
|
26002
|
+
align-items: center;
|
|
26003
|
+
justify-content: center;
|
|
26004
|
+
min-height: 42px;
|
|
26005
|
+
margin-top: 4px;
|
|
26006
|
+
padding: 0 20px;
|
|
26007
|
+
border: 1px solid #2563eb;
|
|
26008
|
+
border-radius: 8px;
|
|
26009
|
+
color: #fff;
|
|
26010
|
+
background: #2563eb;
|
|
26011
|
+
font-weight: 700;
|
|
26012
|
+
cursor: pointer;
|
|
26013
|
+
}
|
|
26014
|
+
|
|
26015
|
+
.feed-group-auth-open:hover { background: #1d4ed8; }
|
|
26016
|
+
|
|
26017
|
+
.cs-advanced-fields .cs-feed-group {
|
|
26018
|
+
min-width: 0;
|
|
26019
|
+
margin: 0;
|
|
26020
|
+
padding: 0;
|
|
26021
|
+
border: 0;
|
|
26022
|
+
}
|
|
26023
|
+
|
|
26024
|
+
.cs-advanced-fields .cs-feed-group > legend {
|
|
26025
|
+
padding: 0;
|
|
26026
|
+
}
|
package/dist/dashboard.js
CHANGED
|
@@ -64,12 +64,14 @@ import { hd2dAssetPath, hd2dStatus, startHd2dDownload } from './dashboard/hd2d-a
|
|
|
64
64
|
import { buildSkillInstallAuditSummary, installLocalSkillLinks, readSkillRegistry, removeInstalledSkill, removeInstalledSkills, updateInstalledSkillAsync, } from './services/skill-registry-store.js';
|
|
65
65
|
import { redactGitUrlCredentials } from './core/skills/sources.js';
|
|
66
66
|
import { effectiveDefaultWorkingDir, getBot, loadBotConfigs, parseBotConfigsFromText } from './bot-registry.js';
|
|
67
|
+
import { addChatToFeedGroup, createFeedGroup, FEED_GROUP_SCOPES, FeedGroupApiError, listFeedGroups } from './dashboard/feed-groups.js';
|
|
68
|
+
import { generateAuthUrl, handleCallbackUrl, isCallbackUrl } from './utils/user-token.js';
|
|
67
69
|
import { findEntryIndex, readRawConfig, requireConfigPath, writeRawConfigAtomic } from './services/config-store.js';
|
|
68
70
|
import { emitCodexNotifierOutboxItem, installCodexNotifierHook, isCodexNotifierWorkerStateFresh, isCodexNotifierHookInstalled, listCodexNotifierOutbox, readCodexNotifierWorkerState, resolveCodexNotifierConfig, runCodexSideConversationMonitor, runCodexNotifierWorkerSupervisor, } from './features/codex-notifier/index.js';
|
|
69
71
|
import { discoverNativeCliSkillGroups } from './core/skills/discovery.js';
|
|
70
72
|
import { analyzeSkillReferences } from './core/skills/references.js';
|
|
71
73
|
import { discoverDashboardSkills, installDashboardSkill, parseDashboardSkillInstallRequest, parseInstallLocalLinksSources, MAX_LOCAL_LINK_SOURCES } from './dashboard/skill-install-request.js';
|
|
72
|
-
import { botDefaultsPayload, botSummaryPayload } from './dashboard/bot-payload.js';
|
|
74
|
+
import { botDefaultsPayload, botSummaryPayload, brandMapByAppId } from './dashboard/bot-payload.js';
|
|
73
75
|
import { handleVcMeetingConsumerProfilesGet, handleVcMeetingConsumerProfilesPut, } from './dashboard/vc-consumer-profiles-api.js';
|
|
74
76
|
import { buildVcMeetingConsumerBootstrapAgents, seedVcMeetingDefaultConsumerProfile, } from './services/vc-meeting-consumer-profile-bootstrap.js';
|
|
75
77
|
import { evaluateVcMeetingConsumerIsolation } from './services/vc-meeting-consumer-isolation.js';
|
|
@@ -91,7 +93,7 @@ import { maybeInstallTraexPluginOnSettingsChange, TRAEX_RECOMMENDED_SOURCE, TRAE
|
|
|
91
93
|
import { deriveCreateGroupName, selectCreateSessionTargets } from './core/session-create.js';
|
|
92
94
|
import { parseDashboardImageUploads } from './core/dashboard-images.js';
|
|
93
95
|
import { checkLarkCliVersion, MIN_LARK_CLI_VERSION_FOR_VC_BOT } from './vc-agent/polling-source.js';
|
|
94
|
-
import { larkHosts } from './im/lark/lark-hosts.js';
|
|
96
|
+
import { larkHosts, normalizeBrand } from './im/lark/lark-hosts.js';
|
|
95
97
|
import { buildResourceMonitorDaemonSeeds, createResourceMonitorService, handleResourceMonitorApi, toResourceMonitorSessionSeed } from './dashboard/resource-monitor-service.js';
|
|
96
98
|
import { readPluginRegistry } from './services/plugin-registry-store.js';
|
|
97
99
|
import { pluginRuntimeDir, resolvePluginPath } from './core/plugins/paths.js';
|
|
@@ -1857,6 +1859,15 @@ function configuredCliIds() {
|
|
|
1857
1859
|
return new Map();
|
|
1858
1860
|
}
|
|
1859
1861
|
}
|
|
1862
|
+
/**
|
|
1863
|
+
* per-bot brand(feishu / lark)按 appId 的映射,供前端派生飞书后台深链 host。
|
|
1864
|
+
* 失败安全逻辑在 brandMapByAppId(返回空 Map,与 configuredCliIds /
|
|
1865
|
+
* configuredBotAgentFields 同款兜底,见其 doc)——冷缓存 /api/groups 与
|
|
1866
|
+
* /api/bots 仍走 DaemonRegistry 降级 roster,前端 normalizeBrand 兜底 feishu。
|
|
1867
|
+
*/
|
|
1868
|
+
function configuredBrands() {
|
|
1869
|
+
return brandMapByAppId(loadBotConfigs);
|
|
1870
|
+
}
|
|
1860
1871
|
function configuredBotAgentFields() {
|
|
1861
1872
|
try {
|
|
1862
1873
|
return new Map(loadBotConfigs().map(b => [b.larkAppId, {
|
|
@@ -2137,7 +2148,11 @@ async function buildGroupsMatrix() {
|
|
|
2137
2148
|
return (a.name ?? a.chatId).localeCompare(b.name ?? b.chatId);
|
|
2138
2149
|
})
|
|
2139
2150
|
.map(({ _firstSeenAt, ...rest }) => rest);
|
|
2140
|
-
|
|
2151
|
+
// brand 是 bots.json 的 per-bot 字段(DaemonRegistry 的心跳态不带它),
|
|
2152
|
+
// 从 configuredBrands(失败安全,返空 Map)按 appId 补进 summary,供前端
|
|
2153
|
+
// 派生飞书后台深链 host;冷缓存 / 缺配置时前端 normalizeBrand 兜底 feishu。
|
|
2154
|
+
const brandByAppId = configuredBrands();
|
|
2155
|
+
const bots = onlineBots.map(d => botSummaryPayload({ ...d, brand: brandByAppId.get(d.larkAppId) }));
|
|
2141
2156
|
return { chats, bots };
|
|
2142
2157
|
}
|
|
2143
2158
|
/**
|
|
@@ -4322,7 +4337,14 @@ const server = createServer(async (req, res) => {
|
|
|
4322
4337
|
// PUT /api/bots/:appId/default-oncall — proxy to that bot's daemon
|
|
4323
4338
|
if (req.method === 'GET' && url.pathname === '/api/bots') {
|
|
4324
4339
|
const agentFields = configuredBotAgentFields();
|
|
4325
|
-
|
|
4340
|
+
// brand 是 bots.json 的 per-bot 字段(DaemonRegistry 心跳态不带它),
|
|
4341
|
+
// 从 configuredBrands(失败安全,返空 Map)按 appId 补进每个 descriptor,
|
|
4342
|
+
// 供前端派生飞书后台深链 host;缺配置时前端 normalizeBrand 兜底 feishu。
|
|
4343
|
+
const brandByAppId = configuredBrands();
|
|
4344
|
+
const onlineBots = [...registry.list()]
|
|
4345
|
+
.map(b => withConfiguredCliId(b, agentFields))
|
|
4346
|
+
.map(b => ({ ...b, brand: brandByAppId.get(b.larkAppId) }))
|
|
4347
|
+
.sort((a, b) => a.botIndex - b.botIndex);
|
|
4326
4348
|
const out = await Promise.all(onlineBots.map(async (d) => {
|
|
4327
4349
|
try {
|
|
4328
4350
|
const r = await fetchDaemonIpc(d.ipcPort, '/api/bot-default-oncall');
|
|
@@ -4759,7 +4781,7 @@ const server = createServer(async (req, res) => {
|
|
|
4759
4781
|
}
|
|
4760
4782
|
// PUT /api/bots/:appId/grant-prefs — proxy to that bot's daemon. Body carries
|
|
4761
4783
|
// any subset of `{ restrictGrantCommands?: boolean, autoGrantRequestCards?: boolean,
|
|
4762
|
-
// messageQuotaDefaultLimit?: number|null }`.
|
|
4784
|
+
// messageQuotaDefaultLimit?: number|null, grantDefaultDurationMs?: number|null }`.
|
|
4763
4785
|
let mBotGrantPrefs;
|
|
4764
4786
|
if (req.method === 'PUT' && (mBotGrantPrefs = url.pathname.match(/^\/api\/bots\/([^/]+)\/grant-prefs$/))) {
|
|
4765
4787
|
const appId = decodeURIComponent(mBotGrantPrefs[1]);
|
|
@@ -4845,6 +4867,72 @@ const server = createServer(async (req, res) => {
|
|
|
4845
4867
|
res.end(await upstream.text());
|
|
4846
4868
|
return;
|
|
4847
4869
|
}
|
|
4870
|
+
// Native Feishu/Lark conversation labels (feed groups). These APIs are
|
|
4871
|
+
// user-token-only, so the frontend pins subsequent create/assign calls to
|
|
4872
|
+
// the same app whose OAuth token produced this list.
|
|
4873
|
+
if (req.method === 'GET' && url.pathname === '/api/feed-groups/auth-url') {
|
|
4874
|
+
const appId = url.searchParams.get('larkAppId') ?? '';
|
|
4875
|
+
let bot;
|
|
4876
|
+
try {
|
|
4877
|
+
bot = loadBotConfigs().find(item => !item.apiOnly && (!appId || item.larkAppId === appId));
|
|
4878
|
+
}
|
|
4879
|
+
catch { /* handled below */ }
|
|
4880
|
+
if (!bot)
|
|
4881
|
+
return jsonRes(res, 404, { ok: false, error: 'bot_not_found' });
|
|
4882
|
+
const { authUrl } = generateAuthUrl(bot.larkAppId, bot.larkAppSecret, normalizeBrand(bot.brand), [...FEED_GROUP_SCOPES]);
|
|
4883
|
+
return jsonRes(res, 200, { ok: true, larkAppId: bot.larkAppId, authUrl });
|
|
4884
|
+
}
|
|
4885
|
+
if (req.method === 'POST' && url.pathname === '/api/feed-groups/oauth-callback') {
|
|
4886
|
+
let body;
|
|
4887
|
+
try {
|
|
4888
|
+
body = await readJsonBody(req);
|
|
4889
|
+
}
|
|
4890
|
+
catch {
|
|
4891
|
+
return jsonRes(res, 400, { ok: false, error: 'bad_json' });
|
|
4892
|
+
}
|
|
4893
|
+
const callbackUrl = typeof body.callbackUrl === 'string' ? body.callbackUrl.trim() : '';
|
|
4894
|
+
if (!isCallbackUrl(callbackUrl)) {
|
|
4895
|
+
return jsonRes(res, 400, { ok: false, error: 'invalid_callback_url', message: '请粘贴完整的 127.0.0.1 OAuth 回调 URL。' });
|
|
4896
|
+
}
|
|
4897
|
+
const message = await handleCallbackUrl(callbackUrl);
|
|
4898
|
+
const ok = typeof message === 'string' && message.startsWith('✅');
|
|
4899
|
+
return jsonRes(res, ok ? 200 : 400, { ok, error: ok ? undefined : 'oauth_exchange_failed', message });
|
|
4900
|
+
}
|
|
4901
|
+
if (req.method === 'GET' && url.pathname === '/api/feed-groups') {
|
|
4902
|
+
const requestedAppId = url.searchParams.get('larkAppId') ?? '';
|
|
4903
|
+
let bots;
|
|
4904
|
+
try {
|
|
4905
|
+
bots = loadBotConfigs().filter(bot => !bot.apiOnly);
|
|
4906
|
+
}
|
|
4907
|
+
catch {
|
|
4908
|
+
return jsonRes(res, 500, { ok: false, error: 'bot_config_unavailable' });
|
|
4909
|
+
}
|
|
4910
|
+
const ordered = requestedAppId
|
|
4911
|
+
? [...bots.filter(bot => bot.larkAppId === requestedAppId), ...bots.filter(bot => bot.larkAppId !== requestedAppId)]
|
|
4912
|
+
: bots;
|
|
4913
|
+
let loginRequired = false;
|
|
4914
|
+
for (const bot of ordered) {
|
|
4915
|
+
try {
|
|
4916
|
+
const groups = await listFeedGroups(bot);
|
|
4917
|
+
return jsonRes(res, 200, { ok: true, larkAppId: bot.larkAppId, groups });
|
|
4918
|
+
}
|
|
4919
|
+
catch (error) {
|
|
4920
|
+
if (error instanceof FeedGroupApiError && error.code === 'user_login_required') {
|
|
4921
|
+
loginRequired = true;
|
|
4922
|
+
continue;
|
|
4923
|
+
}
|
|
4924
|
+
if (requestedAppId && bot.larkAppId === requestedAppId) {
|
|
4925
|
+
const e = error;
|
|
4926
|
+
return jsonRes(res, e.status ?? 502, { ok: false, error: e.code ?? 'feed_group_list_failed', message: e.message });
|
|
4927
|
+
}
|
|
4928
|
+
}
|
|
4929
|
+
}
|
|
4930
|
+
return jsonRes(res, loginRequired ? 401 : 503, {
|
|
4931
|
+
ok: false,
|
|
4932
|
+
error: loginRequired ? 'user_login_required' : 'feed_group_api_unavailable',
|
|
4933
|
+
message: loginRequired ? '尚未获得飞书标签权限,请点击「立即授权」按钮进行授权。' : '没有可用于读取标签的飞书机器人。',
|
|
4934
|
+
});
|
|
4935
|
+
}
|
|
4848
4936
|
// Create a new chat — pick a creator from the user-selected larkAppIds
|
|
4849
4937
|
// (Feishu makes the calling bot the implicit first member, so picking
|
|
4850
4938
|
// anything else would silently add an unwanted bot). Auto-invite the
|
|
@@ -4938,6 +5026,26 @@ const server = createServer(async (req, res) => {
|
|
|
4938
5026
|
else {
|
|
4939
5027
|
upstreamJson.autoInvitedOpenId = autoInvited;
|
|
4940
5028
|
}
|
|
5029
|
+
const existingFeedGroupId = typeof parsed.feedGroupId === 'string' ? parsed.feedGroupId.trim() : '';
|
|
5030
|
+
const newFeedGroupName = typeof parsed.newFeedGroupName === 'string' ? parsed.newFeedGroupName.trim() : '';
|
|
5031
|
+
const feedGroupAppId = typeof parsed.feedGroupAppId === 'string' ? parsed.feedGroupAppId.trim() : '';
|
|
5032
|
+
if (upstream.ok && upstreamJson.ok && typeof upstreamJson.chatId === 'string' && (existingFeedGroupId || newFeedGroupName)) {
|
|
5033
|
+
try {
|
|
5034
|
+
const feedBot = loadBotConfigs().find(bot => bot.larkAppId === feedGroupAppId && !bot.apiOnly);
|
|
5035
|
+
if (!feedBot) {
|
|
5036
|
+
upstreamJson.feedGroupError = '读取标签所用的机器人当前不可用。群聊已创建,但未加入标签。';
|
|
5037
|
+
}
|
|
5038
|
+
else {
|
|
5039
|
+
const targetId = existingFeedGroupId || await createFeedGroup(feedBot, newFeedGroupName);
|
|
5040
|
+
await addChatToFeedGroup(feedBot, targetId, upstreamJson.chatId);
|
|
5041
|
+
upstreamJson.feedGroupId = targetId;
|
|
5042
|
+
upstreamJson.feedGroupName = newFeedGroupName || undefined;
|
|
5043
|
+
}
|
|
5044
|
+
}
|
|
5045
|
+
catch (error) {
|
|
5046
|
+
upstreamJson.feedGroupError = error instanceof Error ? error.message : String(error);
|
|
5047
|
+
}
|
|
5048
|
+
}
|
|
4941
5049
|
}
|
|
4942
5050
|
if (upstream.ok && upstreamJson?.ok)
|
|
4943
5051
|
groupsMatrixSnapshot.invalidate();
|
|
@@ -5034,11 +5142,31 @@ const server = createServer(async (req, res) => {
|
|
|
5034
5142
|
}
|
|
5035
5143
|
const chatId = groupResp.chatId;
|
|
5036
5144
|
const invalidBotIds = Array.isArray(groupResp.invalidBotIds) ? groupResp.invalidBotIds : [];
|
|
5145
|
+
const existingFeedGroupId = typeof parsed.feedGroupId === 'string' ? parsed.feedGroupId.trim() : '';
|
|
5146
|
+
const newFeedGroupName = typeof parsed.newFeedGroupName === 'string' ? parsed.newFeedGroupName.trim() : '';
|
|
5147
|
+
let feedGroupId = '';
|
|
5148
|
+
let feedGroupError = '';
|
|
5149
|
+
if (existingFeedGroupId || newFeedGroupName) {
|
|
5150
|
+
const feedGroupAppId = typeof parsed.feedGroupAppId === 'string' ? parsed.feedGroupAppId.trim() : '';
|
|
5151
|
+
try {
|
|
5152
|
+
const feedBot = loadBotConfigs().find(bot => bot.larkAppId === feedGroupAppId && !bot.apiOnly);
|
|
5153
|
+
if (!feedBot) {
|
|
5154
|
+
feedGroupError = '读取标签所用的机器人当前不可用。';
|
|
5155
|
+
}
|
|
5156
|
+
else {
|
|
5157
|
+
feedGroupId = existingFeedGroupId || await createFeedGroup(feedBot, newFeedGroupName);
|
|
5158
|
+
await addChatToFeedGroup(feedBot, feedGroupId, chatId);
|
|
5159
|
+
}
|
|
5160
|
+
}
|
|
5161
|
+
catch (error) {
|
|
5162
|
+
feedGroupError = error instanceof Error ? error.message : String(error);
|
|
5163
|
+
}
|
|
5164
|
+
}
|
|
5037
5165
|
// spawn 目标:lead 模式只有 lead;一起开工是所有成功入群的选中 bot。
|
|
5038
5166
|
const joinedIds = selectedIds.filter(id => !invalidBotIds.includes(id) && !!registry.getByAppId(id));
|
|
5039
5167
|
const targets = selectCreateSessionTargets(mode, joinedIds, creatorLarkAppId);
|
|
5040
5168
|
if (targets.length === 0) {
|
|
5041
|
-
return jsonRes(res, 200, { ok: true, chatId, shareLink: groupResp.shareLink, spawned: [], failed: [], warning: 'no_spawn_target' });
|
|
5169
|
+
return jsonRes(res, 200, { ok: true, chatId, shareLink: groupResp.shareLink, spawned: [], failed: [], warning: 'no_spawn_target', feedGroupId, feedGroupError });
|
|
5042
5170
|
}
|
|
5043
5171
|
const bots = liveBots();
|
|
5044
5172
|
const nameOf = (id) => bots.find(b => b.larkAppId === id)?.botName ?? id;
|
|
@@ -5070,7 +5198,7 @@ const server = createServer(async (req, res) => {
|
|
|
5070
5198
|
}
|
|
5071
5199
|
}));
|
|
5072
5200
|
return jsonRes(res, 200, {
|
|
5073
|
-
ok: true, chatId, shareLink: groupResp.shareLink, mode, column, spawned, failed,
|
|
5201
|
+
ok: true, chatId, shareLink: groupResp.shareLink, mode, column, spawned, failed, feedGroupId, feedGroupError,
|
|
5074
5202
|
});
|
|
5075
5203
|
}
|
|
5076
5204
|
// Public SSE — relays aggregator's listener events
|
|
@@ -5127,6 +5255,41 @@ const server = createServer(async (req, res) => {
|
|
|
5127
5255
|
jsonRes(res, 500, { error: String(err) });
|
|
5128
5256
|
}
|
|
5129
5257
|
});
|
|
5258
|
+
// OAuth loopback callback for browsers running on the same machine as BotMux.
|
|
5259
|
+
// Remote-browser deployments cannot reach this loopback listener; their
|
|
5260
|
+
// Dashboard keeps the manual callback-URL paste flow as a fallback.
|
|
5261
|
+
const oauthCallbackServer = createServer(async (req, res) => {
|
|
5262
|
+
const url = new URL(req.url ?? '/', 'http://127.0.0.1:9768');
|
|
5263
|
+
if (req.method !== 'GET' || url.pathname !== '/callback') {
|
|
5264
|
+
res.writeHead(404, { 'content-type': 'text/plain; charset=utf-8' });
|
|
5265
|
+
return res.end('Not found');
|
|
5266
|
+
}
|
|
5267
|
+
let ok = false;
|
|
5268
|
+
try {
|
|
5269
|
+
const message = await handleCallbackUrl(url.toString());
|
|
5270
|
+
ok = typeof message === 'string' && message.startsWith('✅');
|
|
5271
|
+
}
|
|
5272
|
+
catch (error) {
|
|
5273
|
+
logger.warn(`[dashboard] OAuth loopback callback failed: ${error.message}`);
|
|
5274
|
+
}
|
|
5275
|
+
res.writeHead(ok ? 200 : 400, {
|
|
5276
|
+
'content-type': 'text/html; charset=utf-8',
|
|
5277
|
+
'cache-control': 'no-store',
|
|
5278
|
+
});
|
|
5279
|
+
return res.end(`<!doctype html><meta charset="utf-8"><title>${ok ? '授权成功' : '授权失败'}</title><style>body{font-family:system-ui,sans-serif;max-width:560px;margin:80px auto;padding:24px;color:#111827}h1{font-size:28px}</style><h1>${ok ? '授权成功' : '授权失败'}</h1><p>${ok ? 'BotMux 已完成授权。你可以关闭此页面并返回 Dashboard。' : '授权链接无效或已过期。请返回 Dashboard 后重新发起授权。'}</p>`);
|
|
5280
|
+
});
|
|
5281
|
+
oauthCallbackServer.on('error', error => {
|
|
5282
|
+
const code = error.code;
|
|
5283
|
+
if (code === 'EADDRINUSE') {
|
|
5284
|
+
logger.warn('[dashboard] OAuth loopback port 127.0.0.1:9768 is already in use; remote/manual callback fallback remains available');
|
|
5285
|
+
}
|
|
5286
|
+
else {
|
|
5287
|
+
logger.warn(`[dashboard] OAuth loopback server error: ${error.message}`);
|
|
5288
|
+
}
|
|
5289
|
+
});
|
|
5290
|
+
oauthCallbackServer.listen(9768, '127.0.0.1', () => {
|
|
5291
|
+
logger.info('[dashboard] OAuth loopback callback listening on 127.0.0.1:9768');
|
|
5292
|
+
});
|
|
5130
5293
|
// Web terminal WebSocket reverse-proxy: bridge `/s/*` upgrade requests through to
|
|
5131
5294
|
// the local terminal proxy (which in turn bridges to the session worker). Raw
|
|
5132
5295
|
// socket-to-socket bridge: dial 127.0.0.1:<terminalProxyPort>, replay the upgrade
|
|
@@ -5478,6 +5641,8 @@ function shutdown() {
|
|
|
5478
5641
|
resourceMonitor.stop();
|
|
5479
5642
|
platformTunnel?.stop();
|
|
5480
5643
|
debugTerminalManager.shutdown();
|
|
5644
|
+
if (oauthCallbackServer.listening)
|
|
5645
|
+
oauthCallbackServer.close();
|
|
5481
5646
|
server.close(() => process.exit(gracefulProcessExitCode()));
|
|
5482
5647
|
// Hard-exit fallback after 5s
|
|
5483
5648
|
setTimeout(() => process.exit(gracefulProcessExitCode()), 5_000).unref();
|