botmux 3.1.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/dist/adapters/backend/sandbox.d.ts +23 -0
  2. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  3. package/dist/adapters/backend/sandbox.js +68 -1
  4. package/dist/adapters/backend/sandbox.js.map +1 -1
  5. package/dist/adapters/cli/read-isolation.d.ts +1 -1
  6. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  7. package/dist/adapters/cli/read-isolation.js +15 -7
  8. package/dist/adapters/cli/read-isolation.js.map +1 -1
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +117 -25
  11. package/dist/cli.js.map +1 -1
  12. package/dist/core/command-handler.d.ts.map +1 -1
  13. package/dist/core/command-handler.js +11 -4
  14. package/dist/core/command-handler.js.map +1 -1
  15. package/dist/core/dashboard-ipc-server.d.ts +1 -0
  16. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  17. package/dist/core/dashboard-ipc-server.js +132 -0
  18. package/dist/core/dashboard-ipc-server.js.map +1 -1
  19. package/dist/core/maintenance.d.ts +23 -1
  20. package/dist/core/maintenance.d.ts.map +1 -1
  21. package/dist/core/maintenance.js +63 -25
  22. package/dist/core/maintenance.js.map +1 -1
  23. package/dist/core/plugins/cli-generation.d.ts.map +1 -1
  24. package/dist/core/plugins/cli-generation.js +7 -0
  25. package/dist/core/plugins/cli-generation.js.map +1 -1
  26. package/dist/core/plugins/convention-scanner.d.ts +3 -3
  27. package/dist/core/plugins/convention-scanner.d.ts.map +1 -1
  28. package/dist/core/plugins/convention-scanner.js.map +1 -1
  29. package/dist/core/plugins/install.d.ts.map +1 -1
  30. package/dist/core/plugins/install.js +84 -26
  31. package/dist/core/plugins/install.js.map +1 -1
  32. package/dist/core/plugins/mcp/environment.d.ts +12 -0
  33. package/dist/core/plugins/mcp/environment.d.ts.map +1 -0
  34. package/dist/core/plugins/mcp/environment.js +17 -0
  35. package/dist/core/plugins/mcp/environment.js.map +1 -0
  36. package/dist/core/plugins/mcp/gateway-installer.d.ts.map +1 -1
  37. package/dist/core/plugins/mcp/gateway-installer.js +9 -3
  38. package/dist/core/plugins/mcp/gateway-installer.js.map +1 -1
  39. package/dist/core/plugins/mcp/gateway.d.ts +13 -1
  40. package/dist/core/plugins/mcp/gateway.d.ts.map +1 -1
  41. package/dist/core/plugins/mcp/gateway.js +143 -23
  42. package/dist/core/plugins/mcp/gateway.js.map +1 -1
  43. package/dist/core/plugins/mcp/host.d.ts +18 -0
  44. package/dist/core/plugins/mcp/host.d.ts.map +1 -0
  45. package/dist/core/plugins/mcp/host.js +126 -0
  46. package/dist/core/plugins/mcp/host.js.map +1 -0
  47. package/dist/core/plugins/mcp/private-store.d.ts +15 -0
  48. package/dist/core/plugins/mcp/private-store.d.ts.map +1 -0
  49. package/dist/core/plugins/mcp/private-store.js +162 -0
  50. package/dist/core/plugins/mcp/private-store.js.map +1 -0
  51. package/dist/core/plugins/mcp/session-runtime.d.ts +25 -0
  52. package/dist/core/plugins/mcp/session-runtime.d.ts.map +1 -0
  53. package/dist/core/plugins/mcp/session-runtime.js +76 -0
  54. package/dist/core/plugins/mcp/session-runtime.js.map +1 -0
  55. package/dist/core/plugins/mcp/socket-auth.d.ts +9 -0
  56. package/dist/core/plugins/mcp/socket-auth.d.ts.map +1 -0
  57. package/dist/core/plugins/mcp/socket-auth.js +94 -0
  58. package/dist/core/plugins/mcp/socket-auth.js.map +1 -0
  59. package/dist/core/plugins/paths.d.ts +3 -0
  60. package/dist/core/plugins/paths.d.ts.map +1 -1
  61. package/dist/core/plugins/paths.js +9 -0
  62. package/dist/core/plugins/paths.js.map +1 -1
  63. package/dist/core/plugins/pm2.d.ts.map +1 -1
  64. package/dist/core/plugins/pm2.js +3 -1
  65. package/dist/core/plugins/pm2.js.map +1 -1
  66. package/dist/core/plugins/runtime.d.ts +2 -0
  67. package/dist/core/plugins/runtime.d.ts.map +1 -1
  68. package/dist/core/plugins/runtime.js.map +1 -1
  69. package/dist/core/plugins/service-manager.d.ts +22 -0
  70. package/dist/core/plugins/service-manager.d.ts.map +1 -1
  71. package/dist/core/plugins/service-manager.js +189 -52
  72. package/dist/core/plugins/service-manager.js.map +1 -1
  73. package/dist/core/plugins/types.d.ts +15 -1
  74. package/dist/core/plugins/types.d.ts.map +1 -1
  75. package/dist/core/restart-report.d.ts +1 -1
  76. package/dist/core/restart-report.d.ts.map +1 -1
  77. package/dist/core/restart-report.js +5 -3
  78. package/dist/core/restart-report.js.map +1 -1
  79. package/dist/core/scheduler.d.ts +47 -0
  80. package/dist/core/scheduler.d.ts.map +1 -1
  81. package/dist/core/scheduler.js +117 -0
  82. package/dist/core/scheduler.js.map +1 -1
  83. package/dist/core/session-manager.d.ts +7 -0
  84. package/dist/core/session-manager.d.ts.map +1 -1
  85. package/dist/core/session-manager.js +130 -33
  86. package/dist/core/session-manager.js.map +1 -1
  87. package/dist/core/silent-schedule-turns.d.ts +5 -0
  88. package/dist/core/silent-schedule-turns.d.ts.map +1 -0
  89. package/dist/core/silent-schedule-turns.js +47 -0
  90. package/dist/core/silent-schedule-turns.js.map +1 -0
  91. package/dist/core/types.d.ts +6 -0
  92. package/dist/core/types.d.ts.map +1 -1
  93. package/dist/core/types.js.map +1 -1
  94. package/dist/core/update-check.d.ts +16 -0
  95. package/dist/core/update-check.d.ts.map +1 -1
  96. package/dist/core/update-check.js +52 -0
  97. package/dist/core/update-check.js.map +1 -1
  98. package/dist/core/worker-pool.d.ts.map +1 -1
  99. package/dist/core/worker-pool.js +30 -23
  100. package/dist/core/worker-pool.js.map +1 -1
  101. package/dist/dashboard/schedule-card-model.d.ts +3 -0
  102. package/dist/dashboard/schedule-card-model.d.ts.map +1 -1
  103. package/dist/dashboard/schedule-card-model.js +5 -0
  104. package/dist/dashboard/schedule-card-model.js.map +1 -1
  105. package/dist/dashboard/web/app.d.ts.map +1 -1
  106. package/dist/dashboard/web/app.js +295 -6
  107. package/dist/dashboard/web/app.js.map +1 -1
  108. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  109. package/dist/dashboard/web/i18n.js +92 -0
  110. package/dist/dashboard/web/i18n.js.map +1 -1
  111. package/dist/dashboard/web/plugin-page.d.ts.map +1 -1
  112. package/dist/dashboard/web/plugin-page.js +1 -3
  113. package/dist/dashboard/web/plugin-page.js.map +1 -1
  114. package/dist/dashboard/web/schedules-page.d.ts.map +1 -1
  115. package/dist/dashboard/web/schedules-page.js +111 -4
  116. package/dist/dashboard/web/schedules-page.js.map +1 -1
  117. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  118. package/dist/dashboard/web/settings-page.js +5 -1
  119. package/dist/dashboard/web/settings-page.js.map +1 -1
  120. package/dist/dashboard/web/update-action.d.ts +16 -0
  121. package/dist/dashboard/web/update-action.d.ts.map +1 -0
  122. package/dist/dashboard/web/update-action.js +64 -0
  123. package/dist/dashboard/web/update-action.js.map +1 -0
  124. package/dist/dashboard-web/app.js +1 -1
  125. package/dist/dashboard-web/chunks/{bot-defaults-page-KLDCZNLP.js → bot-defaults-page-4PM4T6QQ.js} +1 -1
  126. package/dist/dashboard-web/chunks/{chunk-FMJNOATE.js → chunk-3PMN55Z6.js} +1 -1
  127. package/dist/dashboard-web/chunks/{chunk-MLNI5BKE.js → chunk-AIDN2WZB.js} +1 -1
  128. package/dist/dashboard-web/chunks/{chunk-EZAW2EPM.js → chunk-IKCZ677K.js} +1 -1
  129. package/dist/dashboard-web/chunks/{chunk-KEAOTUL3.js → chunk-RXVA6XW3.js} +7 -7
  130. package/dist/dashboard-web/chunks/{connectors-page-O32LFAL5.js → connectors-page-2MKF4YTN.js} +1 -1
  131. package/dist/dashboard-web/chunks/{groups-page-PSAFIZ6M.js → groups-page-TAU2UIVS.js} +1 -1
  132. package/dist/dashboard-web/chunks/{insights-page-V23LLATX.js → insights-page-PJ2XVM6T.js} +1 -1
  133. package/dist/dashboard-web/chunks/{monitor-room-7X5AKYOF.js → monitor-room-D6445HJO.js} +1 -1
  134. package/dist/dashboard-web/chunks/{monitoring-page-CBA3CQYL.js → monitoring-page-GUHMCKSO.js} +1 -1
  135. package/dist/dashboard-web/chunks/{office-page-RL6QSEM7.js → office-page-6K6U2MS5.js} +1 -1
  136. package/dist/dashboard-web/chunks/{overview-page-XQIPO6KH.js → overview-page-USDYU7U5.js} +1 -1
  137. package/dist/dashboard-web/chunks/plugin-page-JXC5F5YV.js +1 -0
  138. package/dist/dashboard-web/chunks/{roles-page-ACIWV7QS.js → roles-page-O4OUA7ZH.js} +1 -1
  139. package/dist/dashboard-web/chunks/schedules-page-LNIBXJSZ.js +1 -0
  140. package/dist/dashboard-web/chunks/{sessions-page-2WDWHSP4.js → sessions-page-B6U6TCFF.js} +1 -1
  141. package/dist/dashboard-web/chunks/{settings-page-6VX4OUGG.js → settings-page-PXLRFF7I.js} +2 -2
  142. package/dist/dashboard-web/chunks/{skills-page-WXE3UYLT.js → skills-page-M5KYNXBA.js} +1 -1
  143. package/dist/dashboard-web/chunks/{team-federation-page-PYTF4FLM.js → team-federation-page-GT7UFQMN.js} +1 -1
  144. package/dist/dashboard-web/chunks/{v3-page-G6CD6O3I.js → v3-page-UYZIRJ2C.js} +1 -1
  145. package/dist/dashboard-web/chunks/{whiteboards-page-6SG33GP4.js → whiteboards-page-WAR77DQE.js} +1 -1
  146. package/dist/dashboard-web/style.css +697 -0
  147. package/dist/dashboard.js +404 -29
  148. package/dist/dashboard.js.map +1 -1
  149. package/dist/i18n/en.d.ts.map +1 -1
  150. package/dist/i18n/en.js +4 -0
  151. package/dist/i18n/en.js.map +1 -1
  152. package/dist/i18n/zh.d.ts.map +1 -1
  153. package/dist/i18n/zh.js +4 -0
  154. package/dist/i18n/zh.js.map +1 -1
  155. package/dist/im/lark/schedules-card.d.ts.map +1 -1
  156. package/dist/im/lark/schedules-card.js +2 -0
  157. package/dist/im/lark/schedules-card.js.map +1 -1
  158. package/dist/services/plugin-registry-store.d.ts.map +1 -1
  159. package/dist/services/plugin-registry-store.js +100 -18
  160. package/dist/services/plugin-registry-store.js.map +1 -1
  161. package/dist/services/restart-intent-store.d.ts +17 -2
  162. package/dist/services/restart-intent-store.d.ts.map +1 -1
  163. package/dist/services/restart-intent-store.js +110 -0
  164. package/dist/services/restart-intent-store.js.map +1 -1
  165. package/dist/services/schedule-store.d.ts +3 -1
  166. package/dist/services/schedule-store.d.ts.map +1 -1
  167. package/dist/services/schedule-store.js +5 -0
  168. package/dist/services/schedule-store.js.map +1 -1
  169. package/dist/skills/definitions.d.ts.map +1 -1
  170. package/dist/skills/definitions.js +3 -2
  171. package/dist/skills/definitions.js.map +1 -1
  172. package/dist/types.d.ts +16 -0
  173. package/dist/types.d.ts.map +1 -1
  174. package/dist/utils/child-env.d.ts +1 -1
  175. package/dist/utils/child-env.d.ts.map +1 -1
  176. package/dist/utils/child-env.js +5 -0
  177. package/dist/utils/child-env.js.map +1 -1
  178. package/dist/utils/global-install.d.ts +2 -0
  179. package/dist/utils/global-install.d.ts.map +1 -1
  180. package/dist/utils/global-install.js +14 -0
  181. package/dist/utils/global-install.js.map +1 -1
  182. package/dist/worker.js +125 -17
  183. package/dist/worker.js.map +1 -1
  184. package/dist/workflows/hostExecutors/botmux-schedule.d.ts +3 -0
  185. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -1
  186. package/dist/workflows/hostExecutors/botmux-schedule.js +9 -0
  187. package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -1
  188. package/package.json +1 -1
  189. package/dist/dashboard-web/chunks/plugin-page-7FW2LPJH.js +0 -1
  190. package/dist/dashboard-web/chunks/schedules-page-KJDUKOJV.js +0 -1
