@sanqianx/claude-ai-workbench 0.13.2 → 0.13.3

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 (120) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +156 -156
  3. package/apps/agent-terminal/app.css +636 -613
  4. package/apps/agent-terminal/app.js +125 -65
  5. package/apps/agent-terminal/conversation-composer.js +44 -0
  6. package/apps/agent-terminal/index.html +171 -170
  7. package/apps/agent-terminal/panel-host-proof.html +152 -152
  8. package/apps/agent-terminal/panel-proof-content.html +41 -41
  9. package/apps/agent-terminal/right-workspace-dock.css +187 -159
  10. package/apps/agent-terminal/right-workspace-dock.js +623 -519
  11. package/apps/ai-profile-settings-host/index.html +25 -25
  12. package/apps/ai-profile-settings-host/page.css +1 -1
  13. package/apps/ai-profile-settings-host/page.js +113 -113
  14. package/apps/minimal-test-host/README.md +15 -15
  15. package/apps/minimal-test-host/host.css +2 -2
  16. package/apps/minimal-test-host/host.js +35 -35
  17. package/apps/minimal-test-host/index.html +58 -58
  18. package/apps/minimal-test-host/optional-mock/fault-injection.js +15 -15
  19. package/docs/sdk/FILE_LAYOUT.md +31 -31
  20. package/docs/sdk/INTEGRATION.md +126 -126
  21. package/docs/sdk/README.md +21 -21
  22. package/docs/sdk/SESSION_EVENTS.md +13 -13
  23. package/docs/sdk/openapi.yaml +8 -1
  24. package/package.json +1 -1
  25. package/packages/client/README.md +29 -29
  26. package/packages/client/index.d.ts +122 -122
  27. package/packages/client/index.js +260 -260
  28. package/packages/client/package.json +2 -2
  29. package/packages/contracts/README.md +9 -9
  30. package/packages/contracts/index.d.ts +519 -517
  31. package/packages/contracts/index.js +312 -312
  32. package/packages/contracts/package.json +1 -1
  33. package/packages/core/README.md +8 -8
  34. package/packages/core/index.d.ts +76 -76
  35. package/packages/core/index.js +222 -222
  36. package/packages/core/package.json +2 -2
  37. package/packages/server/README.md +17 -17
  38. package/packages/server/bin/agent-terminal-server.js +42 -42
  39. package/packages/server/bin/claude-workbench.js +225 -225
  40. package/packages/server/index.d.ts +171 -171
  41. package/packages/server/index.js +230 -230
  42. package/packages/server/lib/agent-discovery.js +133 -133
  43. package/packages/server/lib/agent-registry.js +143 -143
  44. package/packages/server/lib/agent-spawn-env.js +17 -17
  45. package/packages/server/lib/attachment-store.js +78 -78
  46. package/packages/server/lib/bridges/app-server-bridge.js +373 -373
  47. package/packages/server/lib/bridges/opencode-server-bridge.js +506 -506
  48. package/packages/server/lib/capture-settings-store.js +35 -35
  49. package/packages/server/lib/claude-history-recovery.js +87 -87
  50. package/packages/server/lib/cli-session-recovery.js +28 -28
  51. package/packages/server/lib/context-resolver.js +55 -55
  52. package/packages/server/lib/conversation-capture.js +51 -51
  53. package/packages/server/lib/delegation-phase-store.js +357 -357
  54. package/packages/server/lib/delegation-store.js +474 -468
  55. package/packages/server/lib/diagnostics.js +32 -32
  56. package/packages/server/lib/drivers/cli-json-runner.js +974 -974
  57. package/packages/server/lib/drivers/codex-driver.js +1442 -1442
  58. package/packages/server/lib/drivers/opencode-driver.js +1554 -1554
  59. package/packages/server/lib/drivers/zcode-driver.js +1250 -1250
  60. package/packages/server/lib/drivers/zcode-profile-runtime.js +71 -71
  61. package/packages/server/lib/event-stream.js +138 -138
  62. package/packages/server/lib/folder-picker.js +623 -623
  63. package/packages/server/lib/http-handler.js +339 -339
  64. package/packages/server/lib/json-file.js +26 -26
  65. package/packages/server/lib/knowledge-context.js +33 -33
  66. package/packages/server/lib/model-detection.js +295 -295
  67. package/packages/server/lib/parent-context.js +44 -0
  68. package/packages/server/lib/profile-store.js +283 -283
  69. package/packages/server/lib/project-store.js +102 -102
  70. package/packages/server/lib/runtime-loader.js +120 -120
  71. package/packages/server/lib/session-archive-store.js +53 -53
  72. package/packages/server/lib/session-history.js +612 -612
  73. package/packages/server/lib/system-doctor.js +125 -125
  74. package/packages/server/lib/ui-preferences-store.js +48 -48
  75. package/packages/server/lib/workbench-service.js +1696 -1675
  76. package/packages/server/package.json +2 -2
  77. package/packages/ui/README.md +30 -30
  78. package/packages/ui/ai-profile-settings.d.ts +45 -45
  79. package/packages/ui/ai-profile-settings.js +283 -283
  80. package/packages/ui/claude-terminal.d.ts +31 -31
  81. package/packages/ui/claude-terminal.js +343 -343
  82. package/packages/ui/index.d.ts +18 -18
  83. package/packages/ui/index.js +51 -51
  84. package/packages/ui/package.json +2 -2
  85. package/packages/ui/theme.css +13 -13
  86. package/src/assets/claude-prompts.json +21 -21
  87. package/src/backend/http/ai-profile-routes.js +61 -61
  88. package/src/backend/http/claude-routes.js +170 -170
  89. package/src/backend/http/node-helpers.js +45 -45
  90. package/src/backend/index.js +21 -21
  91. package/src/backend/lib/ai-adapter.js +144 -144
  92. package/src/backend/lib/ai-profile-store.js +259 -259
  93. package/src/backend/lib/ai-vendor-presets.js +83 -83
  94. package/src/backend/lib/ai-workspace.js +140 -140
  95. package/src/backend/lib/automation-config.js +253 -253
  96. package/src/backend/lib/claude-cli-runner.js +2392 -2392
  97. package/src/backend/lib/data-dir.js +169 -169
  98. package/src/backend/lib/llm-client.js +176 -176
  99. package/src/backend/lib/model-context-windows.js +82 -82
  100. package/src/backend/lib/native-task-control.js +217 -217
  101. package/src/backend/lib/native-task-history-index.js +475 -475
  102. package/src/backend/lib/native-task-history-reader.js +526 -526
  103. package/src/backend/lib/native-task-messages.js +457 -457
  104. package/src/backend/lib/native-task-registry.js +325 -325
  105. package/src/backend/lib/native-task-runtime.js +242 -242
  106. package/src/backend/lib/native-task-trace.js +440 -440
  107. package/src/backend/lib/native-task-transcript.js +393 -393
  108. package/src/backend/lib/prompt-registry.js +166 -166
  109. package/src/backend/lib/runtime-config.js +121 -121
  110. package/src/backend/lib/sdk-session-stream.js +143 -143
  111. package/src/backend/lib/sdk-turn-stream.js +16 -16
  112. package/src/backend/lib/store-scope.js +131 -131
  113. package/src/backend/lib/task-identity.js +104 -104
  114. package/src/backend/lib/task-state-projection.js +58 -58
  115. package/src/index.js +7 -7
  116. package/src/sdk-wave-a.ts +1 -1
  117. package/src/sdk-wave-b.ts +1 -1
  118. package/src/sdk-wave-c.ts +1 -1
  119. package/src/sdk-wave-d.ts +1 -1
  120. package/src/sdk-wave-e.ts +1 -1
