codebee 0.1.101 → 0.1.103

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 (134) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/LICENSE +21 -21
  3. package/README.md +3 -6
  4. package/app/.playwright-cli/console-2026-09-23T08-26-03-635Z.log +88 -0
  5. package/app/.playwright-cli/page-2026-09-23T08-26-03-845Z.yml +126 -0
  6. package/app/.playwright-cli/page-2026-09-23T08-29-44-203Z.png +0 -0
  7. package/app/.playwright-cli/page-2026-09-23T08-35-42-046Z.yml +210 -0
  8. package/app/.playwright-cli/page-2026-09-23T08-36-52-858Z.png +0 -0
  9. package/app/.playwright-cli/page-2026-09-23T08-37-33-938Z.png +0 -0
  10. package/app/.playwright-cli/run-detail-after.png +0 -0
  11. package/app/core/acceptance.py +100 -100
  12. package/app/core/acp_client.py +457 -426
  13. package/app/core/aiflavor.py +197 -197
  14. package/app/core/analytics.py +38 -38
  15. package/app/core/artifacts.py +148 -148
  16. package/app/core/assets.py +110 -110
  17. package/app/core/attachments.py +623 -623
  18. package/app/core/audit.py +30 -30
  19. package/app/core/backend_profiles.py +188 -188
  20. package/app/core/backup.py +470 -470
  21. package/app/core/beekeeper.py +183 -183
  22. package/app/core/benchstore.py +102 -102
  23. package/app/core/board.py +21 -17
  24. package/app/core/bookmeta.py +1036 -1036
  25. package/app/core/bookmeta_catalog.py +180 -180
  26. package/app/core/branching.py +137 -137
  27. package/app/core/builtin_agent.py +13 -4
  28. package/app/core/capability.py +144 -144
  29. package/app/core/catalog.py +28 -6
  30. package/app/core/chaptersafe.py +32 -32
  31. package/app/core/checkpoints.py +117 -31
  32. package/app/core/cleanup.py +303 -303
  33. package/app/core/command_auth.py +302 -302
  34. package/app/core/compaction.py +201 -201
  35. package/app/core/contracts.py +255 -255
  36. package/app/core/covergen.py +356 -356
  37. package/app/core/defectretro.py +43 -43
  38. package/app/core/diagnostics.py +114 -114
  39. package/app/core/dispatch.py +1 -1
  40. package/app/core/dispatch_log.py +128 -128
  41. package/app/core/env_scrub.py +85 -85
  42. package/app/core/errorlog.py +137 -137
  43. package/app/core/eval_matrix.py +91 -82
  44. package/app/core/evaluation.py +174 -174
  45. package/app/core/failure_notify.py +290 -290
  46. package/app/core/flow_graph.py +33 -33
  47. package/app/core/goal_service.py +167 -167
  48. package/app/core/health.py +389 -389
  49. package/app/core/history.py +38 -38
  50. package/app/core/hooks.py +162 -162
  51. package/app/core/knowledge_pipeline.py +86 -86
  52. package/app/core/manager.py +2385 -2385
  53. package/app/core/mcp_client.py +7 -2
  54. package/app/core/mocks.py +64 -64
  55. package/app/core/notify.py +201 -201
  56. package/app/core/novel_quality.py +181 -181
  57. package/app/core/openapi.py +217 -209
  58. package/app/core/operations.py +228 -228
  59. package/app/core/paihang.py +145 -145
  60. package/app/core/pipeline.py +6 -3
  61. package/app/core/policy.py +9 -0
  62. package/app/core/portguard.py +111 -111
  63. package/app/core/presence.py +77 -77
  64. package/app/core/preview.py +293 -293
  65. package/app/core/project_memory.py +206 -206
  66. package/app/core/prompt_guard.py +78 -78
  67. package/app/core/publish/__init__.py +7 -7
  68. package/app/core/publish/auto.py +659 -562
  69. package/app/core/publish/chaprows.py +138 -138
  70. package/app/core/publish/fanqie.py +16 -10
  71. package/app/core/publish/flow.py +29 -1
  72. package/app/core/publish/flows-fanqie-calibrated.json +442 -442
  73. package/app/core/publish/manager.py +1185 -1177
  74. package/app/core/publish/qimao.py +193 -193
  75. package/app/core/publish/volumes.py +108 -108
  76. package/app/core/publish/ws.py +139 -139
  77. package/app/core/quality_gate.py +201 -201
  78. package/app/core/redact.py +38 -38
  79. package/app/core/repeat_guard.py +129 -129
  80. package/app/core/retrieval.py +137 -137
  81. package/app/core/sandbox_runtime.py +95 -0
  82. package/app/core/selfupdate.py +384 -384
  83. package/app/core/session_log.py +161 -161
  84. package/app/core/sessions.py +312 -312
  85. package/app/core/settings.py +215 -215
  86. package/app/core/settings_schema.py +282 -282
  87. package/app/core/share_page.py +114 -114
  88. package/app/core/skill_scan.py +139 -139
  89. package/app/core/skillpacks/market/character-bible.md +66 -66
  90. package/app/core/skillpacks/market/code-risk-checklist.md +58 -58
  91. package/app/core/skillpacks/market/git-workflow.md +57 -57
  92. package/app/core/skillpacks/market/release-notes.md +72 -72
  93. package/app/core/skillpacks/market/weekly-report.md +71 -71
  94. package/app/core/skillpacks/market/worldview-consistency.md +70 -70
  95. package/app/core/step_runner.py +132 -132
  96. package/app/core/store.py +13 -3
  97. package/app/core/story_tracking.py +275 -275
  98. package/app/core/task_compile.py +199 -199
  99. package/app/core/telemetry.py +292 -292
  100. package/app/core/tlsctx.py +64 -64
  101. package/app/core/token_meter.py +147 -147
  102. package/app/core/tool_outputs.py +107 -107
  103. package/app/core/tracing.py +207 -207
  104. package/app/core/upstream.py +41 -41
  105. package/app/core/usage.py +1038 -1038
  106. package/app/core/volumes.py +389 -389
  107. package/app/core/webhooks.py +89 -89
  108. package/app/core/wxdigest.py +865 -865
  109. package/app/core/zentao.py +2692 -2692
  110. package/app/main.py +1 -0
  111. package/app/mcp_server.py +244 -244
  112. package/app/output/_createbook_body.json +1 -0
  113. package/app/output/_probe_fq_click.py +50 -0
  114. package/app/output/_probe_fq_form.py +42 -0
  115. package/app/output/_probe_fq_modal.py +55 -0
  116. package/app/output/_probe_fq_points.py +71 -0
  117. package/app/output/_probe_fq_submit.py +34 -0
  118. package/app/output/_probe_fq_watch.py +62 -0
  119. package/app/output/workbench-clean-preview.jpg +0 -0
  120. package/app/output/workbench-reference-render.png +0 -0
  121. package/app/output/workbench-shell.png +0 -0
  122. package/app/pick_dialog.py +110 -110
  123. package/app/ui/app.js +165 -29
  124. package/app/ui/artdiff.js +74 -74
  125. package/app/ui/hive3d.js +491 -223
  126. package/app/ui/i18n.js +18 -1
  127. package/app/ui/icons/bee.svg +79 -79
  128. package/app/ui/index.html +24 -4
  129. package/app/ui/manifest.json +16 -16
  130. package/app/ui/qrcode.js +2297 -2297
  131. package/app/ui/style.css +548 -18
  132. package/bin/tutti.js +147 -147
  133. package/package.json +1 -1
  134. package/tools/wx_reader.py +261 -261