@@ -7251,6 +7251,543 @@ button.sidebar-create-btn:focus-visible {
7251
7251
  transparent 100%
7252
7252
  );
7253
7253
  }
7254
+ .topbar-brand-block {
7255
+ display: grid;
7256
+ min-width: 0;
7257
+ padding: 3px 0 4px;
7258
+ }
7259
+ .dashboard-version-control {
7260
+ position: relative;
7261
+ z-index: 2;
7262
+ width: max-content;
7263
+ margin: -2px 0 0 37px;
7264
+ }
7265
+ button.dashboard-version-chip {
7266
+ position: relative;
7267
+ isolation: isolate;
7268
+ display: inline-flex;
7269
+ align-items: center;
7270
+ gap: 6px;
7271
+ min-height: 22px;
7272
+ margin: 0;
7273
+ padding: 0 7px 0 9px;
7274
+ border: 1px solid transparent;
7275
+ border-radius: var(--radius-full);
7276
+ background: color-mix(in srgb, var(--surface) 42%, transparent);
7277
+ color: var(--muted);
7278
+ box-shadow: none;
7279
+ cursor: pointer;
7280
+ font-family: inherit;
7281
+ font-size: 11px;
7282
+ font-weight: 700;
7283
+ line-height: 1;
7284
+ white-space: nowrap;
7285
+ user-select: none;
7286
+ }
7287
+ button.dashboard-version-chip::before {
7288
+ content: "";
7289
+ position: absolute;
7290
+ inset: -1px;
7291
+ z-index: 0;
7292
+ padding: 1px;
7293
+ border-radius: inherit;
7294
+ background: linear-gradient(135deg, var(--brand-accent-cyan), var(--brand-accent), var(--brand-accent-pink));
7295
+ -webkit-mask:
7296
+ linear-gradient(#000 0 0) content-box,
7297
+ linear-gradient(#000 0 0);
7298
+ -webkit-mask-composite: xor;
7299
+ mask:
7300
+ linear-gradient(#000 0 0) content-box,
7301
+ linear-gradient(#000 0 0);
7302
+ mask-composite: exclude;
7303
+ pointer-events: none;
7304
+ }
7305
+ button.dashboard-version-chip > span {
7306
+ position: relative;
7307
+ z-index: 1;
7308
+ }
7309
+ button.dashboard-version-chip:hover,
7310
+ .dashboard-version-control.is-open button.dashboard-version-chip {
7311
+ background: color-mix(in srgb, var(--accent) 7%, var(--surface));
7312
+ color: var(--fg);
7313
+ }
7314
+ .dashboard-version-state {
7315
+ display: grid;
7316
+ place-items: center;
7317
+ flex: none;
7318
+ width: 14px;
7319
+ height: 14px;
7320
+ border-radius: var(--radius-full);
7321
+ font-size: 9px;
7322
+ font-weight: 800;
7323
+ line-height: 1;
7324
+ }
7325
+ .dashboard-version-state.is-current {
7326
+ background: var(--success-soft);
7327
+ color: var(--fg);
7328
+ }
7329
+ .dashboard-version-state.has-update {
7330
+ background: var(--warning-soft);
7331
+ color: var(--fg);
7332
+ }
7333
+ .dashboard-version-state.is-unknown {
7334
+ background: var(--surface-muted);
7335
+ color: var(--fg);
7336
+ }
7337
+ .dashboard-version-state.is-error {
7338
+ background: var(--danger-soft);
7339
+ color: var(--fg);
7340
+ }
7341
+ .dashboard-version-popover {
7342
+ position: absolute;
7343
+ top: calc(100% + 8px);
7344
+ left: 0;
7345
+ display: flex;
7346
+ flex-direction: column;
7347
+ width: min(340px, calc(100vw - 32px));
7348
+ max-height: calc(100vh - var(--topbar-height) - 16px);
7349
+ overflow: hidden;
7350
+ border: 1px solid var(--border-soft);
7351
+ border-radius: var(--radius-lg);
7352
+ background: var(--surface);
7353
+ color: var(--fg);
7354
+ box-shadow: var(--modal-shadow);
7355
+ }
7356
+ .dashboard-version-popover-head {
7357
+ display: flex;
7358
+ align-items: center;
7359
+ justify-content: space-between;
7360
+ min-height: 52px;
7361
+ padding: 12px 16px;
7362
+ border-bottom: 1px solid var(--border-soft);
7363
+ }
7364
+ .dashboard-version-popover-head strong {
7365
+ font-size: 14px;
7366
+ font-weight: 760;
7367
+ }
7368
+ .dashboard-version-head-actions {
7369
+ display: inline-flex;
7370
+ align-items: center;
7371
+ gap: 4px;
7372
+ }
7373
+ button.dashboard-version-refresh,
7374
+ button.dashboard-version-close {
7375
+ display: grid;
7376
+ place-items: center;
7377
+ width: 28px;
7378
+ min-width: 28px;
7379
+ height: 28px;
7380
+ min-height: 28px;
7381
+ margin: 0;
7382
+ padding: 0;
7383
+ border: 0;
7384
+ border-radius: var(--radius-full);
7385
+ background: transparent;
7386
+ color: var(--muted);
7387
+ box-shadow: none;
7388
+ cursor: pointer;
7389
+ font-size: 20px;
7390
+ font-weight: 400;
7391
+ line-height: 1;
7392
+ }
7393
+ button.dashboard-version-refresh svg {
7394
+ width: 15px;
7395
+ height: 15px;
7396
+ fill: none;
7397
+ stroke: currentColor;
7398
+ stroke-linecap: round;
7399
+ stroke-linejoin: round;
7400
+ stroke-width: 1.6;
7401
+ }
7402
+ button.dashboard-version-refresh:hover:not(:disabled),
7403
+ button.dashboard-version-close:hover {
7404
+ background: color-mix(in srgb, var(--accent) 7%, var(--surface));
7405
+ color: var(--accent-strong);
7406
+ }
7407
+ button.dashboard-version-refresh:disabled {
7408
+ cursor: wait;
7409
+ opacity: 0.65;
7410
+ }
7411
+ button.dashboard-version-refresh.is-refreshing svg {
7412
+ animation: dashboard-update-spin 700ms linear infinite;
7413
+ }
7414
+ .dashboard-version-popover-body {
7415
+ display: grid;
7416
+ justify-items: center;
7417
+ gap: 7px;
7418
+ min-height: 0;
7419
+ padding: 22px 20px 18px;
7420
+ overflow-y: auto;
7421
+ overscroll-behavior: contain;
7422
+ text-align: center;
7423
+ }
7424
+ .dashboard-version-current {
7425
+ display: inline-flex;
7426
+ align-items: center;
7427
+ gap: 9px;
7428
+ }
7429
+ .dashboard-version-current > strong {
7430
+ font-family: "Geist Mono", var(--mono);
7431
+ font-size: 28px;
7432
+ font-weight: 760;
7433
+ letter-spacing: -0.04em;
7434
+ line-height: 1.2;
7435
+ }
7436
+ .dashboard-version-current > span {
7437
+ display: grid;
7438
+ place-items: center;
7439
+ width: 24px;
7440
+ height: 24px;
7441
+ border-radius: 50%;
7442
+ font-size: 14px;
7443
+ font-weight: 800;
7444
+ }
7445
+ .dashboard-version-current > span.is-current {
7446
+ background: var(--success-soft);
7447
+ color: var(--fg);
7448
+ }
7449
+ .dashboard-version-current > span.has-update {
7450
+ background: var(--warning-soft);
7451
+ color: var(--fg);
7452
+ }
7453
+ .dashboard-version-current > span.is-unknown {
7454
+ background: var(--surface-muted);
7455
+ color: var(--fg);
7456
+ }
7457
+ .dashboard-version-current > span.is-error {
7458
+ background: var(--danger-soft);
7459
+ color: var(--fg);
7460
+ }
7461
+ .dashboard-version-message {
7462
+ max-width: 290px;
7463
+ margin: 0;
7464
+ color: var(--muted);
7465
+ font-size: 12px;
7466
+ line-height: 1.55;
7467
+ }
7468
+ .dashboard-version-message.is-error {
7469
+ color: var(--danger);
7470
+ overflow-wrap: anywhere;
7471
+ }
7472
+ .dashboard-version-release-link {
7473
+ display: inline-flex;
7474
+ align-items: center;
7475
+ gap: 7px;
7476
+ min-height: 30px;
7477
+ margin-top: 3px;
7478
+ padding: 5px 9px;
7479
+ border-radius: var(--radius-full);
7480
+ color: var(--muted);
7481
+ font-size: 12px;
7482
+ font-weight: 650;
7483
+ line-height: 1;
7484
+ text-decoration: none;
7485
+ }
7486
+ .dashboard-version-release-link svg {
7487
+ width: 16px;
7488
+ height: 16px;
7489
+ fill: currentColor;
7490
+ }
7491
+ .dashboard-version-release-link:hover {
7492
+ background: color-mix(in srgb, var(--accent) 7%, var(--surface));
7493
+ color: var(--accent-strong);
7494
+ }
7495
+ .dashboard-version-installs {
7496
+ width: 100%;
7497
+ margin-top: 5px;
7498
+ padding: 8px 10px;
7499
+ border: 1px solid color-mix(in srgb, var(--warning) 34%, var(--border-soft));
7500
+ border-radius: var(--radius-sm);
7501
+ background: color-mix(in srgb, var(--warning) 7%, var(--surface));
7502
+ color: var(--warning);
7503
+ text-align: left;
7504
+ font-size: 11px;
7505
+ line-height: 1.45;
7506
+ }
7507
+ .dashboard-version-installs summary { cursor: pointer; }
7508
+ .dashboard-version-installs ul {
7509
+ margin: 6px 0 0;
7510
+ padding-left: 18px;
7511
+ overflow-wrap: anywhere;
7512
+ }
7513
+ .dashboard-version-rollback {
7514
+ width: 100%;
7515
+ margin-top: 8px;
7516
+ padding-top: 4px;
7517
+ border-top: 1px solid var(--border-soft);
7518
+ color: var(--muted);
7519
+ text-align: left;
7520
+ }
7521
+ .dashboard-version-rollback > summary {
7522
+ display: grid;
7523
+ grid-template-columns: 16px minmax(0, 1fr) 16px;
7524
+ align-items: center;
7525
+ gap: 8px;
7526
+ min-height: 38px;
7527
+ padding: 5px 2px;
7528
+ border-radius: var(--radius-sm);
7529
+ cursor: pointer;
7530
+ font-size: 12px;
7531
+ font-weight: 650;
7532
+ list-style: none;
7533
+ user-select: none;
7534
+ }
7535
+ .dashboard-version-rollback > summary::-webkit-details-marker { display: none; }
7536
+ .dashboard-version-rollback > summary:hover {
7537
+ color: var(--accent-strong);
7538
+ }
7539
+ .dashboard-version-rollback > summary:focus-visible {
7540
+ outline: 2px solid var(--accent);
7541
+ outline-offset: 2px;
7542
+ }
7543
+ .dashboard-version-rollback > summary svg {
7544
+ width: 15px;
7545
+ height: 15px;
7546
+ fill: none;
7547
+ stroke: currentColor;
7548
+ stroke-linecap: round;
7549
+ stroke-linejoin: round;
7550
+ stroke-width: 1.5;
7551
+ }
7552
+ .dashboard-version-rollback-chevron {
7553
+ justify-self: end;
7554
+ font-size: 15px;
7555
+ line-height: 1;
7556
+ transform: rotate(0deg);
7557
+ transition: transform 140ms ease;
7558
+ }
7559
+ .dashboard-version-rollback[open] .dashboard-version-rollback-chevron {
7560
+ transform: rotate(180deg);
7561
+ }
7562
+ .dashboard-version-rollback-body {
7563
+ display: grid;
7564
+ gap: 10px;
7565
+ padding: 3px 0 2px;
7566
+ }
7567
+ .dashboard-version-rollback-body fieldset {
7568
+ min-width: 0;
7569
+ margin: 0;
7570
+ padding: 0;
7571
+ border: 0;
7572
+ }
7573
+ .dashboard-version-rollback-body legend {
7574
+ width: 100%;
7575
+ margin: 0 0 8px;
7576
+ padding: 0;
7577
+ color: var(--muted);
7578
+ font-size: 11px;
7579
+ line-height: 1.45;
7580
+ }
7581
+ .dashboard-version-rollback-options {
7582
+ display: grid;
7583
+ gap: 7px;
7584
+ }
7585
+ .dashboard-version-rollback-options label {
7586
+ display: grid;
7587
+ grid-template-columns: 16px minmax(0, 1fr) auto;
7588
+ align-items: center;
7589
+ gap: 9px;
7590
+ min-height: 44px;
7591
+ padding: 7px 11px;
7592
+ border: 1px solid var(--border-soft);
7593
+ border-radius: var(--radius-sm);
7594
+ background: color-mix(in srgb, var(--surface-muted) 42%, transparent);
7595
+ color: var(--fg);
7596
+ cursor: pointer;
7597
+ }
7598
+ .dashboard-version-rollback-options label:hover {
7599
+ border-color: color-mix(in srgb, var(--accent) 38%, var(--border-soft));
7600
+ background: color-mix(in srgb, var(--accent) 5%, var(--surface));
7601
+ }
7602
+ .dashboard-version-rollback-options label.is-selected {
7603
+ border-color: color-mix(in srgb, var(--warning) 72%, var(--border-soft));
7604
+ background: var(--warning-soft);
7605
+ }
7606
+ .dashboard-version-rollback-options label:has(input:focus-visible) {
7607
+ outline: 2px solid var(--accent);
7608
+ outline-offset: 2px;
7609
+ }
7610
+ .dashboard-version-rollback-options input {
7611
+ width: 15px;
7612
+ height: 15px;
7613
+ margin: 0;
7614
+ accent-color: var(--warning);
7615
+ }
7616
+ .dashboard-version-rollback-options strong {
7617
+ min-width: 0;
7618
+ overflow: hidden;
7619
+ font-family: inherit;
7620
+ font-size: 12px;
7621
+ font-weight: 720;
7622
+ text-overflow: ellipsis;
7623
+ white-space: nowrap;
7624
+ }
7625
+ .dashboard-version-rollback-options time {
7626
+ flex: none;
7627
+ color: var(--muted);
7628
+ font-size: 11px;
7629
+ white-space: nowrap;
7630
+ }
7631
+ .dashboard-version-rollback-status,
7632
+ .dashboard-version-rollback-load-error,
7633
+ .dashboard-version-rollback-risk {
7634
+ margin: 0;
7635
+ font-size: 11px;
7636
+ line-height: 1.5;
7637
+ }
7638
+ .dashboard-version-rollback-status {
7639
+ display: flex;
7640
+ align-items: center;
7641
+ gap: 7px;
7642
+ min-height: 34px;
7643
+ color: var(--muted);
7644
+ }
7645
+ .dashboard-version-rollback-load-error {
7646
+ display: flex;
7647
+ align-items: center;
7648
+ justify-content: space-between;
7649
+ gap: 8px;
7650
+ padding: 8px 9px;
7651
+ border-radius: var(--radius-sm);
7652
+ background: var(--danger-soft);
7653
+ color: var(--danger);
7654
+ }
7655
+ .dashboard-version-rollback-load-error button {
7656
+ flex: none;
7657
+ min-height: 26px;
7658
+ margin: 0;
7659
+ padding: 3px 8px;
7660
+ border: 1px solid color-mix(in srgb, var(--danger) 42%, var(--border-soft));
7661
+ border-radius: var(--radius-full);
7662
+ background: transparent;
7663
+ color: inherit;
7664
+ box-shadow: none;
7665
+ cursor: pointer;
7666
+ font-size: 11px;
7667
+ font-weight: 700;
7668
+ }
7669
+ .dashboard-version-rollback-load-error button:disabled { cursor: wait; opacity: 0.65; }
7670
+ .dashboard-version-rollback-risk {
7671
+ display: flex;
7672
+ align-items: flex-start;
7673
+ gap: 7px;
7674
+ padding: 8px 9px;
7675
+ border-radius: var(--radius-sm);
7676
+ background: var(--warning-soft);
7677
+ color: var(--warning);
7678
+ }
7679
+ .dashboard-version-rollback-risk > svg {
7680
+ flex: none;
7681
+ width: 14px;
7682
+ height: 14px;
7683
+ margin-top: 1px;
7684
+ fill: none;
7685
+ stroke: currentColor;
7686
+ stroke-linecap: round;
7687
+ stroke-linejoin: round;
7688
+ stroke-width: 1.4;
7689
+ }
7690
+ .dashboard-version-rollback-risk a {
7691
+ color: inherit;
7692
+ font-weight: 700;
7693
+ text-decoration: underline;
7694
+ text-underline-offset: 2px;
7695
+ }
7696
+ .dashboard-version-rollback-risk a:hover { color: var(--accent-strong); }
7697
+ .dashboard-version-rollback-risk a:focus-visible {
7698
+ border-radius: 2px;
7699
+ outline: 2px solid var(--accent);
7700
+ outline-offset: 2px;
7701
+ }
7702
+ button.dashboard-version-rollback-action {
7703
+ display: inline-flex;
7704
+ align-items: center;
7705
+ justify-content: center;
7706
+ gap: 7px;
7707
+ width: 100%;
7708
+ min-height: 36px;
7709
+ margin: 0;
7710
+ padding: 7px 12px;
7711
+ border: 1px solid color-mix(in srgb, var(--warning) 58%, var(--border-soft));
7712
+ border-radius: var(--radius-full);
7713
+ background: var(--warning-soft);
7714
+ color: var(--warning);
7715
+ box-shadow: none;
7716
+ cursor: pointer;
7717
+ font-size: 12px;
7718
+ font-weight: 720;
7719
+ line-height: 1;
7720
+ }
7721
+ button.dashboard-version-rollback-action:hover:not(:disabled) {
7722
+ border-color: var(--warning);
7723
+ background: color-mix(in srgb, var(--warning) 12%, var(--surface));
7724
+ }
7725
+ button.dashboard-version-rollback-action:disabled {
7726
+ cursor: not-allowed;
7727
+ opacity: 0.55;
7728
+ }
7729
+ .dashboard-version-popover-actions {
7730
+ display: flex;
7731
+ justify-content: flex-end;
7732
+ gap: 8px;
7733
+ padding: 12px 16px;
7734
+ border-top: 1px solid var(--border-soft);
7735
+ }
7736
+ button.dashboard-version-secondary,
7737
+ button.dashboard-version-primary {
7738
+ display: inline-flex;
7739
+ align-items: center;
7740
+ justify-content: center;
7741
+ gap: 7px;
7742
+ min-height: 32px;
7743
+ margin: 0;
7744
+ padding: 6px 12px;
7745
+ border-radius: var(--radius-full);
7746
+ box-shadow: none;
7747
+ cursor: pointer;
7748
+ font-size: 12px;
7749
+ font-weight: 720;
7750
+ line-height: 1;
7751
+ }
7752
+ button.dashboard-version-secondary {
7753
+ border: 1px solid var(--border);
7754
+ background: transparent;
7755
+ color: var(--muted);
7756
+ }
7757
+ button.dashboard-version-primary {
7758
+ border: 1px solid color-mix(in srgb, var(--accent) 58%, var(--border-soft));
7759
+ background: color-mix(in srgb, var(--accent) 5%, var(--surface));
7760
+ color: var(--accent-strong);
7761
+ }
7762
+ button.dashboard-version-secondary:hover {
7763
+ border-color: color-mix(in srgb, var(--accent) 42%, var(--border-soft));
7764
+ background: color-mix(in srgb, var(--accent) 6%, var(--surface));
7765
+ color: var(--accent-strong);
7766
+ }
7767
+ button.dashboard-version-primary:hover:not(:disabled) {
7768
+ border-color: var(--accent);
7769
+ background: color-mix(in srgb, var(--accent) 10%, var(--surface));
7770
+ }
7771
+ button.dashboard-version-primary:disabled {
7772
+ cursor: wait;
7773
+ opacity: 0.7;
7774
+ }
7775
+ .dashboard-update-spinner {
7776
+ width: 12px;
7777
+ height: 12px;
7778
+ border: 2px solid currentColor;
7779
+ border-right-color: transparent;
7780
+ border-radius: var(--radius-full);
7781
+ animation: dashboard-update-spin 700ms linear infinite;
7782
+ }
7783
+ @keyframes dashboard-update-spin {
7784
+ to { transform: rotate(360deg); }
7785
+ }
7786
+ @media (prefers-reduced-motion: reduce) {
7787
+ .dashboard-update-spinner,
7788
+ button.dashboard-version-refresh.is-refreshing svg { animation: none; }
7789
+ .dashboard-version-rollback-chevron { transition: none; }
7790
+ }
7254
7791
  .topbar-left {
7255
7792
  grid-column: 1;
7256
7793
  display: inline-flex;
@@ -11348,6 +11885,11 @@ dialog :where(input:not([type=checkbox], [type=radio]), select, textarea) {
11348
11885
  column-gap: 8px;
11349
11886
  padding: 0 12px;
11350
11887
  }
11888
+ .dashboard-version-control { margin-left: 33px; }
11889
+ .dashboard-version-popover {
11890
+ left: -33px;
11891
+ width: min(340px, calc(100vw - 24px));
11892
+ }
11351
11893
  .topbar-left {
11352
11894
  gap: 10px;
11353
11895
  }
@@ -11991,6 +12533,18 @@ tbody tr[data-chat]:hover {
11991
12533
  white-space: nowrap;
11992
12534
  }
11993
12535
 
12536
+ .schedule-chip-strip span.schedule-error-chip {
12537
+ border-color: color-mix(in srgb, var(--danger) 35%, var(--border-soft));
12538
+ background: color-mix(in srgb, var(--danger) 10%, var(--surface));
12539
+ color: var(--danger);
12540
+ max-width: 320px;
12541
+ overflow: hidden;
12542
+ text-overflow: ellipsis;
12543
+ cursor: help;
12544
+ justify-content: flex-start;
12545
+ text-align: left;
12546
+ }
12547
+
11994
12548
  .schedule-row-head .schedule-state {
11995
12549
  align-self: center;
11996
12550
  min-width: 42px;
@@ -22839,3 +23393,146 @@ button.ui-refresh-button.is-loading .ui-action-icon {
22839
23393
  min-height: 320px;
22840
23394
  }
22841
23395
  }
23396
+
23397
+ /* ── Schedule create/edit form modal ─────────────────────────────────────── */
23398
+ .schedule-form-overlay {
23399
+ position: fixed;
23400
+ inset: 0;
23401
+ background: color-mix(in srgb, var(--bg) 72%, transparent);
23402
+ backdrop-filter: blur(3px);
23403
+ display: flex;
23404
+ align-items: center;
23405
+ justify-content: center;
23406
+ z-index: 1000;
23407
+ padding: 24px;
23408
+ }
23409
+
23410
+ .schedule-form-dialog {
23411
+ background: var(--surface);
23412
+ border: 1px solid var(--border-soft);
23413
+ border-radius: 12px;
23414
+ box-shadow: 0 16px 48px color-mix(in srgb, #000 28%, transparent);
23415
+ width: min(560px, 100%);
23416
+ max-height: 90dvh;
23417
+ overflow-y: auto;
23418
+ padding: 24px;
23419
+ }
23420
+
23421
+ .schedule-form-dialog h2 {
23422
+ margin: 0 0 16px;
23423
+ font-size: 18px;
23424
+ }
23425
+
23426
+ .schedule-form {
23427
+ display: flex;
23428
+ flex-direction: column;
23429
+ gap: 14px;
23430
+ }
23431
+
23432
+ .schedule-form-field {
23433
+ display: flex;
23434
+ flex-direction: column;
23435
+ gap: 4px;
23436
+ }
23437
+
23438
+ .schedule-form-label {
23439
+ font-size: 13px;
23440
+ font-weight: 600;
23441
+ color: var(--text);
23442
+ }
23443
+
23444
+ .schedule-form-field input[type="text"],
23445
+ .schedule-form-field textarea {
23446
+ width: 100%;
23447
+ padding: 8px 10px;
23448
+ border: 1px solid var(--border-soft);
23449
+ border-radius: 6px;
23450
+ background: var(--surface);
23451
+ color: var(--text);
23452
+ font-size: 13px;
23453
+ font-family: inherit;
23454
+ }
23455
+
23456
+ .schedule-form-field textarea {
23457
+ resize: vertical;
23458
+ min-height: 80px;
23459
+ }
23460
+
23461
+ .schedule-form-help {
23462
+ font-size: 11px;
23463
+ color: var(--text-dim);
23464
+ }
23465
+
23466
+ .schedule-form-radio-group {
23467
+ display: flex;
23468
+ gap: 16px;
23469
+ flex-wrap: wrap;
23470
+ }
23471
+
23472
+ .schedule-form-radio-group label {
23473
+ display: inline-flex;
23474
+ align-items: center;
23475
+ gap: 6px;
23476
+ font-size: 13px;
23477
+ cursor: pointer;
23478
+ }
23479
+
23480
+ .schedule-form-toggle {
23481
+ flex-direction: row !important;
23482
+ align-items: flex-start;
23483
+ gap: 8px;
23484
+ }
23485
+
23486
+ .schedule-form-toggle > span {
23487
+ display: flex;
23488
+ flex-direction: column;
23489
+ gap: 2px;
23490
+ }
23491
+
23492
+ .schedule-form-error {
23493
+ color: var(--danger, #e5484d);
23494
+ font-size: 12px;
23495
+ margin: 0;
23496
+ }
23497
+
23498
+ .schedule-form-actions {
23499
+ display: flex;
23500
+ justify-content: flex-end;
23501
+ gap: 10px;
23502
+ margin-top: 8px;
23503
+ }
23504
+
23505
+ .schedule-form-cancel,
23506
+ .schedule-form-submit {
23507
+ padding: 8px 16px;
23508
+ border-radius: 6px;
23509
+ font-size: 13px;
23510
+ cursor: pointer;
23511
+ border: 1px solid var(--border-soft);
23512
+ }
23513
+
23514
+ .schedule-form-cancel {
23515
+ background: transparent;
23516
+ color: var(--text);
23517
+ }
23518
+
23519
+ .schedule-form-submit {
23520
+ background: var(--accent);
23521
+ color: #fff;
23522
+ border-color: var(--accent);
23523
+ }
23524
+
23525
+ .schedule-form-submit:disabled {
23526
+ opacity: 0.5;
23527
+ cursor: not-allowed;
23528
+ }
23529
+
23530
+ .schedule-edit-button,
23531
+ .schedule-delete-button {
23532
+ min-width: 56px !important;
23533
+ }
23534
+
23535
+ .schedule-delete-button {
23536
+ color: var(--danger, #e5484d) !important;
23537
+ border-color: color-mix(in srgb, var(--danger, #e5484d) 48%, var(--border-soft)) !important;
23538
+ }