botmux 2.104.0 → 2.105.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +10 -10
- package/README.md +10 -10
- package/dist/adapters/backend/sandbox.d.ts +5 -1
- package/dist/adapters/backend/sandbox.d.ts.map +1 -1
- package/dist/adapters/backend/sandbox.js +54 -5
- package/dist/adapters/backend/sandbox.js.map +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.d.ts +1 -1
- package/dist/adapters/backend/tmux-pipe-backend.js +1 -1
- package/dist/adapters/backend/zellij-observe-backend.d.ts +1 -1
- package/dist/adapters/backend/zellij-observe-backend.js +1 -1
- package/dist/adapters/cli/claude-code.d.ts +1 -1
- package/dist/adapters/cli/read-isolation.d.ts +2 -1
- package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
- package/dist/adapters/cli/read-isolation.js +51 -4
- package/dist/adapters/cli/read-isolation.js.map +1 -1
- package/dist/adapters/cli/relay.d.ts +2 -2
- package/dist/adapters/cli/relay.js +2 -2
- package/dist/adapters/cli/seed.d.ts +2 -2
- package/dist/adapters/cli/seed.js +2 -2
- package/dist/adapters/cli/shared-hints.d.ts.map +1 -1
- package/dist/adapters/cli/shared-hints.js +1 -0
- package/dist/adapters/cli/shared-hints.js.map +1 -1
- package/dist/bot-registry.d.ts +65 -1
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +145 -0
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/send-dispatch.d.ts +44 -0
- package/dist/cli/send-dispatch.d.ts.map +1 -1
- package/dist/cli/send-dispatch.js +79 -0
- package/dist/cli/send-dispatch.js.map +1 -1
- package/dist/cli/vc-agent.d.ts +2 -0
- package/dist/cli/vc-agent.d.ts.map +1 -0
- package/dist/cli/vc-agent.js +331 -0
- package/dist/cli/vc-agent.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +125 -24
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -1
- package/dist/config.js.map +1 -1
- package/dist/core/auto-start.d.ts +2 -2
- package/dist/core/auto-start.js +2 -2
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +2 -1
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-events.d.ts +5 -0
- package/dist/core/dashboard-events.d.ts.map +1 -1
- package/dist/core/dashboard-events.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +47 -2
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/idle-worker-sweeper.d.ts +1 -1
- package/dist/core/idle-worker-sweeper.js +1 -1
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +1 -0
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/scheduler.d.ts +12 -0
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +67 -7
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/session-discovery.js +1 -1
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +55 -10
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +78 -23
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +3 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/worker-pool.d.ts +8 -1
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +31 -9
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/core/zellij-adopt-discovery.js +1 -1
- package/dist/core/zellij-adopt-discovery.js.map +1 -1
- package/dist/daemon.d.ts +121 -0
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +2644 -2
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/federated-group-core.js +1 -1
- package/dist/dashboard/federated-group-core.js.map +1 -1
- package/dist/dashboard/federation-api.js +1 -1
- package/dist/dashboard/schedule-card-model.d.ts +4 -3
- package/dist/dashboard/schedule-card-model.d.ts.map +1 -1
- package/dist/dashboard/schedule-card-model.js +5 -4
- package/dist/dashboard/schedule-card-model.js.map +1 -1
- package/dist/dashboard/settings-write-applier.d.ts +37 -3
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +63 -0
- package/dist/dashboard/settings-write-applier.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +28 -0
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/insights.js +19 -19
- package/dist/dashboard/web/insights.js.map +1 -1
- package/dist/dashboard/web/overview-page.d.ts.map +1 -1
- package/dist/dashboard/web/overview-page.js +7 -4
- package/dist/dashboard/web/overview-page.js.map +1 -1
- package/dist/dashboard/web/schedules-page.d.ts +1 -1
- package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
- package/dist/dashboard/web/schedules-page.js +7 -3
- package/dist/dashboard/web/schedules-page.js.map +1 -1
- package/dist/dashboard/web/sessions.js +2 -2
- package/dist/dashboard/web/settings-page.d.ts +9 -0
- package/dist/dashboard/web/settings-page.d.ts.map +1 -1
- package/dist/dashboard/web/settings-page.js +132 -43
- package/dist/dashboard/web/settings-page.js.map +1 -1
- package/dist/dashboard/web/store.d.ts +6 -0
- package/dist/dashboard/web/store.d.ts.map +1 -1
- package/dist/dashboard/web/store.js +18 -1
- package/dist/dashboard/web/store.js.map +1 -1
- package/dist/dashboard/webhook-routes.d.ts.map +1 -1
- package/dist/dashboard/webhook-routes.js +24 -0
- package/dist/dashboard/webhook-routes.js.map +1 -1
- package/dist/dashboard-web/app.js +3 -3
- package/dist/dashboard-web/chunks/{bot-defaults-page-Z36I5CKM.js → bot-defaults-page-3OIY7N76.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-2BBCKWNO.js → chunk-BNEXMNQD.js} +3 -3
- package/dist/dashboard-web/chunks/{chunk-QDKIUULH.js → chunk-DKKOGZCG.js} +1 -1
- package/dist/dashboard-web/chunks/chunk-LXIK7OUJ.js +1 -0
- package/dist/dashboard-web/chunks/{chunk-BAMNP73K.js → chunk-VFCACTRF.js} +1 -1
- package/dist/dashboard-web/chunks/{connectors-I3MGERCM.js → connectors-VDOAKUW3.js} +1 -1
- package/dist/dashboard-web/chunks/{groups-page-DTP2L4FQ.js → groups-page-CX5AN4XG.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-FNI24WYF.js → insights-page-DOMRL4S6.js} +1 -1
- package/dist/dashboard-web/chunks/overview-page-AZBAXVZ7.js +1 -0
- package/dist/dashboard-web/chunks/{roles-page-A5DZ7Q6U.js → roles-page-3FEAH6S4.js} +1 -1
- package/dist/dashboard-web/chunks/schedules-CTQEA7IE.js +1 -0
- package/dist/dashboard-web/chunks/{sessions-YJ735IH4.js → sessions-LVZCXO2Z.js} +1 -1
- package/dist/dashboard-web/chunks/{sessions-page-2REIJ56C.js → sessions-page-NHBJDSBC.js} +1 -1
- package/dist/dashboard-web/chunks/settings-page-CRDIHRNE.js +2 -0
- package/dist/dashboard-web/chunks/{skills-page-ZCCLHWMJ.js → skills-page-VUG3EPWX.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-4FCGO3WW.js → team-federation-page-ZKL3YMGN.js} +1 -1
- package/dist/dashboard-web/chunks/{workflows-KFJ7O57L.js → workflows-4BYQQBFP.js} +1 -1
- package/dist/dashboard-web/index.html +1 -1
- package/dist/dashboard-web/style.css +111 -16
- package/dist/dashboard.js +196 -2
- package/dist/dashboard.js.map +1 -1
- package/dist/global-config.d.ts +30 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +64 -1
- package/dist/global-config.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +10 -7
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +10 -7
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +1 -1
- package/dist/im/lark/card-builder.js +1 -1
- package/dist/im/lark/card-handler.d.ts +3 -0
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +8 -0
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +1 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +19 -0
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +10 -0
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +100 -21
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/grant-command.d.ts +1 -1
- package/dist/im/lark/grant-command.js +1 -1
- package/dist/im/lark/workflow-slash-command.js +4 -0
- package/dist/im/lark/workflow-slash-command.js.map +1 -1
- package/dist/mir-prompt.d.ts +16 -0
- package/dist/mir-prompt.d.ts.map +1 -0
- package/dist/mir-prompt.js +170 -0
- package/dist/mir-prompt.js.map +1 -0
- package/dist/mir-runner.js +1 -149
- package/dist/mir-runner.js.map +1 -1
- package/dist/platform/bind.d.ts.map +1 -1
- package/dist/platform/bind.js +3 -11
- package/dist/platform/bind.js.map +1 -1
- package/dist/platform/binding.d.ts +4 -5
- package/dist/platform/binding.d.ts.map +1 -1
- package/dist/platform/binding.js +0 -11
- package/dist/platform/binding.js.map +1 -1
- package/dist/platform/tunnel-client.d.ts.map +1 -1
- package/dist/platform/tunnel-client.js +37 -28
- package/dist/platform/tunnel-client.js.map +1 -1
- package/dist/services/deployment-identity.d.ts +1 -1
- package/dist/services/deployment-identity.d.ts.map +1 -1
- package/dist/services/deployment-identity.js +1 -1
- package/dist/services/deployment-identity.js.map +1 -1
- package/dist/services/doc-subs-store.js +1 -1
- package/dist/services/team-board-store.js +1 -1
- package/dist/services/team-board-store.js.map +1 -1
- package/dist/services/trigger-types.d.ts +2 -1
- package/dist/services/trigger-types.d.ts.map +1 -1
- package/dist/services/trigger-types.js +11 -2
- package/dist/services/trigger-types.js.map +1 -1
- package/dist/services/vc-meeting-runtime-store.d.ts +55 -0
- package/dist/services/vc-meeting-runtime-store.d.ts.map +1 -0
- package/dist/services/vc-meeting-runtime-store.js +313 -0
- package/dist/services/vc-meeting-runtime-store.js.map +1 -0
- package/dist/services/voice/index.d.ts +6 -1
- package/dist/services/voice/index.d.ts.map +1 -1
- package/dist/services/voice/index.js +12 -5
- package/dist/services/voice/index.js.map +1 -1
- package/dist/services/voice/sami.js +1 -1
- package/dist/setup/lark-scopes.json +5 -0
- package/dist/setup/verify-permissions.d.ts +6 -0
- package/dist/setup/verify-permissions.d.ts.map +1 -1
- package/dist/setup/verify-permissions.js +17 -0
- package/dist/setup/verify-permissions.js.map +1 -1
- package/dist/skills/definitions.d.ts.map +1 -1
- package/dist/skills/definitions.js +10 -0
- package/dist/skills/definitions.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/daemon-discovery.d.ts +2 -0
- package/dist/utils/daemon-discovery.d.ts.map +1 -1
- package/dist/utils/daemon-discovery.js +2 -0
- package/dist/utils/daemon-discovery.js.map +1 -1
- package/dist/utils/timezone.d.ts +51 -0
- package/dist/utils/timezone.d.ts.map +1 -0
- package/dist/utils/timezone.js +110 -0
- package/dist/utils/timezone.js.map +1 -0
- package/dist/vc-agent/cards.d.ts +47 -0
- package/dist/vc-agent/cards.d.ts.map +1 -0
- package/dist/vc-agent/cards.js +489 -0
- package/dist/vc-agent/cards.js.map +1 -0
- package/dist/vc-agent/meeting-state.d.ts +39 -0
- package/dist/vc-agent/meeting-state.d.ts.map +1 -0
- package/dist/vc-agent/meeting-state.js +186 -0
- package/dist/vc-agent/meeting-state.js.map +1 -0
- package/dist/vc-agent/normalizer.d.ts +13 -0
- package/dist/vc-agent/normalizer.d.ts.map +1 -0
- package/dist/vc-agent/normalizer.js +411 -0
- package/dist/vc-agent/normalizer.js.map +1 -0
- package/dist/vc-agent/polling-source.d.ts +36 -0
- package/dist/vc-agent/polling-source.d.ts.map +1 -0
- package/dist/vc-agent/polling-source.js +129 -0
- package/dist/vc-agent/polling-source.js.map +1 -0
- package/dist/vc-agent/push-source.d.ts +13 -0
- package/dist/vc-agent/push-source.d.ts.map +1 -0
- package/dist/vc-agent/push-source.js +109 -0
- package/dist/vc-agent/push-source.js.map +1 -0
- package/dist/vc-agent/realtime/audio-source.d.ts +6 -0
- package/dist/vc-agent/realtime/audio-source.d.ts.map +1 -0
- package/dist/vc-agent/realtime/audio-source.js +17 -0
- package/dist/vc-agent/realtime/audio-source.js.map +1 -0
- package/dist/vc-agent/realtime/endpoint.d.ts +6 -0
- package/dist/vc-agent/realtime/endpoint.d.ts.map +1 -0
- package/dist/vc-agent/realtime/endpoint.js +25 -0
- package/dist/vc-agent/realtime/endpoint.js.map +1 -0
- package/dist/vc-agent/realtime/errors.d.ts +9 -0
- package/dist/vc-agent/realtime/errors.d.ts.map +1 -0
- package/dist/vc-agent/realtime/errors.js +17 -0
- package/dist/vc-agent/realtime/errors.js.map +1 -0
- package/dist/vc-agent/realtime/events.d.ts +24 -0
- package/dist/vc-agent/realtime/events.d.ts.map +1 -0
- package/dist/vc-agent/realtime/events.js +190 -0
- package/dist/vc-agent/realtime/events.js.map +1 -0
- package/dist/vc-agent/realtime/frontier.d.ts +34 -0
- package/dist/vc-agent/realtime/frontier.d.ts.map +1 -0
- package/dist/vc-agent/realtime/frontier.js +40 -0
- package/dist/vc-agent/realtime/frontier.js.map +1 -0
- package/dist/vc-agent/realtime/index.d.ts +11 -0
- package/dist/vc-agent/realtime/index.d.ts.map +1 -0
- package/dist/vc-agent/realtime/index.js +11 -0
- package/dist/vc-agent/realtime/index.js.map +1 -0
- package/dist/vc-agent/realtime/pacer.d.ts +21 -0
- package/dist/vc-agent/realtime/pacer.d.ts.map +1 -0
- package/dist/vc-agent/realtime/pacer.js +80 -0
- package/dist/vc-agent/realtime/pacer.js.map +1 -0
- package/dist/vc-agent/realtime/protobuf.d.ts +33 -0
- package/dist/vc-agent/realtime/protobuf.d.ts.map +1 -0
- package/dist/vc-agent/realtime/protobuf.js +159 -0
- package/dist/vc-agent/realtime/protobuf.js.map +1 -0
- package/dist/vc-agent/realtime/protocol.d.ts +4 -0
- package/dist/vc-agent/realtime/protocol.d.ts.map +1 -0
- package/dist/vc-agent/realtime/protocol.js +59 -0
- package/dist/vc-agent/realtime/protocol.js.map +1 -0
- package/dist/vc-agent/realtime/session.d.ts +39 -0
- package/dist/vc-agent/realtime/session.d.ts.map +1 -0
- package/dist/vc-agent/realtime/session.js +221 -0
- package/dist/vc-agent/realtime/session.js.map +1 -0
- package/dist/vc-agent/realtime/transport.d.ts +23 -0
- package/dist/vc-agent/realtime/transport.d.ts.map +1 -0
- package/dist/vc-agent/realtime/transport.js +112 -0
- package/dist/vc-agent/realtime/transport.js.map +1 -0
- package/dist/vc-agent/realtime/types.d.ts +84 -0
- package/dist/vc-agent/realtime/types.d.ts.map +1 -0
- package/dist/vc-agent/realtime/types.js +5 -0
- package/dist/vc-agent/realtime/types.js.map +1 -0
- package/dist/vc-agent/types.d.ts +142 -0
- package/dist/vc-agent/types.d.ts.map +1 -0
- package/dist/vc-agent/types.js +2 -0
- package/dist/vc-agent/types.js.map +1 -0
- package/dist/worker.js +8 -5
- package/dist/worker.js.map +1 -1
- package/dist/workflows/attempt-resume.d.ts +4 -0
- package/dist/workflows/attempt-resume.d.ts.map +1 -1
- package/dist/workflows/attempt-resume.js +2 -0
- package/dist/workflows/attempt-resume.js.map +1 -1
- package/dist/workflows/attempt-terminal.d.ts +4 -0
- package/dist/workflows/attempt-terminal.d.ts.map +1 -1
- package/dist/workflows/attempt-terminal.js.map +1 -1
- package/dist/workflows/daemon-spawn.d.ts.map +1 -1
- package/dist/workflows/daemon-spawn.js +7 -0
- package/dist/workflows/daemon-spawn.js.map +1 -1
- package/dist/workflows/definition.d.ts +14 -14
- package/dist/workflows/events/payloads.d.ts +40 -8
- package/dist/workflows/events/payloads.d.ts.map +1 -1
- package/dist/workflows/events/payloads.js +4 -0
- package/dist/workflows/events/payloads.js.map +1 -1
- package/dist/workflows/events/schema.d.ts +508 -452
- package/dist/workflows/events/schema.d.ts.map +1 -1
- package/dist/workflows/runtime.d.ts +4 -0
- package/dist/workflows/runtime.d.ts.map +1 -1
- package/dist/workflows/runtime.js.map +1 -1
- package/dist/workflows/spawn-policy.d.ts +14 -0
- package/dist/workflows/spawn-policy.d.ts.map +1 -0
- package/dist/workflows/spawn-policy.js +9 -0
- package/dist/workflows/spawn-policy.js.map +1 -0
- package/dist/workflows/v3/bot-resolve.d.ts.map +1 -1
- package/dist/workflows/v3/bot-resolve.js +4 -0
- package/dist/workflows/v3/bot-resolve.js.map +1 -1
- package/dist/workflows/v3/cli-run.d.ts.map +1 -1
- package/dist/workflows/v3/cli-run.js +4 -0
- package/dist/workflows/v3/cli-run.js.map +1 -1
- package/dist/workflows/v3/contract.d.ts +9 -3
- package/dist/workflows/v3/contract.d.ts.map +1 -1
- package/dist/workflows/v3/contract.js +3 -3
- package/dist/workflows/v3/contract.js.map +1 -1
- package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -1
- package/dist/workflows/v3/ephemeral-pool.js +2 -0
- package/dist/workflows/v3/ephemeral-pool.js.map +1 -1
- package/dist/workflows/v3/runtime.js +1 -1
- package/dist/workflows/v3/runtime.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/chunk-76J7PNZI.js +0 -1
- package/dist/dashboard-web/chunks/overview-page-EHCZJBWY.js +0 -1
- package/dist/dashboard-web/chunks/schedules-RSXALJU4.js +0 -1
- package/dist/dashboard-web/chunks/settings-page-XKFTXTDE.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as u,b,c as p,d as c,i as m}from"./chunk-
|
|
1
|
+
import{a as u,b,c as p,d as c,i as m}from"./chunk-DKKOGZCG.js";import{b as r}from"./chunk-VFCACTRF.js";import"./chunk-LXIK7OUJ.js";import"./chunk-BNEXMNQD.js";import{a as v,b as l,c as d}from"./chunk-JTSE5VP6.js";import{c as i}from"./chunk-7SZRL6FY.js";var n=i(v(),1);var s=i(d(),1);function t(e){return(0,s.jsx)("th",{"data-sort":e.sort,"data-label":e.label,children:e.label})}function g(){let e=r(),o=(0,n.useRef)(null);return(0,n.useEffect)(()=>{if(o.current)return m(o.current)},[]),(0,s.jsxs)("section",{className:"page",ref:o,children:[(0,s.jsxs)("div",{className:"page-heading",children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{className:"eyebrow",children:e("nav.sessions")}),(0,s.jsx)("h1",{children:e("sessions.title")}),(0,s.jsx)("p",{children:e("sessions.subtitle")})]}),(0,s.jsxs)("div",{className:"sessions-view-controls",children:[(0,s.jsx)("span",{id:"kanban-team-stats",className:"kanban-team-stats",hidden:!0}),(0,s.jsx)("select",{id:"kanban-team",className:"kanban-team-select","aria-label":e("sessions.kanban.groupTeam"),hidden:!0}),(0,s.jsxs)("div",{className:"segmented kanban-groupby",id:"kanban-groupby",role:"group","aria-label":e("sessions.kanban.groupBy"),hidden:!0,children:[(0,s.jsx)("button",{type:"button","data-groupby":"flow",children:e("sessions.kanban.groupFlow")}),(0,s.jsx)("button",{type:"button","data-groupby":"team",children:e("sessions.kanban.groupTeam")}),(0,s.jsx)("button",{type:"button","data-groupby":"bot",children:e("sessions.kanban.groupBot")})]}),(0,s.jsxs)("div",{className:"segmented sessions-view-toggle",role:"group","aria-label":e("sessions.viewMode"),children:[(0,s.jsx)("button",{type:"button","data-view":"kanban",children:e("sessions.viewKanban")}),(0,s.jsx)("button",{type:"button","data-view":"board",children:e("sessions.viewBoard")}),(0,s.jsx)("button",{type:"button","data-view":"table",children:e("sessions.viewTable")})]})]})]}),(0,s.jsxs)("form",{id:"filters",className:"filters sessions-filters",children:[(0,s.jsx)("input",{type:"search",name:"q",placeholder:e("sessions.search")}),(0,s.jsxs)("select",{name:"status",children:[(0,s.jsx)("option",{value:"",children:e("sessions.anyStatus")}),b.map(a=>(0,s.jsx)("option",{value:a,children:p(a)},a))]}),(0,s.jsxs)("select",{name:"adopt",children:[(0,s.jsx)("option",{value:"",children:e("sessions.adoptAny")}),(0,s.jsx)("option",{value:"yes",children:e("sessions.adoptYes")}),(0,s.jsx)("option",{value:"no",children:e("sessions.adoptNo")})]}),(0,s.jsx)("span",{style:{display:"contents"},dangerouslySetInnerHTML:{__html:c()}}),(0,s.jsxs)("label",{className:"filter-toggle",children:[(0,s.jsx)("input",{type:"checkbox",name:"active",defaultChecked:!0})," ",(0,s.jsx)("span",{children:e("sessions.activeOnly")})]})]}),(0,s.jsxs)("div",{id:"idle-cleanup-bar",className:"idle-cleanup-bar",children:[(0,s.jsxs)("div",{className:"idle-cleanup-summary",children:[(0,s.jsx)("span",{className:"idle-cleanup-dot","aria-hidden":"true"}),(0,s.jsx)("span",{id:"idle-cleanup-count",className:"idle-cleanup-count"})]}),(0,s.jsxs)("div",{className:"idle-cleanup-controls",children:[(0,s.jsx)("span",{className:"idle-cleanup-label",children:e("sessions.idleCleanupOlderThan")}),(0,s.jsx)("div",{id:"idle-cleanup-threshold",className:"idle-cleanup-thresholds",role:"group","aria-label":e("sessions.idleCleanupThreshold"),children:u.map(a=>(0,s.jsx)("button",{type:"button","data-hours":a,"aria-pressed":a===24?"true":"false",children:a===168?"7d":`${a}H`},a))}),(0,s.jsx)("button",{type:"button",id:"idle-cleanup-run",className:"contrast idle-cleanup-run",children:e("sessions.idleCleanupRun")})]}),(0,s.jsx)("span",{id:"idle-cleanup-status",className:"idle-cleanup-status","aria-live":"polite"})]}),(0,s.jsxs)("div",{id:"bulk-bar",className:"bulk-bar",hidden:!0,children:[(0,s.jsx)("span",{id:"bulk-count"}),(0,s.jsx)("button",{type:"button",id:"bulk-lock",children:e("sessions.lockSelected")}),(0,s.jsx)("button",{type:"button",id:"bulk-unlock",children:e("sessions.unlockSelected")}),(0,s.jsx)("button",{type:"button",id:"bulk-close",className:"contrast",children:e("sessions.closeSelected")}),(0,s.jsx)("button",{type:"button",id:"bulk-clear",children:e("sessions.clearSelection")})]}),(0,s.jsxs)("table",{id:"sessions-table",children:[(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{children:(0,s.jsx)("input",{type:"checkbox",id:"select-all",title:e("sessions.activeOnly")})}),(0,s.jsx)(t,{sort:"botName",label:e("sessions.bot")}),(0,s.jsx)(t,{sort:"cliId",label:e("sessions.cli")}),(0,s.jsx)(t,{sort:"status",label:e("sessions.status")}),(0,s.jsx)(t,{sort:"tokenIn",label:e("sessions.tokenIn")}),(0,s.jsx)(t,{sort:"tokenOut",label:e("sessions.tokenOut")}),(0,s.jsx)(t,{sort:"title",label:e("sessions.titleCol")}),(0,s.jsx)(t,{sort:"workingDir",label:e("sessions.workingDir")}),(0,s.jsx)(t,{sort:"spawnedAt",label:e("sessions.created")}),(0,s.jsx)(t,{sort:"lastMessageAt",label:e("sessions.last")}),(0,s.jsx)(t,{sort:"adopt",label:e("sessions.adopt")}),(0,s.jsx)("th",{children:e("sessions.actions")})]})}),(0,s.jsx)("tbody",{})]}),(0,s.jsx)("div",{id:"sessions-board",className:"sessions-board",hidden:!0}),(0,s.jsx)("div",{id:"sessions-kanban",className:"sessions-kanban",hidden:!0}),(0,s.jsx)("dialog",{id:"drawer"}),(0,s.jsx)("dialog",{id:"term-modal",className:"term-modal"}),(0,s.jsx)("dialog",{id:"history-modal",className:"history-modal"})]})}function f(e){return l(e,(0,s.jsx)(g,{}))}export{f as renderSessionsPage};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{b as k}from"./chunk-VFCACTRF.js";import{a as z}from"./chunk-LXIK7OUJ.js";import"./chunk-BNEXMNQD.js";import{a as ue,b as J,c as G}from"./chunk-JTSE5VP6.js";import{c as Z}from"./chunk-7SZRL6FY.js";var o=Z(ue(),1);var e=Z(G(),1),ge=["Asia/Shanghai","Asia/Hong_Kong","Asia/Tokyo","Asia/Singapore","Asia/Kolkata","UTC","Europe/London","Europe/Paris","Europe/Moscow","America/Los_Angeles","America/New_York","America/Sao_Paulo","Australia/Sydney"];function Y(t){return{publicReadOnly:t?.publicReadOnly===!0,openTerminalInFeishu:t?.openTerminalInFeishu===!0,chatBotDiscovery:t?.chatBotDiscovery!==!1,vcMeetingAgent:{enabled:t?.vcMeetingAgent?.enabled!==!1,listenerBotAppId:typeof t?.vcMeetingAgent?.listenerBotAppId=="string"?t.vcMeetingAgent.listenerBotAppId:null,listenerBotOptions:Array.isArray(t?.vcMeetingAgent?.listenerBotOptions)?t.vcMeetingAgent.listenerBotOptions:[]},repoPickerMode:t?.repoPickerMode==="repos"?"repos":"all",maintenance:t?.maintenance&&typeof t.maintenance=="object"?t.maintenance:{},localDevInstall:t?.localDevInstall===!0,whiteboard:{enabled:t?.whiteboard?.enabled===!0},remoteAccess:t?.remoteAccess===!0,scheduleTimeZone:typeof t?.scheduleTimeZone=="string"?t.scheduleTimeZone:"",hostTimeZone:typeof t?.hostTimeZone=="string"&&t.hostTimeZone?t.hostTimeZone:"UTC",effectiveScheduleTimeZone:typeof t?.effectiveScheduleTimeZone=="string"&&t.effectiveScheduleTimeZone?t.effectiveScheduleTimeZone:typeof t?.scheduleTimeZone=="string"&&t.scheduleTimeZone?t.scheduleTimeZone:typeof t?.hostTimeZone=="string"&&t.hostTimeZone?t.hostTimeZone:"UTC"}}function he(t,n){let a=t?.[n]??{};return{enabled:a.enabled===!0,time:typeof a.time=="string"?a.time:"04:00"}}function Q(t,n){return n(t==="npm-global"?"update.kindNpm":t==="source-checkout"?"update.kindSource":"update.kindUnknown")}function pe(){let t=k(),n=(0,o.useRef)(!1),a=(0,o.useRef)(new Set),[l,p]=(0,o.useState)(null),[c,u]=(0,o.useState)(!1),[w,M]=(0,o.useState)(null),[T,C]=(0,o.useState)(!0),[i,r]=(0,o.useState)(!1),[g,A]=(0,o.useState)(null),[N,U]=(0,o.useState)(null),[H,I]=(0,o.useState)(null),[X,P]=(0,o.useState)(null),[$,R]=(0,o.useState)(null),[F,B]=(0,o.useState)(!1),[ee,D]=(0,o.useState)(!0),[te,V]=(0,o.useState)(!1),[ne,ae]=(0,o.useState)(""),[ie,b]=(0,o.useState)(!1),[se,v]=(0,o.useState)(null),W=(0,o.useCallback)(()=>{for(let s of a.current)window.clearTimeout(s);a.current.clear()},[]),O=(0,o.useCallback)((s,d)=>{let h=window.setTimeout(()=>{a.current.delete(h),s()},d);return a.current.add(h),h},[]),x=(0,o.useCallback)(async()=>{try{let s=await fetch("/api/update/status"),d=await s.json().catch(()=>({}));if(!n.current)return;if(!s.ok){I(null),P(d?.error??`HTTP ${s.status}`);return}I(d),P(null)}catch(s){if(!n.current)return;I(null),P(s instanceof Error?s.message:String(s))}},[]),j=(0,o.useCallback)(async()=>{try{let s=await fetch("/api/settings"),d=await s.json().catch(()=>({}));if(!n.current)return;if(!s.ok){p(null),M(d?.error??`HTTP ${s.status}`),u(!0);return}p(Y(d.settings)),C(d.authed===!0),r(d.bound===!0),M(null),u(!0)}catch(s){if(!n.current)return;p(null),M(s instanceof Error?s.message:String(s)),u(!0)}},[]);(0,o.useEffect)(()=>(n.current=!0,j(),()=>{n.current=!1,W()}),[W,j]),(0,o.useEffect)(()=>{c&&(b(!1),v(null),B(!1),T&&x())},[T,x,c]);async function oe(s,d,h){if(!l)return;let m=l;p(h(l)),A(s),U({text:t("settings.saving")});try{let f=await fetch("/api/settings",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(d)}),L=await f.json().catch(()=>({}));if(!n.current)return;if(!f.ok||L.ok===!1)throw new Error(L?.error??`HTTP ${f.status}`);let K=Y(L.settings);p(K),z.setScheduleTimeZone(K.effectiveScheduleTimeZone),U({text:t("settings.saved"),cls:"hint-ok"}),O(()=>U(q=>q?.cls==="hint-ok"?null:q),2400)}catch(f){if(!n.current)return;p(m),U({text:`${t("settings.saveFailed")}: ${f instanceof Error?f.message:String(f)}`,cls:"hint-warn-inline"})}finally{n.current&&A(null)}}async function le(){R(null),D(!0),V(!1);try{let s=await fetch("/api/update/changelog"),d=await s.json().catch(()=>({}));if(!n.current)return;ae(typeof d?.releasesUrl=="string"?d.releasesUrl:""),s.ok?(R(Array.isArray(d.releases)?d.releases:[]),D(d.ok!==!1),V(d.rateLimited===!0)):(R([]),D(!1))}catch{if(!n.current)return;R([]),D(!1)}}function re(){let s=Date.now(),d=async()=>{if(n.current){if(Date.now()-s>9e4){b(!1),v({text:t("update.restartSlow"),cls:"hint-warn-inline"});return}try{let h=await fetch("/__health",{cache:"no-store"});if(!n.current)return;if(h.ok){location.reload();return}}catch{}n.current&&O(()=>{d()},2e3)}};O(()=>{d()},3e3)}async function _(s){b(!0),v({text:t("update.restarting")});try{if(await fetch("/api/update/restart",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s?{update:s}:{})}),!n.current)return}catch(d){if(!n.current)return;b(!1),v({text:t("update.restartFailed",{detail:d instanceof Error?d.message:String(d)}),cls:"hint-warn-inline"});return}re()}async function ce(){let s=H;if(!s)return;if(!s.node.ok){window.alert(t("update.nodeTooOldAlert",{version:s.node.version,required:s.node.required}));return}if(s.installs.multiple){let h=s.installs.entries.map(m=>`\u2022 ${m.binPath} (${Q(m.kind,t)})`).join(`
|
|
2
|
+
`);if(!window.confirm(t("update.confirmMultiInstall",{paths:h})))return}let d=s.latest?t("update.confirmUpdate",{version:`v${s.latest}`}):t("update.confirmUpdateNoVer");if(window.confirm(d)){b(!0),v({text:t("update.updating")});try{let h=await fetch("/api/update/run",{method:"POST"}),m=await h.json().catch(()=>({}));if(!n.current)return;if(!h.ok||m.ok===!1){let f=m?.detail??m?.error??`HTTP ${h.status}`;b(!1),v({text:t("update.updateFailed",{detail:f}),cls:"hint-warn-inline"});return}m.changed?(b(!1),v({text:t("update.updatedChanged",{old:`v${m.oldVersion}`,new:`v${m.newVersion}`}),cls:"hint-ok"}),window.confirm(t("update.confirmRestart"))?await _({oldVersion:m.oldVersion,newVersion:m.newVersion}):n.current&&v({text:t("update.noRestartHint"),cls:"hint-ok"})):(b(!1),v({text:t("update.alreadyLatestRun",{version:`v${m.newVersion}`}),cls:"hint-ok"}),await x())}catch(h){if(!n.current)return;b(!1),v({text:t("update.updateFailed",{detail:h instanceof Error?h.message:String(h)}),cls:"hint-warn-inline"})}}}let de=l?(0,e.jsx)(ve,{settings:l,canWrite:T,bound:i,savingKey:g,onSave:oe}):w?(0,e.jsxs)("p",{className:"hint-warn st-banner",children:[t("settings.loadFailed"),": ",w]}):(0,e.jsx)("p",{className:"empty st-banner",children:t("settings.loading")});return(0,e.jsxs)("section",{className:"page",children:[(0,e.jsx)("div",{className:"page-heading",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("nav.settings")}),(0,e.jsx)("h1",{children:t("settings.title")}),(0,e.jsx)("p",{children:t("settings.subtitle")})]})}),(0,e.jsxs)("div",{className:"settings-grid",children:[de,(0,e.jsx)(fe,{canWrite:T,status:H,statusError:X,changelog:$,changelogOpen:F,changelogOk:ee,changelogRateLimited:te,releasesUrl:ne,busy:ie,message:se,onCheck:()=>{I(null),R(null),B(!1),v(null),P(null),x()},onToggleChangelog:()=>{let s=!F;B(s),s&&$===null&&le()},onUpdate:()=>{ce()},onRestart:()=>{window.confirm(t("update.confirmPlainRestart"))&&_(null)}})]}),N?(0,e.jsx)("div",{className:`st-status ${N.cls??""}`,"data-settings-status":!0,role:"status",children:N.text}):null]})}function me(t){return(0,e.jsx)("svg",{viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:{access:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("path",{d:"M8 1.7l5 1.9v4.1c0 3.2-2.1 5.6-5 6.6-2.9-1-5-3.4-5-6.6V3.6z"}),(0,e.jsx)("path",{d:"M5.9 8l1.5 1.5 2.7-2.8"})]}),cards:(0,e.jsx)("path",{d:"M2.2 3.2h11.6v7.4H8.3L5.1 13.2v-2.6H2.2z"}),experimental:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("path",{d:"M6.1 1.8h3.8M7 1.8v4L3.1 12.4a1.35 1.35 0 001.2 2h7.4a1.35 1.35 0 001.2-2L9 5.8v-4"}),(0,e.jsx)("path",{d:"M4.7 10.6h6.6"})]}),meeting:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("rect",{x:"1.6",y:"4.1",width:"8.9",height:"7.8",rx:"1.4"}),(0,e.jsx)("path",{d:"M10.5 7.4l3.9-2.3v5.8l-3.9-2.3"})]}),whiteboard:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("rect",{x:"1.9",y:"2.4",width:"12.2",height:"8.4",rx:"1.2"}),(0,e.jsx)("path",{d:"M4.7 8.2c1-.9 1.8-2.5 2.5-1.8.7.7-.5 2 .3 2.3.7.3 1.8-1.6 3.8-1.9"}),(0,e.jsx)("path",{d:"M5.3 13.9h5.4M8 10.8v3.1"})]}),repo:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("circle",{cx:"4.3",cy:"3.6",r:"1.7"}),(0,e.jsx)("circle",{cx:"4.3",cy:"12.4",r:"1.7"}),(0,e.jsx)("circle",{cx:"11.9",cy:"5.3",r:"1.7"}),(0,e.jsx)("path",{d:"M4.3 5.3v5.4M11.9 7c0 2.7-3.6 2.9-5.7 3.6"})]}),maintenance:(0,e.jsx)(e.Fragment,{children:(0,e.jsx)("path",{d:"M13.9 4.7a3.7 3.7 0 01-4.9 4.5l-4.4 4.4a1.6 1.6 0 01-2.2-2.2L6.8 7a3.7 3.7 0 014.5-4.9L8.9 4.5l2.6 2.6z"})}),update:(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)("path",{d:"M13.5 6.2A5.8 5.8 0 103 10.9"}),(0,e.jsx)("path",{d:"M13.7 2.5v3.9H9.8"}),(0,e.jsx)("path",{d:"M8 5.6v4.6M6 8.3l2 1.9 2-1.9"})]})}[t.name]})}function y(t){return(0,e.jsxs)("article",{className:"bd-card st-card","data-saving":t.saving?"":void 0,children:[(0,e.jsxs)("header",{className:"st-card-head",children:[(0,e.jsx)("span",{className:"st-chip","aria-hidden":"true",children:(0,e.jsx)(me,{name:t.icon})}),(0,e.jsx)("h3",{children:t.title})]}),t.children]})}function E(t){let[n,a]=(0,o.useState)(!1);return(0,e.jsx)("small",{className:n?"open":void 0,onClick:l=>{l.preventDefault(),l.stopPropagation(),a(p=>!p)},children:t.text})}function ve(t){let n=k(),{settings:a,canWrite:l,bound:p,savingKey:c}=t,u=!l,w=he(a.maintenance,"autoUpdate"),M=!l||a.localDevInstall,T=!l||a.maintenance.autoUpdate?.enabled!==!0,C=(i,r)=>{t.onSave(i,{[i]:r},g=>({...g,[i]:r}))};return(0,e.jsxs)(e.Fragment,{children:[l?null:(0,e.jsx)("p",{className:"hint-warn st-banner",children:n("settings.readOnlyVisitor")}),(0,e.jsxs)(y,{icon:"access",title:n("settings.sectionAccess"),saving:c==="publicReadOnly"||c==="remoteAccess",children:[(0,e.jsx)(S,{title:n("settings.publicReadOnly"),help:n("settings.publicReadOnlyHelp"),checked:a.publicReadOnly,disabled:u||c==="publicReadOnly",onChange:i=>C("publicReadOnly",i)}),p?(0,e.jsx)(S,{title:n("settings.remoteAccess"),help:n("settings.remoteAccessHelp"),checked:a.remoteAccess,disabled:u||c==="remoteAccess",onChange:i=>C("remoteAccess",i)}):null]}),(0,e.jsxs)(y,{icon:"meeting",title:n("settings.sectionVcMeetingAgent"),saving:c==="vcMeetingAgent",children:[(0,e.jsx)(S,{title:n("settings.vcMeetingAgent"),help:n("settings.vcMeetingAgentHelp"),checked:a.vcMeetingAgent.enabled,disabled:u||c==="vcMeetingAgent",onChange:i=>{t.onSave("vcMeetingAgent",{vcMeetingAgent:{enabled:i}},r=>({...r,vcMeetingAgent:{...r.vcMeetingAgent,enabled:i}}))}}),(0,e.jsxs)("label",{className:"st-field",children:[(0,e.jsx)("span",{children:n("settings.vcMeetingListenerBot")}),(0,e.jsxs)("select",{value:a.vcMeetingAgent.listenerBotAppId??"",disabled:u||c==="vcMeetingAgent",onChange:i=>{let r=i.currentTarget.value||null;t.onSave("vcMeetingAgent",{vcMeetingAgent:{listenerBotAppId:r}},g=>({...g,vcMeetingAgent:{...g.vcMeetingAgent,listenerBotAppId:r}}))},children:[(0,e.jsx)("option",{value:"",children:n("settings.vcMeetingListenerBotAuto")}),a.vcMeetingAgent.listenerBotOptions.map(i=>{let r=i.botName||i.larkAppId,g=i.cliId?` \xB7 ${i.cliId}`:"",A=[i.vcMeetingAgentEnabled===!0?void 0:n("settings.vcMeetingListenerBotDisabled"),i.hasLarkCliProfile===!0?void 0:n("settings.vcMeetingListenerBotNoProfile")].filter(Boolean),N=A.length>0?` \xB7 ${A.join(" \xB7 ")}`:"";return(0,e.jsxs)("option",{value:i.larkAppId,children:[r,g,N]},i.larkAppId)})]}),(0,e.jsx)(E,{text:n("settings.vcMeetingListenerBotHelp")})]})]}),(0,e.jsx)(y,{icon:"cards",title:n("settings.sectionCards"),saving:c==="openTerminalInFeishu",children:(0,e.jsx)(S,{title:n("settings.openTerminalInFeishu"),help:n("settings.openTerminalInFeishuHelp"),checked:a.openTerminalInFeishu,disabled:u||c==="openTerminalInFeishu",onChange:i=>C("openTerminalInFeishu",i)})}),(0,e.jsx)(y,{icon:"experimental",title:n("settings.sectionExperimental"),saving:c==="chatBotDiscovery",children:(0,e.jsx)(S,{title:n("settings.chatBotDiscovery"),help:n("settings.chatBotDiscoveryHelp"),checked:a.chatBotDiscovery,disabled:u||c==="chatBotDiscovery",onChange:i=>C("chatBotDiscovery",i)})}),(0,e.jsx)(y,{icon:"whiteboard",title:n("settings.sectionWhiteboard"),saving:c==="whiteboard",children:(0,e.jsx)(S,{title:n("settings.whiteboardEnable"),help:n("settings.whiteboardEnableHelp"),checked:a.whiteboard.enabled,disabled:u||c==="whiteboard",onChange:i=>{t.onSave("whiteboard",{whiteboard:{enabled:i}},r=>({...r,whiteboard:{enabled:i}}))}})}),(0,e.jsx)(y,{icon:"repo",title:n("settings.sectionRepoPicker"),saving:c==="repoPickerMode",children:(0,e.jsxs)("label",{className:"st-field",children:[(0,e.jsx)("span",{children:n("settings.repoPickerMode")}),(0,e.jsxs)("select",{value:a.repoPickerMode,disabled:u||c==="repoPickerMode",onChange:i=>{let r=i.currentTarget.value==="repos"?"repos":"all";t.onSave("repoPickerMode",{repoPickerMode:r},g=>({...g,repoPickerMode:r}))},children:[(0,e.jsx)("option",{value:"all",children:n("settings.repoPickerModeAll")}),(0,e.jsx)("option",{value:"repos",children:n("settings.repoPickerModeRepos")})]}),(0,e.jsx)(E,{text:n("settings.repoPickerModeHelp")})]})}),(0,e.jsx)(y,{icon:"maintenance",title:n("settings.sectionSchedule"),saving:c==="scheduleTimeZone",children:(0,e.jsx)(be,{value:a.scheduleTimeZone,host:a.hostTimeZone,effective:a.effectiveScheduleTimeZone,disabled:u||c==="scheduleTimeZone",onSave:i=>{t.onSave("scheduleTimeZone",{scheduleTimeZone:i},r=>({...r,scheduleTimeZone:i??""}))}})}),(0,e.jsxs)(y,{icon:"maintenance",title:n("settings.sectionMaintenance"),saving:c==="autoUpdate"||c==="autoRestart",children:[(0,e.jsx)(S,{title:n("settings.autoUpdate"),help:n("settings.autoUpdateHelp"),checked:w.enabled,disabled:M||c==="autoUpdate",onChange:i=>{let r={enabled:i,time:w.time};t.onSave("autoUpdate",{maintenance:{autoUpdate:r}},g=>({...g,maintenance:{...g.maintenance,autoUpdate:r}}))}}),(0,e.jsx)("div",{className:"st-subrow",children:(0,e.jsxs)("label",{className:"st-field",children:[(0,e.jsx)("span",{children:n("settings.maintenanceTime")}),(0,e.jsx)("input",{type:"time",value:w.time,disabled:M||c==="autoUpdate",onChange:i=>{let r={enabled:w.enabled,time:i.currentTarget.value||"04:00"};t.onSave("autoUpdate",{maintenance:{autoUpdate:r}},g=>({...g,maintenance:{...g.maintenance,autoUpdate:r}}))}})]})}),a.localDevInstall?(0,e.jsx)("p",{className:"hint-warn",children:n("settings.autoUpdateLocalDev")}):null,(0,e.jsx)(S,{title:n("settings.autoRestart"),help:n("settings.autoRestartHelp"),checked:a.maintenance.autoRestart?.enabled===!0,disabled:T||c==="autoRestart",onChange:i=>{let r={enabled:i};t.onSave("autoRestart",{maintenance:{autoRestart:r}},g=>({...g,maintenance:{...g.maintenance,autoRestart:r}}))}})]})]})}function be(t){let n=k(),[a,l]=(0,o.useState)(t.value);(0,o.useEffect)(()=>{l(t.value)},[t.value]);let p=()=>{let u=a.trim();u!==t.value.trim()&&t.onSave(u===""?null:u)},c=t.effective||t.value.trim()||t.host;return(0,e.jsxs)("label",{className:"form-row",children:[(0,e.jsx)("span",{children:n("settings.scheduleTimeZone")}),(0,e.jsx)("input",{type:"text",list:"tz-common",value:a,placeholder:t.host,disabled:t.disabled,onChange:u=>l(u.currentTarget.value),onBlur:p,onKeyDown:u=>{u.key==="Enter"&&(u.preventDefault(),u.currentTarget.blur())}}),(0,e.jsx)("datalist",{id:"tz-common",children:ge.map(u=>(0,e.jsx)("option",{value:u},u))}),(0,e.jsx)("small",{children:n("settings.scheduleTimeZoneHelp",{host:t.host,effective:c})})]})}function S(t){return(0,e.jsxs)("label",{className:"toggle-row",children:[(0,e.jsx)("input",{type:"checkbox",checked:t.checked,disabled:t.disabled,onChange:n=>t.onChange(n.currentTarget.checked)}),(0,e.jsx)("span",{className:"switch","aria-hidden":"true"}),(0,e.jsxs)("span",{className:"toggle-tx",children:[(0,e.jsx)("strong",{children:t.title}),(0,e.jsx)(E,{text:t.help})]})]})}function fe(t){let n=k(),a;if(!t.canWrite)a=(0,e.jsx)("p",{className:"hint-warn",children:n("update.loginRequired")});else if(t.statusError)a=(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("p",{className:"hint-warn",children:[n("update.checkFailed"),": ",t.statusError]}),(0,e.jsx)("div",{className:"update-actions",children:(0,e.jsx)("button",{type:"button","data-up":"check",onClick:t.onCheck,children:n("update.btnCheck")})})]});else if(!t.status)a=(0,e.jsx)("p",{className:"empty",children:n("update.loading")});else{let l=t.status,p=l.localDevInstall||t.busy;a=(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("p",{className:"update-version",children:[(0,e.jsx)("span",{className:"st-update-label",children:n("update.current")}),(0,e.jsxs)("strong",{className:"st-update-ver",children:["v",l.current]}),(0,e.jsx)(ye,{status:l})]}),l.node.ok?null:(0,e.jsx)("p",{className:"hint-warn",children:n("update.nodeWarn",{version:l.node.version,required:l.node.required})}),l.localDevInstall?(0,e.jsx)("p",{className:"hint-warn",children:n("update.localDev")}):null,l.installs.multiple?(0,e.jsx)(ke,{entries:l.installs.entries}):null,(0,e.jsxs)("div",{className:"update-actions",children:[(0,e.jsx)("button",{type:"button","data-up":"check",disabled:t.busy,onClick:t.onCheck,children:n("update.btnCheck")}),(0,e.jsx)("button",{type:"button","data-up":"changelog",disabled:t.busy,onClick:t.onToggleChangelog,children:t.changelogOpen?n("update.btnChangelogHide"):n("update.btnChangelog")}),(0,e.jsx)("button",{type:"button",className:"primary","data-up":"update",disabled:p,onClick:t.onUpdate,children:n("update.btnUpdate")}),(0,e.jsx)("button",{type:"button","data-up":"restart",disabled:t.busy,onClick:t.onRestart,children:n("update.btnRestart")})]}),t.changelogOpen?(0,e.jsx)(Se,{changelog:t.changelog,ok:t.changelogOk,rateLimited:t.changelogRateLimited,releasesUrl:t.releasesUrl}):null,t.message?(0,e.jsx)("p",{className:`oncall-status ${t.message.cls??""}`,children:t.message.text}):null]})}return(0,e.jsx)(y,{icon:"update",title:n("update.section"),children:a})}function ye(t){let n=k(),a=t.status;return a.latest?a.behind?(0,e.jsx)("span",{className:"update-badge update-badge-new",children:n("update.newAvailable",{version:`v${a.latest}`})}):(0,e.jsx)("span",{className:"update-badge update-badge-ok",children:n("update.upToDate")}):(0,e.jsx)("span",{className:"hint-warn-inline",children:n("update.checkUnavailable")})}function ke(t){let n=k();return(0,e.jsxs)("div",{className:"hint-warn",children:[(0,e.jsx)("p",{children:n("update.multiInstallWarn")}),(0,e.jsx)("ul",{className:"update-install-list",children:t.entries.map(a=>(0,e.jsxs)("li",{children:[(0,e.jsx)("code",{children:a.binPath})," \u2192 ",Q(a.kind,n)," ",(0,e.jsx)("small",{children:a.root})]},`${a.binPath}:${a.root}`))})]})}function Se(t){let n=k();if(t.changelog===null)return(0,e.jsx)("p",{className:"empty",children:n("update.changelogLoading")});if(!t.ok){let a=t.rateLimited?n("update.changelogRateLimited"):n("update.changelogFailed");return(0,e.jsxs)("p",{className:"hint-warn-inline",children:[a,t.releasesUrl?(0,e.jsxs)(e.Fragment,{children:[" ",(0,e.jsx)("a",{href:t.releasesUrl,target:"_blank",rel:"noopener",children:n("update.changelogViewOnGitHub")})]}):null]})}return t.changelog.length===0?(0,e.jsx)("p",{className:"empty",children:n("update.changelogEmpty")}):(0,e.jsx)("div",{className:"update-changelog",children:t.changelog.map(a=>{let l=a.name&&a.name!==`v${a.version}`?a.name:"",p=a.publishedAt?new Date(a.publishedAt).toLocaleDateString():"";return(0,e.jsxs)("details",{className:"update-release",open:!0,children:[(0,e.jsxs)("summary",{children:[(0,e.jsxs)("strong",{children:["v",a.version]})," ",l," ",(0,e.jsx)("small",{children:p})," ",(0,e.jsx)("a",{href:a.url,target:"_blank",rel:"noopener",children:"\u2197"})]}),(0,e.jsx)("pre",{className:"update-release-body",children:a.body||""})]},a.version)})})}function Ae(t){return J(t,(0,e.jsx)(pe,{}))}export{be as TimeZoneRow,Ae as renderSettingsPage};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as G}from"./chunk-
|
|
1
|
+
import{b as G}from"./chunk-VFCACTRF.js";import"./chunk-LXIK7OUJ.js";import{p as Z,w as Nl}from"./chunk-BNEXMNQD.js";import{a as as,b as wl,c as Cl}from"./chunk-JTSE5VP6.js";import{c as Y}from"./chunk-7SZRL6FY.js";var a=Y(as(),1);var l=Y(Cl(),1),ns=2;function ll(e){let t=e.as??"span";return(0,l.jsx)(t,{style:{display:"contents"},dangerouslySetInnerHTML:{__html:e.html}})}function os(e,t){let n=String(e??"").replace(/\\/g,"/");return n.includes("/.codex/skills/")?t("skills.sourceCodex"):n.includes("/.claude/skills/")?t("skills.sourceClaude"):n.includes("/.trae/skills/")?t("skills.sourceTrae"):n.includes("/.cursor/skills/")?t("skills.sourceCursor"):n.includes("/.gemini/skills/")?t("skills.sourceGemini"):n.includes("/.config/opencode/skills/")?t("skills.sourceOpenCode"):null}function rs(e,t){let n=e.source??{};return n.type==="github"?`github:${n.owner}/${n.repo}/${n.path??""}`:n.type==="git"?`${n.url??"git"}#${n.path??""}`:n.type==="local-link"?os(n.path,t)??t("skills.sourceLocalLink"):n.type==="local-copy"?t("skills.sourceBotmuxCopy"):String(n.type??"unknown")}function q(e){return(e?.include??[]).filter(t=>t.startsWith("skill:")).map(t=>t.slice(6))}function cs(e){return q(e).length}function ds(e){return q(e).length>0}function U(e){return`${e.cliId}
|
|
2
2
|
${e.rootDir}`}function us(e){return e>=1600?4:e<=620?1:e<=980?2:3}async function h(e,t){let n=await fetch(e,{...t,headers:{"content-type":"application/json",...t.headers??{}}}),k=await n.json().catch(()=>({}));if(!n.ok||k.ok===!1){let f=new Error(k?.error??`HTTP ${n.status}`);throw f.status=n.status,f.body=k,f}return k}function Il(e){return`oncall-status${e?` ${e.ok?"hint-ok":"hint-warn-inline"}`:""}`}function ks(e){let t=G(),n=(0,a.useRef)(null),k=e.installCandidates??[],f=e.selectedInstallSkills??new Set,m=k.length>0&&k.every(r=>f.has(r.name)),C=e.installBusy||e.installDiscovering;return(0,a.useEffect)(()=>{let r=n.current;if(r)if(e.installSelectionOpen&&!r.open)try{r.showModal()}catch{}else!e.installSelectionOpen&&r.open&&r.close()},[e.installSelectionOpen,k.length]),(0,l.jsxs)("article",{className:"bd-card skills-install-panel",children:[(0,l.jsxs)("div",{className:"skills-install-title",children:[(0,l.jsx)("h3",{className:"bd-section-title",children:t("skills.install")}),(0,l.jsxs)("span",{className:"skills-help-tip",children:[(0,l.jsx)("button",{type:"button",className:"skills-help-button","aria-label":t("skills.installInfoLabel"),children:"?"}),(0,l.jsx)("span",{className:"skills-help-popover",role:"tooltip",children:t("skills.installInfo")})]})]}),(0,l.jsxs)("div",{className:"skills-install-grid",children:[(0,l.jsxs)("label",{className:"skills-source-label",children:[(0,l.jsx)("span",{children:t("skills.source")}),(0,l.jsx)("div",{className:"skills-source-control",children:(0,l.jsx)("input",{type:"text","data-install":"source","aria-label":t("skills.source"),placeholder:t("skills.sourcePlaceholder"),value:e.installSource,onChange:r=>e.onInstallSourceChange(r.currentTarget.value)})})]}),(0,l.jsxs)("div",{className:"bd-section-note skills-install-note",children:[(0,l.jsxs)("span",{children:[(0,l.jsx)("strong",{children:t("skills.sourceHelpRemoteLabel")}),t("skills.sourceHelpRemote")]}),(0,l.jsxs)("span",{children:[(0,l.jsx)("strong",{children:t("skills.sourceHelpLocalLabel")}),t("skills.sourceHelpLocal")]})]}),(0,l.jsxs)("div",{className:"skills-install-action-row",children:[(0,l.jsxs)("details",{className:"skills-advanced-options","data-skills-advanced":!0,open:!1,children:[(0,l.jsxs)("summary",{children:[(0,l.jsx)("span",{className:"skills-advanced-marker","aria-hidden":"true"}),(0,l.jsx)("span",{children:t("skills.advanced")})]}),(0,l.jsxs)("div",{className:"skills-advanced-fields",children:[(0,l.jsxs)("label",{className:"skills-install-field-wide",children:[(0,l.jsx)("span",{children:t("skills.path")}),(0,l.jsx)("input",{type:"text","data-install":"path",placeholder:t("skills.pathPlaceholder"),value:e.installPath,onChange:r=>e.onInstallPathChange(r.currentTarget.value)})]}),(0,l.jsxs)("label",{className:"skills-install-field-wide",children:[(0,l.jsx)("span",{children:t("skills.ref")}),(0,l.jsx)("input",{type:"text","data-install":"ref",placeholder:t("skills.refPlaceholder"),value:e.installRef,onChange:r=>e.onInstallRefChange(r.currentTarget.value)})]})]})]}),(0,l.jsx)("div",{className:"skills-install-actions",children:(0,l.jsx)("button",{type:"button",className:"primary","data-action":"install",disabled:C,onClick:()=>e.onInstall(),children:e.installDiscovering?t("skills.scanning"):e.installBusy?t("skills.jobRunning"):t("skills.installSubmit")})})]}),(0,l.jsxs)("div",{className:"skills-local-discovery-panel",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:t("skills.localDiscoverTitle")}),(0,l.jsx)("span",{children:t("skills.localDiscoverHelp")})]}),(0,l.jsx)("button",{type:"button","data-action":"open-native-skill-discovery",onClick:()=>e.onOpenNativeDiscovery(),children:t("skills.localDiscover")})]})]}),(0,l.jsx)("div",{className:"actions",children:(0,l.jsx)("span",{className:Il(e.installStatus),"data-skills-status":!0,children:e.installStatus?.text??""})}),(0,l.jsx)("dialog",{className:"skills-discovery-dialog skills-install-selection-dialog","data-install-selection-dialog":!0,ref:n,onClose:()=>e.onCloseInstallSelection?.(),children:(0,l.jsxs)("article",{children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("h3",{children:t("skills.installSelectionTitle")}),(0,l.jsx)("p",{children:t("skills.installSelectionHelp",{count:k.length})})]}),(0,l.jsx)("div",{className:"skills-discovery-body skills-install-selection-body",children:(0,l.jsxs)("div",{className:"skills-candidate-list","data-install-candidates":!0,children:[(0,l.jsxs)("div",{className:"skills-candidate-list-head",children:[(0,l.jsx)("span",{children:t("skills.scanFound",{count:k.length})}),e.onSelectAllInstallSkills?(0,l.jsx)("button",{type:"button","data-action":"toggle-all-source-skills",disabled:e.installBusy,onClick:()=>e.onSelectAllInstallSkills?.(!m),children:t(m?"skills.discoverClearSelection":"skills.discoverSelectAll")}):null]}),k.map(r=>(0,l.jsxs)("label",{className:"skills-candidate-row",children:[(0,l.jsx)("input",{type:"checkbox",checked:f.has(r.name),disabled:e.installBusy,onChange:()=>e.onToggleInstallSkill?.(r.name)}),(0,l.jsxs)("span",{children:[(0,l.jsx)("strong",{children:r.name}),(0,l.jsxs)("small",{children:[r.path,r.description?` \xB7 ${r.description}`:""]})]})]},`${r.name}:${r.path}`))]})}),(0,l.jsxs)("footer",{className:"actions",children:[(0,l.jsx)("button",{type:"button","data-action":"close-install-selection",disabled:e.installBusy,onClick:()=>e.onCloseInstallSelection?.(),children:t("skills.installSelectionCancel")}),(0,l.jsx)("button",{type:"button",className:"primary","data-action":"confirm-install-selection",disabled:e.installBusy||f.size===0,onClick:()=>e.onConfirmInstallSelection?.(),children:e.installBusy?t("skills.jobRunning"):t("skills.installSelected")})]})]})})]})}function ps(){let e=G(),t=(0,a.useRef)(!0),n=(0,a.useRef)(new Set),k=(0,a.useRef)(null),f=(0,a.useRef)(null),[m,C]=(0,a.useState)([]),[r,I]=(0,a.useState)([]),[v,D]=(0,a.useState)([]),[b,g]=(0,a.useState)("off"),[P,u]=(0,a.useState)("auto"),[R,sl]=(0,a.useState)(null),[el,tl]=(0,a.useState)(!0),[Pl,Rl]=(0,a.useState)(()=>window.innerWidth),[J,$l]=(0,a.useState)(""),[il,Bl]=(0,a.useState)(""),[al,Tl]=(0,a.useState)(""),[Dl,y]=(0,a.useState)(null),[Al,nl]=(0,a.useState)(!1),[jl,ol]=(0,a.useState)(!1),[xl,A]=(0,a.useState)(!1),[rl,cl]=(0,a.useState)([]),[_,j]=(0,a.useState)(()=>new Set),[K,x]=(0,a.useState)(!1),[El,dl]=(0,a.useState)(!1),[z,Ml]=(0,a.useState)(null),[W,F]=(0,a.useState)(()=>new Set),[B,V]=(0,a.useState)(0),[ul,E]=(0,a.useState)(null),[kl,M]=(0,a.useState)(null),[Ll,pl]=(0,a.useState)(null),[Ol,ml]=(0,a.useState)({}),L=(0,a.useMemo)(()=>new Set(m.map(s=>s.name)),[m]),O=us(Pl)*ns,$=Math.max(1,Math.ceil(m.length/O)),Hl=m.slice(B*O,B*O+O),N=(0,a.useMemo)(()=>r.length===0?void 0:(z?r.find(i=>U(i)===z):void 0)??r.find(i=>i.skills.length>0)??r[0],[z,r]),Q=N?U(N):"",T=(0,a.useMemo)(()=>N?N.skills.filter(s=>!L.has(s.name)).map(s=>s.rootDir??s.source?.root??"").filter(Boolean):[],[N,L]),vl=T.length>0&&T.every(s=>W.has(s)),yl=(0,a.useCallback)(()=>{for(let s of n.current)window.clearTimeout(s);n.current.clear()},[]),Gl=(0,a.useCallback)(s=>new Promise(i=>{let o=window.setTimeout(()=>{n.current.delete(o),i()},s);n.current.add(o)}),[]),fl=(0,a.useCallback)(async()=>{let[s,i]=await Promise.all([fetch("/api/skills"),fetch("/api/bots")]),o=await s.json().catch(()=>({})),d=await i.json().catch(()=>({}));if(!s.ok){let c=o?.error??`skills HTTP ${s.status}`;throw new Error(c==="not_found_yet"||c==="not_found"?e("skills.apiUnavailable"):c)}if(!i.ok)throw new Error(d?.error??`bots HTTP ${i.status}`);return{skills:Array.isArray(o.skills)?o.skills:[],nativeSkillGroups:Array.isArray(o.nativeSkillGroups)?o.nativeSkillGroups:[],bots:Array.isArray(d.bots)?d.bots:[],trustProjectSkills:o.trustProjectSkills==="all"?"all":"off",delivery:o.delivery==="prompt"||o.delivery==="native"?o.delivery:"auto"}},[e]),w=(0,a.useCallback)(async()=>{tl(!0);try{let s=await fl();if(!t.current)return;C(s.skills),I(s.nativeSkillGroups),D(s.bots),g(s.trustProjectSkills),u(s.delivery),sl(null),F(i=>{let o=new Set,d=new Set(s.skills.map(c=>c.name));for(let c of s.nativeSkillGroups)for(let p of c.skills){let S=p.rootDir??p.source?.root??"";S&&!d.has(p.name)&&i.has(S)&&o.add(S)}return o})}catch(s){if(!t.current)return;sl(s?.message??String(s))}finally{t.current&&tl(!1)}},[fl]);(0,a.useEffect)(()=>{t.current=!0,w();let s=()=>Rl(window.innerWidth);return window.addEventListener("resize",s),()=>{t.current=!1,yl(),window.removeEventListener("resize",s)}},[yl,w]),(0,a.useEffect)(()=>{V(s=>Math.min(Math.max(0,s),$-1))},[$]),(0,a.useEffect)(()=>{let s=k.current;if(s)if(K&&!s.open)try{s.showModal()}catch{}else!K&&s.open&&s.close()},[K,Q]);async function gl(s,i,o=!0){let d=s;for(i({text:e("skills.jobRunning"),ok:!0});;){if(!t.current)return;if(d.status==="succeeded"){i({text:e("skills.saved"),ok:!0}),o&&await w();return}if(d.status==="failed")throw new Error(d.error??"job_failed");if(await Gl(800),!t.current)return;let c=await h(`/api/skills/jobs/${encodeURIComponent(d.id)}`,{method:"GET"});if(!t.current)return;d=c.job}}function Ul(s){return v.filter(i=>q(i.skills).includes(s)).map(i=>i.botName??i.larkAppId)}function H(){cl([]),j(new Set),A(!1)}function bl(){return{source:J.trim(),path:il.trim()||void 0,ref:al.trim()||void 0}}function ql(s){let i=s??[..._];return{...bl(),skillNames:i.length>0?i:void 0}}async function Jl(){ol(!0),y({text:e("skills.scanning"),ok:!0});try{let s=await h("/api/skills/discover",{method:"POST",body:JSON.stringify(bl())});if(!t.current)return[];let i=Array.isArray(s.discovery?.skills)?s.discovery.skills:[];return cl(i),j(new Set(i.map(o=>o.name))),i}finally{t.current&&ol(!1)}}async function hl(s){nl(!0);try{let i=await h("/api/skills/install",{method:"POST",body:JSON.stringify(ql(s))});if(!t.current)return;await gl(i.job,y),t.current&&H()}catch(i){t.current&&y({text:`${e("skills.failed")}: ${i?.message??i}`,ok:!1})}finally{t.current&&nl(!1)}}function _l(s){j(i=>{let o=new Set(i);return o.has(s)?o.delete(s):o.add(s),o})}function Kl(s){j(s?new Set(rl.map(i=>i.name)):new Set)}async function zl(){if(!J.trim()){y({text:e("skills.sourceRequired"),ok:!1});return}try{A(!1);let s=await Jl();if(!t.current)return;if(s.length===0){y({text:e("skills.scanEmpty"),ok:!1});return}if(s.length===1){await hl([s[0].name]);return}y({text:e("skills.scanFound",{count:s.length}),ok:!0}),A(!0)}catch(s){t.current&&y({text:`${e("skills.failed")}: ${s?.message??s}`,ok:!1})}}async function Wl(){let s=[..._];if(s.length===0){y({text:e("skills.discoverNothingSelected"),ok:!1});return}await hl(s)}async function Fl(){let s=[...W].filter(Boolean);if(s.length===0){y({text:e("skills.discoverNothingSelected"),ok:!1});return}dl(!0);try{if(y({text:e("skills.discoverRegisteringBatch",{total:s.length}),ok:!0}),await h("/api/skills/install-local-links",{method:"POST",body:JSON.stringify({sources:s})}),!t.current)return;x(!1),await w(),t.current&&y({text:e("skills.saved"),ok:!0})}catch(i){t.current&&y({text:`${e("skills.failed")}: ${i?.message??i}`,ok:!1})}finally{t.current&&dl(!1)}}async function Vl(s){if(b!==s){E("project");try{let i=await h("/api/skills/global",{method:"PUT",body:JSON.stringify({trustProjectSkills:s})});if(!t.current)return;g(i.trustProjectSkills==="all"?"all":s)}catch(i){t.current&&window.alert(`${e("skills.failed")}: ${i?.message??i}`)}finally{t.current&&E(null)}}}async function Ql(s){if(P!==s){E("delivery");try{let i=await h("/api/skills/global",{method:"PUT",body:JSON.stringify({delivery:s})});if(!t.current)return;u(i.delivery==="prompt"||i.delivery==="native"?i.delivery:s)}catch(i){t.current&&window.alert(`${e("skills.failed")}: ${i?.message??i}`)}finally{t.current&&E(null)}}}function Sl(s){let i=f.current,o=i?.querySelector(".skills-bot-card");if(!i||!o)return;let d=window.getComputedStyle(i),c=Number.parseFloat(d.columnGap||d.gap||"0")||0;i.scrollBy({left:s*(o.getBoundingClientRect().width+c),behavior:"smooth"})}async function Xl(s){M(`${s}:update`);try{let i=await h(`/api/skills/${encodeURIComponent(s)}/update`,{method:"POST",body:"{}"});if(!t.current)return;await gl(i.job,y)}catch(i){t.current&&window.alert(`${e("skills.failed")}: ${i?.message??i}`)}finally{t.current&&M(null)}}async function Yl(s){if(window.confirm(`${e("skills.remove")} ${s}?`)){M(`${s}:remove`);try{if(await h(`/api/skills/${encodeURIComponent(s)}`,{method:"DELETE",body:"{}"}),!t.current)return;await w()}catch(i){if(!t.current)return;if(i?.status===409&&i?.body?.error==="skill_in_use"){let o=Array.isArray(i.body.affectedBots)?i.body.affectedBots.map(c=>{let p=c?.botName||c?.larkAppId;return p?`${p}`:""}).filter(Boolean):Ul(s),d=[o.length?`Bot: ${o.join(", ")}`:""].filter(Boolean).join("; ")||"-";if(!window.confirm(e("skills.removeInUse",{skill:s,refs:d})))return;try{if(await h(`/api/skills/${encodeURIComponent(s)}?force=1`,{method:"DELETE",body:"{}"}),!t.current)return;await w();return}catch(c){t.current&&window.alert(`${e("skills.failed")}: ${c?.message??c}`);return}}window.alert(`${e("skills.failed")}: ${i?.message??i}`)}finally{t.current&&M(null)}}}async function Zl(s,i,o){let d=`${s}:${i}:${o}`;pl(d),ml(c=>({...c,[s]:null}));try{let c=await h(`/api/bots/${encodeURIComponent(s)}/skills`,{method:"PUT",body:JSON.stringify({action:i,name:o})});if(!t.current)return;D(p=>p.map(S=>S.larkAppId===s?{...S,skills:c.skills??null}:S))}catch(c){t.current&&ml(p=>({...p,[s]:{text:`${e("skills.failed")}: ${c?.message??c}`,ok:!1}}))}finally{t.current&&pl(null)}}let ls=v.filter(s=>ds(s.skills)).length,ss=v.reduce((s,i)=>s+cs(i.skills),0),es=el?(0,l.jsx)(ll,{html:Nl(),as:"div"}):R?(0,l.jsx)("p",{className:"hint-warn",children:R}):(0,l.jsxs)("div",{className:"skills-page-grid",children:[(0,l.jsxs)("aside",{className:"skills-side-rail",children:[(0,l.jsxs)("article",{className:"bd-card skills-defaults-panel",children:[(0,l.jsx)("h3",{className:"bd-section-title",children:e("skills.globalDefaults")}),(0,l.jsxs)("div",{className:"skills-control-block",children:[(0,l.jsx)("span",{className:"skills-control-label",children:e("skills.globalProject")}),(0,l.jsx)("div",{className:"skills-choice-group skills-choice-group-compact skills-project-group",children:[["off",e("skills.globalProjectOff"),e("skills.globalProjectOffHelp")],["all",e("skills.globalProjectAll"),e("skills.globalProjectAllHelp")]].map(([s,i,o])=>(0,l.jsxs)("button",{type:"button",className:`skills-choice${b===s?" selected":""}`,"data-global-project-value":s,"aria-pressed":b===s?"true":"false",disabled:ul==="project",onClick:()=>{Vl(s)},children:[(0,l.jsx)("strong",{children:i}),(0,l.jsx)("small",{children:o})]},s))})]}),(0,l.jsxs)("div",{className:"skills-control-block",children:[(0,l.jsx)("span",{className:"skills-control-label",children:e("skills.globalDelivery")}),(0,l.jsx)("div",{className:"skills-choice-group skills-delivery-group",children:[["auto",e("skills.deliveryAuto"),e("skills.deliveryAutoHelp")],["prompt",e("skills.deliveryPrompt"),e("skills.deliveryPromptHelp")],["native",e("skills.deliveryNative"),e("skills.deliveryNativeHelp")]].map(([s,i,o])=>(0,l.jsxs)("button",{type:"button",className:`skills-choice${P===s?" selected":""}`,"data-global-delivery-value":s,"aria-pressed":P===s?"true":"false",disabled:ul==="delivery",onClick:()=>{Ql(s)},children:[(0,l.jsx)("strong",{children:i}),(0,l.jsx)("small",{children:o})]},s))})]})]}),(0,l.jsx)(ks,{installSource:J,installPath:il,installRef:al,installStatus:Dl,installBusy:Al,installDiscovering:jl,installSelectionOpen:xl,installCandidates:rl,selectedInstallSkills:_,onInstallSourceChange:s=>{$l(s),H()},onInstallPathChange:s=>{Bl(s),H()},onInstallRefChange:s=>{Tl(s),H()},onToggleInstallSkill:_l,onSelectAllInstallSkills:Kl,onConfirmInstallSelection:()=>{Wl()},onCloseInstallSelection:()=>A(!1),onInstall:()=>{zl()},onOpenNativeDiscovery:()=>x(!0)})]}),(0,l.jsxs)("section",{className:"skills-main-panel",children:[(0,l.jsxs)("section",{className:"skills-overview",children:[(0,l.jsxs)("div",{className:"skills-overview-copy",children:[(0,l.jsx)("h2",{children:e("skills.overviewTitle")}),(0,l.jsx)("p",{children:e("skills.overviewBody")})]}),(0,l.jsxs)("div",{className:"skills-metric-strip",children:[(0,l.jsxs)("span",{children:[(0,l.jsx)("small",{children:e("skills.metricInstalled")}),(0,l.jsx)("strong",{children:m.length})]}),(0,l.jsxs)("span",{children:[(0,l.jsx)("small",{children:e("skills.metricBots")}),(0,l.jsxs)("strong",{children:[ls,"/",v.length]})]}),(0,l.jsxs)("span",{children:[(0,l.jsx)("small",{children:e("skills.metricAttached")}),(0,l.jsx)("strong",{children:ss})]})]})]}),(0,l.jsxs)("section",{className:"skills-bots-panel",children:[(0,l.jsxs)("div",{className:"skills-section-head skills-section-head-row",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("h2",{children:e("skills.bots")}),(0,l.jsx)("p",{children:e("skills.botsHelp")})]}),v.length>3?(0,l.jsxs)("div",{className:"skills-bot-rail-actions",children:[(0,l.jsx)("button",{type:"button",className:"skills-rail-button","data-action":"scroll-bots","data-dir":"-1","aria-label":e("skills.scrollBotsPrev"),title:e("skills.scrollBotsPrev"),onClick:()=>Sl(-1),children:"\u2039"}),(0,l.jsx)("span",{className:"skills-count-pill",children:e("skills.botCount",{count:v.length})}),(0,l.jsx)("button",{type:"button",className:"skills-rail-button","data-action":"scroll-bots","data-dir":"1","aria-label":e("skills.scrollBotsNext"),title:e("skills.scrollBotsNext"),onClick:()=>Sl(1),children:"\u203A"})]}):(0,l.jsx)("span",{className:"skills-count-pill",children:e("skills.botCount",{count:v.length})})]}),(0,l.jsx)("div",{className:"skills-bot-grid",ref:f,children:v.map(s=>(0,l.jsx)(ms,{bot:s,installedNames:L,skills:m,status:Ol[s.larkAppId]??null,busyKey:Ll,onUpdate:Zl},s.larkAppId))})]}),(0,l.jsxs)("section",{className:"bd-card skills-installed-panel",children:[(0,l.jsxs)("div",{className:"skills-section-head skills-section-head-row",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("h2",{children:e("skills.installed")}),(0,l.jsx)("p",{children:e("skills.installedHelp")})]}),$<=1?(0,l.jsx)("span",{className:"skills-count-pill",children:e("skills.skillCount",{count:m.length})}):(0,l.jsxs)("div",{className:"skills-installed-toolbar",children:[(0,l.jsx)("span",{className:"skills-count-pill",children:e("skills.skillCount",{count:m.length})}),(0,l.jsxs)("div",{className:"skills-pager",children:[(0,l.jsx)("button",{type:"button",className:"skills-pager-button","data-action":"page-installed-skills","data-dir":"-1","aria-label":e("skills.prevPage"),title:e("skills.prevPage"),disabled:B===0,onClick:()=>V(s=>Math.max(0,s-1)),children:"\u2039"}),(0,l.jsx)("span",{children:e("skills.pageStatus",{page:B+1,pages:$})}),(0,l.jsx)("button",{type:"button",className:"skills-pager-button","data-action":"page-installed-skills","data-dir":"1","aria-label":e("skills.nextPage"),title:e("skills.nextPage"),disabled:B>=$-1,onClick:()=>V(s=>Math.min($-1,s+1)),children:"\u203A"})]})]})]}),m.length===0?(0,l.jsx)("p",{className:"empty",children:e("skills.empty")}):(0,l.jsx)("div",{className:"skills-list",children:Hl.map(s=>(0,l.jsxs)("article",{className:"skills-row skills-installed-card","data-skill":s.name,children:[(0,l.jsxs)("div",{className:"skills-row-body",children:[(0,l.jsx)("strong",{children:s.name}),s.description?(0,l.jsx)("p",{children:s.description}):null,(0,l.jsx)("small",{className:"skills-source-badge",children:rs(s,e)})]}),(0,l.jsxs)("div",{className:"skills-card-actions",children:[(0,l.jsx)("button",{type:"button","data-action":"update-skill",disabled:kl===`${s.name}:update`,onClick:()=>{Xl(s.name)},children:e("skills.update")}),(0,l.jsx)("button",{type:"button","data-action":"remove-skill",disabled:kl===`${s.name}:remove`,onClick:()=>{Yl(s.name)},children:e("skills.remove")})]})]},s.name))})]})]}),(0,l.jsx)("dialog",{className:"skills-discovery-dialog",id:"skills-discovery-dialog",ref:k,onClose:()=>x(!1),children:(0,l.jsxs)("article",{children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("h3",{children:e("skills.discoverTitle")}),(0,l.jsx)("p",{children:e("skills.discoverHelp")})]}),(0,l.jsx)("div",{className:"skills-discovery-body",children:N?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("div",{className:"skills-discovery-tabs",role:"tablist","aria-label":e("skills.discoverTitle"),children:r.map(s=>{let i=U(s),o=i===Q;return(0,l.jsxs)("button",{type:"button",role:"tab","data-discovery-tab":i,className:o?"selected":"","aria-selected":o?"true":"false",onClick:()=>Ml(i),children:[(0,l.jsx)("strong",{children:s.label??s.cliId}),(0,l.jsx)("small",{children:e("skills.skillCount",{count:s.skills.length})})]},i)})}),(0,l.jsx)("div",{className:"skills-discovery-path",children:(0,l.jsx)("code",{children:N.rootDir})}),r.map(s=>{let i=U(s);return(0,l.jsx)("section",{className:"skills-discovery-group","data-discovery-panel":i,hidden:!(i===Q),children:s.skills.length===0?(0,l.jsx)("p",{className:"empty",children:e("skills.discoverGroupEmpty")}):(0,l.jsx)("div",{className:"skills-discovery-list",children:s.skills.map(d=>{let c=L.has(d.name),p=d.rootDir??d.source?.root??"";return(0,l.jsxs)("label",{className:`skills-discovery-row${c?" installed":""}`,children:[(0,l.jsx)("input",{type:"checkbox","data-discovered-skill":!0,value:p,disabled:c,checked:!c&&W.has(p),onChange:S=>{let ts=S.currentTarget.checked;F(is=>{let X=new Set(is);return ts?X.add(p):X.delete(p),X})}}),(0,l.jsxs)("span",{children:[(0,l.jsx)("strong",{children:d.name}),d.description?(0,l.jsx)("small",{children:d.description}):null]}),c?(0,l.jsx)("em",{children:e("skills.discoverRegistered")}):null]},`${d.name}:${p}`)})})},i)})]}):(0,l.jsx)("p",{className:"empty",children:e("skills.discoverEmpty")})}),(0,l.jsxs)("footer",{className:"actions",children:[(0,l.jsx)("button",{type:"button","data-action":"toggle-discovered-skills",disabled:T.length===0,onClick:()=>{F(s=>{let i=new Set(s);return vl?T.forEach(o=>i.delete(o)):T.forEach(o=>i.add(o)),i})},children:e(vl?"skills.discoverClearSelection":"skills.discoverSelectAll")}),(0,l.jsx)("button",{type:"button",className:"primary","data-action":"register-discovered-skills",disabled:El,onClick:()=>{Fl()},children:e("skills.discoverRegister")}),(0,l.jsx)("button",{type:"button","data-action":"close-discovery",onClick:()=>x(!1),children:e("skills.discoverClose")})]})]})})]});return(0,l.jsxs)("section",{className:"page",children:[(0,l.jsxs)("div",{className:"page-heading",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("p",{className:"eyebrow",children:e("nav.skills")}),(0,l.jsx)("h1",{children:e("skills.title")}),(0,l.jsx)("p",{children:e("skills.subtitle")})]}),(0,l.jsx)("button",{type:"button",id:"skills-refresh",disabled:el,onClick:()=>{w()},children:e("skills.refresh")})]}),(0,l.jsx)("div",{id:"skills-body",children:es})]})}function ms(e){let t=G(),{bot:n,installedNames:k,skills:f,status:m,busyKey:C,onUpdate:r}=e,I=n.botName??n.larkAppId,v=q(n.skills),D=new Set(v),b=f.filter(u=>!D.has(u.name)),[g,P]=(0,a.useState)(b[0]?.name??"");return(0,a.useEffect)(()=>{(!g||!b.some(u=>u.name===g))&&P(b[0]?.name??"")},[b,g]),n.error?(0,l.jsxs)("article",{className:"bd-card skills-bot-card","data-appid":n.larkAppId,children:[(0,l.jsxs)("header",{children:[(0,l.jsx)(ll,{html:Z({name:I,larkAppId:n.larkAppId,size:"sm"})}),(0,l.jsx)("strong",{children:I})]}),(0,l.jsx)("p",{className:"hint-warn-inline",children:n.error})]}):(0,l.jsxs)("article",{className:"bd-card skills-bot-card","data-appid":n.larkAppId,children:[(0,l.jsxs)("header",{className:"skills-bot-head",children:[(0,l.jsx)(ll,{html:Z({name:I,larkAppId:n.larkAppId,size:"sm",dot:"ok"})}),(0,l.jsxs)("div",{children:[(0,l.jsx)("strong",{children:I}),(0,l.jsx)("code",{children:n.larkAppId})]}),(0,l.jsx)("span",{className:"skills-count-pill",children:t("skills.skillCount",{count:v.length})})]}),(0,l.jsxs)("section",{className:"bd-section",children:[(0,l.jsx)("h3",{className:"bd-section-title",children:t("skills.priority")}),v.length===0?(0,l.jsx)("p",{className:"bd-section-note",children:t("skills.noPriority")}):(0,l.jsx)("div",{className:"skills-chip-list",children:v.map(u=>{let R=!k.has(u);return(0,l.jsxs)("span",{className:`skills-priority-row${R?" skills-priority-dangling":""}`,title:R?t("skills.dangling"):"",children:[(0,l.jsxs)("span",{className:"skills-priority-name",children:[u,R?(0,l.jsx)("small",{children:t("skills.dangling")}):null]}),(0,l.jsx)("button",{type:"button",className:"skills-priority-remove","data-action":"detach-skill","data-name":u,"aria-label":t("skills.detachNamed",{skill:u}),disabled:C===`${n.larkAppId}:detach:${u}`,onClick:()=>{r(n.larkAppId,"detach",u)},children:"\xD7"})]},u)})}),(0,l.jsx)("div",{className:"actions skills-attach-row",children:b.length===0?(0,l.jsx)("button",{type:"button",disabled:!0,children:t("skills.attach")}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("select",{"data-attach-picker":!0,value:g,onChange:u=>P(u.currentTarget.value),children:b.map(u=>(0,l.jsx)("option",{value:u.name,children:u.name},u.name))}),(0,l.jsx)("button",{type:"button","data-action":"attach-skill",disabled:!g||C===`${n.larkAppId}:attach:${g}`,onClick:()=>g&&void r(n.larkAppId,"attach",g),children:t("skills.attach")})]})})]}),(0,l.jsx)("span",{className:Il(m),"data-bot-status":!0,children:m?.text??""})]})}function gs(e){return wl(e,(0,l.jsx)(ps,{}))}export{ms as BotPolicyCard,ks as SkillsInstallPanel,gs as renderSkillsPage};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as w}from"./chunk-BAMNP73K.js";import"./chunk-76J7PNZI.js";import{m as n,n as d}from"./chunk-2BBCKWNO.js";import{a as V,b as R,c as P}from"./chunk-JTSE5VP6.js";import{c as N}from"./chunk-7SZRL6FY.js";var k=N(V(),1);async function E(e){let t=await fetch(e);return{status:t.status,body:await t.json().catch(()=>({}))}}async function S(e,t,o){let a=await fetch(t,{method:e,headers:{"content-type":"application/json"},body:o?JSON.stringify(o):void 0});return{status:a.status,body:await a.json().catch(()=>({}))}}var x=(e,t)=>S("POST",e,t),X=(e,t)=>S("PUT",e,t),z=[],U=[],q="",I="",A=new Map,H=new Map,$=new Set,M=new Set,y=0;function _(){return y+=1,y}function f(e){return y===e}function c(e){return document.getElementById(e)}function B(){return[...z,...U]}function T(e){let t=A.get(e);return t||(t=new Set,A.set(e,t)),t}function Y(e){return B().find(t=>t.key===e)}function Z(e){let t=(c("tf-search").value||"").trim().toLowerCase();if(t&&!((e.name||"")+" "+(e.cliId||"")+" "+(e.capability||"")).toLowerCase().includes(t))return!1;let o=c("tf-cli").value;return!(o&&e.cliId!==o||c("tf-fcap").checked&&!e.capability||c("tf-frole").checked&&!e.hasTeamRole)}function ee(e,t){let o=[...e.deployments].sort((r,s)=>r.local===s.local?0:r.local?-1:1),a="";for(let r of o){let s=t.filter(p=>p.deployment.id===r.id);if(!s.length)continue;let m=r.id===q,l=m?n("team.tagLocal"):r.stale?n("team.tagRemoteStale"):n("team.tagRemote"),u=e.kind==="local"&&!m?` <button class="tf-rmmember ghost" data-team="${d(e.teamId)}" data-dep="${d(r.id)}" data-name="${d(r.name)}" style="font-size:12px">${n("team.removeMember")}</button>`:"",g=`${e.key}::${r.id}`,b=M.has(g),v=s.filter(p=>T(e.key).has(p.larkAppId)).length;if(a+=`<div class="tf-dep-h" data-dk="${d(g)}" style="cursor:pointer;margin:10px 0 2px"><b>${b?"\u25BE":"\u25B8"} ${d(r.name)}</b> <span class="muted" style="font-size:12px">${n("team.depTag",{tag:l})} \xB7 ${n("team.depCount",{count:s.length})}${v?n("team.depSelected",{n:v}):""}</span>${u}</div>`,!!b){a+='<table style="width:100%;border-collapse:collapse;font-size:14px"><tbody>';for(let p of s){let C=d(p.larkAppId),W=T(e.key).has(p.larkAppId)?" checked":"",K=p.deployment.stale?"opacity:.55":"",J=m?`<input class="tf-cap" data-app="${C}" value="${d(p.capability||"")}" placeholder="${n("team.capPh")}" style="width:92%;padding:3px 6px">`:p.capability?d(p.capability):'<span class="muted">\u2014</span>',Q=p.hasTeamRole?m?`<button class="tf-role" data-app="${C}" data-name="${d(p.name)}">${n("team.viewRole")}</button>`:n("team.hasRoleShort"):'<span class="muted">\u2014</span>';a+=`<tr style="${K}"><td style="padding:4px 8px"><input type="checkbox" class="tf-pick" data-tk="${d(e.key)}" data-app="${C}"${W}></td><td style="padding:4px 8px">${d(p.name)}</td><td style="padding:4px 8px" class="muted">${d(p.cliId)}</td><td style="padding:4px 8px">${J}</td><td style="padding:4px 8px">${Q}</td></tr>`}a+="</tbody></table>"}}return a||(a=`<p class="muted" style="margin:8px 0 0">${n("team.noMatch")}</p>`),a+=`<div style="margin-top:12px;display:flex;gap:8px;flex-wrap:wrap;align-items:center"><input class="tf-gname" data-tk="${d(e.key)}" value="${d(H.get(e.key)||"")}" placeholder="${n("team.gnamePh")}" style="min-width:200px"><button class="tf-grp primary" data-tk="${d(e.key)}">${n("team.pullGroupBtn")}</button><span class="muted" style="font-size:13px">${n("team.pullGroupHint")}</span><span class="tf-gout" data-tk="${d(e.key)}" style="font-size:13px;display:block;flex-basis:100%"></span></div>`,a}function h(){let e=c("tf-teams"),t=B();if(!t.length){e.innerHTML=`<p class="muted">${n("team.noTeams")}</p>`,c("tf-count").textContent="";return}let o="",a=new Set,r=new Set;for(let l of t){let u=l.bots.filter(Z);u.forEach(p=>a.add(p.larkAppId)),l.bots.forEach(p=>r.add(p.larkAppId));let g=new Set(u.map(p=>p.larkAppId));[...T(l.key)].forEach(p=>{g.has(p)||T(l.key).delete(p)});let b=!$.has(l.key),v=l.kind==="remote"?l.ok?` <span class="ok" style="font-size:12px">${n("team.connected")}</span>`:` <span class="err" style="font-size:12px">${n("team.connectFail",{error:d(l.error||"")})}</span>`:` <span class="muted" style="font-size:12px">${n("team.iHost")}</span>`;o+=`<div class="card" style="margin:0 0 12px;padding:12px 14px;background:var(--bg-soft,#f6f7f9)"><div class="tf-team-h" data-tk="${d(l.key)}" style="cursor:pointer;display:flex;align-items:center;gap:8px;flex-wrap:wrap"><b style="font-size:15px">${b?"\u25B8":"\u25BE"} ${d(l.label)}</b>`+(l.sub?` <span class="muted" style="font-size:12px">${d(l.sub)}</span>`:"")+v+` <span class="muted" style="font-size:12px">\xB7 ${n("team.teamMeta",{deps:l.deployments.length,bots:l.bots.length})}</span></div>`,b||(o+=l.kind==="remote"&&!l.ok?`<p class="muted" style="margin:8px 0 0">${n("team.rosterFail")}</p>`:ee(l,u)),o+="</div>"}e.innerHTML=o;let s=t.length>1?n("team.acrossTeams",{n:t.length}):"",m=a.size===r.size?`${r.size}`:`${a.size} / ${r.size}`;c("tf-count").textContent=`\xB7 ${m} ${n("team.botsWord")}${s}`,te(y)}function te(e=y){let t=c("tf-teams");t.querySelectorAll(".tf-team-h").forEach(o=>{o.onclick=()=>{let a=o.dataset.tk;$.has(a)?$.delete(a):$.add(a),h()}}),t.querySelectorAll(".tf-dep-h").forEach(o=>{o.onclick=()=>{let a=o.dataset.dk;M.has(a)?M.delete(a):M.add(a),h()}}),t.querySelectorAll(".tf-pick").forEach(o=>{o.onchange=()=>{let a=T(o.dataset.tk);o.checked?a.add(o.dataset.app):a.delete(o.dataset.app)}}),t.querySelectorAll(".tf-gname").forEach(o=>{o.oninput=()=>{H.set(o.dataset.tk,o.value)}}),t.querySelectorAll(".tf-cap").forEach(o=>{o.onchange=async()=>{let a=o.dataset.app,r=o.value;await X("/api/team/local-bots/"+encodeURIComponent(a)+"/capability",{capability:r}),f(e)&&B().forEach(s=>{let m=s.bots.find(l=>l.larkAppId===a);m&&(m.capability=r.trim()||null)})}}),t.querySelectorAll(".tf-role").forEach(o=>{o.onclick=()=>ne(o.dataset.app,o.dataset.name||"",e)}),t.querySelectorAll(".tf-rmmember").forEach(o=>{o.onclick=async a=>{a.stopPropagation(),confirm(n("team.removeMemberConfirm",{name:o.dataset.name||""}))&&(await S("DELETE",`/api/team/hosted/${encodeURIComponent(o.dataset.team)}/members/${encodeURIComponent(o.dataset.dep)}`),f(e)&&L(e))}}),t.querySelectorAll(".tf-grp").forEach(o=>{o.onclick=async()=>{let a=o.dataset.tk,r=Y(a);if(!r)return;let s=[...T(a)],m=t.querySelector(`.tf-gout[data-tk="${CSS.escape(a)}"]`);if(!s.length){m.innerHTML=`<span class="err">${n("team.errPickBot")}</span>`;return}let l=(t.querySelector(`.tf-gname[data-tk="${CSS.escape(a)}"]`)?.value||"").trim()||n("team.defaultGroupName");m.innerHTML=`<span class="muted">${n("team.creatingGroup")}</span>`;let u=r.kind==="local"?await x("/api/team/federated-group",{name:l,larkAppIds:s,teamId:r.teamId}):await x("/api/team/remote-group",{hubUrl:r.hubUrl,teamId:r.teamId,name:l,larkAppIds:s});if(f(e)&&(ae(m,u.body,u.status),u.body?.ok)){T(a).clear(),H.delete(a);let g=m.innerHTML,b=()=>{if(!f(e))return;let v=t.querySelector(`.tf-gout[data-tk="${CSS.escape(a)}"]`);v&&(v.innerHTML=g)};r.kind==="local"?L(e).then(b):(h(),b())}}})}function ae(e,t,o){if(t?.ok&&t.chatId){let a=t.shareLink||"https://applink.feishu.cn/client/chat/open?openChatId="+encodeURIComponent(t.chatId),r=(t.invalidBotIds||[]).length?` <span class="err"> \xB7 ${n("team.invalidBots",{ids:d((t.invalidBotIds||[]).join(", "))})}</span>`:"",s=(t.invalidOwnerUnionIds||[]).length?`<span class="err"> \xB7 ${n("team.invalidOwners",{n:(t.invalidOwnerUnionIds||[]).length})}</span>`:"",m=t.missingOperatorIdentity?`<span class="err"> \xB7 ${n("team.missingIdentity")}</span>`:"",l=(t.skippedNoOwner||[]).length?`<span class="err"> \xB7 ${n("team.skippedNoOwner",{n:(t.skippedNoOwner||[]).length})}</span>`:"",u=t.delegatedTo?n("team.delegatedBy",{name:d(t.delegatedTo)}):"";e.innerHTML=`<span class="ok">${n("team.groupCreated")}</span>${u} \xB7 <a href="${d(a)}" target="_blank">${n("team.openInLark")}</a>${r}${s}${m}${l}`}else{let a=t?.error||o,r=a==="no_local_online_bot"?n("team.errNoLocalBot"):a==="all_bots_skipped_no_owner"?n("team.errAllSkipped"):a==="no_creator_available"?n("team.errNoCreator"):a==="delegation_timeout"?n("team.errDelegationTimeout"):n("team.errGroupCreate",{error:String(a)});e.innerHTML=`<span class="err">${d(String(r))}</span>`}}async function ne(e,t,o=y){let a=await E("/api/team/local-bots/"+encodeURIComponent(e)+"/role");f(o)&&(c("tf-modal-title").textContent=n("team.roleModalTitleName",{name:t}),c("tf-modal-text").value=a.body?.role||"",c("tf-modal").dataset.app=e,c("tf-modal").style.display="flex")}function D(){let e=Array.from(new Set(B().flatMap(a=>a.bots.map(r=>r.cliId)).filter(Boolean))).sort(),t=c("tf-cli"),o=t.value;t.innerHTML=`<option value="">${n("team.allCli")}</option>`+e.map(a=>`<option value="${d(a)}">${d(a)}</option>`).join(""),t.value=o}async function L(e=y){let t=await E("/api/team/hosted");if(!f(e))return;let o=t.body;if(!o?.ok){z=[],h();return}q=o.deployment.deploymentId,I=o.suggestedHubUrl||"",c("tf-owner").textContent=o.deployment.ownerName||(o.deployment.ownerUnionId?n("team.bound"):n("team.unbound")),z=(o.teams||[]).map(a=>({kind:"local",key:`local:${a.teamId}`,teamId:a.teamId,label:a.isDefault?n("team.myHostedTeam"):a.name,sub:"",ok:!0,deployments:a.deployments||[],bots:a.bots||[]})),D(),h()}async function oe(e=y){let t=await E("/api/team/remote-roster");if(!f(e))return;U=(t.body?.memberships||[]).map(a=>{let r=a.roster?.deployments||[],s=r.find(l=>l.local),m=s?.name?n("team.remoteTeamLabel",{name:s.name}):a.teamName||a.teamId;return{kind:"remote",key:`${a.hubUrl}::${a.teamId}`,teamId:a.teamId,label:m,sub:a.hubUrl,ok:!!a.ok,error:a.error,hubUrl:a.hubUrl,deployments:r,bots:a.roster?.bots||[]}}),D(),h()}function O(e){let t=_(),o=[],a=(r,s,m)=>{r&&(r.addEventListener(s,m),o.push(()=>r.removeEventListener(s,m)))};return A.clear(),H.clear(),$.clear(),M.clear(),["tf-search","tf-cli","tf-fcap","tf-frole"].forEach(r=>{let s=document.getElementById(r);a(s,"input",()=>{f(t)&&h()}),a(s,"change",()=>{f(t)&&h()})}),a(document.getElementById("tf-modal-cancel"),"click",()=>{f(t)&&(c("tf-modal").style.display="none")}),se(t),L(t),oe(t),()=>{f(t)&&(y+=1);for(let s of o.splice(0))s();let r=e.querySelector("#tf-modal");r&&(r.style.display="none")}}async function j(e=y){let t=await E("/api/team/hosted");if(!f(e))return;let o=t.body,a=c("tm-list");I=o?.suggestedHubUrl||I;let r=o?.teams||[];if(!r.length){a.innerHTML=`<p class="muted">${n("team.noTeamsShort")}</p>`;return}a.innerHTML=r.map(s=>{let m=(s.deployments||[]).filter(l=>!l.local).length;return`<div class="card" style="margin:0 0 8px;padding:10px 14px;background:var(--bg-soft,#f6f7f9)">
|
|
1
|
+
import{b as w}from"./chunk-VFCACTRF.js";import"./chunk-LXIK7OUJ.js";import{m as n,n as d}from"./chunk-BNEXMNQD.js";import{a as V,b as R,c as P}from"./chunk-JTSE5VP6.js";import{c as N}from"./chunk-7SZRL6FY.js";var k=N(V(),1);async function E(e){let t=await fetch(e);return{status:t.status,body:await t.json().catch(()=>({}))}}async function S(e,t,o){let a=await fetch(t,{method:e,headers:{"content-type":"application/json"},body:o?JSON.stringify(o):void 0});return{status:a.status,body:await a.json().catch(()=>({}))}}var x=(e,t)=>S("POST",e,t),X=(e,t)=>S("PUT",e,t),z=[],U=[],q="",I="",A=new Map,H=new Map,$=new Set,M=new Set,y=0;function _(){return y+=1,y}function f(e){return y===e}function c(e){return document.getElementById(e)}function B(){return[...z,...U]}function T(e){let t=A.get(e);return t||(t=new Set,A.set(e,t)),t}function Y(e){return B().find(t=>t.key===e)}function Z(e){let t=(c("tf-search").value||"").trim().toLowerCase();if(t&&!((e.name||"")+" "+(e.cliId||"")+" "+(e.capability||"")).toLowerCase().includes(t))return!1;let o=c("tf-cli").value;return!(o&&e.cliId!==o||c("tf-fcap").checked&&!e.capability||c("tf-frole").checked&&!e.hasTeamRole)}function ee(e,t){let o=[...e.deployments].sort((r,s)=>r.local===s.local?0:r.local?-1:1),a="";for(let r of o){let s=t.filter(p=>p.deployment.id===r.id);if(!s.length)continue;let m=r.id===q,l=m?n("team.tagLocal"):r.stale?n("team.tagRemoteStale"):n("team.tagRemote"),u=e.kind==="local"&&!m?` <button class="tf-rmmember ghost" data-team="${d(e.teamId)}" data-dep="${d(r.id)}" data-name="${d(r.name)}" style="font-size:12px">${n("team.removeMember")}</button>`:"",g=`${e.key}::${r.id}`,b=M.has(g),v=s.filter(p=>T(e.key).has(p.larkAppId)).length;if(a+=`<div class="tf-dep-h" data-dk="${d(g)}" style="cursor:pointer;margin:10px 0 2px"><b>${b?"\u25BE":"\u25B8"} ${d(r.name)}</b> <span class="muted" style="font-size:12px">${n("team.depTag",{tag:l})} \xB7 ${n("team.depCount",{count:s.length})}${v?n("team.depSelected",{n:v}):""}</span>${u}</div>`,!!b){a+='<table style="width:100%;border-collapse:collapse;font-size:14px"><tbody>';for(let p of s){let C=d(p.larkAppId),W=T(e.key).has(p.larkAppId)?" checked":"",K=p.deployment.stale?"opacity:.55":"",J=m?`<input class="tf-cap" data-app="${C}" value="${d(p.capability||"")}" placeholder="${n("team.capPh")}" style="width:92%;padding:3px 6px">`:p.capability?d(p.capability):'<span class="muted">\u2014</span>',Q=p.hasTeamRole?m?`<button class="tf-role" data-app="${C}" data-name="${d(p.name)}">${n("team.viewRole")}</button>`:n("team.hasRoleShort"):'<span class="muted">\u2014</span>';a+=`<tr style="${K}"><td style="padding:4px 8px"><input type="checkbox" class="tf-pick" data-tk="${d(e.key)}" data-app="${C}"${W}></td><td style="padding:4px 8px">${d(p.name)}</td><td style="padding:4px 8px" class="muted">${d(p.cliId)}</td><td style="padding:4px 8px">${J}</td><td style="padding:4px 8px">${Q}</td></tr>`}a+="</tbody></table>"}}return a||(a=`<p class="muted" style="margin:8px 0 0">${n("team.noMatch")}</p>`),a+=`<div style="margin-top:12px;display:flex;gap:8px;flex-wrap:wrap;align-items:center"><input class="tf-gname" data-tk="${d(e.key)}" value="${d(H.get(e.key)||"")}" placeholder="${n("team.gnamePh")}" style="min-width:200px"><button class="tf-grp primary" data-tk="${d(e.key)}">${n("team.pullGroupBtn")}</button><span class="muted" style="font-size:13px">${n("team.pullGroupHint")}</span><span class="tf-gout" data-tk="${d(e.key)}" style="font-size:13px;display:block;flex-basis:100%"></span></div>`,a}function h(){let e=c("tf-teams"),t=B();if(!t.length){e.innerHTML=`<p class="muted">${n("team.noTeams")}</p>`,c("tf-count").textContent="";return}let o="",a=new Set,r=new Set;for(let l of t){let u=l.bots.filter(Z);u.forEach(p=>a.add(p.larkAppId)),l.bots.forEach(p=>r.add(p.larkAppId));let g=new Set(u.map(p=>p.larkAppId));[...T(l.key)].forEach(p=>{g.has(p)||T(l.key).delete(p)});let b=!$.has(l.key),v=l.kind==="remote"?l.ok?` <span class="ok" style="font-size:12px">${n("team.connected")}</span>`:` <span class="err" style="font-size:12px">${n("team.connectFail",{error:d(l.error||"")})}</span>`:` <span class="muted" style="font-size:12px">${n("team.iHost")}</span>`;o+=`<div class="card" style="margin:0 0 12px;padding:12px 14px;background:var(--bg-soft,#f6f7f9)"><div class="tf-team-h" data-tk="${d(l.key)}" style="cursor:pointer;display:flex;align-items:center;gap:8px;flex-wrap:wrap"><b style="font-size:15px">${b?"\u25B8":"\u25BE"} ${d(l.label)}</b>`+(l.sub?` <span class="muted" style="font-size:12px">${d(l.sub)}</span>`:"")+v+` <span class="muted" style="font-size:12px">\xB7 ${n("team.teamMeta",{deps:l.deployments.length,bots:l.bots.length})}</span></div>`,b||(o+=l.kind==="remote"&&!l.ok?`<p class="muted" style="margin:8px 0 0">${n("team.rosterFail")}</p>`:ee(l,u)),o+="</div>"}e.innerHTML=o;let s=t.length>1?n("team.acrossTeams",{n:t.length}):"",m=a.size===r.size?`${r.size}`:`${a.size} / ${r.size}`;c("tf-count").textContent=`\xB7 ${m} ${n("team.botsWord")}${s}`,te(y)}function te(e=y){let t=c("tf-teams");t.querySelectorAll(".tf-team-h").forEach(o=>{o.onclick=()=>{let a=o.dataset.tk;$.has(a)?$.delete(a):$.add(a),h()}}),t.querySelectorAll(".tf-dep-h").forEach(o=>{o.onclick=()=>{let a=o.dataset.dk;M.has(a)?M.delete(a):M.add(a),h()}}),t.querySelectorAll(".tf-pick").forEach(o=>{o.onchange=()=>{let a=T(o.dataset.tk);o.checked?a.add(o.dataset.app):a.delete(o.dataset.app)}}),t.querySelectorAll(".tf-gname").forEach(o=>{o.oninput=()=>{H.set(o.dataset.tk,o.value)}}),t.querySelectorAll(".tf-cap").forEach(o=>{o.onchange=async()=>{let a=o.dataset.app,r=o.value;await X("/api/team/local-bots/"+encodeURIComponent(a)+"/capability",{capability:r}),f(e)&&B().forEach(s=>{let m=s.bots.find(l=>l.larkAppId===a);m&&(m.capability=r.trim()||null)})}}),t.querySelectorAll(".tf-role").forEach(o=>{o.onclick=()=>ne(o.dataset.app,o.dataset.name||"",e)}),t.querySelectorAll(".tf-rmmember").forEach(o=>{o.onclick=async a=>{a.stopPropagation(),confirm(n("team.removeMemberConfirm",{name:o.dataset.name||""}))&&(await S("DELETE",`/api/team/hosted/${encodeURIComponent(o.dataset.team)}/members/${encodeURIComponent(o.dataset.dep)}`),f(e)&&L(e))}}),t.querySelectorAll(".tf-grp").forEach(o=>{o.onclick=async()=>{let a=o.dataset.tk,r=Y(a);if(!r)return;let s=[...T(a)],m=t.querySelector(`.tf-gout[data-tk="${CSS.escape(a)}"]`);if(!s.length){m.innerHTML=`<span class="err">${n("team.errPickBot")}</span>`;return}let l=(t.querySelector(`.tf-gname[data-tk="${CSS.escape(a)}"]`)?.value||"").trim()||n("team.defaultGroupName");m.innerHTML=`<span class="muted">${n("team.creatingGroup")}</span>`;let u=r.kind==="local"?await x("/api/team/federated-group",{name:l,larkAppIds:s,teamId:r.teamId}):await x("/api/team/remote-group",{hubUrl:r.hubUrl,teamId:r.teamId,name:l,larkAppIds:s});if(f(e)&&(ae(m,u.body,u.status),u.body?.ok)){T(a).clear(),H.delete(a);let g=m.innerHTML,b=()=>{if(!f(e))return;let v=t.querySelector(`.tf-gout[data-tk="${CSS.escape(a)}"]`);v&&(v.innerHTML=g)};r.kind==="local"?L(e).then(b):(h(),b())}}})}function ae(e,t,o){if(t?.ok&&t.chatId){let a=t.shareLink||"https://applink.feishu.cn/client/chat/open?openChatId="+encodeURIComponent(t.chatId),r=(t.invalidBotIds||[]).length?` <span class="err"> \xB7 ${n("team.invalidBots",{ids:d((t.invalidBotIds||[]).join(", "))})}</span>`:"",s=(t.invalidOwnerUnionIds||[]).length?`<span class="err"> \xB7 ${n("team.invalidOwners",{n:(t.invalidOwnerUnionIds||[]).length})}</span>`:"",m=t.missingOperatorIdentity?`<span class="err"> \xB7 ${n("team.missingIdentity")}</span>`:"",l=(t.skippedNoOwner||[]).length?`<span class="err"> \xB7 ${n("team.skippedNoOwner",{n:(t.skippedNoOwner||[]).length})}</span>`:"",u=t.delegatedTo?n("team.delegatedBy",{name:d(t.delegatedTo)}):"";e.innerHTML=`<span class="ok">${n("team.groupCreated")}</span>${u} \xB7 <a href="${d(a)}" target="_blank">${n("team.openInLark")}</a>${r}${s}${m}${l}`}else{let a=t?.error||o,r=a==="no_local_online_bot"?n("team.errNoLocalBot"):a==="all_bots_skipped_no_owner"?n("team.errAllSkipped"):a==="no_creator_available"?n("team.errNoCreator"):a==="delegation_timeout"?n("team.errDelegationTimeout"):n("team.errGroupCreate",{error:String(a)});e.innerHTML=`<span class="err">${d(String(r))}</span>`}}async function ne(e,t,o=y){let a=await E("/api/team/local-bots/"+encodeURIComponent(e)+"/role");f(o)&&(c("tf-modal-title").textContent=n("team.roleModalTitleName",{name:t}),c("tf-modal-text").value=a.body?.role||"",c("tf-modal").dataset.app=e,c("tf-modal").style.display="flex")}function D(){let e=Array.from(new Set(B().flatMap(a=>a.bots.map(r=>r.cliId)).filter(Boolean))).sort(),t=c("tf-cli"),o=t.value;t.innerHTML=`<option value="">${n("team.allCli")}</option>`+e.map(a=>`<option value="${d(a)}">${d(a)}</option>`).join(""),t.value=o}async function L(e=y){let t=await E("/api/team/hosted");if(!f(e))return;let o=t.body;if(!o?.ok){z=[],h();return}q=o.deployment.deploymentId,I=o.suggestedHubUrl||"",c("tf-owner").textContent=o.deployment.ownerName||(o.deployment.ownerUnionId?n("team.bound"):n("team.unbound")),z=(o.teams||[]).map(a=>({kind:"local",key:`local:${a.teamId}`,teamId:a.teamId,label:a.isDefault?n("team.myHostedTeam"):a.name,sub:"",ok:!0,deployments:a.deployments||[],bots:a.bots||[]})),D(),h()}async function oe(e=y){let t=await E("/api/team/remote-roster");if(!f(e))return;U=(t.body?.memberships||[]).map(a=>{let r=a.roster?.deployments||[],s=r.find(l=>l.local),m=s?.name?n("team.remoteTeamLabel",{name:s.name}):a.teamName||a.teamId;return{kind:"remote",key:`${a.hubUrl}::${a.teamId}`,teamId:a.teamId,label:m,sub:a.hubUrl,ok:!!a.ok,error:a.error,hubUrl:a.hubUrl,deployments:r,bots:a.roster?.bots||[]}}),D(),h()}function O(e){let t=_(),o=[],a=(r,s,m)=>{r&&(r.addEventListener(s,m),o.push(()=>r.removeEventListener(s,m)))};return A.clear(),H.clear(),$.clear(),M.clear(),["tf-search","tf-cli","tf-fcap","tf-frole"].forEach(r=>{let s=document.getElementById(r);a(s,"input",()=>{f(t)&&h()}),a(s,"change",()=>{f(t)&&h()})}),a(document.getElementById("tf-modal-cancel"),"click",()=>{f(t)&&(c("tf-modal").style.display="none")}),se(t),L(t),oe(t),()=>{f(t)&&(y+=1);for(let s of o.splice(0))s();let r=e.querySelector("#tf-modal");r&&(r.style.display="none")}}async function j(e=y){let t=await E("/api/team/hosted");if(!f(e))return;let o=t.body,a=c("tm-list");I=o?.suggestedHubUrl||I;let r=o?.teams||[];if(!r.length){a.innerHTML=`<p class="muted">${n("team.noTeamsShort")}</p>`;return}a.innerHTML=r.map(s=>{let m=(s.deployments||[]).filter(l=>!l.local).length;return`<div class="card" style="margin:0 0 8px;padding:10px 14px;background:var(--bg-soft,#f6f7f9)">
|
|
2
2
|
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap">
|
|
3
3
|
<b>${d(s.name)}</b>${s.isDefault?` <span class="muted" style="font-size:12px">${n("team.default")}</span>`:""}
|
|
4
4
|
<span class="muted" style="font-size:12px">\xB7 ${n("team.manageMetaDeps",{count:(s.deployments||[]).length})}${m?n("team.manageMetaRemote",{r:m}):""} \xB7 ${n("team.manageMetaBots",{count:(s.bots||[]).length})}</span>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{m as i}from"./chunk-
|
|
1
|
+
import{m as i}from"./chunk-BNEXMNQD.js";import"./chunk-7SZRL6FY.js";function Rt(){let t=[["",i("workflow.filter.nonTerminal")],["all",i("workflow.filter.all")],["pending",C("pending")],["running",C("running")],["waiting",C("waiting")],["succeeded",C("succeeded")],["failed",C("failed")],["cancelled",C("cancelled")]];return`
|
|
2
2
|
<nav class="wf-subnav">
|
|
3
3
|
<a href="#/legacy-workflow" class="active" data-i18n="workflow.subnav.runs">${r(i("workflow.subnav.runs"))}</a>
|
|
4
4
|
<a href="#/workflows" data-i18n="workflow.subnav.v3">${r(i("workflow.subnav.v3"))}</a>
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
aria-haspopup="listbox" aria-expanded="false" aria-label="Theme"></button>
|
|
62
62
|
<div class="theme-menu-pop" id="theme-menu-pop" role="listbox" hidden></div>
|
|
63
63
|
</div>
|
|
64
|
-
<a class="topbar-docs-link" href="https://
|
|
64
|
+
<a class="topbar-docs-link" href="https://github.com/deepcoldy/botmux/tree/master/docs-site/docs"
|
|
65
65
|
target="_blank" rel="noopener noreferrer" title="botmux 文档">
|
|
66
66
|
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M2.5 2.5h5.5a1.5 1.5 0 0 1 1.5 1.5v9M13.5 2.5H8a1.5 1.5 0 0 0-1.5 1.5v9M2.5 2.5v9.5a1 1 0 0 0 1 1H7M13.5 2.5v9.5a1 1 0 0 1-1 1H9"/></svg>
|
|
67
67
|
<span data-i18n="nav.docs">文档</span>
|
|
@@ -4500,33 +4500,128 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
|
|
|
4500
4500
|
gap: 10px;
|
|
4501
4501
|
}
|
|
4502
4502
|
|
|
4503
|
+
/* ── Settings page ──────────────────────────────────────────────────────────
|
|
4504
|
+
Two-column grid of section cards. Each card carries an icon chip that
|
|
4505
|
+
doubles as the save indicator (pulses while its section is persisting). */
|
|
4503
4506
|
.settings-grid {
|
|
4504
4507
|
display: grid;
|
|
4505
|
-
grid-template-columns: minmax(
|
|
4508
|
+
grid-template-columns: repeat(auto-fit, minmax(420px, 1fr));
|
|
4506
4509
|
gap: 14px;
|
|
4507
|
-
|
|
4510
|
+
align-items: start;
|
|
4511
|
+
max-width: 1240px;
|
|
4508
4512
|
min-width: 0;
|
|
4509
4513
|
}
|
|
4514
|
+
@media (max-width: 620px) {
|
|
4515
|
+
.settings-grid { grid-template-columns: minmax(0, 1fr); }
|
|
4516
|
+
}
|
|
4517
|
+
.settings-grid > .bd-card { max-width: none; margin-bottom: 0; }
|
|
4518
|
+
.st-banner { grid-column: 1 / -1; margin: 0; }
|
|
4510
4519
|
|
|
4511
|
-
.
|
|
4512
|
-
|
|
4513
|
-
|
|
4520
|
+
.st-card { padding: 14px 18px 12px; min-width: 0; overflow: hidden; }
|
|
4521
|
+
.st-card-head {
|
|
4522
|
+
display: flex;
|
|
4523
|
+
align-items: center;
|
|
4524
|
+
gap: 10px;
|
|
4525
|
+
margin: 0 0 2px;
|
|
4526
|
+
padding-bottom: 10px;
|
|
4527
|
+
border-bottom: 1px solid var(--border-soft);
|
|
4528
|
+
}
|
|
4529
|
+
.st-card-head h3 {
|
|
4530
|
+
margin: 0;
|
|
4531
|
+
font-size: 13.5px;
|
|
4532
|
+
font-weight: 650;
|
|
4533
|
+
letter-spacing: 0.01em;
|
|
4534
|
+
}
|
|
4535
|
+
.st-chip {
|
|
4536
|
+
display: grid;
|
|
4537
|
+
place-items: center;
|
|
4538
|
+
flex: none;
|
|
4539
|
+
width: 30px;
|
|
4540
|
+
height: 30px;
|
|
4541
|
+
border-radius: 9px;
|
|
4542
|
+
color: var(--accent);
|
|
4543
|
+
background: var(--accent-soft);
|
|
4544
|
+
border: 1px solid color-mix(in srgb, var(--accent) 24%, transparent);
|
|
4545
|
+
}
|
|
4546
|
+
.st-chip svg { width: 16px; height: 16px; }
|
|
4547
|
+
.st-card[data-saving] .st-chip { animation: st-chip-pulse 1.1s ease-in-out infinite; }
|
|
4548
|
+
@keyframes st-chip-pulse {
|
|
4549
|
+
0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--accent) 38%, transparent); }
|
|
4550
|
+
50% { box-shadow: 0 0 0 5px color-mix(in srgb, var(--accent) 10%, transparent); }
|
|
4551
|
+
}
|
|
4552
|
+
|
|
4553
|
+
.st-card .toggle-row { min-width: 0; padding: 11px 0; }
|
|
4554
|
+
.st-card .toggle-row + .toggle-row,
|
|
4555
|
+
.st-card .st-subrow + .toggle-row,
|
|
4556
|
+
.st-card .hint-warn + .toggle-row { border-top: 1px dashed var(--border-soft); }
|
|
4557
|
+
.st-card .toggle-tx { min-width: 0; }
|
|
4558
|
+
.st-card .toggle-tx strong { font-size: 12.5px; }
|
|
4559
|
+
.st-card .toggle-tx strong,
|
|
4560
|
+
.st-card .toggle-tx small { overflow-wrap: anywhere; }
|
|
4561
|
+
.st-card .toggle-tx small,
|
|
4562
|
+
.st-field small {
|
|
4563
|
+
display: -webkit-box;
|
|
4564
|
+
-webkit-line-clamp: 2;
|
|
4565
|
+
-webkit-box-orient: vertical;
|
|
4514
4566
|
overflow: hidden;
|
|
4567
|
+
margin-top: 3px;
|
|
4568
|
+
color: var(--faint);
|
|
4569
|
+
font-size: 11px;
|
|
4570
|
+
line-height: 1.55;
|
|
4571
|
+
cursor: pointer;
|
|
4515
4572
|
}
|
|
4573
|
+
.st-card .toggle-tx small:hover,
|
|
4574
|
+
.st-field small:hover { color: var(--muted); }
|
|
4575
|
+
.st-card .toggle-tx small.open,
|
|
4576
|
+
.st-field small.open { -webkit-line-clamp: unset; color: var(--muted); }
|
|
4516
4577
|
|
|
4517
|
-
.
|
|
4518
|
-
.
|
|
4519
|
-
|
|
4520
|
-
|
|
4521
|
-
|
|
4522
|
-
|
|
4523
|
-
|
|
4524
|
-
|
|
4578
|
+
.st-field { display: block; margin: 10px 0 6px; min-width: 0; }
|
|
4579
|
+
.st-field > span {
|
|
4580
|
+
display: block;
|
|
4581
|
+
margin-bottom: 6px;
|
|
4582
|
+
color: var(--fg);
|
|
4583
|
+
font-size: 12.5px;
|
|
4584
|
+
font-weight: 600;
|
|
4585
|
+
}
|
|
4586
|
+
.st-field select,
|
|
4587
|
+
.st-field input[type=time] { width: 100%; max-width: 360px; }
|
|
4588
|
+
.st-field small { display: -webkit-box; margin-top: 6px; overflow-wrap: anywhere; }
|
|
4589
|
+
|
|
4590
|
+
/* Dependent controls (auto-update time) hang off their parent toggle. */
|
|
4591
|
+
.st-subrow {
|
|
4592
|
+
margin: 0 0 10px 48px;
|
|
4593
|
+
padding: 2px 0 2px 12px;
|
|
4594
|
+
border-left: 2px solid var(--border-soft);
|
|
4525
4595
|
}
|
|
4526
|
-
.
|
|
4527
|
-
|
|
4596
|
+
.st-subrow .st-field { margin: 0; }
|
|
4597
|
+
.st-subrow input[type=time] { max-width: 150px; }
|
|
4598
|
+
|
|
4599
|
+
/* Global save status: fixed pill so feedback is visible from any card. */
|
|
4600
|
+
.st-status {
|
|
4601
|
+
position: fixed;
|
|
4602
|
+
left: 50%;
|
|
4603
|
+
bottom: 26px;
|
|
4604
|
+
transform: translateX(-50%);
|
|
4605
|
+
z-index: 70;
|
|
4606
|
+
padding: 8px 18px;
|
|
4607
|
+
border-radius: 999px;
|
|
4608
|
+
background: var(--surface-raised);
|
|
4609
|
+
border: 1px solid var(--border);
|
|
4610
|
+
box-shadow: var(--shadow);
|
|
4611
|
+
font-size: 12.5px;
|
|
4528
4612
|
color: var(--muted);
|
|
4529
4613
|
}
|
|
4614
|
+
.st-status.hint-ok { color: var(--success); border-color: color-mix(in srgb, var(--success) 40%, var(--border)); }
|
|
4615
|
+
.st-status.hint-warn-inline { color: var(--danger); border-color: color-mix(in srgb, var(--danger) 40%, var(--border)); }
|
|
4616
|
+
|
|
4617
|
+
/* Version & update card */
|
|
4618
|
+
.st-update-label { color: var(--muted); font-size: 12px; }
|
|
4619
|
+
.st-update-ver { font-family: var(--mono); font-size: 19px; font-weight: 700; letter-spacing: -0.01em; }
|
|
4620
|
+
.update-version { align-items: baseline; margin: 10px 0 2px; }
|
|
4621
|
+
|
|
4622
|
+
@media (prefers-reduced-motion: reduce) {
|
|
4623
|
+
.st-card[data-saving] .st-chip { animation: none; }
|
|
4624
|
+
}
|
|
4530
4625
|
|
|
4531
4626
|
.skills-page-grid {
|
|
4532
4627
|
display: grid;
|
|
@@ -8227,7 +8322,7 @@ body.cp-fx-slice main { animation: cp-fx-slice 0.32s steps(2, end); }
|
|
|
8227
8322
|
.insights-page .spanchip-sys { color: var(--mut); opacity: .8; }
|
|
8228
8323
|
.insights-page .spanchip-sys.on { opacity: 1; }
|
|
8229
8324
|
|
|
8230
|
-
/* full-text prompt modal (
|
|
8325
|
+
/* full-text prompt modal (用户: 弹窗看全文) — fixed overlay + centred reading panel */
|
|
8231
8326
|
.insights-page .insight-modal { position: fixed; inset: 0; z-index: 1000; }
|
|
8232
8327
|
.insights-page .insight-modal[hidden] { display: none; }
|
|
8233
8328
|
.insights-page .modal-backdrop { position: absolute; inset: 0; background: rgba(0, 0, 0, .55); }
|