@walkhi/code-relax 0.1.0-beta.2 → 0.1.0-beta.20

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/README.md +55 -71
  2. package/dist/bin/codex-remote.mjs +150 -126
  3. package/dist/bin/manage-relay-admin.mjs +20 -0
  4. package/dist/bin/migrate-relay-db.mjs +107 -0
  5. package/dist/bin/self-relay-admin.mjs +8 -0
  6. package/dist/bin/self-relay-demo.mjs +2 -2
  7. package/dist/bin/self-relay-server.mjs +18 -10
  8. package/dist/shared/app-server-events.cjs +42 -15
  9. package/dist/shared/file-mentions.cjs +35 -0
  10. package/dist/shared/server-requests.cjs +86 -58
  11. package/dist/skills/code-relax/SKILL.md +7 -6
  12. package/dist/src/desktop-launcher.mjs +16 -21
  13. package/dist/src/file-upload-session.mjs +124 -0
  14. package/dist/src/lan-socket-server.mjs +52 -9
  15. package/dist/src/managed-app-server.mjs +44 -13
  16. package/dist/src/message-images.mjs +0 -18
  17. package/dist/src/onboarding.mjs +9 -11
  18. package/dist/src/platform/README.md +1 -1
  19. package/dist/src/platform/windows/background-process.mjs +1 -1
  20. package/dist/src/platform/windows/codex-runtime.mjs +251 -0
  21. package/dist/src/platform/windows/desktop-host.mjs +17 -3
  22. package/dist/src/platform/windows/desktop-info.ps1 +2 -4
  23. package/dist/src/platform/windows/desktop-runtime.ps1 +10 -0
  24. package/dist/src/platform/windows/desktop-shortcuts.ps1 +7 -14
  25. package/dist/src/platform/windows/launch-worker.mjs +42 -0
  26. package/dist/src/platform/windows/resident-start.js +20 -0
  27. package/dist/src/platform/windows/resident-startup.ps1 +76 -20
  28. package/dist/src/platform/windows/service-host.mjs +4 -16
  29. package/dist/src/platform/windows/start-hidden-console.ps1 +10 -5
  30. package/dist/src/platform/windows/stop-desktop.ps1 +7 -4
  31. package/dist/src/platform/windows/user-environment.mjs +1 -1
  32. package/dist/src/runtime-discovery.mjs +43 -0
  33. package/dist/src/self-relay/admin-cloud.mjs +101 -0
  34. package/dist/src/self-relay/admin-page.mjs +79 -0
  35. package/dist/src/self-relay/admin-server.mjs +66 -0
  36. package/dist/src/self-relay/admin-state.mjs +82 -19
  37. package/dist/src/self-relay/admin-style.mjs +9 -0
  38. package/dist/src/self-relay/admin-usage-page.mjs +28 -0
  39. package/dist/src/self-relay/connector.mjs +243 -30
  40. package/dist/src/self-relay/demo.mjs +3 -4
  41. package/dist/src/self-relay/email-accounts.mjs +141 -0
  42. package/dist/src/self-relay/lifecycle.mjs +99 -142
  43. package/dist/src/self-relay/mysql-state.mjs +104 -0
  44. package/dist/src/self-relay/p2p-probe.mjs +1 -1
  45. package/dist/src/self-relay/server.mjs +335 -59
  46. package/dist/src/self-relay/usage-diagnostics.mjs +46 -0
  47. package/dist/src/self-relay/usage-meter.mjs +125 -0
  48. package/dist/src/server.mjs +731 -1439
  49. package/dist/src/service-control.mjs +4 -4
  50. package/dist/src/service-doctor.mjs +27 -29
  51. package/dist/src/service-health.mjs +2 -2
  52. package/dist/src/service-install.mjs +1 -4
  53. package/dist/src/service-lifecycle.mjs +19 -19
  54. package/dist/src/shared-app-server.mjs +277 -270
  55. package/dist/src/shared-catalog.mjs +1 -11
  56. package/dist/src/shared-recovery.mjs +11 -9
  57. package/dist/src/shared-thread-stream.mjs +1 -1
  58. package/dist/src/skill-install.mjs +0 -13
  59. package/package.json +17 -18
  60. package/tools/postinstall.mjs +69 -15
  61. package/dist/src/app-server-client.mjs +0 -468
  62. package/dist/src/app-server-tasks.mjs +0 -358
  63. package/dist/src/debug-ui.mjs +0 -131
  64. package/dist/src/platform/windows/desktop-monitor.mjs +0 -34
  65. package/dist/src/platform/windows/desktop-shortcut-run.ps1 +0 -5
  66. package/dist/src/platform/windows/desktop-tools.mjs +0 -48
  67. package/dist/src/platform/windows/launch-worker.ps1 +0 -20
  68. package/dist/src/thread-catalog.mjs +0 -47
  69. package/dist/tools/find-desktop-pipe.mjs +0 -10
  70. package/dist/web/activity-view.js +0 -283
  71. package/dist/web/approval-ui.js +0 -188
  72. package/dist/web/capabilities.js +0 -57
  73. package/dist/web/chat-transport.js +0 -202
  74. package/dist/web/chat.css +0 -782
  75. package/dist/web/chat.js +0 -3830
  76. package/dist/web/client-platform.js +0 -11
  77. package/dist/web/community-view.js +0 -20
  78. package/dist/web/community.css +0 -77
  79. package/dist/web/community.html +0 -37
  80. package/dist/web/composer-controller.js +0 -101
  81. package/dist/web/conversation-controller.js +0 -99
  82. package/dist/web/disclosure-state-controller.js +0 -95
  83. package/dist/web/draft-controller.js +0 -103
  84. package/dist/web/harmony-platform.js +0 -52
  85. package/dist/web/highlight-powershell.min.js +0 -39
  86. package/dist/web/highlight.min.js +0 -1262
  87. package/dist/web/history-cache.js +0 -240
  88. package/dist/web/history-controller.js +0 -167
  89. package/dist/web/index.html +0 -325
  90. package/dist/web/lan-session.js +0 -122
  91. package/dist/web/link-action-controller.js +0 -212
  92. package/dist/web/message-send-controller.js +0 -177
  93. package/dist/web/message-view.js +0 -98
  94. package/dist/web/p2p-data-channel.js +0 -50
  95. package/dist/web/p2p-diagnostics.js +0 -28
  96. package/dist/web/p2p-probe.js +0 -123
  97. package/dist/web/page-resume.js +0 -28
  98. package/dist/web/pending-message-store.js +0 -108
  99. package/dist/web/queue-controller.js +0 -82
  100. package/dist/web/resources.json +0 -1
  101. package/dist/web/self-relay-session.js +0 -129
  102. package/dist/web/server-requests.js +0 -67
  103. package/dist/web/station-connection-controller.js +0 -75
  104. package/dist/web/task-list-view.js +0 -296
  105. package/dist/web/thread-attention-controller.js +0 -124
  106. package/dist/web/thread-context-controller.js +0 -30
  107. package/dist/web/thread-list-controller.js +0 -61
  108. package/dist/web/thread-list-sync.js +0 -86
  109. package/dist/web/thread-title-controller.js +0 -57
  110. package/dist/web/timeline-formatters.js +0 -249
  111. package/dist/web/timeline-reducer.js +0 -81
  112. package/dist/web/timeline-renderer.js +0 -161
  113. package/dist/web/timeline-scroll-controller.js +0 -50
  114. package/dist/web/timeline-sync.js +0 -67
  115. package/dist/web/usage-controller.js +0 -258
  116. package/dist/web/vendor/README.md +0 -14
  117. package/dist/web/vendor/highlight-powershell.min.js +0 -39
  118. package/dist/web/vendor/highlight.LICENSE.txt +0 -29
  119. package/dist/web/vendor/highlight.min.js +0 -1262
  120. package/dist/web/vendor/lucide.LICENSE.txt +0 -17