package/app/ui/style.css CHANGED
@@ -3888,6 +3888,10 @@ body.inspector-open #run-detail #rd-log.rd-logdrawer {
3888
3888
  .rd-checkpoints-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
3889
3889
  .rd-checkpoints-head strong { margin-right: auto; }
3890
3890
  .rd-checkpoint-row, .rd-memory-row { padding: 9px 0; border-top: 1px solid var(--border); }
3891
+ .rd-checkpoint-steps { margin: 8px 0 12px; padding: 10px; border: 1px solid var(--border); border-radius: 10px; }
3892
+ .rd-checkpoint-step { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 5px 0; border-top: 1px dashed var(--border); font-size: 12px; }
3893
+ .rd-checkpoint-step > :first-child { overflow-wrap: anywhere; }
3894
+ .rd-acp-plan-entry { padding-left: 14px; color: var(--muted); }
3891
3895
  .rd-checkpoint-row > strong { margin-right: 8px; overflow-wrap: anywhere; }
3892
3896
  .rd-checkpoint-row pre, .rd-memory-row pre {
3893
3897
  max-height: 240px; overflow: auto; white-space: pre-wrap; overflow-wrap: anywhere;
@@ -7194,8 +7198,15 @@ main.browser-page-active #page-settings > #sub-browser .browser-shell {
7194
7198
  .hive-scene-page-label { white-space: nowrap; font-family: var(--mono); }
7195
7199
  .hive-viewport {
7196
7200
  position: relative; width: 100%; aspect-ratio: 2848 / 1600; overflow: hidden;
7197
- container-type: inline-size; border: 1px solid var(--border); border-radius: 12px;
7198
- background: #d4e7f7; cursor: grab; touch-action: pan-y;
7201
+ container-type: inline-size; isolation: isolate;
7202
+ border: 1px solid color-mix(in srgb, #6aa9d2 30%, var(--border)); border-radius: 16px;
7203
+ background: radial-gradient(ellipse at 50% 22%, #eef8ff 0%, #dcecf8 58%, #c9dfef 100%);
7204
+ box-shadow: inset 0 1px 0 rgba(255,255,255,.82), 0 18px 46px rgba(17,55,83,.12);
7205
+ cursor: grab; touch-action: pan-y;
7206
+ }
7207
+ .hive-viewport::after {
7208
+ position: absolute; inset: 0; z-index: 3; border-radius: inherit; pointer-events: none;
7209
+ content: ""; box-shadow: inset 0 0 0 1px rgba(255,255,255,.28), inset 0 -34px 56px rgba(18,61,91,.055);
7199
7210
  }
7200
7211
  .hive-viewport.is-dragging { cursor: grabbing; }
7201
7212
  .hive-reference-layer { position: absolute; inset: 0; transform-origin: center; }
@@ -7204,33 +7215,53 @@ main.browser-page-active #page-settings > #sub-browser .browser-shell {
7204
7215
  .hive-gl { display: none; }
7205
7216
  .hive-gl-overlay { position: absolute; inset: 0; pointer-events: none; }
7206
7217
  #rd-hive-viewport.hive-mode-3d #rd-hive-cells { display: none; }
7218
+ #rd-hive-viewport.hive-mode-live3d #rd-hive-cells { display: none !important; }
7207
7219
  #rd-hive-viewport.hive-mode-2d { height: auto; aspect-ratio: auto; overflow: visible; border: 0; border-radius: 0; background: transparent; cursor: auto; }
7208
7220
  #rd-hive-viewport.hive-mode-2d .hive-reference-layer { display: none; }
7209
7221
  .hg-badge {
7210
7222
  position: absolute; transform: translate(-50%, -50%); width: 10.8%; height: 7.6%;
7211
- display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .4cqw;
7212
- padding: .3cqw; border: 0; border-radius: 1.4cqw; pointer-events: auto; cursor: pointer;
7213
- color: #101c29; background: rgba(255,255,255,.98); box-shadow: 0 .35cqw .9cqw rgba(14,55,88,.22);
7223
+ display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .36cqw;
7224
+ padding: .3cqw; border: 1px solid rgba(142,224,247,.42); border-radius: .78cqw; pointer-events: auto; cursor: pointer;
7225
+ color: #effbff; background: linear-gradient(142deg, rgba(14,43,63,.98), rgba(8,61,83,.97));
7226
+ box-shadow: inset 0 1px 0 rgba(224,250,255,.18), 0 .42cqw 1.1cqw rgba(2,20,37,.30);
7214
7227
  text-align: center; font-family: "Microsoft YaHei", sans-serif;
7215
7228
  }
7216
- .hg-badge .hg-name { font-size: 1.25cqw; font-weight: 800; line-height: 1.15; white-space: nowrap; }
7217
- .hg-badge .hg-meta { font-size: .58cqw; color: #536d7d; line-height: 1; white-space: nowrap; }
7229
+ .hg-badge::before {
7230
+ position: absolute; top: 15%; left: 8%; width: .3cqw; height: .3cqw; min-width: 3px; min-height: 3px;
7231
+ border-radius: 50%; content: ""; background: #6c8a9c; box-shadow: 0 0 .35cqw rgba(91,223,245,.25);
7232
+ }
7233
+ .hg-badge .hg-name { font-size: 1.12cqw; font-weight: 750; letter-spacing: .01em; line-height: 1.15; white-space: nowrap; }
7234
+ .hg-badge .hg-meta { font-size: .62cqw; color: #a9cfdd; line-height: 1; white-space: nowrap; }
7218
7235
  .hg-badge:disabled { cursor: default; opacity: 1; }
7219
- .hg-badge:hover:not(:disabled), .hg-badge:focus-visible { outline: .12cqw solid #71eaf9; outline-offset: .2cqw; }
7220
- .hg-badge.hg-active { box-shadow: 0 0 1.1cqw rgba(0, 236, 255, .65); }
7236
+ .hg-badge:hover:not(:disabled), .hg-badge:focus-visible { outline: .12cqw solid #71eaf9; outline-offset: .16cqw; }
7237
+ .hg-badge.hg-active {
7238
+ border-color: rgba(90,245,225,.85);
7239
+ box-shadow: inset 0 1px 0 rgba(224,250,255,.18), 0 .42cqw 1.1cqw rgba(2,20,37,.30), 0 0 1.15cqw rgba(0,236,255,.38);
7240
+ }
7241
+ .hg-badge.hg-active::before { background: #5df4c7; box-shadow: 0 0 .42cqw rgba(93,244,199,.9); }
7221
7242
  .hg-monitor {
7222
7243
  position: absolute; display: grid; grid-template-columns: 1fr auto; grid-template-rows: auto auto 1fr;
7223
- padding: .12cqw .3cqw; gap: .08cqw .18cqw; overflow: hidden; border: 0; border-radius: 0;
7224
- pointer-events: auto; cursor: pointer; text-align: left; color: #d8f9ff; background: #06244a;
7225
- font-family: var(--mono); font-size: .57cqw; line-height: 1.15;
7244
+ padding: .12cqw .3cqw; gap: .08cqw .18cqw; overflow: hidden;
7245
+ border: 1px solid rgba(115,202,229,.46); border-radius: .26cqw;
7246
+ pointer-events: auto; cursor: pointer; text-align: left; color: #d8f9ff;
7247
+ background: linear-gradient(160deg, #0b3048 0%, #061a2b 72%, #082236 100%);
7248
+ box-shadow: inset 0 1px 0 rgba(204,248,255,.13), 0 1px 3px rgba(0,12,24,.26);
7249
+ font-family: var(--mono); font-size: .68cqw; line-height: 1.15;
7250
+ }
7251
+ .hg-monitor::before {
7252
+ position: absolute; top: .18cqw; right: .22cqw; width: .24cqw; height: .24cqw; min-width: 2px; min-height: 2px;
7253
+ border-radius: 50%; content: ""; background: #58e3bd; box-shadow: 0 0 .28cqw rgba(88,227,189,.5);
7226
7254
  }
7227
7255
  .hg-monitor:disabled { opacity: 1; cursor: default; }
7228
- .hg-monitor:hover:not(:disabled), .hg-monitor:focus-visible { outline: .12cqw solid #91f6ff; outline-offset: .1cqw; z-index: 1; }
7229
- .hg-monitor-role { grid-column: 1 / -1; font-size: .69cqw; line-height: 1.16; font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
7230
- .hg-monitor-status { color: #94deee; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
7231
- .hg-monitor-time { grid-column: 2; grid-row: 2; color: #9dd8e4; white-space: nowrap; }
7232
- .hg-monitor-tail { grid-column: 1 / -1; color: #b3e7f2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
7233
- .hg-monitor.st-running { box-shadow: inset 0 -.1cqw #52edf5; }
7256
+ .hg-monitor:hover:not(:disabled), .hg-monitor:focus-visible { outline: .12cqw solid #91f6ff; outline-offset: .08cqw; z-index: 1; }
7257
+ .hg-monitor-role { grid-column: 1 / -1; font-size: .82cqw; line-height: 1.16; font-weight: 700; letter-spacing: .005em; color: #edfaff; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
7258
+ .hg-monitor-status { font-size: .64cqw; color: #94deee; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
7259
+ .hg-monitor-time { grid-column: 2; grid-row: 2; font-size: .60cqw; color: #9dd8e4; white-space: nowrap; }
7260
+ .hg-monitor-tail { grid-column: 1 / -1; font-size: .62cqw; color: #b3e7f2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
7261
+ .hg-monitor.st-running { border-color: rgba(78,239,244,.82); box-shadow: inset 0 -.1cqw #52edf5, inset 0 1px 0 rgba(204,248,255,.13), 0 1px 3px rgba(0,12,24,.26); }
7262
+ .hg-monitor.st-queued::before { background: #7e99aa; box-shadow: none; }
7263
+ .hg-monitor.st-done::before { background: #78f2ae; box-shadow: 0 0 .28cqw rgba(120,242,174,.45); }
7264
+ .hg-monitor.st-failed::before, .hg-monitor.st-timeout::before { background: #ff777b; box-shadow: 0 0 .28cqw rgba(255,119,123,.5); }
7234
7265
  .hg-monitor.st-running .hg-monitor-status { color: #5cf5fc; }
7235
7266
  .hg-monitor.st-done .hg-monitor-status { color: #99f3bf; }
7236
7267
  .hg-monitor.st-failed .hg-monitor-status, .hg-monitor.st-timeout .hg-monitor-status { color: #ffa2a2; }
@@ -7276,3 +7307,502 @@ main.browser-page-active #page-settings > #sub-browser .browser-shell {
7276
7307
  .pb-chip input { margin: 0; }
7277
7308
  .pb-pend-btns { display: flex; gap: 8px; margin-top: 6px; }
7278
7309
  .pb-vol { font-size: 11px; color: var(--accent, #4a7dbe); margin-top: 5px; font-weight: 600; }
7310
+ .pb-vol-sel { display: inline-flex; align-items: center; gap: 4px; cursor: pointer;
7311
+ color: inherit; user-select: none; }
7312
+ .pb-vol-sel:hover, .pb-vol-sel.on { color: var(--text); }
7313
+ .pb-vol-sel input { margin: 0; accent-color: var(--accent, #4a7dbe); }
7314
+
7315
+
7316
+ /* Procedural WebGL hive renderer: canvas is the live 3D layer, DOM controls stay accessible above it. */
7317
+ #rd-hive-viewport .hive-gl-live {
7318
+ display: block;
7319
+ position: absolute;
7320
+ inset: 0;
7321
+ width: 100%;
7322
+ height: 100%;
7323
+ z-index: 0;
7324
+ touch-action: none;
7325
+ }
7326
+ #rd-hive-viewport .hive-reference-layer { z-index: 1; pointer-events: none; }
7327
+ #rd-hive-viewport .hive-gl-overlay { pointer-events: none; }
7328
+ #rd-hive-viewport .hive-gl-overlay button { pointer-events: auto; }
7329
+ #rd-hive-viewport.hive-mode-2d .hive-gl-live { display: none; }
7330
+ #rd-hive-viewport.hive-mode-3d .hive-reference { display: none; }
7331
+ #rd-hive-viewport.hive-mode-3d .hive-reference-layer { pointer-events: none; }
7332
+ /* Stage-card top is projected from the 3D wall by hive3d.js; do not pin it to a screen-space row. */
7333
+ #rd-hive-viewport.hive-mode-3d .hg-monitor { top: auto; }
7334
+ @media (prefers-reduced-motion: reduce) {
7335
+ #rd-hive-viewport .hive-gl-live { scroll-behavior: auto; }
7336
+ }
7337
+
7338
+ #rd-hive-viewport .hive-gl-live[hidden] { display: none !important; }
7339
+
7340
+
7341
+ /* Visual calibration pass: reduce floating task labels so the room and desks read first. */
7342
+ #rd-hive-viewport.hive-mode-3d {
7343
+ background: linear-gradient(180deg, #e9f4fc 0%, #d7e9f7 54%, #c9dceb 100%);
7344
+ }
7345
+ #rd-hive-viewport .hive-reference-layer {
7346
+ z-index: 2;
7347
+ overflow: hidden;
7348
+ }
7349
+ #rd-hive-viewport .hg-badge {
7350
+ width: 10.6%;
7351
+ height: 6.6%;
7352
+ padding: .24cqw;
7353
+ border-radius: 1.15cqw;
7354
+ box-shadow: 0 .22cqw .55cqw rgba(14,55,88,.17);
7355
+ }
7356
+ #rd-hive-viewport .hg-badge .hg-name {
7357
+ font-size: clamp(10px, 1.05cqw, 17px);
7358
+ }
7359
+ #rd-hive-viewport .hg-badge .hg-meta {
7360
+ font-size: clamp(7px, .48cqw, 10px);
7361
+ }
7362
+ #rd-hive-viewport .hg-monitor {
7363
+ background: rgba(4, 28, 55, .88);
7364
+ border: 1px solid rgba(121, 225, 246, .28);
7365
+ border-radius: 3px;
7366
+ padding: 2px 4px;
7367
+ font-size: clamp(6px, .45cqw, 9px);
7368
+ line-height: 1.2;
7369
+ box-shadow: 0 2px 6px rgba(4, 24, 45, .12);
7370
+ backdrop-filter: blur(2px);
7371
+ }
7372
+ #rd-hive-viewport .hg-monitor-role {
7373
+ font-size: clamp(6px, .52cqw, 10px);
7374
+ }
7375
+ #rd-hive-viewport .hg-monitor-tail {
7376
+ opacity: .8;
7377
+ }
7378
+ #rd-hive-viewport .hg-monitor.st-idle {
7379
+ background: rgba(7, 38, 66, .58);
7380
+ border-color: rgba(255,255,255,.16);
7381
+ opacity: .84;
7382
+ }
7383
+ #rd-hive-viewport .hg-monitor:disabled {
7384
+ opacity: .42;
7385
+ }
7386
+ @media (max-width: 760px) {
7387
+ #rd-hive-viewport .hg-monitor { display: none; }
7388
+ #rd-hive-viewport .hg-badge { width: 14%; }
7389
+ }
7390
+
7391
+
7392
+ /* True projected-screen labels: type must fit inside compact physical monitor bounds. */
7393
+ #rd-hive-viewport .hg-monitor {
7394
+ box-sizing: border-box;
7395
+ min-width: 0;
7396
+ min-height: 0;
7397
+ padding: 1px 2px;
7398
+ gap: 0;
7399
+ grid-template-rows: auto auto minmax(0, 1fr);
7400
+ border: 1px solid rgba(121, 225, 246, .20);
7401
+ border-radius: 2px;
7402
+ background: rgba(2, 19, 39, .93);
7403
+ box-shadow: none;
7404
+ backdrop-filter: none;
7405
+ line-height: 1.05;
7406
+ }
7407
+ #rd-hive-viewport .hg-monitor-role {
7408
+ min-width: 0;
7409
+ font-size: clamp(5px, .43cqw, 9px);
7410
+ line-height: 1.05;
7411
+ }
7412
+ #rd-hive-viewport .hg-monitor-status,
7413
+ #rd-hive-viewport .hg-monitor-time {
7414
+ font-size: clamp(4px, .35cqw, 7px);
7415
+ line-height: 1.05;
7416
+ }
7417
+ #rd-hive-viewport .hg-monitor-tail {
7418
+ min-width: 0;
7419
+ font-size: clamp(4px, .34cqw, 6px);
7420
+ line-height: 1.05;
7421
+ }
7422
+ #rd-hive-viewport .hg-monitor.st-idle {
7423
+ background: rgba(2, 19, 39, .88);
7424
+ }
7425
+
7426
+
7427
+ /* Workflow arrows are DOM overlays anchored to projected wall-panel edges. */
7428
+ #rd-hive-viewport .hg-flow-link {
7429
+ position: absolute;
7430
+ z-index: 1;
7431
+ display: block;
7432
+ height: 2px;
7433
+ border-radius: 2px;
7434
+ pointer-events: none;
7435
+ transform-origin: left center;
7436
+ background: linear-gradient(90deg, rgba(99, 237, 255, .62), rgba(99, 237, 255, .95));
7437
+ box-shadow: 0 0 5px rgba(72, 226, 255, .5);
7438
+ }
7439
+ #rd-hive-viewport .hg-flow-link::after {
7440
+ content: "";
7441
+ position: absolute;
7442
+ right: 0;
7443
+ top: -3px;
7444
+ width: 7px;
7445
+ height: 7px;
7446
+ border-top: 2px solid #72efff;
7447
+ border-right: 2px solid #72efff;
7448
+ transform: rotate(45deg);
7449
+ filter: drop-shadow(0 0 2px rgba(83, 233, 255, .65));
7450
+ }
7451
+
7452
+
7453
+ /* Premium Hive3D finish: give the glass studio a deep, cinematic frame and legible hardware UI. */
7454
+ #rd-hive-viewport.hive-mode-3d {
7455
+ background:
7456
+ radial-gradient(ellipse at 50% 34%, rgba(24, 83, 112, .36) 0%, rgba(9, 25, 44, .18) 46%, transparent 74%),
7457
+ linear-gradient(180deg, #071725 0%, #091a2b 54%, #06111e 100%);
7458
+ border: 1px solid rgba(98, 200, 226, .22);
7459
+ box-shadow: inset 0 1px 0 rgba(214, 246, 255, .06), 0 24px 72px rgba(0, 0, 0, .24);
7460
+ }
7461
+ #rd-hive-viewport .hg-badge {
7462
+ box-sizing: border-box;
7463
+ background: linear-gradient(145deg, rgba(12, 36, 54, .98), rgba(5, 20, 34, .98)) !important;
7464
+ color: #e8f8ff !important;
7465
+ border: 1px solid rgba(107, 225, 239, .45) !important;
7466
+ border-radius: 7px;
7467
+ box-shadow: inset 0 1px 0 rgba(227, 251, 255, .10), 0 5px 14px rgba(0, 8, 20, .32) !important;
7468
+ text-shadow: 0 1px 8px rgba(66, 190, 225, .12);
7469
+ }
7470
+ #rd-hive-viewport .hg-badge .hg-name {
7471
+ color: #f0fbff !important;
7472
+ letter-spacing: .025em;
7473
+ font-weight: 750;
7474
+ }
7475
+ #rd-hive-viewport .hg-badge .hg-meta { color: #8dbdce !important; }
7476
+ #rd-hive-viewport .hg-badge.hg-active {
7477
+ border-color: rgba(87, 247, 213, .92) !important;
7478
+ box-shadow: inset 0 0 0 1px rgba(87, 247, 213, .10), 0 0 18px rgba(0, 225, 220, .18), 0 5px 14px rgba(0, 8, 20, .32) !important;
7479
+ }
7480
+ #rd-hive-viewport .hg-room-sign {
7481
+ position: absolute;
7482
+ z-index: 2;
7483
+ display: flex;
7484
+ align-items: center;
7485
+ justify-content: space-evenly;
7486
+ gap: clamp(4px, .42cqw, 8px);
7487
+ padding: 0 clamp(4px, .45cqw, 9px);
7488
+ box-sizing: border-box;
7489
+ overflow: hidden;
7490
+ pointer-events: none;
7491
+ white-space: nowrap;
7492
+ color: #e8fbff;
7493
+ font-family: Inter, ui-sans-serif, system-ui, sans-serif;
7494
+ text-shadow: 0 0 9px rgba(37, 187, 220, .18);
7495
+ }
7496
+ #rd-hive-viewport .hg-room-kicker {
7497
+ color: #79b7c9;
7498
+ font-size: clamp(5px, .48cqw, 9px);
7499
+ font-weight: 800;
7500
+ letter-spacing: .12em;
7501
+ }
7502
+ #rd-hive-viewport .hg-room-title {
7503
+ color: #f0fcff;
7504
+ font-size: clamp(7px, .72cqw, 13px);
7505
+ font-weight: 850;
7506
+ letter-spacing: .045em;
7507
+ }
7508
+ #rd-hive-viewport .hg-room-live {
7509
+ color: #72e8ca;
7510
+ font-size: clamp(5px, .44cqw, 8px);
7511
+ font-weight: 750;
7512
+ letter-spacing: .025em;
7513
+ }
7514
+ #rd-hive-viewport .hg-monitor {
7515
+ border-radius: 3px;
7516
+ border-color: rgba(77, 202, 229, .42);
7517
+ background: linear-gradient(145deg, rgba(5, 27, 43, .97), rgba(2, 13, 25, .98));
7518
+ box-shadow: inset 0 1px 0 rgba(209, 247, 255, .06), 0 2px 7px rgba(0, 8, 18, .18);
7519
+ }
7520
+ #rd-hive-viewport .hg-monitor-role { color: #edfbff; }
7521
+ #rd-hive-viewport .hg-monitor-status,
7522
+ #rd-hive-viewport .hg-monitor-time { color: #87d7e7; }
7523
+ #rd-hive-viewport .hg-monitor-tail { color: #b0dae5; opacity: .92; }
7524
+ #rd-hive-viewport .hg-monitor.st-running {
7525
+ border-color: rgba(76, 243, 220, .95);
7526
+ box-shadow: inset 0 0 0 1px rgba(76, 243, 220, .12), 0 0 8px rgba(31, 210, 211, .15);
7527
+ }
7528
+
7529
+
7530
+ /* Second calibration: the wall identity should read at a glance without overpowering the stages. */
7531
+ #rd-hive-viewport .hg-room-kicker { font-size: clamp(6px, .55cqw, 10px); }
7532
+ #rd-hive-viewport .hg-room-title { font-size: clamp(8px, .88cqw, 15px); letter-spacing: .055em; }
7533
+ #rd-hive-viewport .hg-room-live { font-size: clamp(6px, .50cqw, 9px); }
7534
+
7535
+
7536
+ /* Readability pass: task labels remain useful at a glance at the shipped scene size. */
7537
+ #rd-hive-viewport .hg-monitor-role {
7538
+ font-size: clamp(6px, .56cqw, 10px);
7539
+ line-height: 1.08;
7540
+ }
7541
+ #rd-hive-viewport .hg-monitor-status,
7542
+ #rd-hive-viewport .hg-monitor-time {
7543
+ font-size: clamp(5px, .40cqw, 7px);
7544
+ line-height: 1.05;
7545
+ }
7546
+ #rd-hive-viewport .hg-monitor-tail {
7547
+ font-size: clamp(5px, .38cqw, 7px);
7548
+ line-height: 1.05;
7549
+ }
7550
+
7551
+
7552
+ /* Reference-match pass: high-key blue office, white phase pills, and cyan flow rails. */
7553
+ #rd-hive-viewport.hive-mode-3d {
7554
+ background: linear-gradient(180deg, #eaf5ff 0%, #dcecf9 58%, #cfe1ef 100%) !important;
7555
+ border: 1px solid rgba(112, 164, 203, .38) !important;
7556
+ border-radius: 12px;
7557
+ box-shadow: inset 0 1px 0 rgba(255,255,255,.92), 0 16px 36px rgba(33, 80, 119, .14) !important;
7558
+ }
7559
+ #rd-hive-viewport .hg-badge {
7560
+ box-sizing: border-box;
7561
+ background: linear-gradient(180deg, #ffffff 0%, #f5f9ff 100%) !important;
7562
+ color: #12283e !important;
7563
+ border: 1px solid rgba(118, 171, 207, .72) !important;
7564
+ border-radius: 1.25cqw;
7565
+ box-shadow: inset 0 1px 0 #fff, 0 3px 0 rgba(25, 58, 88, .12), 0 7px 15px rgba(24, 62, 97, .20) !important;
7566
+ text-shadow: none !important;
7567
+ }
7568
+ #rd-hive-viewport .hg-badge::before {
7569
+ width: clamp(4px, .35cqw, 6px);
7570
+ height: clamp(4px, .35cqw, 6px);
7571
+ min-width: 0;
7572
+ min-height: 0;
7573
+ background: #38c7e8;
7574
+ box-shadow: 0 0 7px rgba(57, 206, 236, .48);
7575
+ }
7576
+ #rd-hive-viewport .hg-badge .hg-name {
7577
+ color: #142e49 !important;
7578
+ font-weight: 760;
7579
+ letter-spacing: 0;
7580
+ }
7581
+ #rd-hive-viewport .hg-badge .hg-meta {
7582
+ color: #58748c !important;
7583
+ font-weight: 600;
7584
+ }
7585
+ #rd-hive-viewport .hg-badge.hg-active {
7586
+ border-color: #58d4ee !important;
7587
+ box-shadow: inset 0 0 0 1px rgba(76, 209, 238, .28), 0 0 0 2px rgba(87, 211, 239, .26), 0 6px 14px rgba(23, 89, 130, .19) !important;
7588
+ }
7589
+ #rd-hive-viewport .hg-badge.hg-active::before {
7590
+ background: #18c8a1;
7591
+ box-shadow: 0 0 7px rgba(24, 200, 161, .70);
7592
+ }
7593
+ #rd-hive-viewport .hg-flow-link {
7594
+ height: 3px;
7595
+ background: linear-gradient(90deg, rgba(74, 229, 255, .70), #55eaff);
7596
+ box-shadow: 0 0 6px rgba(40, 224, 255, .68);
7597
+ }
7598
+ #rd-hive-viewport .hg-flow-link::after {
7599
+ top: -3px;
7600
+ border-color: #64eeff;
7601
+ filter: drop-shadow(0 0 3px rgba(59, 221, 255, .72));
7602
+ }
7603
+ #rd-hive-viewport .hg-monitor {
7604
+ background: linear-gradient(145deg, #06213a 0%, #00162a 100%) !important;
7605
+ border: 1px solid rgba(112, 195, 232, .48) !important;
7606
+ border-radius: 2px;
7607
+ box-shadow: inset 0 1px 0 rgba(209, 244, 255, .13), 0 2px 5px rgba(8, 35, 59, .17) !important;
7608
+ }
7609
+ #rd-hive-viewport .hg-monitor:disabled {
7610
+ opacity: .98 !important;
7611
+ }
7612
+ #rd-hive-viewport .hg-monitor-role {
7613
+ color: #f0fbff !important;
7614
+ }
7615
+ #rd-hive-viewport .hg-monitor-status,
7616
+ #rd-hive-viewport .hg-monitor-time {
7617
+ color: #8fe5f4 !important;
7618
+ }
7619
+ #rd-hive-viewport .hg-monitor-tail {
7620
+ color: #60dcf3 !important;
7621
+ opacity: 1;
7622
+ }
7623
+
7624
+
7625
+ /* Reference geometry finishing: taller white phase pills and illuminated monitor baselines. */
7626
+ #rd-hive-viewport .hg-badge {
7627
+ width: 10.8% !important;
7628
+ height: clamp(42px, 4.5cqw, 54px) !important;
7629
+ padding: 4px 6px !important;
7630
+ border-radius: 12px !important;
7631
+ gap: 3px !important;
7632
+ }
7633
+ #rd-hive-viewport .hg-badge .hg-name {
7634
+ font-size: clamp(11px, .98cqw, 15px) !important;
7635
+ line-height: 1.15 !important;
7636
+ }
7637
+ #rd-hive-viewport .hg-badge .hg-meta {
7638
+ font-size: clamp(7px, .54cqw, 9px) !important;
7639
+ line-height: 1 !important;
7640
+ }
7641
+ #rd-hive-viewport .hg-monitor {
7642
+ position: absolute;
7643
+ }
7644
+ #rd-hive-viewport .hg-monitor::after {
7645
+ position: absolute;
7646
+ content: "";
7647
+ left: 4%;
7648
+ right: 4%;
7649
+ bottom: 2px;
7650
+ height: 2px;
7651
+ border-radius: 2px;
7652
+ background: linear-gradient(90deg, #31cce9, #a0f5ff);
7653
+ box-shadow: 0 0 5px rgba(42, 222, 255, .58);
7654
+ pointer-events: none;
7655
+ }
7656
+
7657
+
7658
+ /* High-fidelity default view: use the shipped rendered reference as the scene plate,
7659
+ while clickable HTML controls on the six phase cards and fourteen monitors stay live. */
7660
+ #rd-hive-viewport.hive-mode-3d .hive-reference {
7661
+ display: block !important;
7662
+ z-index: 0;
7663
+ object-fit: contain;
7664
+ }
7665
+ #rd-hive-viewport.hive-mode-live3d .hive-reference {
7666
+ display: none !important;
7667
+ }
7668
+ #rd-hive-viewport .hive-reference-artboard {
7669
+ position: absolute;
7670
+ inset: 0;
7671
+ transform-origin: 50% 50%;
7672
+ will-change: transform;
7673
+ }
7674
+ #rd-hive-viewport.hive-mode-3d .hive-gl-live {
7675
+ z-index: 0;
7676
+ }
7677
+ #rd-hive-viewport.hive-mode-3d .hg-badge {
7678
+ width: 10.74% !important;
7679
+ height: 7.57% !important;
7680
+ padding: 2px 4px !important;
7681
+ gap: 2px !important;
7682
+ border-radius: 1.15cqw !important;
7683
+ background: linear-gradient(180deg, #fff 0%, #f6faff 100%) !important;
7684
+ border: 1px solid rgba(120, 171, 207, .78) !important;
7685
+ box-shadow: inset 0 1px 0 #fff, 0 3px 0 rgba(25, 58, 88, .12), 0 7px 15px rgba(24, 62, 97, .19) !important;
7686
+ color: #142e49 !important;
7687
+ }
7688
+ #rd-hive-viewport.hive-mode-3d .hg-badge .hg-name {
7689
+ color: #142e49 !important;
7690
+ font-size: clamp(10px, .98cqw, 15px) !important;
7691
+ line-height: 1.08 !important;
7692
+ }
7693
+ #rd-hive-viewport.hive-mode-3d .hg-badge .hg-meta {
7694
+ color: #58748c !important;
7695
+ font-size: clamp(6px, .49cqw, 8px) !important;
7696
+ line-height: 1 !important;
7697
+ }
7698
+ #rd-hive-viewport.hive-mode-3d .hg-flow-link {
7699
+ display: none !important;
7700
+ }
7701
+ #rd-hive-viewport.hive-mode-3d .hg-monitor {
7702
+ padding: 1px 2px;
7703
+ border-radius: 3px;
7704
+ background: linear-gradient(180deg, #06213a 0%, #001327 100%);
7705
+ border: 1px solid rgba(101, 194, 233, .58);
7706
+ box-shadow: inset 0 1px 0 rgba(215, 247, 255, .14), 0 2px 4px rgba(0, 18, 35, .22);
7707
+ opacity: 1;
7708
+ }
7709
+ #rd-hive-viewport.hive-mode-3d .hg-monitor-role {
7710
+ font-size: clamp(5px, .53cqw, 8px);
7711
+ line-height: 1.03;
7712
+ color: #f0fbff;
7713
+ }
7714
+ #rd-hive-viewport.hive-mode-3d .hg-monitor-status,
7715
+ #rd-hive-viewport.hive-mode-3d .hg-monitor-time {
7716
+ font-size: clamp(4px, .35cqw, 6px);
7717
+ line-height: 1;
7718
+ color: #6cdbf5;
7719
+ }
7720
+ #rd-hive-viewport.hive-mode-3d .hg-monitor-tail {
7721
+ font-size: clamp(4px, .34cqw, 6px);
7722
+ line-height: 1;
7723
+ color: #87e8f7;
7724
+ }
7725
+ #rd-hive-viewport.hive-mode-3d .hg-monitor::after {
7726
+ height: 2px;
7727
+ bottom: 1px;
7728
+ opacity: .92;
7729
+ }
7730
+ #rd-hive-viewport.hive-mode-3d .hg-monitor:disabled {
7731
+ opacity: 1 !important;
7732
+ }
7733
+ #rd-hive-viewport.hive-mode-live3d {
7734
+ background: linear-gradient(180deg, #eaf5ff 0%, #dcecf9 58%, #cfe1ef 100%);
7735
+ }
7736
+ #rd-hive-viewport.hive-mode-live3d .hg-badge {
7737
+ background: linear-gradient(180deg, #fff 0%, #f5f9ff 100%);
7738
+ color: #142e49;
7739
+ border: 1px solid rgba(118, 171, 207, .72);
7740
+ }
7741
+
7742
+ /* In real WebGL mode the monitor glass/face is rendered in 3D. Keep DOM text overlays
7743
+ transparent so foreground robots correctly occlude the physical screen through depth testing. */
7744
+ #rd-hive-viewport.hive-mode-live3d .hg-monitor {
7745
+ background: transparent !important;
7746
+ border-color: rgba(94, 207, 235, .24) !important;
7747
+ box-shadow: none !important;
7748
+ backdrop-filter: none !important;
7749
+ }
7750
+ #rd-hive-viewport.hive-mode-live3d .hg-monitor::after { display: none !important; }
7751
+ #rd-hive-viewport.hive-mode-live3d .hg-monitor-role,
7752
+ #rd-hive-viewport.hive-mode-live3d .hg-monitor-status,
7753
+ #rd-hive-viewport.hive-mode-live3d .hg-monitor-time,
7754
+ #rd-hive-viewport.hive-mode-live3d .hg-monitor-tail {
7755
+ text-shadow: 0 1px 2px rgba(0, 12, 24, .92);
7756
+ }
7757
+
7758
+ /* Fullscreen applies to the reference artwork, live WebGL and 2D fallback alike. */
7759
+ .hive-scene-stage { min-width: 0; }
7760
+ .hive-scene-fullscreen { min-width: 64px; }
7761
+ .hive-scene-stage:fullscreen,
7762
+ .hive-scene-stage.is-fullscreen {
7763
+ display: flex; flex-direction: column; gap: 8px;
7764
+ width: 100vw; height: 100vh; min-width: 0; max-width: none;
7765
+ margin: 0; padding: 12px 16px 16px; box-sizing: border-box; overflow: hidden;
7766
+ border: 0; border-radius: 0; background: #eaf3fa; color: #183750;
7767
+ }
7768
+ .hive-scene-stage:fullscreen .hive-scene-tools,
7769
+ .hive-scene-stage.is-fullscreen .hive-scene-tools {
7770
+ flex: 0 0 auto; flex-wrap: wrap; width: 100%; min-height: 38px;
7771
+ margin: 0; gap: 8px; box-sizing: border-box;
7772
+ }
7773
+ .hive-scene-stage:fullscreen .hive-viewport,
7774
+ .hive-scene-stage.is-fullscreen .hive-viewport {
7775
+ flex: 1 1 auto; width: 100%; height: auto; min-height: 0;
7776
+ aspect-ratio: auto; border-radius: 12px;
7777
+ }
7778
+ .hive-scene-stage:fullscreen .hive-viewport .hive-reference,
7779
+ .hive-scene-stage.is-fullscreen .hive-viewport .hive-reference {
7780
+ object-fit: contain; background: #eaf3fa;
7781
+ }
7782
+ .hive-scene-stage:fullscreen .hive-viewport.hive-mode-2d,
7783
+ .hive-scene-stage.is-fullscreen .hive-viewport.hive-mode-2d {
7784
+ flex: 1 1 auto; height: auto; min-height: 0; overflow: auto;
7785
+ }
7786
+ @media (max-width: 680px) {
7787
+ .hive-scene-stage:fullscreen,
7788
+ .hive-scene-stage.is-fullscreen { padding: 8px; gap: 6px; }
7789
+ .hive-scene-stage:fullscreen .hive-scene-tools,
7790
+ .hive-scene-stage.is-fullscreen .hive-scene-tools { gap: 5px; }
7791
+ .hive-scene-stage:fullscreen .hive-scene-hint,
7792
+ .hive-scene-stage.is-fullscreen .hive-scene-hint { display: none; }
7793
+ }
7794
+
7795
+ /* ---- 步骤行窄主列折行(追加于文件尾防并行重排) ----
7796
+ * 步骤行定宽列总和 ≈783px(序号26+角色92+执行者118+st-model 77+st-prov 200+耗时42
7797
+ * +状态chip 44+日志按钮60+8间隙96+内边距28),浏览器缩放/窄窗/检查器打开都会把
7798
+ * 主列压到 783 以下——行放不下就溢出 .step(min-width:auto),传导到
7799
+ * #rd-pane-steps 长出横向滚动条(1010 实案:150% 缩放下 CLI 日志按钮被右缘切半)。
7800
+ * 用容器查询按「面板实际宽度」而非视口折行:≤820px 时与 ≤900 移动端同款允许换行,
7801
+ * role/who 允许收缩(本就带省略号);宽主列保持单行形态不动。容器查询 Edge 105+,
7802
+ * 老浏览器忽略整段=维持现状,优雅降级。 */
7803
+ #rd-steps { container-type: inline-size; }
7804
+ @container (max-width: 820px) {
7805
+ .step { flex-wrap: wrap; row-gap: 6px; }
7806
+ .step .role { flex: 0 1 92px; }
7807
+ .step .who { flex: 0 1 118px; }
7808
+ }