@@ -1,159 +1,187 @@
1
- /* Right workspace dock - native background-task side panel. */
2
-
3
- .right-dock {
4
- display: flex;
5
- flex-direction: row;
6
- width: 380px;
7
- min-width: 280px;
8
- max-width: 560px;
9
- height: 100%;
10
- border-left: 1px solid var(--border, #2a2a33);
11
- background: var(--bg, #14141a);
12
- color: var(--fg, #e8e8ee);
13
- position: relative;
14
- overflow: hidden;
15
- }
16
-
17
- .right-dock[hidden] { display: none; }
18
-
19
- .rd-resizer {
20
- flex: 0 0 6px;
21
- cursor: col-resize;
22
- background: transparent;
23
- /* Pointer events own the gesture: without this, touch drags hand the
24
- * gesture to browser panning and the dock never resizes. */
25
- touch-action: none;
26
- }
27
-
28
- .rd-resizer:hover, .rd-resizer:focus-visible { background: var(--accent, #4a7dff); outline: none; }
29
-
30
- .rd-body { display: flex; flex-direction: column; flex: 1; min-width: 0; position: relative; }
31
-
32
- .rd-tabs {
33
- display: flex;
34
- flex-direction: row;
35
- align-items: center;
36
- gap: 4px;
37
- padding: 4px 6px;
38
- border-bottom: 1px solid var(--border, #2a2a33);
39
- overflow-x: auto;
40
- flex: 0 0 auto;
41
- }
42
-
43
- .rd-tab {
44
- display: inline-flex;
45
- align-items: center;
46
- gap: 6px;
47
- padding: 3px 8px;
48
- border: 1px solid transparent;
49
- border-radius: 6px;
50
- background: transparent;
51
- color: inherit;
52
- cursor: pointer;
53
- font-size: 12px;
54
- white-space: nowrap;
55
- }
56
-
57
- .rd-tab.active { border-color: var(--accent, #4a7dff); background: rgba(74, 125, 255, 0.12); }
58
-
59
- .rd-dot { width: 8px; height: 8px; border-radius: 50%; background: #888; flex: 0 0 auto; }
60
- .rd-dot.running { background: #4a7dff; }
61
- .rd-dot.pending { background: #b8860b; }
62
- .rd-dot.completed { background: #2e9e5b; }
63
- .rd-dot.failed { background: #d64545; }
64
- .rd-dot.stopped { background: #8a6d3b; }
65
-
66
- .rd-tab-close { padding: 0 2px; opacity: 0.7; }
67
- .rd-tab-close:hover { opacity: 1; }
68
-
69
- .rd-plus { padding: 3px 10px; border: none; border-radius: 6px; background: transparent; color: inherit; cursor: pointer; font-size: 14px; }
70
- .rd-plus:hover { background: rgba(255, 255, 255, 0.08); }
71
-
72
- .rd-panes { flex: 1 1 auto; min-height: 0; position: relative; display: flex; flex-direction: column; }
73
-
74
- .rd-empty { padding: 16px; color: #9a9aa5; font-size: 12px; }
75
-
76
- .rd-pane { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
77
- .rd-pane[hidden] { display: none; }
78
-
79
- .rd-head { display: flex; align-items: center; gap: 8px; padding: 6px 10px; flex: 0 0 auto; }
80
- .rd-title { font-size: 13px; overflow: hidden; text-overflow: ellipsis; }
81
- .rd-chips { display: inline-flex; gap: 4px; flex-wrap: wrap; }
82
- .rd-chip { font-size: 11px; padding: 1px 6px; border-radius: 8px; border: 1px solid var(--border, #2a2a33); }
83
- .rd-chip.conflict { border-color: #d64545; color: #d64545; }
84
-
85
- .rd-meta { padding: 4px 10px; font-size: 11px; color: #9a9aa5; flex: 0 0 auto; }
86
- .rd-meta-row { display: flex; gap: 6px; }
87
- .rd-meta-label { flex: 0 0 110px; }
88
- .rd-meta-value { word-break: break-all; }
89
-
90
- .rd-stoprow { display: flex; align-items: center; gap: 8px; padding: 4px 10px; flex: 0 0 auto; }
91
- .rd-stop { font-size: 12px; padding: 2px 8px; }
92
- .rd-stopnote { font-size: 11px; color: #9a9aa5; }
93
-
94
- .rd-banner { display: flex; align-items: center; gap: 8px; padding: 4px 10px; background: rgba(214, 69, 69, 0.14); font-size: 12px; flex: 0 0 auto; }
95
- .rd-banner[hidden] { display: none; }
96
- .rd-resync { font-size: 11px; padding: 1px 6px; }
97
-
98
- .rd-error { padding: 4px 10px; color: #d64545; font-size: 12px; flex: 0 0 auto; white-space: pre-wrap; }
99
- .rd-error[hidden] { display: none; }
100
-
101
- .rd-scroll { flex: 1 1 auto; overflow-y: auto; padding: 4px 10px; min-height: 0; }
102
-
103
- .rd-item { margin: 6px 0; padding: 4px 6px; border-left: 2px solid var(--border, #2a2a33); font-size: 12px; }
104
- .rd-item.rd-interrupted { border-left-color: #8a6d3b; color: #d8b56a; }
105
- .rd-state { display: flex; align-items: center; gap: 6px; }
106
- .rd-state-dot { width: 8px; height: 8px; border-radius: 50%; background: #888; flex: 0 0 auto; }
107
- .rd-state-dot.running { background: #4a7dff; }
108
- .rd-state-dot.completed { background: #2e9e5b; }
109
- .rd-state-dot.failed { background: #d64545; }
110
- .rd-state-dot.stopped { background: #8a6d3b; }
111
- .rd-dim { color: #9a9aa5; font-size: 11px; display: block; }
112
- .rd-pre { white-space: pre-wrap; word-break: break-all; background: rgba(255, 255, 255, 0.04); padding: 4px; margin: 2px 0; max-height: 220px; overflow-y: auto; font-size: 11px; }
113
-
114
- .rd-msg { margin: 4px 0; }
115
- .rd-role { font-size: 10px; color: #9a9aa5; margin-right: 6px; }
116
- .rd-text { margin: 2px 0 2px 12px; }
117
- .rd-text.rd-final { border-left: 2px solid #2e9e5b; padding-left: 6px; }
118
- .rd-text :first-child { margin-top: 0; }
119
- .rd-toolname { font-size: 11px; color: #7fa3e8; display: block; }
120
- .rd-toolresult.failed .rd-toolname { color: #d64545; }
121
- .rd-toolresult.failed { border-left: 2px solid #d64545; padding-left: 4px; }
122
- .rd-readfail { color: #d8b56a; font-size: 11px; }
123
-
124
- .rd-more { align-self: flex-start; margin: 2px 10px; font-size: 11px; flex: 0 0 auto; }
125
- .rd-more[disabled] { opacity: 0.5; }
126
- .rd-note { padding: 2px 10px; font-size: 11px; color: #9a9aa5; flex: 0 0 auto; }
127
- .rd-note[hidden] { display: none; }
128
-
129
- .rd-foot { flex: 0 0 auto; max-height: 140px; overflow-y: auto; border-top: 1px solid var(--border, #2a2a33); padding: 4px 10px; font-size: 11px; }
130
- .rd-usage-title { display: block; color: #9a9aa5; }
131
- .rd-usage-row { display: flex; gap: 6px; }
132
- .rd-usage-key { flex: 0 0 120px; color: #9a9aa5; }
133
- .rd-usage-val { word-break: break-all; }
134
- .rd-diag { display: block; color: #d8b56a; }
135
-
136
- .rd-picker { position: absolute; top: 36px; right: 8px; z-index: 30; width: min(320px, 90%); border: 1px solid var(--border, #2a2a33); background: var(--bg, #14141a); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45); padding: 6px; }
137
- .rd-picker[hidden] { display: none; }
138
- .rd-picker-head { display: flex; align-items: center; gap: 6px; font-size: 12px; margin-bottom: 4px; }
139
- .rd-picker-head strong { flex: 1 1 auto; }
140
- .rd-picker-refresh, .rd-picker-close { font-size: 11px; padding: 1px 6px; }
141
- .rd-picker-row { display: block; width: 100%; text-align: left; margin: 2px 0; padding: 4px 6px; font-size: 12px; border: 1px solid transparent; background: transparent; color: inherit; cursor: pointer; }
142
- .rd-picker-row:hover:not([disabled]) { border-color: var(--accent, #4a7dff); }
143
- .rd-picker-row[disabled] { opacity: 0.5; cursor: not-allowed; }
144
- .rd-picker-empty { padding: 8px; font-size: 12px; color: #9a9aa5; }
145
- .rd-picker-note { margin-top: 6px; font-size: 11px; color: #9a9aa5; border-top: 1px solid var(--border, #2a2a33); padding-top: 4px; }
146
- .rd-picker-subhead { margin: 6px 0 2px; font-size: 11px; color: #9a9aa5; border-top: 1px solid var(--border, #2a2a33); padding-top: 6px; }
147
- .rd-picker-host-row { border-color: rgba(74, 125, 255, 0.35); }
148
-
149
- .rd-dot.host { background: #7fa3e8; }
150
- .rd-chip.host { border-color: #7fa3e8; color: #7fa3e8; }
151
-
152
- .rd-host-pane { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
153
- .rd-host-status { padding: 4px 10px; font-size: 11px; color: #9a9aa5; flex: 0 0 auto; }
154
- .rd-host-status[hidden] { display: none; }
155
- .rd-host-frame-holder { flex: 1 1 auto; min-height: 0; display: flex; }
156
- .rd-host-frame { flex: 1 1 auto; width: 100%; border: none; background: var(--bg, #14141a); }
157
-
158
- #btn-dock-toggle { position: relative; }
159
- #btn-dock-toggle .rd-toggle-count { position: absolute; top: -4px; right: -4px; background: #4a7dff; color: #fff; border-radius: 8px; font-size: 10px; padding: 0 4px; min-width: 14px; }
1
+ /* Right workspace dock - native background-task side panel. */
2
+
3
+ .right-dock {
4
+ display: flex;
5
+ flex-direction: row;
6
+ flex: 0 0 auto;
7
+ width: 380px;
8
+ min-width: 280px;
9
+ max-width: min(560px, 48%);
10
+ height: 100%;
11
+ border-left: 1px solid var(--line);
12
+ background: var(--page);
13
+ color: var(--text);
14
+ position: relative;
15
+ overflow: hidden;
16
+ }
17
+
18
+ .right-dock[hidden] { display: none; }
19
+
20
+ .rd-resizer {
21
+ flex: 0 0 6px;
22
+ cursor: col-resize;
23
+ background: transparent;
24
+ /* Pointer events own the gesture: without this, touch drags hand the
25
+ * gesture to browser panning and the dock never resizes. */
26
+ touch-action: none;
27
+ }
28
+
29
+ .rd-resizer:hover, .rd-resizer:focus-visible { background: var(--accent, var(--blue)); outline: none; }
30
+
31
+ .rd-body { display: flex; flex-direction: column; flex: 1; min-width: 0; position: relative; }
32
+
33
+ .rd-tabs {
34
+ display: flex;
35
+ flex-direction: row;
36
+ align-items: center;
37
+ gap: 4px;
38
+ padding: 4px 6px;
39
+ border-bottom: 1px solid var(--line);
40
+ overflow: hidden;
41
+ flex: 0 0 auto;
42
+ }
43
+
44
+ .rd-tab-list { display: flex; align-items: center; gap: 4px; flex: 1 1 auto; min-width: 0; overflow-x: auto; scrollbar-width: thin; }
45
+ .rd-tab-list .rd-tab { flex: 0 0 auto; }
46
+ .rd-plus, .rd-collapse { flex: 0 0 auto; }
47
+
48
+ .rd-tab {
49
+ display: inline-flex;
50
+ align-items: center;
51
+ gap: 6px;
52
+ padding: 3px 8px;
53
+ border: 1px solid transparent;
54
+ border-radius: 6px;
55
+ background: transparent;
56
+ color: inherit;
57
+ cursor: pointer;
58
+ font-size: 12px;
59
+ white-space: nowrap;
60
+ }
61
+
62
+ .rd-tab.active { border-color: var(--accent, var(--blue)); background: var(--blue-soft); }
63
+ .rd-tab-label { max-width: 180px; overflow: hidden; text-overflow: ellipsis; }
64
+
65
+ .rd-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--faint); flex: 0 0 auto; }
66
+ .rd-dot.running { background: var(--blue); }
67
+ .rd-dot.pending { background: var(--warn); }
68
+ .rd-dot.completed { background: var(--good); }
69
+ .rd-dot.failed { background: var(--bad); }
70
+ .rd-dot.stopped { background: var(--warn); }
71
+
72
+ .rd-tab-close { padding: 0 2px; opacity: 0.7; }
73
+ .rd-tab-close:hover { opacity: 1; }
74
+
75
+ .rd-plus { padding: 3px 10px; border: none; border-radius: 6px; background: transparent; color: inherit; cursor: pointer; font-size: 14px; }
76
+ .rd-plus:hover { background: var(--surface); }
77
+
78
+ .rd-panes { flex: 1 1 auto; min-height: 0; position: relative; display: flex; flex-direction: column; }
79
+
80
+ .rd-empty { padding: 16px; color: var(--muted); font-size: 12px; }
81
+
82
+ .rd-pane { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
83
+ .rd-pane[hidden] { display: none; }
84
+
85
+ .rd-head { display: flex; align-items: center; gap: 8px; flex: 0 0 auto; border-bottom: 1px solid var(--line); padding: 10px 16px; }
86
+ .rd-title { flex: 1; min-width: 0; font-size: 13px; overflow-wrap: anywhere; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
87
+ .rd-task-status { flex: 0 0 auto; color: var(--muted); font-size: 12px; }
88
+ .rd-tabs { min-height: 38px; }
89
+ .rd-tab { height: 28px; }
90
+ .rd-scroll { font-size: 15px; line-height: 1.7; overflow-wrap: anywhere; }
91
+ .rd-scroll .step { max-width: 100%; }
92
+ .rd-scroll .s-desc { min-width: 0; }
93
+ .rd-scroll .rd-pre { max-width: 100%; }
94
+ .dock-open .stream { padding-inline: 16px; }
95
+ .dock-open .col, .dock-open .composer { max-width: 100%; }
96
+ .task-open { border: 1px solid var(--line2); border-radius: 6px; padding: 2px 8px; background: var(--surface); color: var(--blue); white-space: nowrap; font-size: 11px; }
97
+ .task-open:hover { background: var(--surface2); }
98
+ .task-open:disabled { opacity: .6; cursor: wait; }
99
+ .rd-collapse { margin-left: auto; flex: 0 0 auto; padding: 3px 8px; border: 0; border-radius: 6px; background: transparent; color: var(--muted); font-size: 11px; }
100
+ .rd-collapse:hover { background: var(--surface); color: var(--text); }
101
+ #view-terminal { position: relative; }
102
+ /* A narrow embedded viewport must not shrink the conversation to a sliver.
103
+ The task drawer overlays it and always offers its own dismiss control. */
104
+ @media (max-width: 850px) {
105
+ #view-terminal.dock-open > .right-dock { position: absolute; inset: 0 0 0 auto; z-index: 25; width: min(380px, calc(100% - 32px)) !important; min-width: 0; max-width: calc(100% - 32px); box-shadow: var(--shadow-2); }
106
+ .dock-open .rd-resizer { display: none; }
107
+ }
108
+ @media (max-width: 640px) {
109
+ body.kb-embedded #view-terminal.dock-open > .sidebar { display: none; }
110
+ }
111
+
112
+
113
+ .rd-banner { display: flex; align-items: center; gap: 8px; padding: 4px 10px; background: var(--bad-soft); font-size: 12px; flex: 0 0 auto; }
114
+ .rd-banner[hidden] { display: none; }
115
+ .rd-resync { font-size: 11px; padding: 1px 6px; }
116
+
117
+ .rd-error { padding: 4px 10px; color: var(--bad); font-size: 12px; flex: 0 0 auto; white-space: pre-wrap; }
118
+ .rd-error[hidden] { display: none; }
119
+
120
+ .rd-scroll { flex: 1 1 auto; overflow-y: auto; padding: 4px 16px 16px; min-height: 0; }
121
+
122
+ .rd-pre { white-space: pre-wrap; word-break: break-all; background: var(--code-bg); padding: 4px; margin: 2px 0; max-height: 220px; overflow-y: auto; font-size: 11px; }
123
+
124
+
125
+ .rd-more { align-self: flex-start; margin: 2px 10px; font-size: 11px; flex: 0 0 auto; }
126
+ .rd-more[disabled] { opacity: 0.5; }
127
+
128
+
129
+ .rd-picker { position: absolute; top: 40px; right: 8px; z-index: 30; width: min(280px, calc(100% - 16px)); box-sizing: border-box; border: 1px solid var(--line); border-radius: 12px; background: var(--page); box-shadow: var(--shadow-2); padding: 12px; }
130
+ .rd-picker[hidden] { display: none; }
131
+ .rd-picker-heading { margin: 0 4px 8px; font-size: 12px; color: var(--muted); }
132
+ .rd-picker-row { display: flex; align-items: center; gap: 10px; width: 100%; box-sizing: border-box; text-align: left; padding: 10px; font: inherit; font-size: 13px; line-height: 20px; border: 1px solid transparent; border-radius: 8px; background: var(--surface); color: var(--text); cursor: pointer; }
133
+ .rd-picker-row + .rd-picker-row { margin-top: 6px; }
134
+ .rd-picker-row:hover { background: var(--surface2); }
135
+ .rd-picker-row:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; }
136
+ .rd-picker-row .ic { flex: 0 0 auto; color: var(--muted); }
137
+ .rd-picker-label { min-width: 0; overflow-wrap: anywhere; }
138
+ .rd-picker-empty { padding: 10px 4px; font-size: 12px; color: var(--muted); }
139
+
140
+ .rd-dot.host { background: var(--blue); }
141
+
142
+ .rd-host-pane { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
143
+ .rd-host-status { padding: 4px 10px; font-size: 11px; color: var(--muted); flex: 0 0 auto; }
144
+ .rd-host-status[hidden] { display: none; }
145
+ .rd-host-frame-holder { flex: 1 1 auto; min-height: 0; display: flex; }
146
+ .rd-host-frame { flex: 1 1 auto; width: 100%; border: none; background: var(--page); }
147
+
148
+ #btn-dock-toggle { position: relative; }
149
+ #btn-dock-toggle .rd-toggle-count { position: absolute; top: -4px; right: -4px; background: var(--blue); color: #fff; border-radius: 8px; font-size: 10px; padding: 0 4px; min-width: 14px; }
150
+
151
+ /* Parallel workspace: the same conversation surface and composer on both sides. */
152
+ .right-dock { width:420px; min-width:340px; max-width:none; font-size:14px; }
153
+ .right-dock:not(.rd-drawer) { position:relative; inset:auto; box-shadow:none; }
154
+ .right-dock.rd-drawer { position:absolute; inset:0 0 0 auto; z-index:25; min-width:0; max-width:calc(100% - 24px); box-shadow:var(--shadow-2); }
155
+ .rd-drawer .rd-resizer { display:none; }
156
+ .rd-tabs { min-height:48px; box-sizing:border-box; padding:6px 8px; }
157
+ .rd-tab-list { scrollbar-width:none; }
158
+ .rd-tab-list::-webkit-scrollbar { display:none; }
159
+ .rd-tab-list .rd-tab { flex:0 1 200px; min-width:96px; max-width:220px; }
160
+ .rd-tab { border:0; border-radius:7px; min-height:32px; padding:5px 8px; font-size:13px; }
161
+ .rd-tab.active { background:var(--surface); }
162
+ .rd-tab { display:flex; gap:0; padding:0; }
163
+ .rd-tab-open { display:flex; align-items:center; flex:1; min-width:0; overflow:hidden; padding:7px 8px; border:0; border-radius:7px; background:transparent; color:inherit; font:inherit; text-align:left; cursor:pointer; }
164
+ .rd-tab-close { border:0; background:transparent; color:var(--muted); font-size:16px; padding:3px 6px; cursor:pointer; }
165
+ .rd-tab-open:focus-visible, .rd-tab-close:focus-visible { outline:2px solid var(--blue); outline-offset:-2px; }
166
+ .rd-tab .rd-dot { display:none; }
167
+ .rd-head { min-height:40px; border:0; padding:12px 24px 0; }
168
+ .rd-thread-note, .rd-task-status { color:var(--muted); font-size:12px; font-weight:400; }
169
+ .rd-task-status { margin-left:auto; }
170
+ .rd-scroll { padding:12px 24px 24px; }
171
+ .rd-launcher { padding:42px 24px; gap:10px; }
172
+ .rd-launcher .rd-picker-heading { font-size:12px; margin:0 0 2px; font-weight:500; color:var(--text); }
173
+ .rd-launcher .rd-picker-row { min-height:48px; border:1px solid var(--line); border-radius:10px; background:var(--page); font-size:14px; padding:12px 14px; }
174
+ .rd-launcher .rd-picker-row:hover { background:var(--surface); }
175
+ .rd-launcher .rd-picker-row:disabled { opacity:.5; cursor:default; }
176
+ .rd-draft-pane { display:flex; flex-direction:column; }
177
+ .rd-draft-empty { margin:auto 24px; text-align:center; padding:48px 0; }
178
+ .rd-draft-empty strong { font-size:17px; font-weight:500; }
179
+ .rd-draft-empty p { font-size:12px; color:var(--muted); margin-top:8px; }
180
+ .rd-composer-wrap { flex:0 0 auto; margin-top:auto; padding:12px 20px 20px; }
181
+ .rd-composer-label { flex:1; color:var(--muted); font-size:12px; }
182
+ .rd-composer-wrap .send { margin-left:auto; }
183
+ .rd-composer-wrap .composer textarea { font-size:14px; min-height:48px; }
184
+ .rd-continue { align-self:center; border:1px solid var(--line); border-radius:8px; background:var(--page); color:var(--text); font-size:13px; padding:9px 16px; margin:12px 20px 20px; }
185
+ .rd-permissions { padding:0 20px; }
186
+ .rd-pane[hidden], .rd-host-pane[hidden] { display:none; }
187
+ @media (max-width:640px) { .rd-head,.rd-scroll { padding-left:16px; padding-right:16px; } .rd-composer-wrap { padding:12px; } }