botmux 3.16.1 → 3.17.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/riff-backend.d.ts +84 -1
- package/dist/adapters/backend/riff-backend.d.ts.map +1 -1
- package/dist/adapters/backend/riff-backend.js +202 -19
- package/dist/adapters/backend/riff-backend.js.map +1 -1
- package/dist/adapters/backend/sandbox.d.ts +8 -0
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +15 -0
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/backend/tmux-backend.d.ts +61 -7
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-backend.js +80 -9
- package/dist/adapters/backend/tmux-backend.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +62 -4
- package/dist/adapters/backend/tmux-pipe-backend.d.ts.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +240 -27
- package/dist/adapters/backend/tmux-pipe-backend.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +4 -2
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/coco.d.ts.map +1 -1
- package/dist/adapters/cli/coco.js +27 -0
- package/dist/adapters/cli/coco.js.map +1 -1
- package/dist/adapters/cli/codex-app.d.ts.map +1 -1
- package/dist/adapters/cli/codex-app.js +28 -0
- package/dist/adapters/cli/codex-app.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +51 -23
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/dsh-tui.d.ts +24 -0
- package/dist/adapters/cli/dsh-tui.d.ts.map +1 -0
- package/dist/adapters/cli/dsh-tui.js +99 -0
- package/dist/adapters/cli/dsh-tui.js.map +1 -0
- package/dist/adapters/cli/dsh.d.ts.map +1 -1
- package/dist/adapters/cli/dsh.js +15 -9
- package/dist/adapters/cli/dsh.js.map +1 -1
- package/dist/adapters/cli/fs-policy.d.ts +98 -1
- package/dist/adapters/cli/fs-policy.d.ts.map +1 -1
- package/dist/adapters/cli/fs-policy.js +182 -7
- package/dist/adapters/cli/fs-policy.js.map +1 -1
- package/dist/adapters/cli/grok.js +16 -18
- package/dist/adapters/cli/grok.js.map +1 -1
- package/dist/adapters/cli/model-catalog-json.d.ts +17 -0
- package/dist/adapters/cli/model-catalog-json.d.ts.map +1 -0
- package/dist/adapters/cli/model-catalog-json.js +43 -0
- package/dist/adapters/cli/model-catalog-json.js.map +1 -0
- package/dist/adapters/cli/oh-my-pi.d.ts +2 -0
- package/dist/adapters/cli/oh-my-pi.d.ts.map +1 -1
- package/dist/adapters/cli/oh-my-pi.js +45 -13
- package/dist/adapters/cli/oh-my-pi.js.map +1 -1
- package/dist/adapters/cli/opencode.js +1 -1
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/registry.d.ts +2 -1
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +6 -1
- package/dist/adapters/cli/registry.js.map +1 -1
- package/dist/adapters/cli/relay.d.ts.map +1 -1
- package/dist/adapters/cli/relay.js +7 -0
- package/dist/adapters/cli/relay.js.map +1 -1
- package/dist/adapters/cli/seed.d.ts.map +1 -1
- package/dist/adapters/cli/seed.js +6 -0
- package/dist/adapters/cli/seed.js.map +1 -1
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +20 -14
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/adapters/cli/traex.d.ts +4 -0
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +153 -0
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +42 -1
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/autostart.d.ts +6 -0
- package/dist/autostart.d.ts.map +1 -1
- package/dist/autostart.js +21 -1
- package/dist/autostart.js.map +1 -1
- package/dist/bot-registry.d.ts +27 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +62 -2
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/vc-agent.d.ts.map +1 -1
- package/dist/cli/vc-agent.js +21 -3
- package/dist/cli/vc-agent.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +92 -1
- package/dist/cli.js.map +1 -1
- package/dist/codex-app-runner.js +28 -0
- package/dist/codex-app-runner.js.map +1 -1
- package/dist/core/bot-steer-directive.d.ts +25 -0
- package/dist/core/bot-steer-directive.d.ts.map +1 -0
- package/dist/core/bot-steer-directive.js +47 -0
- package/dist/core/bot-steer-directive.js.map +1 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +102 -18
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +53 -13
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dashboard-rows.d.ts +3 -0
- package/dist/core/dashboard-rows.d.ts.map +1 -1
- package/dist/core/dashboard-rows.js +26 -5
- package/dist/core/dashboard-rows.js.map +1 -1
- package/dist/core/dispatch.d.ts.map +1 -1
- package/dist/core/dispatch.js +5 -4
- package/dist/core/dispatch.js.map +1 -1
- package/dist/core/existing-app-server.d.ts +22 -0
- package/dist/core/existing-app-server.d.ts.map +1 -0
- package/dist/core/existing-app-server.js +85 -0
- package/dist/core/existing-app-server.js.map +1 -0
- package/dist/core/native-topic-id.d.ts +9 -0
- package/dist/core/native-topic-id.d.ts.map +1 -0
- package/dist/core/native-topic-id.js +14 -0
- package/dist/core/native-topic-id.js.map +1 -0
- package/dist/core/per-bot-env.d.ts.map +1 -1
- package/dist/core/per-bot-env.js +10 -0
- package/dist/core/per-bot-env.js.map +1 -1
- package/dist/core/session-activity.d.ts +11 -0
- package/dist/core/session-activity.d.ts.map +1 -1
- package/dist/core/session-activity.js +23 -0
- package/dist/core/session-activity.js.map +1 -1
- package/dist/core/session-group-birth.d.ts.map +1 -1
- package/dist/core/session-group-birth.js +23 -8
- package/dist/core/session-group-birth.js.map +1 -1
- package/dist/core/session-manager.d.ts +1 -4
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +16 -20
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/shared-adopt.d.ts +20 -0
- package/dist/core/shared-adopt.d.ts.map +1 -0
- package/dist/core/shared-adopt.js +26 -0
- package/dist/core/shared-adopt.js.map +1 -0
- package/dist/core/skills/customize-command.d.ts +7 -0
- package/dist/core/skills/customize-command.d.ts.map +1 -0
- package/dist/core/skills/customize-command.js +303 -0
- package/dist/core/skills/customize-command.js.map +1 -0
- 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 +15 -0
- package/dist/core/terminal-write-auth.js.map +1 -1
- package/dist/core/terminal-write-frame.d.ts +30 -0
- package/dist/core/terminal-write-frame.d.ts.map +1 -0
- package/dist/core/terminal-write-frame.js +44 -0
- package/dist/core/terminal-write-frame.js.map +1 -0
- package/dist/core/types.d.ts +14 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +6 -8
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +21 -4
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +415 -100
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/core/worker-startup-retry.d.ts +52 -0
- package/dist/core/worker-startup-retry.d.ts.map +1 -0
- package/dist/core/worker-startup-retry.js +68 -0
- package/dist/core/worker-startup-retry.js.map +1 -0
- package/dist/daemon.d.ts +9 -8
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +467 -171
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/autostart-api.d.ts +26 -0
- package/dist/dashboard/autostart-api.d.ts.map +1 -0
- package/dist/dashboard/autostart-api.js +88 -0
- package/dist/dashboard/autostart-api.js.map +1 -0
- 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 +2 -0
- package/dist/dashboard/bot-payload.js.map +1 -1
- package/dist/dashboard/control-csrf.d.ts +29 -1
- package/dist/dashboard/control-csrf.d.ts.map +1 -1
- package/dist/dashboard/control-csrf.js +45 -11
- package/dist/dashboard/control-csrf.js.map +1 -1
- package/dist/dashboard/customization-api.d.ts +23 -0
- package/dist/dashboard/customization-api.d.ts.map +1 -0
- package/dist/dashboard/customization-api.js +198 -0
- package/dist/dashboard/customization-api.js.map +1 -0
- package/dist/dashboard/debug-terminal.d.ts +13 -1
- package/dist/dashboard/debug-terminal.d.ts.map +1 -1
- package/dist/dashboard/debug-terminal.js +18 -4
- package/dist/dashboard/debug-terminal.js.map +1 -1
- package/dist/dashboard/settings-write-applier.d.ts +0 -23
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +7 -28
- package/dist/dashboard/settings-write-applier.js.map +1 -1
- package/dist/dashboard/terminal-control-route.d.ts +32 -0
- package/dist/dashboard/terminal-control-route.d.ts.map +1 -0
- package/dist/dashboard/terminal-control-route.js +70 -0
- package/dist/dashboard/terminal-control-route.js.map +1 -0
- package/dist/dashboard/terminal-control.d.ts +64 -13
- package/dist/dashboard/terminal-control.d.ts.map +1 -1
- package/dist/dashboard/terminal-control.js +77 -14
- package/dist/dashboard/terminal-control.js.map +1 -1
- package/dist/dashboard/terminal-front-proxy.d.ts.map +1 -1
- package/dist/dashboard/terminal-front-proxy.js +22 -8
- package/dist/dashboard/terminal-front-proxy.js.map +1 -1
- package/dist/dashboard/vc-consumer-profiles-api.d.ts +69 -18
- package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -1
- package/dist/dashboard/vc-consumer-profiles-api.js +149 -29
- package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -1
- package/dist/dashboard/web/agent-workbench-api.d.ts +34 -2
- package/dist/dashboard/web/agent-workbench-api.d.ts.map +1 -1
- package/dist/dashboard/web/agent-workbench-api.js +39 -4
- package/dist/dashboard/web/agent-workbench-api.js.map +1 -1
- package/dist/dashboard/web/agent-workbench-appearance.d.ts +6 -3
- package/dist/dashboard/web/agent-workbench-appearance.d.ts.map +1 -1
- package/dist/dashboard/web/agent-workbench-appearance.js +7 -4
- package/dist/dashboard/web/agent-workbench-appearance.js.map +1 -1
- package/dist/dashboard/web/agent-workbench-model.d.ts +2 -0
- package/dist/dashboard/web/agent-workbench-model.d.ts.map +1 -1
- package/dist/dashboard/web/agent-workbench-model.js.map +1 -1
- package/dist/dashboard/web/agent-workbench-page.js +2 -2
- package/dist/dashboard/web/agent-workbench-page.js.map +1 -1
- package/dist/dashboard/web/agent-workbench-panes.d.ts +59 -4
- package/dist/dashboard/web/agent-workbench-panes.d.ts.map +1 -1
- package/dist/dashboard/web/agent-workbench-panes.js +493 -85
- package/dist/dashboard/web/agent-workbench-panes.js.map +1 -1
- package/dist/dashboard/web/agent-workbench-session-list.d.ts +11 -7
- package/dist/dashboard/web/agent-workbench-session-list.d.ts.map +1 -1
- package/dist/dashboard/web/agent-workbench-session-list.js +24 -31
- package/dist/dashboard/web/agent-workbench-session-list.js.map +1 -1
- package/dist/dashboard/web/agent-workbench-terminal-control.d.ts +198 -0
- package/dist/dashboard/web/agent-workbench-terminal-control.d.ts.map +1 -0
- package/dist/dashboard/web/agent-workbench-terminal-control.js +292 -0
- package/dist/dashboard/web/agent-workbench-terminal-control.js.map +1 -0
- package/dist/dashboard/web/agent-workbench-view.d.ts +3 -2
- package/dist/dashboard/web/agent-workbench-view.d.ts.map +1 -1
- package/dist/dashboard/web/agent-workbench-view.js +69 -50
- package/dist/dashboard/web/agent-workbench-view.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +58 -7
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +24 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +191 -16
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +17 -0
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +51 -2
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/web/bot-onboarding.js +32 -8
- package/dist/dashboard/web/bot-onboarding.js.map +1 -1
- package/dist/dashboard/web/confirm-modal.d.ts +35 -0
- package/dist/dashboard/web/confirm-modal.d.ts.map +1 -0
- package/dist/dashboard/web/confirm-modal.js +111 -0
- package/dist/dashboard/web/confirm-modal.js.map +1 -0
- package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
- package/dist/dashboard/web/connectors-page.js +2 -1
- package/dist/dashboard/web/connectors-page.js.map +1 -1
- package/dist/dashboard/web/customization-page.d.ts +3 -0
- package/dist/dashboard/web/customization-page.d.ts.map +1 -0
- package/dist/dashboard/web/customization-page.js +315 -0
- package/dist/dashboard/web/customization-page.js.map +1 -0
- package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
- package/dist/dashboard/web/dashboard-routes.js +1 -0
- package/dist/dashboard/web/dashboard-routes.js.map +1 -1
- package/dist/dashboard/web/groups-page.d.ts.map +1 -1
- package/dist/dashboard/web/groups-page.js +11 -9
- 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 +226 -42
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/monitor-room.d.ts.map +1 -1
- package/dist/dashboard/web/monitor-room.js +3 -2
- package/dist/dashboard/web/monitor-room.js.map +1 -1
- package/dist/dashboard/web/overview-page.d.ts.map +1 -1
- package/dist/dashboard/web/overview-page.js +98 -63
- package/dist/dashboard/web/overview-page.js.map +1 -1
- package/dist/dashboard/web/roles-page.d.ts.map +1 -1
- package/dist/dashboard/web/roles-page.js +4 -3
- package/dist/dashboard/web/roles-page.js.map +1 -1
- package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
- package/dist/dashboard/web/schedules-page.js +165 -18
- package/dist/dashboard/web/schedules-page.js.map +1 -1
- package/dist/dashboard/web/sessions-kanban.d.ts +2 -0
- package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-kanban.js +142 -24
- 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 +177 -94
- 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 +5 -4
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts +0 -8
- package/dist/dashboard/web/settings-page.d.ts.map +1 -1
- package/dist/dashboard/web/settings-page.js +185 -65
- package/dist/dashboard/web/settings-page.js.map +1 -1
- package/dist/dashboard/web/skills/skill-library-tab.d.ts +2 -0
- package/dist/dashboard/web/skills/skill-library-tab.d.ts.map +1 -1
- package/dist/dashboard/web/skills/skill-library-tab.js +15 -1
- package/dist/dashboard/web/skills/skill-library-tab.js.map +1 -1
- package/dist/dashboard/web/skills-page.d.ts.map +1 -1
- package/dist/dashboard/web/skills-page.js +5 -4
- package/dist/dashboard/web/skills-page.js.map +1 -1
- package/dist/dashboard/web/store.d.ts +5 -0
- package/dist/dashboard/web/store.d.ts.map +1 -1
- package/dist/dashboard/web/store.js +4 -0
- package/dist/dashboard/web/store.js.map +1 -1
- package/dist/dashboard/web/team-federation-page.d.ts.map +1 -1
- package/dist/dashboard/web/team-federation-page.js +3 -2
- package/dist/dashboard/web/team-federation-page.js.map +1 -1
- package/dist/dashboard/web/toast.d.ts +15 -0
- package/dist/dashboard/web/toast.d.ts.map +1 -0
- package/dist/dashboard/web/toast.js +70 -0
- package/dist/dashboard/web/toast.js.map +1 -0
- package/dist/dashboard/web/v3-components.d.ts.map +1 -1
- package/dist/dashboard/web/v3-components.js +2 -1
- package/dist/dashboard/web/v3-components.js.map +1 -1
- package/dist/dashboard/web/vc-consumer-profiles-section.d.ts +10 -12
- package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
- package/dist/dashboard/web/vc-consumer-profiles-section.js +219 -200
- package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
- package/dist/dashboard/web/whiteboards-page.d.ts.map +1 -1
- package/dist/dashboard/web/whiteboards-page.js +2 -1
- package/dist/dashboard/web/whiteboards-page.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/agent-workbench-dock-page-LZSUOCEQ.js +1 -0
- package/dist/dashboard-web/chunks/agent-workbench-page-YONDRJU7.js +1 -0
- package/dist/dashboard-web/chunks/bot-defaults-page-X7LV6373.js +1 -0
- package/dist/dashboard-web/chunks/chunk-2PVRDXEL.js +1 -0
- package/dist/dashboard-web/chunks/chunk-53JUKBU2.js +10 -0
- package/dist/dashboard-web/chunks/{chunk-5CJMHTT4.js → chunk-5QX4OYOR.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-NACP7BMR.js → chunk-5VRVJFQR.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-FDZ7WOBW.js → chunk-6ROOZWYV.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-F6KNPF4R.js → chunk-CK22743G.js} +15 -19
- package/dist/dashboard-web/chunks/chunk-CVNIMUPY.js +25 -0
- package/dist/dashboard-web/chunks/chunk-GJC2TMWS.js +2 -0
- package/dist/dashboard-web/chunks/chunk-OT6L6G7R.js +1 -0
- package/dist/dashboard-web/chunks/chunk-QITAMHW6.js +1 -0
- package/dist/dashboard-web/chunks/chunk-RHVFZC5Z.js +1 -0
- package/dist/dashboard-web/chunks/chunk-SOBMN2VY.js +1 -0
- package/dist/dashboard-web/chunks/chunk-SZOB6VK2.js +1 -0
- package/dist/dashboard-web/chunks/chunk-XVIXNQGC.js +44 -0
- package/dist/dashboard-web/chunks/chunk-YUJF34ME.js +1 -0
- package/dist/dashboard-web/chunks/connectors-page-LB2HEJ7F.js +1 -0
- package/dist/dashboard-web/chunks/customization-page-4GXBYLG6.js +105 -0
- package/dist/dashboard-web/chunks/feedback-page-IZQ7VLDG.js +1 -0
- package/dist/dashboard-web/chunks/groups-page-4WCP5OEV.js +8 -0
- package/dist/dashboard-web/chunks/{insights-page-HJFDYR5N.js → insights-page-TXQHIPQL.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-V7PCP47V.js → monitor-room-VBRVWXCM.js} +8 -8
- package/dist/dashboard-web/chunks/monitoring-page-QDDZWERE.js +2 -0
- package/dist/dashboard-web/chunks/office-page-PENFNYPG.js +1 -0
- package/dist/dashboard-web/chunks/overview-page-BZQDP6MP.js +1 -0
- package/dist/dashboard-web/chunks/plugin-page-JX4GSWZS.js +1 -0
- package/dist/dashboard-web/chunks/roles-page-VPNINZNK.js +1 -0
- package/dist/dashboard-web/chunks/schedules-page-BITO6HEA.js +1 -0
- package/dist/dashboard-web/chunks/sessions-page-ZKCOVTD2.js +8 -0
- package/dist/dashboard-web/chunks/settings-page-UT6JDTS6.js +2 -0
- package/dist/dashboard-web/chunks/skills-page-GULXVAJY.js +4 -0
- package/dist/dashboard-web/chunks/team-federation-page-CUUJWGEG.js +1 -0
- package/dist/dashboard-web/chunks/v3-page-5WVJ5AUR.js +94 -0
- package/dist/dashboard-web/chunks/whiteboards-page-FZ2CME4H.js +1 -0
- package/dist/dashboard-web/design-tokens.css +236 -0
- package/dist/dashboard-web/index.html +1 -0
- package/dist/dashboard-web/style.css +1930 -114
- package/dist/dashboard.js +360 -279
- package/dist/dashboard.js.map +1 -1
- package/dist/desktop/renderer/app.js +6 -0
- package/dist/desktop/renderer/app.js.map +1 -1
- package/dist/dsh-runner.js +139 -17
- package/dist/dsh-runner.js.map +1 -1
- package/dist/global-config.d.ts +33 -2
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +62 -0
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +12 -4
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/index.d.ts +27 -3
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +33 -4
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +12 -4
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +2 -0
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +7 -4
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +70 -16
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +38 -3
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +163 -13
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/v3-blocked-card-handler.d.ts.map +1 -1
- package/dist/im/lark/v3-blocked-card-handler.js +2 -1
- package/dist/im/lark/v3-blocked-card-handler.js.map +1 -1
- package/dist/im/lark/v3-blocked-card.d.ts +1 -1
- package/dist/im/lark/v3-blocked-card.d.ts.map +1 -1
- package/dist/im/lark/v3-blocked-card.js +14 -0
- package/dist/im/lark/v3-blocked-card.js.map +1 -1
- package/dist/index-core-only.js +2 -0
- package/dist/index-core-only.js.map +1 -1
- package/dist/index-daemon.js +3 -0
- package/dist/index-daemon.js.map +1 -1
- package/dist/platform/binding.d.ts +11 -1
- package/dist/platform/binding.d.ts.map +1 -1
- package/dist/platform/binding.js +3 -28
- package/dist/platform/binding.js.map +1 -1
- package/dist/services/codex-app-runner-protocol.d.ts +5 -0
- package/dist/services/codex-app-runner-protocol.d.ts.map +1 -1
- package/dist/services/codex-app-runner-protocol.js +5 -0
- package/dist/services/codex-app-runner-protocol.js.map +1 -1
- package/dist/services/customization-store.d.ts +93 -0
- package/dist/services/customization-store.d.ts.map +1 -0
- package/dist/services/customization-store.js +542 -0
- package/dist/services/customization-store.js.map +1 -0
- package/dist/services/file-bridge-path.d.ts.map +1 -1
- package/dist/services/file-bridge-path.js +3 -0
- package/dist/services/file-bridge-path.js.map +1 -1
- package/dist/services/grok-transcript.d.ts.map +1 -1
- package/dist/services/grok-transcript.js +44 -9
- package/dist/services/grok-transcript.js.map +1 -1
- package/dist/services/local-cli-opener.d.ts.map +1 -1
- package/dist/services/local-cli-opener.js +12 -3
- package/dist/services/local-cli-opener.js.map +1 -1
- package/dist/services/model-catalog.d.ts +54 -0
- package/dist/services/model-catalog.d.ts.map +1 -0
- package/dist/services/model-catalog.js +147 -0
- package/dist/services/model-catalog.js.map +1 -0
- package/dist/services/omp-transcript.d.ts +27 -0
- package/dist/services/omp-transcript.d.ts.map +1 -0
- package/dist/services/omp-transcript.js +214 -0
- package/dist/services/omp-transcript.js.map +1 -0
- package/dist/services/platform-team-store.d.ts +16 -8
- package/dist/services/platform-team-store.d.ts.map +1 -1
- package/dist/services/platform-team-store.js +17 -10
- package/dist/services/platform-team-store.js.map +1 -1
- package/dist/services/project-scanner.d.ts.map +1 -1
- package/dist/services/project-scanner.js +13 -8
- package/dist/services/project-scanner.js.map +1 -1
- package/dist/services/resumable-session-discovery.d.ts.map +1 -1
- package/dist/services/resumable-session-discovery.js +117 -35
- package/dist/services/resumable-session-discovery.js.map +1 -1
- package/dist/services/structured-bridge-clis.d.ts +5 -3
- package/dist/services/structured-bridge-clis.d.ts.map +1 -1
- package/dist/services/structured-bridge-clis.js +5 -1
- package/dist/services/structured-bridge-clis.js.map +1 -1
- package/dist/services/vc-meeting-action-gate.d.ts.map +1 -1
- package/dist/services/vc-meeting-action-gate.js +15 -4
- package/dist/services/vc-meeting-action-gate.js.map +1 -1
- package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts +46 -66
- package/dist/services/vc-meeting-consumer-profile-bootstrap.d.ts.map +1 -1
- package/dist/services/vc-meeting-consumer-profile-bootstrap.js +33 -292
- package/dist/services/vc-meeting-consumer-profile-bootstrap.js.map +1 -1
- package/dist/services/vc-meeting-consumer-profile-templates.js +3 -3
- package/dist/services/vc-meeting-consumer-profile-templates.js.map +1 -1
- package/dist/services/vc-meeting-delivery-store.d.ts +18 -0
- package/dist/services/vc-meeting-delivery-store.d.ts.map +1 -1
- package/dist/services/vc-meeting-delivery-store.js +55 -0
- package/dist/services/vc-meeting-delivery-store.js.map +1 -1
- package/dist/services/vc-meeting-send-policy.d.ts +21 -1
- package/dist/services/vc-meeting-send-policy.d.ts.map +1 -1
- package/dist/services/vc-meeting-send-policy.js +30 -2
- package/dist/services/vc-meeting-send-policy.js.map +1 -1
- package/dist/services/vc-meeting-shared-consumer-catalog-store.d.ts +78 -0
- package/dist/services/vc-meeting-shared-consumer-catalog-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-shared-consumer-catalog-store.js +227 -0
- package/dist/services/vc-meeting-shared-consumer-catalog-store.js.map +1 -0
- package/dist/services/vc-meeting-shared-consumer-catalog.d.ts +53 -0
- package/dist/services/vc-meeting-shared-consumer-catalog.d.ts.map +1 -0
- package/dist/services/vc-meeting-shared-consumer-catalog.js +161 -0
- package/dist/services/vc-meeting-shared-consumer-catalog.js.map +1 -0
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +1 -0
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/open-platform-automation.d.ts +20 -0
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +27 -0
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/skills/customization-bundle.d.ts +83 -0
- package/dist/skills/customization-bundle.d.ts.map +1 -0
- package/dist/skills/customization-bundle.js +214 -0
- package/dist/skills/customization-bundle.js.map +1 -0
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +10 -3
- package/dist/skills/definitions.js.map +1 -1
- package/dist/skills/effective-builtins.d.ts +38 -0
- package/dist/skills/effective-builtins.d.ts.map +1 -0
- package/dist/skills/effective-builtins.js +96 -0
- package/dist/skills/effective-builtins.js.map +1 -0
- package/dist/skills/injection-mode.d.ts +4 -1
- package/dist/skills/injection-mode.d.ts.map +1 -1
- package/dist/skills/injection-mode.js +11 -3
- package/dist/skills/injection-mode.js.map +1 -1
- package/dist/skills/installer.d.ts.map +1 -1
- package/dist/skills/installer.js +24 -1
- package/dist/skills/installer.js.map +1 -1
- package/dist/skills/prompt-fragments.d.ts +58 -0
- package/dist/skills/prompt-fragments.d.ts.map +1 -0
- package/dist/skills/prompt-fragments.js +88 -0
- package/dist/skills/prompt-fragments.js.map +1 -0
- package/dist/types.d.ts +51 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/cli-usage-limit.d.ts +50 -0
- package/dist/utils/cli-usage-limit.d.ts.map +1 -1
- package/dist/utils/cli-usage-limit.js +43 -0
- package/dist/utils/cli-usage-limit.js.map +1 -1
- 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 +88 -2
- package/dist/utils/idle-detector.js.map +1 -1
- package/dist/utils/stuck-detector.d.ts +5 -0
- package/dist/utils/stuck-detector.d.ts.map +1 -1
- package/dist/utils/stuck-detector.js +41 -0
- package/dist/utils/stuck-detector.js.map +1 -1
- package/dist/utils/usage-limit-tracker.d.ts +46 -0
- package/dist/utils/usage-limit-tracker.d.ts.map +1 -0
- package/dist/utils/usage-limit-tracker.js +91 -0
- package/dist/utils/usage-limit-tracker.js.map +1 -0
- package/dist/utils/user-token.js +1 -1
- package/dist/utils/user-token.js.map +1 -1
- package/dist/worker.js +542 -106
- package/dist/worker.js.map +1 -1
- package/dist/workflows/definition.d.ts +14 -14
- package/dist/workflows/events/payloads.d.ts +12 -12
- package/dist/workflows/events/schema.d.ts +164 -164
- package/dist/workflows/migration/v2-to-v3.js +1 -1
- package/dist/workflows/migration/v2-to-v3.js.map +1 -1
- package/dist/workflows/v3/architect.d.ts.map +1 -1
- package/dist/workflows/v3/architect.js +11 -5
- package/dist/workflows/v3/architect.js.map +1 -1
- package/dist/workflows/v3/artifact-contract-declarations.d.ts +22 -0
- package/dist/workflows/v3/artifact-contract-declarations.d.ts.map +1 -0
- package/dist/workflows/v3/artifact-contract-declarations.js +95 -0
- package/dist/workflows/v3/artifact-contract-declarations.js.map +1 -0
- package/dist/workflows/v3/contract.d.ts +1 -0
- package/dist/workflows/v3/contract.d.ts.map +1 -1
- package/dist/workflows/v3/contract.js.map +1 -1
- package/dist/workflows/v3/daemon-run.d.ts +2 -2
- package/dist/workflows/v3/daemon-run.d.ts.map +1 -1
- package/dist/workflows/v3/daemon-run.js +4 -0
- package/dist/workflows/v3/daemon-run.js.map +1 -1
- package/dist/workflows/v3/dag.d.ts +7 -0
- package/dist/workflows/v3/dag.d.ts.map +1 -1
- package/dist/workflows/v3/dag.js +69 -8
- package/dist/workflows/v3/dag.js.map +1 -1
- package/dist/workflows/v3/ephemeral-pool.js +1 -1
- package/dist/workflows/v3/ephemeral-pool.js.map +1 -1
- package/dist/workflows/v3/event-contract.d.ts +3 -1
- package/dist/workflows/v3/event-contract.d.ts.map +1 -1
- package/dist/workflows/v3/host.d.ts.map +1 -1
- package/dist/workflows/v3/host.js +5 -1
- package/dist/workflows/v3/host.js.map +1 -1
- package/dist/workflows/v3/journal.d.ts +1 -1
- package/dist/workflows/v3/journal.d.ts.map +1 -1
- package/dist/workflows/v3/journal.js.map +1 -1
- package/dist/workflows/v3/library-materialize.d.ts.map +1 -1
- package/dist/workflows/v3/library-materialize.js +9 -1
- package/dist/workflows/v3/library-materialize.js.map +1 -1
- package/dist/workflows/v3/library-schema.d.ts +3 -1
- package/dist/workflows/v3/library-schema.d.ts.map +1 -1
- package/dist/workflows/v3/library-schema.js +20 -4
- package/dist/workflows/v3/library-schema.js.map +1 -1
- package/dist/workflows/v3/library-store.d.ts.map +1 -1
- package/dist/workflows/v3/library-store.js +15 -3
- package/dist/workflows/v3/library-store.js.map +1 -1
- package/dist/workflows/v3/run-envelope.d.ts +16 -16
- package/dist/workflows/v3/shared-node-runtime.d.ts +2 -1
- package/dist/workflows/v3/shared-node-runtime.d.ts.map +1 -1
- package/dist/workflows/v3/shared-node-runtime.js +48 -7
- package/dist/workflows/v3/shared-node-runtime.js.map +1 -1
- package/package.json +2 -1
- package/dist/dashboard-web/chunks/agent-workbench-dock-page-IKAC5CFL.js +0 -1
- package/dist/dashboard-web/chunks/agent-workbench-page-M53UN5EB.js +0 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-YKE5SDZF.js +0 -10
- package/dist/dashboard-web/chunks/chunk-22WIADUT.js +0 -2
- package/dist/dashboard-web/chunks/chunk-24ONYQMR.js +0 -1
- package/dist/dashboard-web/chunks/chunk-2W6SCN3M.js +0 -1
- package/dist/dashboard-web/chunks/chunk-4XNJX6B3.js +0 -1
- package/dist/dashboard-web/chunks/chunk-5THX4DI2.js +0 -66
- package/dist/dashboard-web/chunks/chunk-7SZRL6FY.js +0 -1
- package/dist/dashboard-web/chunks/chunk-AGCPF6MT.js +0 -1
- package/dist/dashboard-web/chunks/chunk-FXW3V4JR.js +0 -1
- package/dist/dashboard-web/chunks/chunk-SYC6D5XU.js +0 -1
- package/dist/dashboard-web/chunks/connectors-page-VOISXXII.js +0 -1
- package/dist/dashboard-web/chunks/feedback-page-RN6HRZMS.js +0 -1
- package/dist/dashboard-web/chunks/groups-page-UQT6DCB7.js +0 -8
- package/dist/dashboard-web/chunks/monitoring-page-NKEKVQAP.js +0 -2
- package/dist/dashboard-web/chunks/office-page-GVJF73XW.js +0 -1
- package/dist/dashboard-web/chunks/overview-page-KHLV6VTI.js +0 -1
- package/dist/dashboard-web/chunks/plugin-page-J3OF5IY4.js +0 -1
- package/dist/dashboard-web/chunks/roles-page-WQIRSOLZ.js +0 -1
- package/dist/dashboard-web/chunks/schedules-page-J2DEY2X6.js +0 -1
- package/dist/dashboard-web/chunks/sessions-page-7BQFEA5P.js +0 -8
- package/dist/dashboard-web/chunks/settings-page-BJEIOFJH.js +0 -2
- package/dist/dashboard-web/chunks/skills-page-HGIFR3IU.js +0 -4
- package/dist/dashboard-web/chunks/team-federation-page-MR5ZPL4B.js +0 -1
- package/dist/dashboard-web/chunks/v3-page-GBR5JWPE.js +0 -94
- package/dist/dashboard-web/chunks/whiteboards-page-QAZM4BN3.js +0 -1
- package/dist/services/vc-meeting-consumer-profile-store.d.ts +0 -39
- package/dist/services/vc-meeting-consumer-profile-store.d.ts.map +0 -1
- package/dist/services/vc-meeting-consumer-profile-store.js +0 -191
- package/dist/services/vc-meeting-consumer-profile-store.js.map +0 -1
package/dist/.runtime-build-id
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
14c156c655efc61ed07f4a086355ded6d7394ff614c0288ec130fecb1fd25290
|
|
@@ -25,6 +25,28 @@ export interface RiffBackendConfig {
|
|
|
25
25
|
jwt?: string;
|
|
26
26
|
/** Name of env var containing the JWT token (default: RIFF_JWT). */
|
|
27
27
|
jwtEnv?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Command to refresh the ByteCloud JWT when the keychain holds no live token.
|
|
30
|
+
* When neither `config.jwt` nor the env token is set and `readBytecloudKeychainJwt`
|
|
31
|
+
* returns null (every candidate expired / within the safety window / absent),
|
|
32
|
+
* riff task creation would fail with a 401 that aborts the whole turn. Before
|
|
33
|
+
* giving up, we run this command ONCE (debounced) to let the owning CLI
|
|
34
|
+
* (bytedcli / kaboo-cli) refresh credentials and rewrite the keychain, then
|
|
35
|
+
* re-read. bytedcli is the ByteCloud JWT owner: `bytedcli auth
|
|
36
|
+
* get-bytecloud-jwt-token --force-refresh` refreshes via its Auth SDK and
|
|
37
|
+
* writes the token to `~/.local/share/bytedcli/data/bytecloud-auth/…`, which is
|
|
38
|
+
* already a `bytecloudKeychainCandidates` path.
|
|
39
|
+
*
|
|
40
|
+
* Shape: [binary, ...args]. When unset, resolves in order:
|
|
41
|
+
* 1. env `BOTMUX_RIFF_JWT_REFRESH_CMD` (space-split, e.g. `bytedcli auth get-bytecloud-jwt-token --force-refresh`)
|
|
42
|
+
* 2. a `bytedcli` binary found on PATH → `bytedcli auth get-bytecloud-jwt-token --force-refresh`
|
|
43
|
+
* 3. otherwise no auto-refresh (fail-closed to the old behaviour — a 401).
|
|
44
|
+
* We intentionally do NOT default to `npx @bytedance-dev/bytedcli@latest`: an
|
|
45
|
+
* uncached/`@latest` npx resolve can block ~30s per call, far too slow for a
|
|
46
|
+
* synchronous pre-request refresh. Deployments wanting npx must set the env
|
|
47
|
+
* explicitly (and ideally pin the version).
|
|
48
|
+
*/
|
|
49
|
+
jwtRefreshCmd?: string[];
|
|
28
50
|
/** Sandbox resource pool selected for newly-created tasks. Riff defaults to
|
|
29
51
|
* BOE when omitted; follow-ups inherit the parent task's sandbox. */
|
|
30
52
|
sandboxCluster?: RiffSandboxCluster;
|
|
@@ -183,6 +205,62 @@ export declare function decodeJwtExp(jwt: string): number | null;
|
|
|
183
205
|
*/
|
|
184
206
|
export declare const JWT_EXPIRY_SAFETY_WINDOW_SEC = 30;
|
|
185
207
|
export declare function readBytecloudKeychainJwt(home?: string, env?: NodeJS.ProcessEnv, nowMs?: number, platform?: NodeJS.Platform): string | null;
|
|
208
|
+
/**
|
|
209
|
+
* Locate a `bytedcli` binary on PATH (used to build the default JWT-refresh
|
|
210
|
+
* command). Returns the bare name `bytedcli` when found so execFileSync resolves
|
|
211
|
+
* it via PATH, or null when absent. Injectable env/platform for testing.
|
|
212
|
+
*
|
|
213
|
+
* We look for a real installed binary rather than defaulting to
|
|
214
|
+
* `npx @bytedance-dev/bytedcli@latest`: an uncached / `@latest` npx resolve can
|
|
215
|
+
* block ~30s, which is unacceptable on the synchronous pre-request path. If
|
|
216
|
+
* bytedcli is not installed we simply do not auto-refresh (fail-closed to the
|
|
217
|
+
* prior behaviour — the request may 401, exactly as before this change).
|
|
218
|
+
*/
|
|
219
|
+
export declare function findBytedcliBinary(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): string | null;
|
|
220
|
+
/**
|
|
221
|
+
* Resolve the JWT-refresh command: explicit config → env
|
|
222
|
+
* `BOTMUX_RIFF_JWT_REFRESH_CMD` (space-split) → a PATH-resident bytedcli →
|
|
223
|
+
* null (no auto-refresh). See RiffBackendConfig.jwtRefreshCmd for the rationale.
|
|
224
|
+
*/
|
|
225
|
+
export declare function resolveJwtRefreshCmd(configured: string[] | undefined, env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): string[] | null;
|
|
226
|
+
/** Minimum gap between speculative JWT refresh attempts. When the keychain
|
|
227
|
+
* holds no live token, a reconnect/follow-up loop would otherwise trigger a
|
|
228
|
+
* refresh on EVERY getJwt() call; we cap proactive refreshes at one per window
|
|
229
|
+
* and let the shared keychain re-read serve the rest. Also caps the cost of a
|
|
230
|
+
* refresh command that keeps failing (e.g. bytedcli not logged in). A refresh
|
|
231
|
+
* driven by an actual server 401 bypasses this window (see `force`). */
|
|
232
|
+
export declare const JWT_REFRESH_DEBOUNCE_MS = 60000;
|
|
233
|
+
/** How long a single refresh command may run before we give up. Once the
|
|
234
|
+
* refresh is asynchronous (below) this no longer blocks the event loop — it
|
|
235
|
+
* only bounds one awaited child process — so we keep it generous: a cold
|
|
236
|
+
* bytedcli token fetch can take a few seconds, and a session that cannot get a
|
|
237
|
+
* JWT has nothing useful to do anyway. */
|
|
238
|
+
export declare const JWT_REFRESH_TIMEOUT_MS = 30000;
|
|
239
|
+
export declare function __resetJwtRefreshDebounceForTest(): void;
|
|
240
|
+
export interface RefreshBytecloudJwtOpts {
|
|
241
|
+
/** Injectable async runner (defaults to a real execFile). */
|
|
242
|
+
runner?: (bin: string, args: string[]) => Promise<void>;
|
|
243
|
+
/** Injectable clock for the debounce window (defaults to Date.now()). */
|
|
244
|
+
nowMs?: number;
|
|
245
|
+
/** Bypass the debounce window. Set only when an actual server 401/403 proved
|
|
246
|
+
* the current token is bad — a rejection is authoritative evidence worth one
|
|
247
|
+
* more attempt even inside the window. Never set for speculative refreshes. */
|
|
248
|
+
force?: boolean;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Run the JWT-refresh command once, ASYNCHRONOUSLY. Never throws: a missing
|
|
252
|
+
* command, a non-zero exit, or a timeout all resolve to `false` (the caller then
|
|
253
|
+
* falls back to whatever the keychain holds — i.e. the pre-change behaviour).
|
|
254
|
+
* Resolves true only when a command actually ran to completion.
|
|
255
|
+
*
|
|
256
|
+
* Async + injectable (runner / now / force) so it never blocks the event loop
|
|
257
|
+
* (critical on the daemon-side orphan-cancel path) and the debounce / coalesce /
|
|
258
|
+
* fail-closed paths are unit-testable without spawning a real process.
|
|
259
|
+
*
|
|
260
|
+
* COALESCE: if a refresh is already in flight, ride it instead of spawning a
|
|
261
|
+
* second bytedcli — concurrent getJwt() callers share one refresh.
|
|
262
|
+
*/
|
|
263
|
+
export declare function refreshBytecloudJwt(cmd: string[] | null, opts?: RefreshBytecloudJwtOpts): Promise<boolean>;
|
|
186
264
|
/**
|
|
187
265
|
* RiffBackend — bridges botmux's SessionBackend interface to riff's HTTP API.
|
|
188
266
|
*
|
|
@@ -287,7 +365,12 @@ export declare class RiffBackend implements SessionBackend {
|
|
|
287
365
|
* worker forwards it to the daemon so the follow-up lineage survives a
|
|
288
366
|
* daemon restart (currentTaskId otherwise lives only in this process). */
|
|
289
367
|
onTaskId(cb: (taskId: string | null) => void): void;
|
|
290
|
-
/** Resolve JWT dynamically — re-reads env/keychain each call so auto-refresh
|
|
368
|
+
/** Resolve JWT dynamically — re-reads env/keychain each call so auto-refresh
|
|
369
|
+
* works. Async because a keychain miss may trigger a (non-blocking) CLI
|
|
370
|
+
* refresh. `opts.allowRefresh=false` skips the refresh entirely (daemon-side
|
|
371
|
+
* orphan-cancel: a best-effort teardown must never freeze the daemon on a
|
|
372
|
+
* host-identity refresh). `opts.forceRefresh=true` bypasses the debounce
|
|
373
|
+
* window (an actual server 401 proved the token bad). */
|
|
291
374
|
private getJwt;
|
|
292
375
|
private resolveJwt;
|
|
293
376
|
private readJwtFromBytecloudKeychain;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"riff-backend.d.ts","sourceRoot":"","sources":["../../../src/adapters/backend/riff-backend.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"riff-backend.d.ts","sourceRoot":"","sources":["../../../src/adapters/backend/riff-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { execFileSync } from 'node:child_process';
|
|
3
|
+
import { join, delimiter } from 'node:path';
|
|
4
|
+
import { execFileSync, execFile } from 'node:child_process';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
5
6
|
import { createHash } from 'node:crypto';
|
|
6
7
|
import { logger } from '../../utils/logger.js';
|
|
7
8
|
import { escapeXmlTagLikeTokens } from '../../utils/xml.js';
|
|
@@ -166,7 +167,7 @@ export function deriveRiffReposFromDirs(dirs, deriveOne = deriveRiffRepoFromWork
|
|
|
166
167
|
export async function cancelRiffTaskById(cfg, taskId) {
|
|
167
168
|
const attempt = async () => {
|
|
168
169
|
const headers = { 'Content-Type': 'application/json' };
|
|
169
|
-
const jwt = new RiffBackend(cfg, 'orphan-cancel')['resolveJwt']();
|
|
170
|
+
const jwt = await new RiffBackend(cfg, 'orphan-cancel')['resolveJwt']({ allowRefresh: false });
|
|
170
171
|
if (jwt)
|
|
171
172
|
headers['x-jwt-token'] = jwt;
|
|
172
173
|
const resp = await fetch(`${cfg.baseUrl}/api/task-cancel`, {
|
|
@@ -229,6 +230,12 @@ function aimeDataHome(env) {
|
|
|
229
230
|
return null;
|
|
230
231
|
return join(workspace, sanitizeAimeUser(user), '.local', 'share');
|
|
231
232
|
}
|
|
233
|
+
/** True when BOTH AIME vars are set (trimmed non-empty), i.e. bytedcli swaps its
|
|
234
|
+
* storage root to the AIME workspace. In that runtime we must not trigger a
|
|
235
|
+
* host-identity JWT refresh — see resolveJwt's fail-closed skip. */
|
|
236
|
+
function isFullAimeRuntime(env) {
|
|
237
|
+
return aimeDataHome(env) !== null;
|
|
238
|
+
}
|
|
232
239
|
/**
|
|
233
240
|
* The keychain candidates for a ByteCloud tool's `bytecloud-auth/` store, across
|
|
234
241
|
* the CLIs botmux users log into (kaboo-cli / aiden-cli / cjadk / bytedcli).
|
|
@@ -426,6 +433,129 @@ export function readBytecloudKeychainJwt(home = homedir(), env = process.env, no
|
|
|
426
433
|
}
|
|
427
434
|
return bestLive?.jwt ?? opaqueFallback;
|
|
428
435
|
}
|
|
436
|
+
/**
|
|
437
|
+
* Locate a `bytedcli` binary on PATH (used to build the default JWT-refresh
|
|
438
|
+
* command). Returns the bare name `bytedcli` when found so execFileSync resolves
|
|
439
|
+
* it via PATH, or null when absent. Injectable env/platform for testing.
|
|
440
|
+
*
|
|
441
|
+
* We look for a real installed binary rather than defaulting to
|
|
442
|
+
* `npx @bytedance-dev/bytedcli@latest`: an uncached / `@latest` npx resolve can
|
|
443
|
+
* block ~30s, which is unacceptable on the synchronous pre-request path. If
|
|
444
|
+
* bytedcli is not installed we simply do not auto-refresh (fail-closed to the
|
|
445
|
+
* prior behaviour — the request may 401, exactly as before this change).
|
|
446
|
+
*/
|
|
447
|
+
export function findBytedcliBinary(env = process.env, platform = process.platform) {
|
|
448
|
+
const pathVar = env.PATH ?? env.Path ?? '';
|
|
449
|
+
if (!pathVar)
|
|
450
|
+
return null;
|
|
451
|
+
const names = platform === 'win32' ? ['bytedcli.cmd', 'bytedcli.exe', 'bytedcli'] : ['bytedcli'];
|
|
452
|
+
for (const dir of pathVar.split(delimiter)) {
|
|
453
|
+
if (!dir)
|
|
454
|
+
continue;
|
|
455
|
+
for (const name of names) {
|
|
456
|
+
try {
|
|
457
|
+
if (existsSync(join(dir, name)))
|
|
458
|
+
return 'bytedcli';
|
|
459
|
+
}
|
|
460
|
+
catch { /* ignore unreadable PATH entry */ }
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
return null;
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Resolve the JWT-refresh command: explicit config → env
|
|
467
|
+
* `BOTMUX_RIFF_JWT_REFRESH_CMD` (space-split) → a PATH-resident bytedcli →
|
|
468
|
+
* null (no auto-refresh). See RiffBackendConfig.jwtRefreshCmd for the rationale.
|
|
469
|
+
*/
|
|
470
|
+
export function resolveJwtRefreshCmd(configured, env = process.env, platform = process.platform) {
|
|
471
|
+
if (configured && configured.length > 0)
|
|
472
|
+
return configured;
|
|
473
|
+
const fromEnv = env.BOTMUX_RIFF_JWT_REFRESH_CMD?.trim();
|
|
474
|
+
if (fromEnv) {
|
|
475
|
+
const parts = fromEnv.split(/\s+/).filter(Boolean);
|
|
476
|
+
if (parts.length > 0)
|
|
477
|
+
return parts;
|
|
478
|
+
}
|
|
479
|
+
const bin = findBytedcliBinary(env, platform);
|
|
480
|
+
if (bin)
|
|
481
|
+
return [bin, 'auth', 'get-bytecloud-jwt-token', '--force-refresh'];
|
|
482
|
+
return null;
|
|
483
|
+
}
|
|
484
|
+
/** Minimum gap between speculative JWT refresh attempts. When the keychain
|
|
485
|
+
* holds no live token, a reconnect/follow-up loop would otherwise trigger a
|
|
486
|
+
* refresh on EVERY getJwt() call; we cap proactive refreshes at one per window
|
|
487
|
+
* and let the shared keychain re-read serve the rest. Also caps the cost of a
|
|
488
|
+
* refresh command that keeps failing (e.g. bytedcli not logged in). A refresh
|
|
489
|
+
* driven by an actual server 401 bypasses this window (see `force`). */
|
|
490
|
+
export const JWT_REFRESH_DEBOUNCE_MS = 60_000;
|
|
491
|
+
/** How long a single refresh command may run before we give up. Once the
|
|
492
|
+
* refresh is asynchronous (below) this no longer blocks the event loop — it
|
|
493
|
+
* only bounds one awaited child process — so we keep it generous: a cold
|
|
494
|
+
* bytedcli token fetch can take a few seconds, and a session that cannot get a
|
|
495
|
+
* JWT has nothing useful to do anyway. */
|
|
496
|
+
export const JWT_REFRESH_TIMEOUT_MS = 30_000;
|
|
497
|
+
/** Process-wide last-attempt timestamp (ms). Shared across RiffBackend instances
|
|
498
|
+
* because the orphan-cancel path builds a throwaway instance per call — a
|
|
499
|
+
* per-instance clock there would never debounce. `-Infinity` means "never
|
|
500
|
+
* attempted", so the first call always runs regardless of the clock's
|
|
501
|
+
* magnitude. Reset helper for tests. */
|
|
502
|
+
let lastJwtRefreshAtMs = Number.NEGATIVE_INFINITY;
|
|
503
|
+
/** In-flight refresh, shared process-wide so concurrent callers COALESCE onto a
|
|
504
|
+
* single child process instead of each spawning their own bytedcli. `null`
|
|
505
|
+
* between attempts. */
|
|
506
|
+
let inFlightJwtRefresh = null;
|
|
507
|
+
export function __resetJwtRefreshDebounceForTest() {
|
|
508
|
+
lastJwtRefreshAtMs = Number.NEGATIVE_INFINITY;
|
|
509
|
+
inFlightJwtRefresh = null;
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Run the JWT-refresh command once, ASYNCHRONOUSLY. Never throws: a missing
|
|
513
|
+
* command, a non-zero exit, or a timeout all resolve to `false` (the caller then
|
|
514
|
+
* falls back to whatever the keychain holds — i.e. the pre-change behaviour).
|
|
515
|
+
* Resolves true only when a command actually ran to completion.
|
|
516
|
+
*
|
|
517
|
+
* Async + injectable (runner / now / force) so it never blocks the event loop
|
|
518
|
+
* (critical on the daemon-side orphan-cancel path) and the debounce / coalesce /
|
|
519
|
+
* fail-closed paths are unit-testable without spawning a real process.
|
|
520
|
+
*
|
|
521
|
+
* COALESCE: if a refresh is already in flight, ride it instead of spawning a
|
|
522
|
+
* second bytedcli — concurrent getJwt() callers share one refresh.
|
|
523
|
+
*/
|
|
524
|
+
export function refreshBytecloudJwt(cmd, opts = {}) {
|
|
525
|
+
const { runner = defaultJwtRefreshRunner, nowMs = Date.now(), force = false } = opts;
|
|
526
|
+
if (!cmd || cmd.length === 0)
|
|
527
|
+
return Promise.resolve(false);
|
|
528
|
+
// Coalesce first: a forced caller still rides an in-flight refresh rather than
|
|
529
|
+
// racing a second child — the running one will rewrite the keychain either way.
|
|
530
|
+
if (inFlightJwtRefresh)
|
|
531
|
+
return inFlightJwtRefresh;
|
|
532
|
+
// Debounce: cap the cost of a refresh that keeps failing. A forced (401-driven)
|
|
533
|
+
// refresh bypasses the window — the token was provably rejected.
|
|
534
|
+
if (!force && nowMs - lastJwtRefreshAtMs < JWT_REFRESH_DEBOUNCE_MS)
|
|
535
|
+
return Promise.resolve(false);
|
|
536
|
+
lastJwtRefreshAtMs = nowMs;
|
|
537
|
+
const [bin, ...args] = cmd;
|
|
538
|
+
const run = (async () => {
|
|
539
|
+
try {
|
|
540
|
+
await runner(bin, args);
|
|
541
|
+
return true;
|
|
542
|
+
}
|
|
543
|
+
catch (err) {
|
|
544
|
+
logger.warn(`[riff] JWT refresh command failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
})();
|
|
548
|
+
inFlightJwtRefresh = run;
|
|
549
|
+
return run.finally(() => { if (inFlightJwtRefresh === run)
|
|
550
|
+
inFlightJwtRefresh = null; });
|
|
551
|
+
}
|
|
552
|
+
const execFileAsync = promisify(execFile);
|
|
553
|
+
/** Default refresh runner: async execFile with a bounded timeout. stdout/stderr
|
|
554
|
+
* are discarded — the command's SIDE EFFECT (rewriting the keychain) is what
|
|
555
|
+
* matters; we re-read the keychain afterwards rather than parse its output. */
|
|
556
|
+
async function defaultJwtRefreshRunner(bin, args) {
|
|
557
|
+
await execFileAsync(bin, args, { timeout: JWT_REFRESH_TIMEOUT_MS });
|
|
558
|
+
}
|
|
429
559
|
function defaultRunGit(cwd) {
|
|
430
560
|
return (args) => {
|
|
431
561
|
try {
|
|
@@ -596,11 +726,17 @@ export class RiffBackend {
|
|
|
596
726
|
if (this.currentTaskId)
|
|
597
727
|
cb(this.currentTaskId);
|
|
598
728
|
}
|
|
599
|
-
/** Resolve JWT dynamically — re-reads env/keychain each call so auto-refresh
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
729
|
+
/** Resolve JWT dynamically — re-reads env/keychain each call so auto-refresh
|
|
730
|
+
* works. Async because a keychain miss may trigger a (non-blocking) CLI
|
|
731
|
+
* refresh. `opts.allowRefresh=false` skips the refresh entirely (daemon-side
|
|
732
|
+
* orphan-cancel: a best-effort teardown must never freeze the daemon on a
|
|
733
|
+
* host-identity refresh). `opts.forceRefresh=true` bypasses the debounce
|
|
734
|
+
* window (an actual server 401 proved the token bad). */
|
|
735
|
+
getJwt(opts = {}) {
|
|
736
|
+
return this.resolveJwt(opts);
|
|
737
|
+
}
|
|
738
|
+
async resolveJwt(opts = {}) {
|
|
739
|
+
const { allowRefresh = true, forceRefresh = false } = opts;
|
|
604
740
|
if (this.config.jwt)
|
|
605
741
|
return this.config.jwt;
|
|
606
742
|
const envKey = this.config.jwtEnv ?? 'RIFF_JWT';
|
|
@@ -609,10 +745,37 @@ export class RiffBackend {
|
|
|
609
745
|
return fromEnv;
|
|
610
746
|
// Fallback: try ByteCloud Auth SDK keychain (kaboo-cli / aiden-cli / cjadk / bytedcli)
|
|
611
747
|
const fromKeychain = this.readJwtFromBytecloudKeychain();
|
|
612
|
-
|
|
748
|
+
// A forced refresh (post-401) intentionally ignores an existing keychain
|
|
749
|
+
// token: the server just rejected whatever we had, so re-reading the same
|
|
750
|
+
// store without refreshing first would hand back the same bad token.
|
|
751
|
+
if (fromKeychain && !forceRefresh) {
|
|
613
752
|
logger.info(`[riff] JWT loaded from ByteCloud keychain`);
|
|
614
753
|
return fromKeychain;
|
|
615
754
|
}
|
|
755
|
+
// No live keychain token (or a forced post-401 refresh) — every candidate is
|
|
756
|
+
// expired, within the safety window, or absent. This is exactly the "token
|
|
757
|
+
// expired mid-task" / "expired at startup" case (the JWT is re-read per
|
|
758
|
+
// request). Before giving up to a 401 that would abort the turn, ask the
|
|
759
|
+
// owning CLI to refresh (non-blocking async, coalesced, non-fatal), then
|
|
760
|
+
// re-read once. Skipped when allowRefresh=false (daemon-side orphan-cancel)
|
|
761
|
+
// and inside a full AIME runtime (fail-closed identity boundary — we never
|
|
762
|
+
// trigger a host-identity refresh there; the AIME store is refreshed inside
|
|
763
|
+
// AIME).
|
|
764
|
+
if (allowRefresh && !isFullAimeRuntime(process.env)) {
|
|
765
|
+
const cmd = resolveJwtRefreshCmd(this.config.jwtRefreshCmd);
|
|
766
|
+
if (await refreshBytecloudJwt(cmd, { force: forceRefresh })) {
|
|
767
|
+
const refreshed = this.readJwtFromBytecloudKeychain();
|
|
768
|
+
if (refreshed) {
|
|
769
|
+
logger.info(`[riff] JWT refreshed via ByteCloud CLI and reloaded from keychain`);
|
|
770
|
+
return refreshed;
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
// Forced refresh found nothing new — fall back to the (rejected) keychain
|
|
775
|
+
// token rather than null: a stale token is no worse than no token, and the
|
|
776
|
+
// caller already knows it 401'd.
|
|
777
|
+
if (fromKeychain)
|
|
778
|
+
return fromKeychain;
|
|
616
779
|
logger.warn(`[riff] JWT not found in config, env ${envKey}, or ByteCloud keychain; API calls will fail`);
|
|
617
780
|
return null;
|
|
618
781
|
}
|
|
@@ -1249,11 +1412,31 @@ export class RiffBackend {
|
|
|
1249
1412
|
body = JSON.stringify(payload);
|
|
1250
1413
|
}
|
|
1251
1414
|
// Resolve JWT last — right before the request — so the safety-window
|
|
1252
|
-
// freshness check reflects the token that actually goes on the wire.
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1415
|
+
// freshness check reflects the token that actually goes on the wire. `body`
|
|
1416
|
+
// (string or FormData) is re-extractable per fetch, so the retry below can
|
|
1417
|
+
// reuse it.
|
|
1418
|
+
const post = (jwt) => {
|
|
1419
|
+
const h = { ...headers };
|
|
1420
|
+
if (jwt)
|
|
1421
|
+
h['x-jwt-token'] = jwt;
|
|
1422
|
+
return fetch(url, { method: 'POST', headers: h, body, signal: AbortSignal.timeout(this.createTimeoutMs) });
|
|
1423
|
+
};
|
|
1424
|
+
const firstJwt = await this.getJwt();
|
|
1425
|
+
let resp = await post(firstJwt);
|
|
1426
|
+
// One retry on an auth rejection. A 401/403 is authoritative proof the token
|
|
1427
|
+
// was bad (expired mid-flight / stale at startup), so it justifies forcing a
|
|
1428
|
+
// JWT refresh that bypasses the debounce window. We retry ONLY when the
|
|
1429
|
+
// refresh produced a genuinely different token — otherwise the second POST
|
|
1430
|
+
// would just replay the same rejected credential (this also naturally
|
|
1431
|
+
// no-ops inside a full AIME runtime, where the host refresh is skipped).
|
|
1432
|
+
// Other statuses (400/5xx) are not auth problems and are not retried.
|
|
1433
|
+
if (resp.status === 401 || resp.status === 403) {
|
|
1434
|
+
const freshJwt = await this.getJwt({ forceRefresh: true });
|
|
1435
|
+
if (freshJwt && freshJwt !== firstJwt) {
|
|
1436
|
+
logger.warn(`[riff] task create/follow-up got HTTP ${resp.status}; retrying once with a refreshed JWT`);
|
|
1437
|
+
resp = await post(freshJwt);
|
|
1438
|
+
}
|
|
1439
|
+
}
|
|
1257
1440
|
if (!resp.ok)
|
|
1258
1441
|
throw new Error(`HTTP ${resp.status}: ${await resp.text()}`);
|
|
1259
1442
|
const result = (await resp.json());
|
|
@@ -1316,7 +1499,7 @@ export class RiffBackend {
|
|
|
1316
1499
|
async cancelTask(taskId) {
|
|
1317
1500
|
const url = `${this.config.baseUrl}/api/task-cancel`;
|
|
1318
1501
|
const headers = { 'Content-Type': 'application/json' };
|
|
1319
|
-
const jwt = this.getJwt();
|
|
1502
|
+
const jwt = await this.getJwt();
|
|
1320
1503
|
if (jwt)
|
|
1321
1504
|
headers['x-jwt-token'] = jwt;
|
|
1322
1505
|
const resp = await fetch(url, {
|
|
@@ -1361,7 +1544,7 @@ export class RiffBackend {
|
|
|
1361
1544
|
async streamTask(taskId) {
|
|
1362
1545
|
const url = `${this.config.baseUrl}/api2/task-stream?id=${encodeURIComponent(taskId)}`;
|
|
1363
1546
|
const headers = {};
|
|
1364
|
-
const jwt = this.getJwt();
|
|
1547
|
+
const jwt = await this.getJwt();
|
|
1365
1548
|
if (jwt)
|
|
1366
1549
|
headers['x-jwt-token'] = jwt;
|
|
1367
1550
|
this.abortController = new AbortController();
|
|
@@ -1680,7 +1863,7 @@ export class RiffBackend {
|
|
|
1680
1863
|
try {
|
|
1681
1864
|
const url = `${this.config.baseUrl}/api/task-detail?id=${encodeURIComponent(taskId)}`;
|
|
1682
1865
|
const headers = {};
|
|
1683
|
-
const jwt = this.getJwt();
|
|
1866
|
+
const jwt = await this.getJwt();
|
|
1684
1867
|
if (jwt)
|
|
1685
1868
|
headers['x-jwt-token'] = jwt;
|
|
1686
1869
|
const resp = await fetch(url, { headers, signal: AbortSignal.timeout(8000) });
|
|
@@ -1712,7 +1895,7 @@ export class RiffBackend {
|
|
|
1712
1895
|
try {
|
|
1713
1896
|
const url = `${this.config.baseUrl}/api/task-detail?id=${encodeURIComponent(taskId)}`;
|
|
1714
1897
|
const headers = {};
|
|
1715
|
-
const jwt = this.getJwt();
|
|
1898
|
+
const jwt = await this.getJwt();
|
|
1716
1899
|
if (jwt)
|
|
1717
1900
|
headers['x-jwt-token'] = jwt;
|
|
1718
1901
|
const resp = await fetch(url, { headers, signal: AbortSignal.timeout(8000) });
|