tagword-codeagent 1.1.6__py3-none-any.whl

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 (173) hide show
  1. codeagent/__init__.py +10 -0
  2. codeagent/__main__.py +13 -0
  3. codeagent/cli/__init__.py +13 -0
  4. codeagent/cli/entrypoint.py +161 -0
  5. codeagent/cli/main.py +979 -0
  6. codeagent/core/__init__.py +2 -0
  7. codeagent/core/attachments.py +342 -0
  8. codeagent/core/audio_models.py +50 -0
  9. codeagent/core/bootstrap.py +178 -0
  10. codeagent/core/default_presets.py +159 -0
  11. codeagent/core/env.py +106 -0
  12. codeagent/core/folder_picker.py +151 -0
  13. codeagent/core/image_understanding.py +90 -0
  14. codeagent/core/models.py +6 -0
  15. codeagent/core/paths.py +238 -0
  16. codeagent/core/pricing.py +107 -0
  17. codeagent/core/process_ports.py +258 -0
  18. codeagent/core/seed_bridge.py +21 -0
  19. codeagent/core/settings.py +98 -0
  20. codeagent/core/speech_synth.py +330 -0
  21. codeagent/core/team_config.py +247 -0
  22. codeagent/core/team_manager.py +245 -0
  23. codeagent/core/token_counter.py +41 -0
  24. codeagent/core/tts_voices.py +103 -0
  25. codeagent/core/usage_billing.py +72 -0
  26. codeagent/core/vision_models.py +93 -0
  27. codeagent/memory/diary.py +144 -0
  28. codeagent/persona_defaults/README.md +12 -0
  29. codeagent/persona_defaults/agent.md +352 -0
  30. codeagent/persona_defaults/identity.md +29 -0
  31. codeagent/persona_defaults/memory.md +4 -0
  32. codeagent/persona_defaults/skills.md +325 -0
  33. codeagent/persona_defaults/soul.md +38 -0
  34. codeagent/persona_defaults/tools.md +41 -0
  35. codeagent/persona_defaults/user.md +18 -0
  36. codeagent/runtime/__init__.py +11 -0
  37. codeagent/runtime/agent_context.py +6 -0
  38. codeagent/runtime/agent_runtime.py +21 -0
  39. codeagent/runtime/compact_prompt.py +9 -0
  40. codeagent/runtime/compact_state.py +40 -0
  41. codeagent/runtime/llm_worker.py +132 -0
  42. codeagent/runtime/orchestrator.py +161 -0
  43. codeagent/runtime/prompt_enrichment.py +324 -0
  44. codeagent/runtime/session_manager.py +30 -0
  45. codeagent/runtime/task_split.py +38 -0
  46. codeagent/runtime/turn_loop.py +13 -0
  47. codeagent/runtime/worker.py +48 -0
  48. codeagent/server/__init__.py +505 -0
  49. codeagent/server/app_factory.py +1292 -0
  50. codeagent/server/attachment_api.py +261 -0
  51. codeagent/server/hub.py +175 -0
  52. codeagent/server/icon.png +0 -0
  53. codeagent/server/self_healing.py +143 -0
  54. codeagent/server/team_engine.py +243 -0
  55. codeagent/server/tts_api.py +51 -0
  56. codeagent/server/webui_api_app.py +3180 -0
  57. codeagent/skills/__init__.py +2 -0
  58. codeagent/skills/select.py +144 -0
  59. codeagent/tools/__init__.py +6 -0
  60. codeagent/tools/agent_tools.py +10 -0
  61. codeagent/web/__init__.py +1 -0
  62. codeagent/web/__pycache__/__init__.cpython-313.pyc +0 -0
  63. codeagent/web/__pycache__/app.cpython-313.pyc +0 -0
  64. codeagent/web/__pycache__/auth_impl.cpython-313.pyc +0 -0
  65. codeagent/web/auth_impl.py +326 -0
  66. codeagent/web/static/00-marked.min.js +6 -0
  67. codeagent/web/static/00-mermaid.min.js +2314 -0
  68. codeagent/web/static/00-purify.min.js +3 -0
  69. codeagent/web/static/00-storage.js +83 -0
  70. codeagent/web/static/00-utils.js +51 -0
  71. codeagent/web/static/01-theme.css +96 -0
  72. codeagent/web/static/01a-scroll.js +86 -0
  73. codeagent/web/static/01b-think.js +62 -0
  74. codeagent/web/static/01c-session-identity.js +81 -0
  75. codeagent/web/static/01c-session-thinking.js +61 -0
  76. codeagent/web/static/01c-session-tree-menus.js +349 -0
  77. codeagent/web/static/01c-session-tree.js +531 -0
  78. codeagent/web/static/01c-session-utilities.js +83 -0
  79. codeagent/web/static/01c-vision-model.js +132 -0
  80. codeagent/web/static/01d-image-gen-model.js +84 -0
  81. codeagent/web/static/01e-audio-model.js +97 -0
  82. codeagent/web/static/01f-compose-ui.js +88 -0
  83. codeagent/web/static/01g-tts-settings.js +128 -0
  84. codeagent/web/static/01h-music-model.js +85 -0
  85. codeagent/web/static/01i-model-stack.js +291 -0
  86. codeagent/web/static/01j-video-gen-model.js +85 -0
  87. codeagent/web/static/01k-model-stack-bootstrap.js +66 -0
  88. codeagent/web/static/01k-model-stack-state.js +209 -0
  89. codeagent/web/static/01q-inflight.js +195 -0
  90. codeagent/web/static/02-reset.css +22 -0
  91. codeagent/web/static/02-session-ui.js +201 -0
  92. codeagent/web/static/03-layout-p1.css +2 -0
  93. codeagent/web/static/03-layout-p2.css +2 -0
  94. codeagent/web/static/03a-links-stream.js +88 -0
  95. codeagent/web/static/03b-stream-text.js +119 -0
  96. codeagent/web/static/03c-render-bubble.js +520 -0
  97. codeagent/web/static/03d-agent-bubble.js +126 -0
  98. codeagent/web/static/03e-tool-trace.js +182 -0
  99. codeagent/web/static/03f-timeline.js +54 -0
  100. codeagent/web/static/03g-bubble-tts.js +292 -0
  101. codeagent/web/static/04-components-p1.css +1 -0
  102. codeagent/web/static/04-components-p2b.css +1 -0
  103. codeagent/web/static/04-components-p3.css +2 -0
  104. codeagent/web/static/04-components-p4.css +1 -0
  105. codeagent/web/static/04-components-p5.css +1 -0
  106. codeagent/web/static/04-components-p6.css +58 -0
  107. codeagent/web/static/04-components-p7.css +4 -0
  108. codeagent/web/static/04-components-p8.css +1 -0
  109. codeagent/web/static/04-components-p9.css +1 -0
  110. codeagent/web/static/04-ws-connect.js +351 -0
  111. codeagent/web/static/04-ws-helpers.js +116 -0
  112. codeagent/web/static/05-chat-p1.css +1058 -0
  113. codeagent/web/static/05-chat-p2.css +1 -0
  114. codeagent/web/static/05-chat-p3.css +295 -0
  115. codeagent/web/static/05a-session-history.js +176 -0
  116. codeagent/web/static/05b-session-list.js +114 -0
  117. codeagent/web/static/05c-dialog.js +123 -0
  118. codeagent/web/static/05d-project-create.js +172 -0
  119. codeagent/web/static/05e-project-remote.js +143 -0
  120. codeagent/web/static/06-chat.js +552 -0
  121. codeagent/web/static/06-utilities.css +181 -0
  122. codeagent/web/static/06b-attachments.js +304 -0
  123. codeagent/web/static/06c-camera.js +488 -0
  124. codeagent/web/static/07-activity-bar.css +127 -0
  125. codeagent/web/static/09-git-p1.css +1 -0
  126. codeagent/web/static/09-git-p2.css +1 -0
  127. codeagent/web/static/09a-init-bind.js +110 -0
  128. codeagent/web/static/09b-panel-toggle.js +80 -0
  129. codeagent/web/static/09c-api-refresh.js +100 -0
  130. codeagent/web/static/09d-status-log.js +80 -0
  131. codeagent/web/static/09e-commit.js +80 -0
  132. codeagent/web/static/09f-remote.js +93 -0
  133. codeagent/web/static/11a-cron-parse.js +117 -0
  134. codeagent/web/static/11b-cron-panel.js +100 -0
  135. codeagent/web/static/11c-cron-card.js +133 -0
  136. codeagent/web/static/11d-cron-form.js +105 -0
  137. codeagent/web/static/11e-env-config.js +168 -0
  138. codeagent/web/static/11f-env-llm-a-state.js +136 -0
  139. codeagent/web/static/11f-env-llm-b-form.js +409 -0
  140. codeagent/web/static/11f-env-llm-c-board.js +322 -0
  141. codeagent/web/static/11g-env-paths-git.js +973 -0
  142. codeagent/web/static/11h-env-mcp-a-state.js +161 -0
  143. codeagent/web/static/11h-env-mcp-b-form.js +229 -0
  144. codeagent/web/static/11h-env-mcp-c-board.js +565 -0
  145. codeagent/web/static/12-plugins.js +127 -0
  146. codeagent/web/static/13a-skills.js +156 -0
  147. codeagent/web/static/13a-todo-utils.js +140 -0
  148. codeagent/web/static/13b-todo-fetch.js +106 -0
  149. codeagent/web/static/13b-tools.js +127 -0
  150. codeagent/web/static/13c-todo-crud.js +92 -0
  151. codeagent/web/static/14-activity-bar.js +177 -0
  152. codeagent/web/static/15-plans.css +194 -0
  153. codeagent/web/static/15-plans.js +219 -0
  154. codeagent/web/static/16-mobile.css +612 -0
  155. codeagent/web/static/16-mobile.js +178 -0
  156. codeagent/web/static/17-preset-ux.css +287 -0
  157. codeagent/web/static/18-agent-mgr.css +616 -0
  158. codeagent/web/static/18-agent-mgr.js +204 -0
  159. codeagent/web/static/24-health-dashboard.js +68 -0
  160. codeagent/web/static/99-brand-polish.css +152 -0
  161. codeagent/web/static/body.html +824 -0
  162. codeagent/web/static/setup/setup_form.html +171 -0
  163. codeagent/web/static/setup/setup_head.html +100 -0
  164. codeagent/web/static/setup/setup_tail.html +264 -0
  165. codeagent/web/static/setup/setup_test.html +38 -0
  166. codeagent/web/web_login.html +265 -0
  167. codeagent/web/webui.html +35 -0
  168. tagword_codeagent-1.1.6.dist-info/METADATA +273 -0
  169. tagword_codeagent-1.1.6.dist-info/RECORD +173 -0
  170. tagword_codeagent-1.1.6.dist-info/WHEEL +5 -0
  171. tagword_codeagent-1.1.6.dist-info/entry_points.txt +3 -0
  172. tagword_codeagent-1.1.6.dist-info/licenses/LICENSE +21 -0
  173. tagword_codeagent-1.1.6.dist-info/top_level.txt +1 -0