package/dist/web/chat.css DELETED
@@ -1,782 +0,0 @@
1
- :root { --color-chart-blue:#339cff; --color-chart-purple:#ad7bf9; color-scheme: dark; font: 14px/1.45 Inter, "Segoe UI", sans-serif; background: #101311; color: #e8eee9; }
2
- .sidebar-brand > span { touch-action: manipulation; user-select: none; }
3
- .connection-notice { display:flex; flex:none; align-items:center; gap:8px; padding:6px 10px; color:#87958c; font-size:12px; }
4
- .connection-notice[hidden] { display:none; }
5
- .connection-indicator { width:7px; height:7px; border-radius:50%; background:currentColor; flex:none; }
6
- .connection-notice.connecting .connection-indicator { width:10px; height:10px; background:none; border:1.5px solid currentColor; border-right-color:transparent; animation:connection-spin 1s linear infinite; }
7
- .connection-notice button { margin-left:auto; padding:3px 6px; border:0; background:transparent; color:inherit; font-size:inherit; }
8
- @keyframes connection-spin { to { transform:rotate(360deg); } }
9
- .model-menu[aria-disabled="true"] .model-option, .model-menu[aria-disabled="true"] .effort-track { opacity:.45; }
10
- .file-action-menu { position:fixed; z-index:80; display:grid; min-width:180px; max-width:min(280px, calc(100vw - 16px)); gap:3px; padding:5px; border:1px solid #465149; border-radius:11px; background:#252d28; box-shadow:0 10px 28px #0007; }
11
- .file-action-name { display:flex; min-width:0; padding:7px 9px 8px; overflow:hidden; border-bottom:1px solid #465149; color:#b8c4bc; font-size:12px; line-height:16px; white-space:nowrap; }
12
- .file-action-name-body { min-width:0; overflow:hidden; direction:rtl; text-align:left; text-overflow:ellipsis; unicode-bidi:plaintext; }
13
- .file-action-name-extension { flex:none; }
14
- .link-action-url { display:block; overflow:hidden; direction:ltr; text-align:left; text-overflow:ellipsis; }
15
- .file-action-menu > button { border:0; padding:8px 14px; background:transparent; text-align:left; }
16
- .file-action-menu > button:hover { background:#ffffff0d; }
17
- html { height: 100%; overflow: hidden; }
18
- body { height: 100%; }
19
- * { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
20
- body { display: flex; flex-direction: column; margin: 0; min-height: 100vh; overflow: hidden; background: radial-gradient(circle at 20% 0%, #203329 0, #101311 38%); }
21
- header { display: flex; flex: none; align-items: center; gap: 13px; min-width: 0; padding: 10px 18px; border-bottom: 1px solid #2c3830; white-space: nowrap; }
22
- h1 { flex: none; margin: 0; font-size: 16px; }
23
- .sub { min-width: 0; overflow: hidden; color: #9fb0a5; font-size: 11px; text-overflow: ellipsis; }
24
- .status { display: inline-flex; flex: none; align-items: center; gap: 7px; margin-left: auto; color: #b8c8bd; font-size: 12px; }
25
- .dot { width: 9px; height: 9px; border-radius: 50%; background: #768078; }
26
- .dot.ok { background: #42d17b; box-shadow: 0 0 12px #42d17b80; }
27
- main { display: grid; grid-template-columns: minmax(230px, 280px) minmax(0, 1fr); flex: 1; min-height: 0; }
28
- aside { min-height: 0; overflow-y: auto; overflow-anchor: none; overscroll-behavior: contain; border-right: 1px solid #2c3830; padding: 12px 8px; background: #171c19; scrollbar-width: thin; scrollbar-color: #3b443f transparent; }
29
- section { position: relative; display: flex; flex-direction: column; min-width: 0; min-height: 0; overflow: hidden; padding: 14px 22px 18px; }
30
- button, textarea, select { font: inherit; }
31
- button { border: 1px solid #405248; background: #1d2821; color: #e8eee9; border-radius: 8px; padding: 8px 12px; cursor: pointer; }
32
- button:hover { background: #29372e; }
33
- button:disabled { opacity: .45; cursor: default; }
34
- button { appearance:none; -webkit-appearance:none; }
35
- button:focus:not(:focus-visible), [role="button"]:focus:not(:focus-visible) { outline:none; }
36
- button:focus-visible, [role="button"]:focus-visible { outline:2px solid #6b9fd8; outline-offset:2px; }
37
- .toolbar { display: flex; align-items: center; justify-content: space-between; min-height: 28px; margin: 0 4px 7px; color: #8d9891; }
38
- .sidebar-title { font-size: 12px; font-weight: 650; letter-spacing: .04em; }
39
- .project.recent { margin-top: 24px; }
40
- .project.recent .project-tasks { margin: 0; padding-left: 0; }
41
- .recent-heading { margin: 0; padding: 6px 10px; color: #858e89; font-size: 12px; font-weight: 600; }
42
- .refresh-icon { width: 25px; height: 25px; border: 0; padding: 0; border-radius: 6px; color: #8d9891; background: transparent; font-size: 15px; }
43
- .project { margin: 0 0 4px; }
44
- .project-header { display: flex; align-items: center; width: calc(100% - 4px); min-width: 0; margin: 0 2px; border: 0; border-radius: 6px; padding: 2px 4px; color: #d4ddd7; background: transparent; }
45
- .project-header:hover { background: #222824; }
46
- .project-toggle { display: flex; flex: 1; min-width: 0; align-items: center; border: 0; padding: 3px 2px; color: inherit; background: transparent; text-align: left; }
47
- .project-toggle:hover { background: transparent; }
48
- .project-folder { display: grid; place-items: center; width: 17px; height: 17px; flex: none; margin-right: 8px; color: #aab3ad; }
49
- .project-folder svg { display: block; width: 17px; height: 17px; overflow: visible; fill: none; stroke: currentColor; stroke-width: 1.35; stroke-linecap: round; stroke-linejoin: round; }
50
- .project-name { flex: 1; min-width: 0; overflow: hidden; font-size: 12px; font-weight: 500; line-height: 1.35; text-overflow: ellipsis; white-space: nowrap; }
51
- .project-path, .project-count { display: none; }
52
- .project-tasks { margin: 0 3px 2px 17px; padding-left: 7px; }
53
- .project.collapsed .project-tasks { display: none; }
54
- .task-swipe { position:relative; width:100%; overflow:hidden; border-radius:7px; -webkit-user-select:none; user-select:none; }
55
- .task { position:relative; z-index:1; display: flex; width: 100%; min-width: 0; align-items: center; gap: 8px; margin: 1px 0; border: 0; border-radius: 7px; padding: 6px 9px; color: #cbd4ce; background: #171c19; text-align: left; touch-action:pan-y; transition:transform .16s ease; }
56
- .task-swipe-action { position:absolute; z-index:0; inset:1px 0 1px auto; width:104px; display:flex; align-items:center; justify-content:flex-end; pointer-events:none; border:0; padding:0 12px 6px; color:#f3b45f; background:transparent; font-size:12px; }
57
- .task-swipe.swiping { background:#202823; }
58
- .task-swipe.swiping .task { border-radius:0; background:#202823; }
59
- .task-swipe .task-swipe-action { width:max-content; white-space:nowrap; transform:translateX(calc(100% - var(--swipe-offset, 0px))); }
60
- .task-swipe.swiping::after { content:''; position:absolute; z-index:2; right:0; bottom:2px; width:var(--swipe-threshold); height:2px; border-radius:999px; background:linear-gradient(to left, #f3b45f calc(var(--swipe-progress, 0) * 100%), #f3b45f30 0); pointer-events:none; }
61
- .task-swipe.swipe-ready::after { background:#ffd08a; }
62
- .task-swipe.swipe-ready .task-swipe-action { color:#ffd08a; }
63
- .task-swipe-action[hidden] { display:none; }
64
- .task:hover { background: #242a26; }
65
- .task.active { background: #303632; }
66
- .task-title { flex: 1; min-width: 0; overflow: hidden; font-size: 12px; font-weight: 400; line-height: 1.35; text-overflow: ellipsis; white-space: nowrap; }
67
- .running-status { width: 13px; height: 13px; flex: none; border: 1.5px solid #5e6962; border-top-color: #c2cbc5; border-radius: 50%; animation: status-spin .9s linear infinite; }
68
- .approval-status { display: inline-flex; align-items: center; flex: none; color: #f2b65a; font-size: 12px; font-weight: 650; line-height: 1.2; white-space: nowrap; }
69
- .archive-status { display:inline-flex; align-items:center; flex:none; color:#d9a45f; font-size:12px; font-weight:600; line-height:1.2; white-space:nowrap; }
70
- .unread-status { width: 9px; height: 9px; flex: none; border-radius: 50%; background: #4285e8; }
71
- .project-header > :is(.approval-status, .running-status, .unread-status) { margin: 0 7px 0 auto; }
72
- .project-actions { display: flex; flex: none; align-items: center; gap: 1px; opacity: 0; pointer-events: none; }
73
- .project-header:hover > :is(.approval-status, .running-status, .unread-status), .project-header:focus-within > :is(.approval-status, .running-status, .unread-status) { display: none; }
74
- .project-header:hover .project-actions, .project-header:focus-within .project-actions { opacity: 1; pointer-events: auto; }
75
- .project-action { display: grid; place-items: center; width: 24px; height: 24px; border: 0; border-radius: 5px; padding: 0; color: #9ca69f; background: transparent; }
76
- .project-action:hover { color: #e1e7e3; background: #353c38; }
77
- .project-action.more { font-size: 16px; letter-spacing: 1px; line-height: 1; }
78
- .project-action[aria-disabled="true"] { cursor: default; }
79
- .project-action svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }
80
- @keyframes status-spin { to { transform: rotate(360deg); } }
81
- .task-meta { display: none; }
82
- .archive-list-entry { display:flex; align-items:center; gap:9px; flex:none; width:100%; padding:9px 8px; border:0; border-radius:0; background:transparent; color:#9eaca3; text-align:left; font-size:12px; }
83
- .archive-list-entry > span { flex:1; }
84
- .archive-list-entry[hidden] { display:none; }
85
- #empty { color: #91a397; padding: 28px 0; }
86
- #selected { display: flex; flex: 1; min-height: 0; flex-direction: column; }
87
- #selected[hidden] { display: none; }
88
- .selected-heading { display: flex; flex: none; align-items: center; min-width: 0; min-height: 28px; padding: 2px; margin-bottom: 4px; background: transparent; white-space: nowrap; }
89
- #selectedTitle { flex: 0 1 auto; min-width: 0; overflow: hidden; margin: 0; font-size: 15px; text-overflow: ellipsis; white-space: nowrap; }
90
- #selectedMeta { display: flex; flex: 1; min-width: 0; flex-wrap: nowrap; align-items: center; gap: 7px; overflow: hidden; color: #91a397; font-size: 11px; }
91
- #selectedMeta > span:first-child { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
92
- .live { display: inline-flex; align-items: center; gap: 5px; color: #7d9183; }
93
- .live::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: #68736b; }
94
- .live.connected { color: #71d695; }
95
- .live.connected::before { background: #42d17b; box-shadow: 0 0 8px #42d17b80; }
96
- #timeline { display: flex; flex: 1; min-height: 0; flex-direction: column; gap: 12px; overflow-y: auto; overscroll-behavior: contain; padding: 6px 14px 18px 0; scroll-padding-bottom: 18px; scrollbar-width: none; }
97
- #timeline::-webkit-scrollbar { display: none; }
98
- .scroll-to-bottom { position: absolute; z-index: 8; right: 34px; bottom: 122px; display: grid; place-items: center; width: 32px; height: 32px; border: 1px solid #3b453f; border-radius: 50%; padding: 0; color: #e1e7e3; background: #202622; transition: background-color .15s ease, opacity .15s ease; }
99
- .scroll-to-bottom .codex-icon { width: 20px; height: 20px; transform: rotate(180deg); }
100
- .scroll-to-bottom[hidden] { display: none; }
101
- .turn { display: flex; flex-direction: column; min-width: 0; gap: 12px; }
102
- .turn-label { align-self: center; color: #748379; font-size: 11px; margin: 5px 0; }
103
- .turn-error { display: flex; align-items: flex-start; align-self: stretch; gap: 9px; border: 1px solid #343c37; border-radius: 14px; padding: 12px 14px; color: #e6ebe7; font-size: 12px; line-height: 1.45; }
104
- .turn-error-icon { display: grid; place-items: center; width: 16px; height: 16px; flex: none; margin-top: 1px; border: 1.5px solid currentColor; border-radius: 50%; font-size: 10px; font-weight: 750; line-height: 1; }
105
- .turn-error-message { min-width: 0; word-break: break-word; }
106
- .message { max-width: 88%; border-radius: 12px; padding: 10px 12px; font-size: 13px; line-height: 1.55; word-break: break-word; }
107
- .message.user { align-self: flex-end; padding: 5px 12px; background: #244a35; border: 1px solid #397655; }
108
- .pending-message { display: flex; flex-direction: column; align-self: stretch; min-width: 0; gap: 6px; }
109
- .pending-message-status { align-self:flex-end; color:#94a79a; font-size:12px; }
110
- .pending-message-actions { align-self:flex-end; display:flex; gap:8px; }
111
- .pending-message-actions[hidden] { display:none; }
112
- .pending-message-actions button { padding:4px 8px; font-size:12px; background:transparent; color:#94a79a; }
113
- .message.agent { align-self: stretch; max-width: 100%; padding: 3px 2px; border: 0; border-radius: 0; background: transparent; }
114
- .message.commentary { color: #b9c9be; border-style: dashed; }
115
- .message.final { border: 0; background: transparent; }
116
- .role { display: none; }
117
- .message-body { min-width: 0; }
118
- .message-body > :first-child { margin-top: 0; }
119
- .message-body > :last-child { margin-bottom: 0; }
120
- .message-body p { margin: .6em 0; }
121
- .message-body h1, .message-body h2, .message-body h3, .message-body h4 { margin: .9em 0 .45em; line-height: 1.3; }
122
- .message-body h1 { font-size: 1.35em; }
123
- .message-body h2 { font-size: 1.22em; }
124
- .message-body h3, .message-body h4 { font-size: 1.08em; }
125
- .message-body ul, .message-body ol { margin: .55em 0; padding-left: 1.5em; }
126
- .message-body blockquote { margin: .7em 0; padding: .1em 0 .1em .9em; border-left: 3px solid #4f765e; color: #b6c5ba; }
127
- .message-body code { border-radius: 4px; padding: .12em .35em; background: #0b100d; font: .88em/1.45 "Cascadia Mono", Consolas, monospace; }
128
- .message-body pre { margin: .75em 0; padding: 11px 12px; overflow: auto; border: 1px solid #29372e; border-radius: 8px; background: #090c0a; white-space: pre; }
129
- .message-body pre code { padding: 0; background: transparent; font-size: 12px; }
130
- .message-body .code-block { margin: .75em 0; overflow: hidden; border: 1px solid #29372e; border-radius: 12px; background: #090c0a; }
131
- .message-body .code-block-header { display: flex; min-height: 48px; align-items: center; gap: 8px; padding: 6px 6px 6px 16px; color: #aeb9b2; font-size: 14px; font-weight: 500; line-height: 1.3; user-select: none; }
132
- .message-body .code-block-language { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
133
- .message-body .code-block-copy { display: grid; place-items: center; width: 32px; height: 32px; flex: none; margin-left: auto; border: 0; border-radius: 8px; padding: 0; color: #aeb9b2; background: transparent; }
134
- .message-body .code-block-copy:hover { color: #e8eee9; background: #ffffff0d; }
135
- .message-body .code-block-copy[data-copy-state="copied"] { color: #e8eee9; }
136
- .message-body .code-block-copy-icon { display: block; width: 16px; height: 16px; }
137
- .message-body .code-block pre { margin: 0; padding: 0 16px 12px; border: 0; border-radius: 0; background: transparent; }
138
- .message-body .code-block code.hljs { color: #d9e3dc; }
139
- .message-body .hljs-comment, .message-body .hljs-quote { color: #789083; font-style: italic; }
140
- .message-body .hljs-keyword, .message-body .hljs-selector-tag, .message-body .hljs-literal,
141
- .message-body .hljs-section, .message-body .hljs-link { color: #c99aef; }
142
- .message-body .hljs-string, .message-body .hljs-doctag, .message-body .hljs-regexp,
143
- .message-body .hljs-template-tag, .message-body .hljs-template-variable { color: #a7d08c; }
144
- .message-body .hljs-number, .message-body .hljs-symbol, .message-body .hljs-bullet { color: #efb36d; }
145
- .message-body .hljs-title, .message-body .hljs-title.class_, .message-body .hljs-title.function_ { color: #82b7e8; }
146
- .message-body .hljs-type, .message-body .hljs-built_in, .message-body .hljs-attribute,
147
- .message-body .hljs-selector-attr, .message-body .hljs-selector-class, .message-body .hljs-selector-pseudo { color: #e4ca82; }
148
- .message-body .hljs-variable, .message-body .hljs-params, .message-body .hljs-property { color: #d9e3dc; }
149
- .message-body .hljs-meta, .message-body .hljs-meta .hljs-keyword { color: #85c9c0; }
150
- .message-body .hljs-addition { color: #85c997; background: #2d694733; }
151
- .message-body .hljs-deletion { color: #ed9292; background: #7d303033; }
152
- .message-body .hljs-emphasis { font-style: italic; }
153
- .message-body .hljs-strong { font-weight: 700; }
154
- .message-body a { color: #73d99a; text-decoration: none; }
155
- .message-body a:hover { text-decoration: underline; }
156
- .message-body table { display: block; max-width: 100%; overflow: auto; border-collapse: collapse; }
157
- .message-body th, .message-body td { border: 1px solid #35433a; padding: 6px 8px; }
158
- .message-body hr { border: 0; border-top: 1px solid #35433a; }
159
- .user-attachments { display: flex; align-self: flex-end; max-width: 88%; flex-wrap: wrap; justify-content: flex-end; gap: 7px; }
160
- .image-thumb { width: 72px; height: 72px; overflow: hidden; padding: 0; border: 1px solid #45564b; border-radius: 8px; background: #0b0e0c; }
161
- .image-thumb:hover { border-color: #6e8a78; background: #0b0e0c; }
162
- .image-thumb img { display: block; width: 100%; height: 100%; object-fit: cover; }
163
- .image-thumb.image-placeholder { position: relative; display: grid; place-items: center; color: #66746b; }
164
- .image-placeholder-art { display: grid; place-items: center; width: 38px; height: 38px; }
165
- .image-placeholder-art svg { width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: 1.35; stroke-linecap: round; stroke-linejoin: round; }
166
- .image-placeholder-refresh { position: absolute; right: 5px; bottom: 5px; display: grid; place-items: center; width: 23px; height: 23px; border: 1px solid #4b5d52; border-radius: 50%; color: #b4c1b8; background: #151b17; }
167
- .image-placeholder-refresh svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
168
- .image-thumb.image-placeholder.loading .image-placeholder-refresh svg { animation: image-refresh-spin .8s linear infinite; }
169
- @keyframes image-refresh-spin { to { transform: rotate(360deg); } }
170
- #draftImages .image-thumb { position: relative; margin-bottom: 8px; }
171
- .remove-image { position: absolute; right: 2px; top: 2px; width: 20px; height: 20px; border-radius: 50%; background: #101311dd; color: white; line-height: 18px; }
172
- .message.agent .message-image { display: block; max-width: min(100%, 640px); max-height: 380px; margin-top: 9px; border-radius: 8px; object-fit: contain; }
173
- .activity { align-self: stretch; border: 0; border-radius: 6px; background: transparent; color: #8f9b93; }
174
- .activity summary { display: flex; align-items: center; gap: 6px; cursor: pointer; padding: 3px 2px; font-size: 12px; line-height: 1.35; white-space: nowrap; list-style: none; }
175
- .activity summary::-webkit-details-marker { display: none; }
176
- .activity-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
177
- .activity-icon { width: 15px; height: 15px; flex: none; color: #8e9892; }
178
- .activity-icon svg { display: block; width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
179
- .activity-icon.filled svg { fill: currentColor; stroke: none; }
180
- .activity pre { margin: 0; padding: 2px 8px 6px 20px; overflow: auto; white-space: pre-wrap; word-break: break-word; font: 10.5px/1.45 "Cascadia Mono", Consolas, monospace; }
181
- .activity.compact { display: flex; align-items: center; gap: 6px; padding: 3px 2px; font-size: 12px; line-height: 1.35; }
182
- .activity-copy { display: grid; place-items: center; width: 26px; height: 26px; flex: none; padding: 0; border: 0; border-radius: 5px; color: #819087; background: transparent; }
183
- .activity-copy:hover { color: #d5ddd8; background: #ffffff0b; }
184
- .activity-copy[data-copy-state="copied"] { color: #76d395; }
185
- .activity-copy .code-block-copy-icon { display: block; width: 14px; height: 14px; }
186
- .command-shell { margin: 4px 2px 8px 20px; overflow: hidden; border: 1px solid #354039; border-radius: 8px; background: #111713; color: #d5ddd8; }
187
- .command-shell-command { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: start; gap: 7px; padding: 7px 8px 7px 10px; border-bottom: 1px solid #2a352e; font: 11px/1.5 "Cascadia Mono", Consolas, monospace; }
188
- .command-shell-command code { min-width: 0; padding: 3px 0; overflow-wrap: anywhere; white-space: pre-wrap; color: inherit; background: transparent; }
189
- .command-shell-prompt { padding-top: 3px; color: #76d395; user-select: none; }
190
- .command-shell-output { position: relative; overflow: hidden; padding: 9px 36px 9px 10px; }
191
- .command-shell-output pre { min-width: 0; min-height: 16px; max-height: 182px; padding: 0; overflow-x: hidden; overflow-y: auto; white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word; color: #c2ccc5; font-size: 10.5px; }
192
- .command-shell-output pre.empty { color: #758279; font-style: italic; white-space: pre-wrap; }
193
- .command-shell-output .activity-copy { position: absolute; top: 5px; right: 5px; }
194
- .command-shell-footer { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-height: 28px; padding: 5px 9px 5px 10px; border-top: 1px solid #2a352e; color: #7f8d84; font-size: 10.5px; }
195
- .command-shell-cwd { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
196
- .command-shell-status { flex: none; color: #97a59c; }
197
- .tool-detail { display: flex; flex-direction: column; gap: 8px; margin: 4px 2px 8px 20px; padding: 9px 10px; border: 1px solid #354039; border-radius: 8px; background: #111713; color: #c2ccc5; font-size: 11px; }
198
- .tool-detail-section { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
199
- .tool-detail-heading { color: #89968e; font-size: 10.5px; font-weight: 600; }
200
- .tool-detail-fields { display: grid; grid-template-columns: minmax(58px, max-content) minmax(0, 1fr); gap: 4px 10px; margin: 0; }
201
- .tool-detail-fields dt { color: #7f8d84; }
202
- .tool-detail-fields dd { min-width: 0; margin: 0; overflow-wrap: anywhere; }
203
- .tool-detail-fields dd > .tool-detail-fields { margin-top: 4px; }
204
- .tool-detail .tool-detail-text { max-height: 200px; margin: 0; padding: 7px 8px; overflow: auto; white-space: pre-wrap; word-break: break-word; border-radius: 5px; background: #0b100d; color: #c2ccc5; font: 10.5px/1.5 "Cascadia Mono", Consolas, monospace; }
205
- .tool-detail-list { display: flex; flex-direction: column; gap: 4px; margin: 0; padding-left: 18px; }
206
- .tool-detail-section.error { color: #ec8b83; }
207
- .tool-detail-footer { padding-top: 3px; border-top: 1px solid #2a352e; color: #7f8d84; text-align: right; font-size: 10px; }
208
- .tool-detail .muted { color: #758279; }
209
- .image-view-detail { padding: 4px 0 3px 23px; }
210
- .image-view-thumb { display: block; width: 100px; height: 100px; overflow: hidden; padding: 0; border: 1px solid #354039; border-radius: 9px; background: #0b0e0c; }
211
- .image-view-thumb:hover { border-color: #66776c; background: #0b0e0c; }
212
- .image-view-thumb img { display: block; width: 100%; height: 100%; object-fit: cover; }
213
- .generated-image { align-self: flex-start; max-width: min(100%, 640px); }
214
- .generated-image > .image-thumb { width: min(280px, 70vw); height: 160px; color: #89968e; }
215
- .generated-image-button { display: block; max-width: 100%; overflow: hidden; padding: 0; border: 1px solid #354039; border-radius: 10px; background: #0b0e0c; }
216
- .generated-image-button:hover { border-color: #66776c; background: #0b0e0c; }
217
- .generated-image-preview { display: block; max-width: 100%; max-height: min(520px, 65vh); object-fit: contain; }
218
- .generated-image-group { display: grid; grid-template-columns: minmax(0, 1fr) clamp(42px, 12vw, 56px); align-self: flex-start; width: min(100%, 712px); gap: 8px; }
219
- .generated-image-stack { position: relative; min-width: 0; aspect-ratio: 1; overflow: hidden; border: 1px solid #354039; border-radius: 10px; background: #0b0e0c; }
220
- .generated-image-slide { position: absolute; inset: 0; display: grid; place-items: center; }
221
- .generated-image-slide[hidden] { display: none; }
222
- .generated-image-slide > .generated-image { width: 100%; height: 100%; max-width: none; }
223
- .generated-image-slide .generated-image-button, .generated-image-slide .generated-image > .image-thumb { width: 100%; height: 100%; border: 0; border-radius: 0; }
224
- .generated-image-slide .generated-image-preview { width: 100%; height: 100%; max-height: none; object-fit: contain; }
225
- .generated-image-controls { display: flex; flex-direction: column; align-items: stretch; position: relative; gap: 8px; height: 0; min-height: 100%; overflow-y: auto; scrollbar-width: thin; }
226
- .generated-image-thumbnail { flex: none; width: 100%; aspect-ratio: 1; padding: 2px; overflow: hidden; border: 2px solid transparent; border-radius: 7px; background: #151b17; color: #89968e; font-size: 10px; }
227
- .generated-image-thumbnail[aria-pressed="true"] { border-color: #71d695; }
228
- .generated-image-thumbnail img { display: block; width: 100%; height: 100%; object-fit: cover; border-radius: 3px; }
229
- .process { align-self: stretch; min-width: 0; border: 0; border-radius: 0; background: transparent; }
230
- .process > summary { display: flex; align-items: center; justify-content: flex-start; gap: 5px; cursor: pointer; padding: 8px 2px; border-bottom: 1px solid #252e28; color: #94a79a; font-size: 12px; font-weight: 650; list-style: none; }
231
- .process > summary::-webkit-details-marker { display: none; }
232
- .process > summary[aria-disabled="true"] { cursor:default; pointer-events:none; }
233
- .disclosure-chevron { display: grid; place-items: center; width: 14px; height: 14px; flex: none; color: #758078; opacity: 0; transform: rotate(0deg); transition: transform .12s ease, opacity .12s ease; }
234
- .disclosure-chevron svg { display: block; width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
235
- :is(.process, .activity)[open] > summary > .disclosure-chevron { opacity: 1; }
236
- .process[open] > summary > .disclosure-chevron { transform: rotate(90deg); }
237
- .activity[open] > summary > .disclosure-chevron { transform: rotate(90deg); }
238
- .process.running > summary { color: #71d695; }
239
- .active-process > summary { min-width: 0; overflow: hidden; justify-content: flex-start; border-bottom: 0; color: #818c84; font-weight: 400; white-space: nowrap; }
240
- .active-process > summary > .activity-title { flex: 0 1 auto; min-width: 0; }
241
- .active-process > summary > .pulse { flex: 0 0 7px; margin-left: 2px; }
242
- .active-process[open] > summary { border-bottom: 1px solid #252e28; }
243
- .settled-process > summary { justify-content: flex-start; border-bottom: 0; color: #969f99; font-weight: 400; }
244
- .settled-process[open] > summary { border-bottom: 0; }
245
- .process-body { display: flex; flex-direction: column; gap: 4px; padding: 6px 0 9px; }
246
- .process-body .settled-process { margin: 1px 0; }
247
- .process-body .settled-process > summary { padding: 3px 2px; }
248
- .process-body .settled-process > .process-body { gap: 0; padding: 2px 0 5px 15px; }
249
- .process-body .message.commentary { max-width: 100%; padding: 2px 0; border: 0; border-radius: 0; background: transparent; color: #c4cec7; }
250
- .process-body .message.commentary .role { display: none; }
251
- .process-count { display: none; }
252
- .turn-duration { align-self: stretch; padding: 9px 2px 8px; border-bottom: 1px solid #252e28; color: #969f99; font-size: 12px; font-weight: 650; }
253
- .live-step { display: flex; align-items: center; gap: 8px; padding: 7px 2px 2px; color: #8f9a92; font-size: 12px; }
254
- .pulse { width: 7px; height: 7px; border-radius: 50%; background: #52cc7c; animation: pulse 1.2s ease-in-out infinite; }
255
- @keyframes pulse { 0%, 100% { opacity: .35; transform: scale(.85); } 50% { opacity: 1; transform: scale(1.1); } }
256
- .attachment { display: inline-block; margin: 8px 6px 0 0; border: 1px solid #43604d; border-radius: 999px; padding: 3px 8px; color: #a8bbad; font-size: 11px; }
257
- .diff-add { margin-left: 5px; color: #52d883; }
258
- .diff-remove { margin-left: 3px; color: #ff625d; }
259
- .queue-panel { display: grid; flex: none; gap: 5px; margin-top: 7px; }
260
- .queue-panel[hidden] { display: none; }
261
- .queued-message { display: flex; align-items: center; gap: 8px; min-width: 0; border: 1px solid #343b36; border-radius: 10px; padding: 7px 9px; background: #202421; color: #cbd4ce; font-size: 11px; }
262
- .queued-text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
263
- .queued-error { color: #ff8c82; }
264
- .queue-action { flex: none; border: 0; padding: 4px 6px; background: transparent; color: #98a39c; font-size: 10px; }
265
- .queue-action:hover { color: #e8eee9; background: #303632; }
266
- .composer { container:composer / inline-size; position: relative; display: grid; flex: none; gap: 2px; margin-top: 8px; padding: 5px 11px; border: 1px solid #354139; border-radius: 15px; background: #181d1a; }
267
- #draftImages:empty { display:none !important; }
268
- .pending-settings { display: flex; align-items: center; gap: 5px; color: #9fb2a5; font-size: 11px; line-height: 1.35; }
269
- .pending-settings[hidden] { display: none; }
270
- .clear-pending-settings { display: grid; place-items: center; width: 18px; height: 18px; flex: none; border: 0; border-radius: 5px; padding: 0; color: #829087; background: transparent; font-size: 16px; line-height: 1; }
271
- .clear-pending-settings:hover { color: #e8eee9; background: #303632; }
272
- textarea { width: 100%; min-height: 62px; resize: none; border: 0; outline: 0; padding: 3px 1px; color: #eef4ef; background: transparent; font-size: 13px; }
273
- #prompt { width:calc(100% - 40px); height:48px; min-height:48px; overflow-y:auto; font-size:12px; line-height:1.5; }
274
- .voice-stop-popover { position:absolute; top:-48px; left:12px; z-index:20; padding:4px; border:1px solid #465149; border-radius:12px; background:#252d28; box-shadow:0 4px 16px #0003; }
275
- .voice-stop-popover[hidden] { display:none; }
276
- #stopVoiceToEdit { min-width:112px; min-height:36px; padding:6px 16px; border:0; border-radius:8px; background:transparent; color:#dce3de; font-size:13px; }
277
- #stopVoiceToEdit:disabled { opacity:.6; }
278
- @media (prefers-color-scheme:light) { .voice-stop-popover { background:#f5f7f5; border-color:#d5ddd8; } #stopVoiceToEdit { color:#34443a; } }
279
- .composer-row { display: flex; justify-content: space-between; align-items: center; gap: 12px; }
280
- #actionToast { position:fixed; top:calc(env(safe-area-inset-top, 0px) + 4px); left:50%; transform:translateX(-50%); max-width:calc(100vw - 24px); padding:6px 12px; font-size:12px; line-height:1.4; border-radius:8px; background:#364039; color:#f0f4f1; box-shadow:0 2px 10px #0004; z-index:100; pointer-events:none; }
281
- .composer-controls { display: flex; align-items: center; gap: 12px; margin-left: auto; }
282
- .permission-control { position:relative; flex:none; }
283
- .permission-control[hidden], .permission-menu[hidden], .permission-option[hidden] { display:none; }
284
- .permission-trigger { display:flex; align-items:center; gap:4px; height:28px; padding:0 6px; border:0; border-radius:7px; color:#aaa; background:transparent; font-size:11px; white-space:nowrap; }
285
- .permission-trigger .codex-icon { width:14px; height:14px; }
286
- .permission-trigger.full-access { color:#ef8a43; background:#ef8a4312; }
287
- .permission-trigger:hover, .permission-trigger[aria-expanded="true"] { background:#ffffff0a; }
288
- .permission-menu { position:absolute; z-index:21; bottom:calc(100% + 8px); left:0; width:318px; max-width:calc(100vw - 76px); padding:6px; border:1px solid #ffffff14; border-radius:14px; background:#303030; box-shadow:0 12px 28px #0005; }
289
- .permission-menu-title { padding:4px 6px 7px; color:#aaa; font-size:11px; }
290
- .permission-option { display:flex; align-items:center; justify-content:space-between; gap:10px; width:100%; padding:7px 6px; border:0; border-radius:8px; text-align:left; color:#eee; background:transparent; }
291
- .permission-option:hover { background:#ffffff0a; }
292
- .permission-option strong { display:block; font-size:12px; font-weight:600; }
293
- .permission-option small { display:block; color:#aaa; font-size:11px; }
294
- .permission-check { visibility:hidden; flex:none; }
295
- .permission-option[aria-checked="true"] .permission-check { visibility:visible; }
296
- .permission-option[data-permission="full"], .permission-option[data-permission="full"] small { color:#ef8a43; }
297
- .model-control { position:relative; min-width: 0; }
298
- .model-trigger { display: flex; align-items: center; gap: 6px; height: 32px; max-width: 230px; border: 0; padding: 0 7px; border-radius: 8px; color: #dbe3dd; background: transparent; font-size: 12px; }
299
- .model-trigger[aria-expanded="true"] { background: #252c28; }
300
- #modelSummary { display:flex; align-items:center; gap:4px; min-width:0; overflow:hidden; white-space:nowrap; }
301
- #modelSummaryName { min-width:0; overflow:hidden; text-overflow:ellipsis; }
302
- #modelSummaryEffort { flex:none; }
303
- .model-fast-indicator { display:flex; flex:none; color:inherit; }
304
- .model-fast-indicator[hidden] { display:none; }
305
- .model-fast-indicator .codex-icon { width:14px; height:14px; }
306
- #modelSummaryEffort { color:#aaa; }
307
- .codex-icon { display: block; width: 16px; height: 16px; flex: none; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
308
- .codex-icon.filled { fill: currentColor; stroke: none; }
309
- .chevron { display: grid; place-items: center; width: 14px; height: 14px; flex: none; color: #8d9a91; }
310
- .chevron .codex-icon { width: 14px; height: 14px; }
311
- .context-meter { --context-percent: 0; position: relative; width: 15px; height: 15px; flex: none; border-radius: 50%; background: conic-gradient(#77d99a calc(var(--context-percent) * 1%), #4a554e 0); }
312
- .context-meter::before { content: ""; position: absolute; inset: 3px; border-radius: 50%; background: #181d1a; }
313
- .context-meter.warning { background: conic-gradient(#f3bc66 calc(var(--context-percent) * 1%), #364139 0); }
314
- .context-meter.danger { background: conic-gradient(#ff7d70 calc(var(--context-percent) * 1%), #364139 0); }
315
- .question-reply + .question-reply { margin-top:12px; }
316
- .question-history { margin:12px 0; }
317
- .question-history p { margin:6px 0; }
318
- .question-history button { margin-top:6px; padding:6px 10px; border:1px solid #8884; border-radius:8px; color:inherit; background:transparent; font-size:12px; }
319
- .question-form { display:flex; flex-direction:column; margin:12px 0; padding:12px 15px; border:1px solid #8883; border-radius:20px; background:#2d2d2d; }
320
- .question-header { order:-1; display:flex; align-items:center; justify-content:space-between; margin-bottom:12px; color:#aaa; font-size:12px; }
321
- .question-form fieldset { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:8px; min-width:0; margin:0; padding:0; border:0; }
322
- .question-form fieldset[hidden] { display:none; }
323
- .question-group { display:contents; }
324
- .question-group > div { grid-column:1/-1; }
325
- .question-group > div:first-child { font-weight:600; font-size:13px; }
326
- .question-choices { display:grid; gap:5px; counter-reset:choice; }
327
- .question-form button { padding:5px 9px; border:1px solid #8884; border-radius:16px; color:inherit; background:transparent; font-size:12px; }
328
- .question-choices button { display:flex; align-items:center; gap:9px; width:100%; padding:4px 0; border:0; border-radius:8px; text-align:left; counter-increment:choice; }
329
- .question-choices button::before { content:counter(choice); display:grid; place-items:center; flex:none; width:26px; height:26px; border:1px solid #8884; border-radius:50%; background:#8881; color:#aaa; }
330
- .question-choices button[aria-pressed="true"] { background:#8882; }
331
- .question-choices button[aria-pressed="true"]::before { background:#ddd; color:#222; }
332
- .question-form textarea { grid-column:1/-1; min-height:30px; height:30px; padding:6px 0; border:0; border-radius:0; font-size:13px; }
333
- .question-group:nth-last-child(2) textarea { grid-column:1; }
334
- .question-footer { display:flex; align-items:center; gap:8px; }
335
- .question-form button[type="submit"] { background:#ddd; color:#222; }
336
- .question-form button:disabled { opacity:.4; }
337
- .question-header button { border:0; padding:2px 5px; }
338
- .question-form fieldset:disabled { opacity:.65; }
339
- @media(prefers-color-scheme:light) { .question-form { background:#f5f5f5; } }
340
- .question-reply-question { font-size:.9em; opacity:.7; margin-bottom:4px; white-space:pre-wrap; }
341
- .question-reply-answer { white-space:pre-wrap; overflow-wrap:anywhere; }
342
- .context-control { position:relative; flex:none; }
343
- .context-trigger { display:grid; place-items:center; width:26px; height:32px; padding:0; border:0; border-radius:7px; background:transparent; }
344
- .context-trigger[aria-expanded="true"] { background:#ffffff0a; }
345
- .context-details { position:absolute; z-index:23; bottom:calc(100% + 8px); left:50%; transform:translateX(-50%); width:220px; max-width:calc(100vw - 24px); padding:10px 12px; border:1px solid #ffffff14; border-radius:10px; color:#ddd; background:#303030; font-size:12px; box-shadow:0 8px 24px #0005; }
346
- .context-details[hidden] { display:none; }
347
- .model-menu { --effort-accent:var(--color-chart-blue); position: absolute; z-index: 20; left: 50%; transform:translateX(-50%); bottom: calc(100% + 8px); width: 252px; max-width:calc(100vw - 24px); max-height: 60dvh; overflow-y: auto; border: 1px solid #ffffff14; border-radius: 16px; padding: 7px; background: #2d2d2d; box-shadow: 0 14px 36px #0005; }
348
- .model-menu[hidden] { display: none; }
349
- .menu-view[hidden] { display: none; }
350
- .menu-title { padding: 5px 8px 6px; color: #aab3ad; font-size: 11px; }
351
- .menu-hint { padding: 6px 8px 3px; color: #818a84; font-size: 10px; }
352
- .model-option { display: flex; width: 100%; align-items: center; justify-content: space-between; border: 0; border-radius: 8px; padding: 7px 9px; background: transparent; font-size: 12px; text-align: left; }
353
- .model-option:hover, .model-option.selected { background: #3a3d3b; }
354
- .model-option small { display: block; margin-top: 1px; color: #8d9690; font-size: 10px; }
355
- .model-option .check { min-width: 14px; color: #e7eee9; text-align: right; }
356
- .menu-divider { height: 1px; margin: 6px 5px; background: #414742; }
357
- .effort-entry { display: flex; width: 100%; align-items: center; justify-content: space-between; border: 0; border-radius: 8px; padding: 8px 9px; color: #cbd3ce; background: transparent; font-size: 11px; }
358
- .effort-entry:hover { background: #373b38; }
359
- .effort-entry-value { color: var(--color-chart-blue); }
360
- .effort-entry-label, .effort-entry-value { display: inline-flex; align-items: center; gap: 6px; }
361
- .effort-entry-label .codex-icon { width: 14px; height: 14px; color: #9ca59f; }
362
- .effort-entry-value .codex-icon { width: 12px; height: 12px; }
363
- .effort-panel { padding: 2px 0 4px; }
364
- .effort-header { display: grid; grid-template-columns: 28px 1fr 28px; align-items: start; min-height: 49px; }
365
- .effort-bolt { display: grid; place-items: center; flex:none; width: 28px; height: 28px; padding:0; border:0; border-radius:7px; background:transparent; color: #9ca59f; }
366
- .effort-bolt:hover { background:#ffffff0a; }
367
- .effort-bolt[aria-checked="true"] { color:var(--effort-accent); background:transparent; }
368
- .effort-bolt[aria-checked="true"] .codex-icon { fill:currentColor; }
369
- .effort-bolt .codex-icon { width: 15px; height: 15px; }
370
- .effort-heading { justify-self: center; min-width: 70px; border: 0; border-radius: 6px; padding: 3px 8px; text-align: center; color: #aaa; background: transparent; }
371
- .effort-heading:hover { background: #ffffff0a; }
372
- .effort-heading strong { display: flex; align-items: center; justify-content: center; gap: 4px; color: var(--effort-accent); font-size: 12px; font-weight: 600; }
373
- .effort-heading strong .codex-icon { width: 12px; height: 12px; color:#888; }
374
- .effort-model-name { display: block; margin-top: 2px; font-size: 10px; }
375
- .effort-track { --effort-progress: 0%; --effort-offset: 20px; --effort-range-offset: 14px; position: relative; height: 32px; margin: 5px 2px 3px; padding: 2px 6px; touch-action: none; user-select: none; cursor: ew-resize; }
376
- .effort-rail { position: absolute; inset: 4px 6px; height: 24px; overflow: hidden; border:0; border-radius: 12px; background: #ffffff19; }
377
- .effort-range { position: absolute; inset: 0 auto 0 0; width: calc(var(--effort-progress) + var(--effort-range-offset)); border-radius: 12px 0 0 12px; background: var(--color-chart-blue); }
378
- .effort-options { position: absolute; inset: 2px 20px; }
379
- .effort-option { position: absolute; top: 0; width: 28px; height: 28px; border: 0; padding: 0; transform: translateX(-50%); background: transparent; font-size: 0; }
380
- .effort-option:hover, .effort-option:focus, .effort-option:active, .effort-option.selected { background:transparent; }
381
- .effort-option:nth-child(1) { left: 0%; }
382
- .effort-option:nth-child(2) { left: 20%; }
383
- .effort-option:nth-child(3) { left: 40%; }
384
- .effort-option:nth-child(4) { left: 60%; }
385
- .effort-option:nth-child(5) { left: 80%; }
386
- .effort-option:nth-child(6) { left: 100%; }
387
- .effort-option::before { content: ""; display: block; width: 4px; height: 4px; margin: auto; border-radius: 50%; background: #7d827f; transition: transform .12s ease, background-color .2s ease; }
388
- .effort-option.reached::before { background: #ffffff4d; }
389
- .effort-option:active::before, .effort-option:focus-visible::before { box-shadow:0 0 0 2px #94b6e080; }
390
- .effort-option:focus { outline:none; }
391
- @media (hover:hover) and (pointer:fine) { .effort-option:hover::before { box-shadow:0 0 0 2px #94b6e080; } }
392
- .effort-option:disabled { opacity: .35; }
393
- .effort-thumb { position: absolute; z-index: 2; top: 2px; left: calc(var(--effort-progress) + var(--effort-offset)); width: 28px; height: 28px; pointer-events: none; transform: translateX(-50%); border:0; border-radius: 50%; background: #fff; }
394
- .effort-panel.ultra { --effort-accent:var(--color-chart-purple); }
395
- #modelSummaryEffort.ultra, #effortEntryText.ultra { color:var(--color-chart-purple); }
396
- .effort-panel.ultra .effort-range { background:linear-gradient(90deg,color-mix(in srgb,var(--color-chart-blue) 60%,var(--color-chart-purple)),var(--color-chart-purple) 55%,color-mix(in srgb,var(--color-chart-purple) 72%,var(--color-chart-blue))); }
397
- .effort-panel.ultra .effort-range::after { content:""; position:absolute; inset:0; opacity:.18; mix-blend-mode:luminosity; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='128' height='128'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.7'/%3E%3C/svg%3E"); }
398
- .effort-panel.ultra .effort-option:not(:disabled)::before, .effort-panel.fast .effort-option.reached::before { opacity:0; }
399
- .setting-select { display: none; }
400
- .composer-icon-button { flex-shrink: 0; }
401
- #turnActions[hidden] { display: none; }
402
- .send-control { position:relative; display:grid; place-items:center; width:26px; height:26px; flex:none; }
403
- .queue-send-icon { position:absolute; right:0; bottom:calc(100% + 16px); color:#243029; background:#d4ded7; }
404
- .queue-send-icon[hidden] { display:none; }
405
- #send { touch-action:manipulation; -webkit-user-select:none; user-select:none; -webkit-touch-callout:none; }
406
- .composer-icon-button { display: grid; place-items: center; width: 32px; height: 32px; padding: 0; border: 0; border-radius: 50%; }
407
- .composer-add { position:relative; flex:none; }
408
- .composer-add-menu[hidden], .composer-add-option[hidden] { display:none; }
409
- #addMenuTrigger { background:transparent; border-radius:0; }
410
- .composer-add-menu { position:absolute; z-index:24; bottom:calc(100% + 8px); left:0; display:grid; min-width:168px; gap:3px; padding:6px; border:1px solid #465149; border-radius:11px; color:#dce3de; background:#252d28; box-shadow:0 10px 28px #0007; }
411
- .composer-add-option { display:flex; align-items:center; gap:9px; width:100%; min-height:36px; padding:7px 9px; border:0; border-radius:7px; color:inherit; background:transparent; font-size:12px; text-align:left; white-space:nowrap; }
412
- .composer-add-option .codex-icon { width:17px; height:17px; }
413
- .composer-add-option:hover { background:#ffffff10; }
414
- .composer-add-option:disabled { opacity:.45; }
415
- .voice-icon { color: #cbd3ce; background: transparent; }
416
- .voice-icon:hover { background:transparent; }
417
- .voice-icon .codex-icon { width: 20px; height: 20px; }
418
- .voice-icon:disabled { cursor: default; color: #8b958f; opacity: .72; }
419
- .send-icon { width:26px; height:26px; border:1px solid #ffffff8f; color:#111512; background:#f2f5f3; box-shadow:0 2px 8px #0005; transition:transform .12s ease, background-color .12s ease, box-shadow .12s ease; }
420
- .send-icon .codex-icon { width:20px; height:20px; stroke-width:2.15; }
421
- .send-icon:hover { background:#fff; box-shadow:0 3px 10px #0006; }
422
- .send-icon:active { transform:scale(.94); box-shadow:0 1px 4px #0005; }
423
- .send-icon:disabled { opacity:.46; box-shadow:none; }
424
- .queue-send-icon:hover { background:#e2e9e4; }
425
- .image-viewer { max-width: min(94vw, 1200px); max-height: 92vh; padding: 0; border: 0; background: transparent; overflow: visible; }
426
- .image-viewer::backdrop { background: #000c; backdrop-filter: blur(3px); }
427
- .image-viewer-shell { position: relative; display: grid; place-items: center; max-width: 94vw; max-height: 92vh; }
428
- .image-viewer img { display: block; max-width: 94vw; max-height: 92vh; border-radius: 8px; object-fit: contain; box-shadow: 0 18px 60px #000a; }
429
- .image-viewer-original, .image-viewer-download { position: absolute; bottom: 12px; display: inline-flex; align-items: center; justify-content: center; height: 38px; border-radius: 19px; border-color: #ffffff55; background: #101311cc; color: #fff; }
430
- .image-viewer-original { left: 12px; gap: 7px; min-width: 112px; padding: 0 14px; }
431
- .image-viewer-download { right: 12px; width: 38px; min-width: 38px; padding: 0; }
432
- .image-viewer-original .codex-icon, .image-viewer-download .codex-icon { width: 18px; height: 18px; }
433
- .image-viewer-download.loading .codex-icon { display: none; }
434
- .image-viewer-download.loading::before { content: ""; width: 15px; height: 15px; border: 2px solid #ffffff55; border-top-color: currentColor; border-radius: 50%; animation: image-viewer-spin .8s linear infinite; }
435
- @keyframes image-viewer-spin { to { transform: rotate(360deg); } }
436
- .image-viewer-close { position: absolute; top: 10px; right: 10px; width: 34px; height: 34px; padding: 0; border-radius: 50%; border-color: #ffffff55; background: #101311cc; font-size: 20px; line-height: 1; }
437
- .new-chat-entry { display:flex; flex:none; align-items:center; gap:10px; margin:8px 0; padding:10px 8px; border:0; background:transparent; color:inherit; text-align:left; }
438
- #newThreadWelcome[hidden], #newThreadProjectBar[hidden], #timeline[hidden], .selected-heading[hidden] { display:none; }
439
- .new-thread-welcome { flex:1; min-height:0; overflow:auto; display:flex; flex-direction:column; gap:24px; align-items:center; justify-content:center; padding:24px 12px; }
440
- .new-thread-title { margin:0; font-size:clamp(20px, 2.3vw, 28px); font-weight:500; text-align:center; overflow-wrap:anywhere; }
441
- #newThreadIcon svg { display:block; width:56px; height:56px; opacity:.3; }
442
- .new-thread-project { display:flex; align-items:center; gap:24px; margin:0 12px; padding:6px 12px; color:inherit; font-size:12px; background:#1b211d; border-radius:14px 14px 0 0; }
443
- #newThreadProjectName { flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
444
- #clearNewThreadProject { flex:none; width:24px; height:24px; padding:0; border:0; background:transparent; color:inherit; font-size:18px; }
445
- #clearNewThreadProject[hidden] { display:none; }
446
-
447
-
448
- @media (max-width: 760px) {
449
- header { gap: 8px; padding: 8px 12px; }
450
- header h1 { font-size: 14px; }
451
- .sub { font-size: 10px; }
452
- main { grid-template-columns: 1fr; grid-template-rows: minmax(150px, 34%) minmax(0, 1fr); }
453
- aside { border-right: 0; border-bottom: 1px solid #2c3830; }
454
- section { padding: 14px; }
455
- .scroll-to-bottom { right: 24px; bottom: 114px; }
456
- }
457
- body.embedded-terminal { --terminal-sidebar-width:280px; min-height:0; height:100%; background:#101311; }
458
- .embedded-terminal header { display:none; }
459
- .terminal-chat-header { display:none; }
460
- #connectionStatus { flex:none; font-size:12px; color:#42d17b; }
461
- #connectionStatus.failed { color:#e06c64; }
462
- .sidebar-brand { display:none; }
463
- .embedded-terminal .sidebar-brand { display:flex; align-items:center; justify-content:space-between; gap:8px; padding:1px 8px 3px; font-size:18px; font-weight:600; }
464
- .embedded-terminal .new-chat-entry { margin:0; padding:5px 8px; font-size:12px; }
465
- .embedded-terminal .toolbar { min-height:20px; margin:0 4px 1px; }
466
- .embedded-terminal .project { margin-bottom:1px; }
467
- .embedded-terminal .task { margin:0; padding:4px 9px; }
468
- @media (max-width:760px) {
469
- .composer-row { min-width:0; }
470
- .composer-controls { flex:0 1 auto; min-width:0; }
471
- .model-control { flex:0 1 auto; }
472
- .model-trigger { width:100%; max-width:100%; min-width:0; gap:3px; padding:0; }
473
- .model-trigger .chevron { flex-shrink:0; }
474
- .context-meter { width:14px; height:14px; }
475
- .model-trigger .chevron, .model-trigger .chevron .codex-icon, .model-fast-indicator .codex-icon { width:12px; height:12px; }
476
- }
477
- @container composer (max-width:310px) {
478
- #permissionLabel { display:none; }
479
- .permission-trigger { width:26px; padding:0; justify-content:center; }
480
- }
481
- .embedded-terminal .status { margin-left:0; overflow:hidden; }
482
- .embedded-terminal #status { overflow:hidden; text-overflow:ellipsis; }
483
- .embedded-terminal .project-actions { opacity:1; pointer-events:auto; }
484
- #connectionSettings, #usageButton, #announcementButton, #communityButton, #returnToComputer, #installedAppVersion, #debugMenu, .app-actions { display:none; }
485
- .embedded-terminal .app-actions { position:relative; display:flex; align-items:stretch; gap:4px; flex-shrink:0; min-width:0; }
486
- .embedded-terminal .app-actions > :is(#returnToComputer:not([hidden]), #debugMenu:not([hidden])) { flex:0 0 auto; min-width:0; width:auto; }
487
- .embedded-terminal #installedAppVersion:not([hidden]) { display:block; flex:1 1 auto; align-self:center; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
488
- .embedded-terminal #debugMenu:not([hidden]) { position:static; display:block; }
489
- #debugMenu > summary { display:flex; align-items:center; gap:9px; height:100%; box-sizing:border-box; padding:5px 8px; color:var(--muted, #94a79a); font-size:12px; cursor:pointer; list-style:none; }
490
- #debugMenu > summary::-webkit-details-marker { display:none; }
491
- #debugMenu > summary > span { flex:1; text-align:right; }
492
- #debugMenu[open] .debug-chevron { transform:rotate(90deg); }
493
- .debug-menu-items { position:absolute; z-index:30; right:0; bottom:calc(100% + 4px); box-sizing:border-box; width:260px; display:grid; gap:4px; padding:8px; border:1px solid #414a44; border-radius:10px; background:#202522; box-shadow:0 12px 32px #0008; }
494
- .debug-menu-items > button { width:100%; padding:8px; border:0; background:transparent; text-align:left; }
495
- .installed-app-version { margin:0 2px; color:var(--muted, #94a79a); font-size:9px; line-height:1.4; text-align:center; }
496
- #sharedRecoveryConfirm, #sharedRecoveryResult { font-size:12px; line-height:1.5; overflow-wrap:anywhere; color:var(--muted, #94a79a); }
497
- #sharedRecoveryConfirm button { width:100%; margin-top:6px; text-align:left; }
498
- .embedded-terminal aside { display:flex; flex-direction:column; overflow:hidden; padding:2px 8px 6px; font-size:12px; }
499
- .embedded-terminal #tasks { flex:1; min-height:0; overflow-y:auto; overflow-anchor:none; }
500
- .embedded-terminal :is(#connectionSettings, #usageButton, #announcementButton:not([hidden]), #communityButton, #archivedThreads:not([hidden]), #returnToComputer:not([hidden])) { display:flex; align-items:center; gap:9px; flex-shrink:0; width:100%; padding:5px 8px; border:0; border-radius:0; background:transparent; color:#9eaca3; text-align:left; font-size:12px; }
501
- .embedded-terminal #archivedThreads { margin-top:3px; padding-top:5px; border-top:1px solid #ffffff12; }
502
- .embedded-terminal #usageButton { margin-top:0; }
503
- .embedded-terminal #archivedThreads[hidden] + #usageButton { margin-top:3px; padding-top:5px; border-top:1px solid #ffffff12; }
504
- .shared-service-notice { display:none; }
505
- .embedded-terminal .shared-service-notice:not([hidden]) { display:grid; grid-template-columns:minmax(0, 1fr) 15px; align-items:center; flex:none; gap:7px; min-width:0; margin:3px 0 2px; padding:8px; border:1px solid #d899494f; border-radius:9px; color:#e5b779; background:#d8994914; cursor:pointer; }
506
- .embedded-terminal .shared-service-copy { display:flex; flex-direction:column; min-width:0; gap:2px; }
507
- .embedded-terminal .shared-service-notice strong { font-size:12px; line-height:1.35; font-weight:650; white-space:normal; overflow-wrap:anywhere; }
508
- .embedded-terminal .shared-service-notice .shared-service-copy > span { color:#c8a77c; font-size:12px; line-height:1.35; white-space:normal; overflow-wrap:anywhere; }
509
- .embedded-terminal .shared-service-notice > .codex-icon { width:15px; height:15px; color:#c8a77c; }
510
- #connectionAddress { min-width:0; flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
511
- .connection-control-mode { font-weight:600; }
512
- .connection-control-mode.complete { color:#42d17b; }
513
- .connection-control-mode.basic { color:#dc9b57; }
514
- .embedded-terminal :is(#connectionSettings, #usageButton, #announcementButton, #communityButton, #archivedThreads, #returnToComputer):hover { color:#e8eee9; }
515
- #usageButton > span { flex:1; }
516
- #announcementTitle { min-width:0; flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
517
- #communityButton > span { min-width:0; flex:1; }
518
- .embedded-terminal #communityButton[aria-current="page"] { color:#e8eee9; background:#ffffff0a; }
519
- #usageSummary { display:flex; align-items:center; justify-content:space-between; gap:8px; min-width:0; }
520
- #returnToComputer { margin-top:0; }
521
- .usage-heading { display:flex; align-items:center; justify-content:space-between; }
522
- .usage-heading strong { color:inherit; font-size:12px; font-weight:600; }
523
- .usage-ratio { font-size:12px; font-weight:600; font-variant-numeric:tabular-nums; }
524
- .usage-summary-ratio { font-weight:600; font-variant-numeric:tabular-nums; }
525
- .usage-ratio-good { color:#4bb982; }
526
- .usage-ratio-low { color:#dc9b57; }
527
- .usage-group { display:grid; gap:5px; }
528
- .usage-model { color:inherit; font-weight:600; }
529
- .usage-plan-row { display:grid; grid-template-columns:minmax(0, 1fr) 84px; gap:12px; }
530
- .usage-plan-row { color:#aeb9b2; font-size:12px; }
531
- .usage-plan-row > :last-child { text-align:left; }
532
- #usagePlan { display:flex; align-items:center; justify-content:flex-end; gap:14px; white-space:nowrap; }
533
- .usage-plan-tier { padding:2px 7px; border:1px solid #8885; border-radius:5px; font-size:11px; }
534
- .usage-window { display:grid; gap:8px; padding:12px 0; border-top:1px solid #8883; }
535
- .usage-window > strong { font-size:13px; }
536
- .usage-timeline { --usage-fill:#4bb982; display:grid; gap:6px; padding:1px 0 2px; color:#aeb9b2; }
537
- .usage-timeline-ahead { --usage-fill:#dc9b57; }
538
- .usage-timeline-summary, .usage-timeline-time-summary { display:flex; align-items:center; justify-content:center; min-width:0; text-align:center; font-size:12px; font-variant-numeric:tabular-nums; }
539
- .usage-timeline-summary > span, .usage-timeline-time-summary > span { display:flex; align-items:center; justify-content:center; gap:5px; }
540
- .usage-timeline-used::before { width:8px; height:8px; flex:none; border-radius:50%; background:var(--usage-fill); content:""; }
541
- .usage-timeline-elapsed::before { width:6px; height:6px; flex:none; border:1px solid #202522aa; border-radius:1px; background:currentColor; transform:rotate(45deg); content:""; }
542
- .usage-percentage { font-weight:600; }
543
- .usage-timeline-track { position:relative; height:12px; border:1px solid #8885; border-radius:6px; background:#8882; }
544
- .usage-timeline-fill { position:absolute; inset:0 auto 0 0; min-width:0; border-radius:5px; background:var(--usage-fill); transition:width .2s ease; }
545
- .usage-timeline-tick { position:absolute; z-index:1; top:0; bottom:0; width:1px; background:#20252266; transform:translateX(-.5px); }
546
- .usage-timeline-now { position:absolute; z-index:2; top:-5px; bottom:-5px; width:2px; border-radius:1px; background:currentColor; box-shadow:0 0 0 1px #202522aa; transform:translateX(-1px); }
547
- .usage-timeline-now::before { position:absolute; top:-1px; left:50%; width:6px; height:6px; border:1px solid #202522aa; background:currentColor; transform:translate(-50%, -50%) rotate(45deg); content:""; }
548
- .usage-timeline-scale { position:relative; height:13px; color:#8f9b94; font-size:9px; font-variant-numeric:tabular-nums; line-height:1; }
549
- .usage-timeline-scale-label { position:absolute; top:0; white-space:nowrap; transform:translateX(-50%); }
550
- .usage-timeline-scale-label.is-first { transform:none; }
551
- .usage-timeline-scale-label.is-last { transform:translateX(-100%); }
552
- .usage-window-detail { font-size:12px; opacity:.72; line-height:1.5; overflow-wrap:anywhere; }
553
- .usage-dialog { width:min(430px, calc(100vw - 32px)); max-height:calc(100dvh - 32px); overflow-y:auto; border:1px solid #414a44; border-radius:14px; padding:0; color:#e7ede9; background:#202522; box-shadow:0 20px 70px #000b; }
554
- .usage-dialog::backdrop { background:#0009; backdrop-filter:blur(2px); }
555
- .usage-dialog-shell { display:grid; gap:14px; padding:16px; }
556
- .usage-dialog-header { display:flex; align-items:center; justify-content:space-between; }
557
- .usage-dialog-header h3 { margin:0; font-size:15px; }
558
- .usage-dialog-close { width:32px; height:32px; padding:0; border:0; background:transparent; font-size:20px; }
559
- #usageRows { display:grid; gap:9px; min-height:18px; color:#aeb9b2; font-size:12px; }
560
- @media (prefers-color-scheme:light) {
561
- .embedded-terminal :is(#connectionSettings, #usageButton, #announcementButton, #communityButton, #archivedThreads, #returnToComputer) { color:#596c60; }
562
- .embedded-terminal #archivedThreads { border-top-color:#17212b18; }
563
- .embedded-terminal #archivedThreads[hidden] + #usageButton { border-top-color:#17212b18; }
564
- .embedded-terminal .shared-service-notice:not([hidden]) { color:#8b5318; background:#d8994914; border-color:#b66b2c45; }
565
- .embedded-terminal .shared-service-notice .shared-service-copy > span,
566
- .embedded-terminal .shared-service-notice > .codex-icon { color:#76512c; }
567
- .embedded-terminal :is(#connectionSettings, #usageButton, #announcementButton, #communityButton, #archivedThreads, #returnToComputer):hover { color:#17212b; }
568
- .embedded-terminal #communityButton[aria-current="page"] { color:#17212b; background:#17212b0a; }
569
- .composer-add-menu { color:#34443a; background:#f5f7f5; border-color:#d5ddd8; box-shadow:0 10px 28px #17212b24; }
570
- .file-action-menu { color:#17212b; background:#fff; border-color:#cfd8d2; box-shadow:0 10px 28px #17212b24; }
571
- .file-action-name { color:#65736a; border-color:#dce3df; }
572
- .file-action-menu > button:hover { background:#17212b0a; }
573
- .composer-add-option:hover { background:#17212b0a; }
574
- .usage-dialog { color:#17212b; background:#f5f7f5; border-color:#cfd8d2; }
575
- .usage-timeline { color:#596c60; }
576
- .usage-timeline-tick { background:#f5f7f566; }
577
- .usage-timeline-now { box-shadow:0 0 0 1px #f5f7f5cc; }
578
- .usage-timeline-now::before { border-color:#f5f7f5cc; }
579
- .usage-timeline-elapsed::before { border-color:#f5f7f5cc; }
580
- .debug-menu-items { color:#17212b; background:#fff; border-color:#cfd8d2; box-shadow:0 12px 32px #17212b24; }
581
- }
582
- #sidebarBackdrop { display:none; }
583
- #wideSidebarToggle, #wideSidebarExpand { display:none; }
584
- #wideSidebarToggle .codex-icon, #wideSidebarExpand .codex-icon { width:24px; height:24px; stroke-width:1.8; }
585
- #wideSidebarToggle:hover, #wideSidebarExpand:hover { background:color-mix(in srgb, currentColor 8%, transparent); }
586
- .embedded-terminal #voice[aria-pressed="true"] { width:26px; height:26px; margin-inline:3px; color:#ef6868; background:#ef686814; box-shadow:inset 0 0 0 1px #ef686899; }
587
- .embedded-terminal #voice[aria-pressed="true"] .codex-icon { width:16px; height:16px; }
588
- @media (max-width:760px) {
589
- .embedded-terminal main { position:relative; display:grid; grid-template-columns:1fr; grid-template-rows:minmax(0,1fr); }
590
- .embedded-terminal aside { display:none; position:absolute; inset:0 auto 0 0; width:min(90%,var(--terminal-sidebar-width)); z-index:20; box-shadow:12px 0 30px #0008; }
591
- .embedded-terminal.sidebar-open aside { display:flex; }
592
- .embedded-terminal.sidebar-open #sidebarBackdrop { display:block; position:absolute; inset:0; z-index:19; background:#0008; border:0; border-radius:0; }
593
- .embedded-terminal section { padding:8px 12px; }
594
- .embedded-terminal .selected-heading { min-width:0; }
595
- .embedded-terminal textarea { font-size:16px; }
596
- .embedded-terminal #prompt { font-size:13px; }
597
- }
598
- @media (max-width:599px) {
599
- .embedded-terminal .terminal-chat-header { display:flex; position:absolute; z-index:9; inset:0 0 auto; height:40px; align-items:center; background:#101311; }
600
- .embedded-terminal #terminalSidebarToggle { display:grid; place-items:center; width:48px; height:40px; flex:none; border:0; padding:8px 12px; color:inherit; background:transparent; }
601
- .embedded-terminal #terminalSidebarToggle .codex-icon { width:28px; height:28px; stroke-width:2; }
602
- .embedded-terminal #terminalChatTitle { position:absolute; left:56px; right:56px; overflow:hidden; font-size:15px; font-weight:700; text-align:center; text-overflow:ellipsis; white-space:nowrap; touch-action:manipulation; user-select:none; }
603
- .embedded-terminal .selected-heading { display:none; }
604
- .embedded-terminal section { padding-top:48px; }
605
- .embedded-terminal.sidebar-open #wideSidebarToggle { display:grid; place-items:center; flex:none; align-self:center; width:40px; height:40px; padding:8px; border:0; background:transparent; color:inherit; }
606
- }
607
- @media (min-width:600px) {
608
- .embedded-terminal #wideSidebarToggle { display:grid; place-items:center; flex:none; align-self:center; width:40px; height:40px; padding:8px; border:0; background:transparent; color:inherit; }
609
- .embedded-terminal.sidebar-collapsed main { grid-template-columns:minmax(0,1fr); }
610
- .embedded-terminal.sidebar-collapsed aside { display:none; }
611
- .embedded-terminal.sidebar-collapsed #wideSidebarExpand { display:grid; place-items:center; position:absolute; top:2px; left:8px; width:32px; height:28px; padding:2px; border:0; background:transparent; color:inherit; z-index:9; }
612
- .embedded-terminal.sidebar-collapsed .selected-heading { padding-left:36px; }
613
- .embedded-terminal section { padding-top:2px; }
614
- .embedded-terminal main { grid-template-columns:var(--terminal-sidebar-width) minmax(0, 1fr); grid-template-rows:minmax(0,1fr); }
615
- .embedded-terminal aside { display:flex; position:static; width:auto; box-shadow:none; border-right:1px solid #2c3830; border-bottom:0; }
616
- .embedded-terminal.sidebar-open #sidebarBackdrop { display:none; }
617
- }
618
- @media (prefers-color-scheme: light) {
619
- :root { color-scheme:light; background:#f5f7fa; color:#17212b; }
620
- body, body.embedded-terminal { background:#f5f7fa; }
621
- .embedded-terminal .terminal-chat-header { background:#f5f7fa; }
622
- aside, .composer, .model-menu, .new-thread-project { background:#fff; border-color:#d5ddd8; color:#17212b; }
623
- button, select, textarea { color:#17212b; }
624
- button { background:#eef2ef; border-color:#ccd6ce; }
625
- button:hover { background:#e2e9e4; }
626
- textarea, .model-trigger, .voice-icon, .effort-entry, .project-header, .task, .model-option, .queue-action, .project-action { color:#27382e; background:transparent; }
627
- .model-trigger[aria-expanded="true"], .model-option:hover, .model-option.selected, .task:hover, .project-header:hover, .effort-entry:hover { background:#e8eeea; }
628
- .task.active { background:#dce8e0; }
629
- .message.user { background:#dcefe3; border-color:#a4cdb3; }
630
- .message.commentary, .process-body .message.commentary, .message-body blockquote { color:#44564b; }
631
- .message-body code, .message-body pre, .message-body .code-block { background:#eaf0ec; border-color:#d2dbd5; }
632
- .message-body pre code { background:transparent; }
633
- .message-body .code-block-header, .message-body .code-block-copy { color:#596c60; }
634
- .message-body .code-block-copy:hover { color:#17212b; background:#17212b0a; }
635
- .message-body .code-block-copy[data-copy-state="copied"] { color:#17212b; }
636
- .message-body .code-block code.hljs, .message-body .hljs-variable, .message-body .hljs-params,
637
- .message-body .hljs-property { color:#24372b; }
638
- .message-body .hljs-comment, .message-body .hljs-quote { color:#66776c; }
639
- .message-body .hljs-keyword, .message-body .hljs-selector-tag, .message-body .hljs-literal,
640
- .message-body .hljs-section, .message-body .hljs-link { color:#7b3fb3; }
641
- .message-body .hljs-string, .message-body .hljs-doctag, .message-body .hljs-regexp,
642
- .message-body .hljs-template-tag, .message-body .hljs-template-variable { color:#397947; }
643
- .message-body .hljs-number, .message-body .hljs-symbol, .message-body .hljs-bullet { color:#a15c1c; }
644
- .message-body .hljs-title, .message-body .hljs-title.class_, .message-body .hljs-title.function_ { color:#1d64a8; }
645
- .message-body .hljs-type, .message-body .hljs-built_in, .message-body .hljs-attribute,
646
- .message-body .hljs-selector-attr, .message-body .hljs-selector-class, .message-body .hljs-selector-pseudo { color:#805d05; }
647
- .message-body .hljs-meta, .message-body .hljs-meta .hljs-keyword { color:#1f7671; }
648
- .message-body .hljs-addition { color:#2f7444; background:#78b98a24; }
649
- .message-body .hljs-deletion { color:#a23d3d; background:#d77a7a24; }
650
- .message-body a, .process.running > summary { color:#167343; }
651
- .activity, .activity-icon, .live-step, .turn-label, .turn-duration,
652
- .process > summary, .active-process > summary, .settled-process > summary,
653
- .toolbar, .refresh-icon, .project-folder, .project-action, .disclosure-chevron,
654
- .sub, .status, #empty, .pending-settings, .menu-title, .menu-hint, .model-option small, .chevron { color:#596c60; }
655
- .activity-copy { color:#65766b; }
656
- .activity-copy:hover { color:#17212b; background:#17212b0a; }
657
- .activity-copy[data-copy-state="copied"] { color:#167343; }
658
- .command-shell, .tool-detail { border-color:#d2dbd5; background:#f8faf8; color:#27382e; }
659
- .command-shell-command, .command-shell-footer, .tool-detail-footer { border-color:#dfe6e1; }
660
- .command-shell-prompt { color:#167343; }
661
- .command-shell-output pre, .tool-detail-text { color:#27382e; }
662
- .command-shell-output pre.empty, .command-shell-footer, .command-shell-status,
663
- .tool-detail-heading, .tool-detail-fields dt, .tool-detail-footer, .tool-detail .muted { color:#65766b; }
664
- .tool-detail-text { background:#edf2ef; }
665
- .tool-detail-section.error { color:#b42318; }
666
- .process > summary, .turn-duration, .turn-error, header { border-color:#d5ddd8; }
667
- .turn-error { color:#27382e; }
668
- .queued-message, .scroll-to-bottom { background:#edf2ef; border-color:#c9d5cd; color:#27382e; }
669
- .queued-error, .diff-remove { color:#b42318; }
670
- .diff-add { color:#167343; }
671
- .send-icon, .send-icon:hover { border-color:#27382e; background:#27382e; color:#fff; box-shadow:0 2px 7px #17212b33; }
672
- .queue-send-icon, .queue-send-icon:hover { border-color:#91a097; background:#e0e7e2; color:#27382e; }
673
- .context-meter::before { background:#fff; }
674
- .context-trigger[aria-expanded="true"] { background:#00000008; }
675
- .context-details { background:#fff; color:#27382e; border-color:#d5ddd8; }
676
- .model-option .check { color:#27382e; }
677
- .menu-divider { background:#d5ddd8; }
678
- .effort-rail { background:#dce4de; border-color:#a5b3aa; }
679
- :root { --color-chart-purple:#924ff7; }
680
- #modelSummaryEffort, .effort-heading { color:#657269; }
681
- .effort-heading:hover { background:#00000008; }
682
- .effort-bolt:hover { background:#00000008; }
683
- .permission-menu { background:#fff; border-color:#d5ddd8; }
684
- .permission-option { color:#27382e; }
685
- .permission-trigger, .permission-menu-title, .permission-option small { color:#657269; }
686
- .permission-option:hover, .permission-trigger:hover, .permission-trigger[aria-expanded="true"] { background:#00000008; }
687
- .permission-trigger.full-access, .permission-option[data-permission="full"], .permission-option[data-permission="full"] small { color:#bd5b16; }
688
- .attachment { color:#44564b; border-color:#b7c9be; }
689
- .image-viewer-close, .image-viewer-original, .image-viewer-download { color:#fff; background:#101311cc; }
690
- }
691
-
692
-
693
- #connectionEntry { display:none; }
694
- body.connection-entry > header, body.connection-entry > main { display:none; }
695
- body.connection-entry #connectionEntry { display:flex; flex:1; min-height:0; overflow:hidden; }
696
- .connection-entry-page { display:flex; flex-direction:column; width:100%; min-height:100%; }
697
- .connection-entry-header { display:flex; flex:none; align-items:center; width:100%; height:52px; padding:0 8px; }
698
- .connection-entry-header h1 { flex:1; margin:0; text-align:center; font-size:18px; font-weight:600; }
699
- .connection-entry-back, .connection-entry-header-spacer { width:40px; height:40px; flex:none; }
700
- .connection-entry-back { display:grid; place-items:center; padding:0; border:0; border-radius:10px; background:transparent; color:inherit; }
701
- .connection-entry-back:active { background:#ffffff12; }
702
- .connection-entry-back svg { width:22px; height:22px; fill:none; stroke:currentColor; stroke-width:1.8; stroke-linecap:round; stroke-linejoin:round; }
703
- .connection-entry-content { display:flex; flex:1; min-height:0; align-items:center; justify-content:center; padding:24px; overflow:auto; }
704
- .connection-entry-card { width:100%; max-width:420px; }
705
- .entry-connection-mode { display:flex; align-items:baseline; gap:10px; margin:0 0 20px; }
706
- .entry-connection-mode span { font-size:12px; opacity:.58; }
707
- .entry-connection-mode strong { font-size:16px; font-weight:600; }
708
- #entryStatus { white-space:pre-wrap; overflow-wrap:anywhere; }
709
- .connection-entry-actions { display:flex; flex-wrap:wrap; gap:10px; margin-top:24px; }
710
-
711
- #externalUiOption { align-items:center; justify-content:flex-start; gap:8px; flex-shrink:0; padding:8px; font-size:12px; color:var(--muted, #94a79a); }
712
- #externalUiOption:not([hidden]) { display:flex; }
713
- #externalUiOption[data-active-page="builtin"] > span:first-child,
714
- #externalUiOption[data-active-page="debug"] > span:last-child { color:#73dfa3; font-weight:600; }
715
- #externalUiToggle { position:relative; width:34px; height:20px; flex:none; margin:0; border:1px solid #6d7971; border-radius:10px; appearance:none; -webkit-appearance:none; background:#303833; transition:background-color .15s, border-color .15s; }
716
- #externalUiToggle::after { content:""; position:absolute; top:2px; left:2px; width:14px; height:14px; border-radius:50%; background:#d8dfda; transition:transform .15s; }
717
- #externalUiToggle:checked { border-color:#48c985; background:#2f7650; }
718
- #externalUiToggle:checked::after { transform:translateX(14px); background:#fff; }
719
- #externalUiToggle:disabled { opacity:.55; }
720
-
721
- .model-menu[data-loading="true"] .menu-view { visibility:hidden; }
722
- .model-menu[data-loading="true"]::before { content:"正在读取模型设置…"; position:absolute; inset:0; display:grid; place-items:center; font-size:13px; color:inherit; }
723
-
724
- .connection-entry-card { padding:8px 18px 24px; }
725
- .entry-diagram { display:flex; width:100%; align-items:flex-start; margin:8px 0 28px; color:#3f5349; }
726
- .entry-diagram-node { display:flex; flex:1; min-width:0; flex-direction:column; align-items:center; gap:4px; }
727
- .entry-diagram-node > svg { width:28px; height:28px; fill:none; stroke:currentColor; stroke-width:1.7; stroke-linecap:round; stroke-linejoin:round; }
728
- .entry-diagram-node > span { min-height:24px; max-width:92px; font-size:10px; line-height:12px; text-align:center; opacity:.72; }
729
- .entry-diagram-link { flex:none; width:26px; height:10px; margin-top:8px; fill:none; stroke:currentColor; stroke-width:1.7; stroke-linecap:round; stroke-linejoin:round; }
730
- .entry-diagram-middle > svg { display:none; }
731
- .entry-diagram[data-mode="lan"] [data-route="lan"],
732
- .entry-diagram[data-mode="private"] [data-route="private"],
733
- .entry-diagram[data-mode="official"] [data-route="official"] { display:block; }
734
- .entry-steps { display:flex; flex-direction:column; gap:0; padding:0; margin:0; list-style:none; }
735
- .entry-steps li { position:relative; min-height:44px; padding:0 0 16px 34px; font-size:13px; line-height:20px; opacity:.46; }
736
- .entry-steps li::before { content:attr(data-number); position:absolute; left:0; top:0; display:grid; width:22px; height:22px; place-items:center; border:1px solid #7e898566; border-radius:50%; font-size:10px; }
737
- .entry-steps li:not(:last-child)::after { content:""; position:absolute; left:11px; top:23px; bottom:1px; width:1px; background:#7e898544; }
738
- .entry-steps li[data-state="current"] { color:inherit; opacity:1; font-weight:600; }
739
- .entry-steps li[data-state="current"]::before { border-color:#55bf8b; color:#55bf8b; }
740
- .entry-steps li[data-state="done"] { opacity:.72; }
741
- .entry-steps li[data-state="done"]::before { content:"✓"; border-color:#55bf8b; background:#55bf8b22; color:#55bf8b; }
742
- .entry-steps li[data-state="done"]::after { background:#55bf8b88; }
743
- .entry-progress { display:flex; align-items:flex-start; gap:12px; margin-top:8px; min-height:76px; }
744
- .entry-indicator { flex:none; width:18px; height:18px; margin-top:3px; border:2px solid #7e898544; border-top-color:#55bf8b; border-radius:50%; animation:entry-spin 1s linear infinite; }
745
- #entryStatus { margin:0 0 8px; font-size:16px; font-weight:600; }
746
- #entryDetail { margin:0; font-size:13px; line-height:1.7; opacity:.7; overflow-wrap:anywhere; }
747
- .entry-progress[data-state="error"] .entry-indicator { animation:none; border-color:#e58a78; }
748
- .connection-entry-actions button { min-height:42px; flex:1 1 160px; }
749
- .diagnostic-overview { font-size:17px; font-weight:600; margin-bottom:0; }
750
- .diagnostic-hint { opacity:.7; line-height:1.6; }
751
- .usage-dialog details summary { cursor:pointer; padding:10px 0; }
752
- @keyframes entry-spin { to { transform:rotate(360deg); } }
753
- @media(prefers-reduced-motion:reduce) { .entry-indicator { animation:none; } }
754
- @media(prefers-color-scheme:light) {
755
- .connection-entry-back:active { background:#1f2c240d; }
756
- .entry-diagram { color:#3f5349; }
757
- }
758
-
759
- .approval-panel { flex: 0 1 auto; min-height: 0; max-height: 42vh; overflow-y: auto; padding: 8px 12px; border-top: 1px solid #45564b; }
760
- .approval-panel[hidden] { display: none; }
761
- .approval-card { padding: 10px; border: 1px solid #8883; border-radius: 10px; background: transparent; margin-bottom: 6px; }
762
- .approval-card p { margin: 6px 0; font-size: 12px; }
763
- .approval-meta { color:var(--muted, #94a79a); overflow-wrap:anywhere; }
764
- .approval-card strong { display:block; font-size:14px; font-weight:600; overflow-wrap:anywhere; }
765
- .approval-card .approval-kind { margin:0 0 4px; opacity:.7; font-size:11px; }
766
- .approval-body { min-width:0; overflow-wrap:anywhere; }
767
- .approval-scope-option { width:100%; padding:6px 0; border-top:1px solid #63774b55; }
768
- .approval-scope-option p { white-space:pre-wrap; overflow-wrap:anywhere; }
769
- .approval-card pre { margin: 6px 0; white-space: pre-wrap; overflow-wrap: anywhere; font: 12px/1.5 monospace; max-height: 18vh; overflow-y: auto; }
770
- .approval-details { width: 100%; min-width: 0; margin: 6px 0; }
771
- .approval-details summary { cursor: pointer; font-size: 12px; }
772
- .approval-details-title::after { content: ' · 展开'; opacity: .7; }
773
- .approval-details[open] .approval-details-title::after { content: ' · 收起'; }
774
- .approval-preview { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden; white-space: pre-wrap; overflow-wrap: anywhere; font: 12px/1.5 monospace; margin-top: 4px; }
775
- .approval-details[open] .approval-preview { display: none; }
776
- .approval-card form { display: flex; flex-wrap: wrap; gap: 8px; }
777
- .approval-card label, .approval-card form pre { width: 100%; }
778
- .approval-card input { display: block; width: 100%; }
779
- .approval-card button { min-height: 32px; padding: 5px 9px; border: 1px solid #8884; border-radius: 6px; background: transparent; color: inherit; font-size: 12px; }
780
- .approval-card button:hover:not(:disabled) { background: #8881; border-color: #8887; }
781
- .approval-actions { display: flex; flex-wrap: nowrap; gap: 6px; width: 100%; overflow-x: auto; padding: 3px 0; }
782
- .approval-actions button { flex: 0 0 auto; white-space: nowrap; }