@@ -0,0 +1,612 @@
1
+ /* ================================================================
2
+ * 16-mobile.css — Mobile / touch layout (≤768px)
3
+ * ================================================================ */
4
+
5
+ .topbar__sidebar-btn,
6
+ .sidebar-backdrop {
7
+ display: none;
8
+ }
9
+
10
+ @media (max-width: 768px) {
11
+ :root {
12
+ --mobile-nav-h: calc(52px + env(safe-area-inset-bottom, 0px));
13
+ --topbar-h: 48px;
14
+ }
15
+
16
+ /* ---- Viewport height ---- */
17
+ .app,
18
+ .activity-bar {
19
+ height: 100dvh;
20
+ }
21
+
22
+ /* ---- App shell: single column + fixed nav ---- */
23
+ .app {
24
+ display: block;
25
+ position: relative;
26
+ grid-template-columns: unset;
27
+ grid-template-rows: unset;
28
+ }
29
+
30
+ .workspace {
31
+ height: 100dvh;
32
+ padding-bottom: var(--mobile-nav-h);
33
+ box-sizing: border-box;
34
+ }
35
+
36
+ .workspace > .page {
37
+ bottom: var(--mobile-nav-h);
38
+ }
39
+
40
+ /* ---- Bottom tab bar (activity bar) ---- */
41
+ .activity-bar {
42
+ position: fixed;
43
+ left: 0;
44
+ right: 0;
45
+ bottom: 0;
46
+ top: auto;
47
+ width: 100%;
48
+ min-width: 0;
49
+ height: var(--mobile-nav-h);
50
+ flex-direction: row;
51
+ align-items: stretch;
52
+ border-right: none;
53
+ border-top: 1px solid var(--border);
54
+ z-index: 120;
55
+ padding-bottom: env(safe-area-inset-bottom, 0px);
56
+ background: var(--bg-panel);
57
+ }
58
+
59
+ .activity-bar__top {
60
+ flex: 1;
61
+ flex-direction: row;
62
+ align-items: center;
63
+ justify-content: space-around;
64
+ gap: 0;
65
+ padding: var(--sp-1) var(--sp-1) 0;
66
+ overflow-x: auto;
67
+ -webkit-overflow-scrolling: touch;
68
+ }
69
+
70
+ .activity-bar__bottom {
71
+ flex-direction: row;
72
+ align-items: center;
73
+ justify-content: center;
74
+ padding: var(--sp-1) var(--sp-2) 0;
75
+ border-top: none;
76
+ border-left: 1px solid var(--divider);
77
+ flex-shrink: 0;
78
+ }
79
+
80
+ .activity-btn {
81
+ width: 44px;
82
+ height: 44px;
83
+ flex-shrink: 0;
84
+ font-size: 18px;
85
+ }
86
+
87
+ .activity-btn.active::before {
88
+ left: 50%;
89
+ top: 2px;
90
+ transform: translateX(-50%);
91
+ width: 18px;
92
+ height: 3px;
93
+ border-radius: 3px;
94
+ }
95
+
96
+ /* ---- Sidebar drawer ---- */
97
+ .sidebar-backdrop {
98
+ display: none;
99
+ position: fixed;
100
+ inset: 0;
101
+ bottom: var(--mobile-nav-h);
102
+ background: rgba(0, 0, 0, 0.45);
103
+ z-index: 190;
104
+ -webkit-tap-highlight-color: transparent;
105
+ }
106
+
107
+ body.sidebar-open .sidebar-backdrop {
108
+ display: block;
109
+ }
110
+
111
+ .sidebar {
112
+ position: fixed;
113
+ top: 0;
114
+ left: 0;
115
+ bottom: var(--mobile-nav-h);
116
+ width: min(88vw, 320px);
117
+ max-height: none;
118
+ z-index: 200;
119
+ transform: translateX(-105%);
120
+ transition: transform 0.24s cubic-bezier(0.2, 0, 0, 1);
121
+ box-shadow: var(--shadow-lg);
122
+ border-right: 1px solid var(--border);
123
+ border-bottom: none;
124
+ }
125
+
126
+ body.sidebar-open .sidebar {
127
+ transform: translateX(0);
128
+ }
129
+
130
+ /* Stats mode: sidebar becomes main content */
131
+ body[data-activity-mode="stats"] .sidebar {
132
+ position: relative;
133
+ width: 100%;
134
+ transform: none;
135
+ box-shadow: none;
136
+ bottom: auto;
137
+ height: calc(100dvh - var(--mobile-nav-h));
138
+ }
139
+
140
+ body[data-activity-mode="stats"] .workspace {
141
+ display: none;
142
+ }
143
+
144
+ body[data-activity-mode="stats"] .topbar__sidebar-btn {
145
+ display: none;
146
+ }
147
+
148
+ /* Files mode: compact file tree on top */
149
+ body[data-activity-mode="files"] .sidebar {
150
+ position: relative;
151
+ width: 100%;
152
+ transform: none;
153
+ box-shadow: none;
154
+ max-height: 38vh;
155
+ bottom: auto;
156
+ flex-shrink: 0;
157
+ }
158
+
159
+ body[data-activity-mode="files"] .app {
160
+ display: flex;
161
+ flex-direction: column;
162
+ height: 100dvh;
163
+ }
164
+
165
+ body[data-activity-mode="files"] .workspace {
166
+ flex: 1;
167
+ min-height: 0;
168
+ height: auto;
169
+ padding-bottom: var(--mobile-nav-h);
170
+ }
171
+
172
+ /* Config / tasks / agent: hide sidebar from layout */
173
+ body[data-activity-mode="config"] .sidebar,
174
+ body[data-activity-mode="tasks"] .sidebar,
175
+ body[data-activity-mode="agent"] .sidebar,
176
+ body[data-activity-mode="team"] .sidebar,
177
+ body[data-activity-mode="hub"] .sidebar {
178
+ display: none;
179
+ }
180
+
181
+ body[data-activity-mode="config"] .sidebar-backdrop,
182
+ body[data-activity-mode="tasks"] .sidebar-backdrop,
183
+ body[data-activity-mode="agent"] .sidebar-backdrop,
184
+ body[data-activity-mode="team"] .sidebar-backdrop,
185
+ body[data-activity-mode="hub"] .sidebar-backdrop {
186
+ display: none !important;
187
+ }
188
+
189
+ /* ---- Topbar ---- */
190
+ .topbar {
191
+ padding: 0 var(--sp-3);
192
+ gap: var(--sp-2);
193
+ }
194
+
195
+ .topbar__sidebar-btn {
196
+ display: inline-flex;
197
+ align-items: center;
198
+ justify-content: center;
199
+ width: 36px;
200
+ height: 36px;
201
+ padding: 0;
202
+ border: none;
203
+ border-radius: var(--r-md);
204
+ background: transparent;
205
+ color: var(--text-muted);
206
+ cursor: pointer;
207
+ flex-shrink: 0;
208
+ -webkit-tap-highlight-color: transparent;
209
+ }
210
+
211
+ .topbar__sidebar-btn:hover,
212
+ .topbar__sidebar-btn.is-active {
213
+ background: var(--bg-hover);
214
+ color: var(--accent);
215
+ }
216
+
217
+ .topbar__sidebar-btn svg {
218
+ width: 18px;
219
+ height: 18px;
220
+ }
221
+
222
+ body:not([data-activity-mode="chat"]) .topbar__sidebar-btn {
223
+ display: none;
224
+ }
225
+
226
+ .topbar__title {
227
+ max-width: 36vw;
228
+ font-size: 13px;
229
+ }
230
+
231
+ .topbar__project-path {
232
+ display: none !important;
233
+ }
234
+
235
+ .channel-pill {
236
+ font-size: 9.5px;
237
+ padding: 1px 6px;
238
+ }
239
+
240
+ .topbar__meta {
241
+ gap: var(--sp-1);
242
+ margin-left: auto;
243
+ flex-shrink: 0;
244
+ }
245
+
246
+ .topbar__todo-btn {
247
+ width: 36px;
248
+ height: 36px;
249
+ }
250
+
251
+ .topbar__todo-btn svg {
252
+ width: 17px;
253
+ height: 17px;
254
+ }
255
+
256
+ /* ---- Chat page ---- */
257
+ #page-chat.active {
258
+ flex-direction: column;
259
+ }
260
+
261
+ .chat-log {
262
+ padding: var(--sp-4) var(--sp-3);
263
+ gap: var(--sp-4);
264
+ }
265
+
266
+ .msg-row.msg-agent {
267
+ padding-right: 0;
268
+ }
269
+
270
+ .msg-row.msg-user {
271
+ padding-left: 0;
272
+ }
273
+
274
+ .msg-col {
275
+ max-width: 96%;
276
+ }
277
+
278
+ .bubble {
279
+ font-size: 14px;
280
+ padding: 10px 13px;
281
+ }
282
+
283
+ .compose {
284
+ padding: var(--sp-2) var(--sp-3) calc(var(--sp-3) + env(safe-area-inset-bottom, 0px));
285
+ }
286
+
287
+ .compose__box {
288
+ border-radius: var(--r-lg);
289
+ }
290
+
291
+ .compose__dock {
292
+ display: flex;
293
+ align-items: center;
294
+ gap: 6px;
295
+ padding: 5px 6px 6px;
296
+ min-height: 0;
297
+ background: var(--bg-subtle);
298
+ }
299
+
300
+ .compose__dock-tools {
301
+ flex-shrink: 0;
302
+ }
303
+
304
+ .compose__dock-chips {
305
+ flex: 1;
306
+ min-width: 0;
307
+ padding: 0;
308
+ gap: 4px;
309
+ border: none;
310
+ background: transparent;
311
+ box-shadow: none;
312
+ overflow: hidden;
313
+ }
314
+
315
+ .compose__dock-actions {
316
+ flex-shrink: 0;
317
+ gap: 4px;
318
+ }
319
+
320
+ .compose__tool-btn {
321
+ width: 32px;
322
+ height: 32px;
323
+ border: none;
324
+ background: transparent;
325
+ }
326
+
327
+ .compose__chip {
328
+ height: 28px;
329
+ padding: 0 7px;
330
+ font-size: 11px;
331
+ gap: 4px;
332
+ }
333
+
334
+ .compose__chip--think {
335
+ flex-shrink: 0;
336
+ padding: 0 6px;
337
+ }
338
+
339
+ .compose__chip--think .think-toggle__label {
340
+ display: none;
341
+ }
342
+
343
+ .compose__switch-track {
344
+ width: 26px;
345
+ height: 15px;
346
+ }
347
+
348
+ .compose__switch-thumb {
349
+ width: 11px;
350
+ height: 11px;
351
+ }
352
+
353
+ .compose__chip--think[aria-pressed="true"] .compose__switch-thumb {
354
+ transform: translateX(11px);
355
+ }
356
+
357
+ .compose__chip--model {
358
+ flex: 1;
359
+ min-width: 0;
360
+ max-width: none;
361
+ padding-right: 6px;
362
+ }
363
+
364
+ .compose__chip--model .compose__chip-leading {
365
+ display: none;
366
+ }
367
+
368
+ .compose__chip-chevron {
369
+ margin-left: -2px;
370
+ }
371
+
372
+ .token-usage--compact {
373
+ padding: 2px 5px 2px 4px;
374
+ gap: 3px;
375
+ }
376
+
377
+ .token-usage--compact .token-usage__segs {
378
+ display: none;
379
+ }
380
+
381
+ .token-usage--compact .token-usage__icon {
382
+ display: inline-flex;
383
+ width: 12px;
384
+ height: 12px;
385
+ }
386
+
387
+ .token-usage--compact .token-usage__pct {
388
+ min-width: 22px;
389
+ font-size: 10px;
390
+ }
391
+
392
+ .btn--send .btn__send-label { display: none; }
393
+ .btn--send {
394
+ width: 34px;
395
+ height: 34px;
396
+ padding: 0;
397
+ border-radius: var(--r-full);
398
+ gap: 0;
399
+ }
400
+
401
+ .compose__sheet-grid {
402
+ grid-template-columns: 1fr;
403
+ padding: 2px 8px 10px;
404
+ }
405
+
406
+ .compose__head {
407
+ padding: 8px 8px 0;
408
+ }
409
+
410
+ .compose-attach-chip {
411
+ width: 60px;
412
+ }
413
+
414
+ .compose-attach-chip img {
415
+ width: 60px;
416
+ height: 46px;
417
+ }
418
+
419
+ .compose__editor #msg,
420
+ .compose__box > #msg {
421
+ padding: 10px 12px 6px;
422
+ font-size: 14px;
423
+ }
424
+
425
+ .compose-attach-chip {
426
+ max-width: 160px;
427
+ }
428
+
429
+ .bubble .md-content img,
430
+ .chat-inline-img,
431
+ .bubble-user__img,
432
+ .oa-tool-gen-images img,
433
+ .chat-img-wrap > img {
434
+ max-width: 100%;
435
+ max-height: min(40vh, 280px);
436
+ }
437
+
438
+ .chat-img-wrap__actions {
439
+ opacity: 1;
440
+ pointer-events: auto;
441
+ }
442
+
443
+ .camera-modal__dialog {
444
+ max-width: 100%;
445
+ margin: var(--sp-2);
446
+ max-height: calc(100dvh - var(--mobile-nav-h) - var(--sp-4));
447
+ display: flex;
448
+ flex-direction: column;
449
+ }
450
+
451
+ .camera-modal__video {
452
+ max-height: 50dvh;
453
+ }
454
+
455
+ #msg {
456
+ font-size: 16px; /* prevent iOS zoom on focus */
457
+ min-height: 48px;
458
+ }
459
+
460
+ /* ---- Slide panels → below the topbar (topbar remains accessible) ---- */
461
+ .todo-panel,
462
+ .git-slide-panel,
463
+ .plan-panel {
464
+ position: fixed;
465
+ top: var(--topbar-h);
466
+ left: 0;
467
+ right: 0;
468
+ bottom: var(--mobile-nav-h);
469
+ width: 100% !important;
470
+ max-width: none;
471
+ z-index: 150;
472
+ border-left: none;
473
+ }
474
+
475
+ /* ---- Forms & config pages ---- */
476
+ .page--scroll {
477
+ padding: var(--sp-4) var(--sp-3) var(--sp-8);
478
+ }
479
+
480
+ .section {
481
+ padding: var(--sp-4);
482
+ border-radius: var(--r-lg);
483
+ }
484
+
485
+ .form-row {
486
+ flex-direction: column;
487
+ align-items: stretch;
488
+ gap: var(--sp-2);
489
+ }
490
+
491
+ .form-row label {
492
+ min-width: 0;
493
+ }
494
+
495
+ .form-row input,
496
+ .form-row select,
497
+ .form-row textarea {
498
+ width: 100% !important;
499
+ max-width: none !important;
500
+ }
501
+
502
+ .section__header {
503
+ flex-direction: column;
504
+ align-items: stretch;
505
+ gap: var(--sp-2);
506
+ }
507
+
508
+ .config-grid {
509
+ grid-template-columns: 1fr;
510
+ }
511
+
512
+ .field-row {
513
+ flex-direction: column;
514
+ }
515
+
516
+ .field-row > input {
517
+ min-width: 0;
518
+ }
519
+
520
+ .preset-card {
521
+ flex-direction: column;
522
+ align-items: stretch;
523
+ gap: var(--sp-2);
524
+ }
525
+
526
+ .preset-card__actions {
527
+ margin-left: 0;
528
+ justify-content: flex-end;
529
+ }
530
+
531
+ .preset-use-type-seg__btn {
532
+ font-size: 11px;
533
+ padding: 3px 8px;
534
+ }
535
+
536
+ .compose-stack-panel__body--grid {
537
+ grid-template-columns: 1fr;
538
+ }
539
+
540
+ .compose-stack-row {
541
+ grid-template-columns: 44px minmax(0, 1fr);
542
+ }
543
+
544
+ /* ---- Cron / tasks ---- */
545
+ .cron-day-pill {
546
+ width: 38px;
547
+ height: 36px;
548
+ }
549
+
550
+ /* ---- Stats ---- */
551
+ .stats-grid {
552
+ grid-template-columns: repeat(2, 1fr);
553
+ gap: var(--sp-2);
554
+ }
555
+
556
+ /* ---- Modals ---- */
557
+ .modal__box {
558
+ max-width: calc(100vw - var(--sp-6));
559
+ margin: var(--sp-4);
560
+ }
561
+
562
+ /* 手机端 Team/Agent 等模态框可滚动 */
563
+ .modal-overlay .modal {
564
+ max-height: calc(100dvh - var(--mobile-nav-h) - var(--sp-6));
565
+ margin: var(--sp-3);
566
+ display: flex;
567
+ flex-direction: column;
568
+ }
569
+
570
+ .modal-overlay .modal__body {
571
+ flex: 1;
572
+ overflow-y: auto;
573
+ -webkit-overflow-scrolling: touch;
574
+ padding-bottom: var(--sp-4);
575
+ }
576
+
577
+ .modal-overlay .modal__footer {
578
+ flex-shrink: 0;
579
+ border-top: 1px solid var(--border);
580
+ padding: var(--sp-3);
581
+ }
582
+
583
+ /* ---- Search / session tree touch targets ---- */
584
+ .tree-session__row,
585
+ .tree-project__row,
586
+ .sess-row .sess-item-main {
587
+ min-height: 44px;
588
+ }
589
+
590
+ /* 手机端:项目名右侧的「新建会话」和「⋮」按钮始终显示(桌面版 hover 才显示) */
591
+ .tree-project__add-session,
592
+ .tree-project__menu {
593
+ display: flex;
594
+ }
595
+
596
+ .tree-footer-btn,
597
+ .search-bar__input {
598
+ min-height: 40px;
599
+ }
600
+
601
+ .project-tree__footer {
602
+ padding-bottom: env(safe-area-inset-bottom, 0px);
603
+ }
604
+ }
605
+
606
+ /* Tablet: soften layout between 769px and 900px */
607
+ @media (min-width: 769px) and (max-width: 900px) {
608
+ .topbar__sidebar-btn,
609
+ .sidebar-backdrop {
610
+ display: none !important;
611
+ }
612
+ }