@codexhost/cli-linux-arm64 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/THIRD_PARTY_NOTICES.txt +4 -0
- package/app/codexhost-distribution.json +1 -1
- package/app/desktop-controller.mjs +3 -1
- package/app/host-runtime.mjs +1000 -472
- package/app/plugins/antigravity/plugin.mjs +54 -205
- package/app/plugins/claude-code/plugin.mjs +223 -49
- package/app/plugins/codebuddy/assets/icon.svg +1 -0
- package/app/plugins/codebuddy/manifest.json +13 -0
- package/app/plugins/codebuddy/plugin.mjs +23045 -0
- package/app/plugins/cursor-cli/assets/icon.svg +1 -0
- package/app/plugins/cursor-cli/manifest.json +13 -0
- package/app/plugins/cursor-cli/plugin.mjs +22579 -0
- package/app/plugins/deepseek-harness/plugin.mjs +7695 -10516
- package/app/plugins/enabled.json +3 -1
- package/app/plugins/grok/plugin.mjs +921 -74
- package/app/plugins/kiro-cli/plugin.mjs +29 -6
- package/app/plugins/pi/plugin.mjs +0 -12
- package/app/renderer-extension.js +746 -344
- package/bin/codexhost +0 -0
- package/libexec/codexhost-shim +0 -0
- package/libexec/codexhost-updater +0 -0
- package/licenses/Agent-Client-Protocol-SDK-LICENSE.txt +191 -0
- package/package.json +1 -1
|
@@ -16,7 +16,9 @@
|
|
|
16
16
|
"grok",
|
|
17
17
|
"omp",
|
|
18
18
|
"antigravity",
|
|
19
|
-
"kiro-cli"
|
|
19
|
+
"kiro-cli",
|
|
20
|
+
"codebuddy",
|
|
21
|
+
"cursor-cli"
|
|
20
22
|
];
|
|
21
23
|
var DEFAULT_RENDERER_AGENTS = KNOWN_RENDERER_AGENTS;
|
|
22
24
|
function defaultIdFactory(sequence) {
|
|
@@ -126,13 +128,25 @@
|
|
|
126
128
|
if (agent === "codex" && codexAccountId) state.codexAccountId = codexAccountId;
|
|
127
129
|
else delete state.codexAccountId;
|
|
128
130
|
if (agent === "pi" && model) state.piModel = model;
|
|
131
|
+
else if (agent === "pi") delete state.piModel;
|
|
129
132
|
if (agent === "claude-code" && model) state.claudeModel = model;
|
|
133
|
+
else if (agent === "claude-code") delete state.claudeModel;
|
|
130
134
|
if (agent === "deepseek-harness" && model) state.deepSeekHarnessModel = model;
|
|
135
|
+
else if (agent === "deepseek-harness") delete state.deepSeekHarnessModel;
|
|
131
136
|
if (agent === "opencode" && model) state.openCodeModel = model;
|
|
137
|
+
else if (agent === "opencode") delete state.openCodeModel;
|
|
132
138
|
if (agent === "grok" && model) state.grokModel = model;
|
|
139
|
+
else if (agent === "grok") delete state.grokModel;
|
|
133
140
|
if (agent === "omp" && model) state.ompModel = model;
|
|
141
|
+
else if (agent === "omp") delete state.ompModel;
|
|
134
142
|
if (agent === "antigravity" && model) state.antigravityModel = model;
|
|
143
|
+
else if (agent === "antigravity") delete state.antigravityModel;
|
|
135
144
|
if (agent === "kiro-cli" && model) state.kiroCliModel = model;
|
|
145
|
+
else if (agent === "kiro-cli") delete state.kiroCliModel;
|
|
146
|
+
if (agent === "codebuddy" && model) state.codeBuddyModel = model;
|
|
147
|
+
else if (agent === "codebuddy") delete state.codeBuddyModel;
|
|
148
|
+
if (agent === "cursor-cli" && model) state.cursorCliModel = model;
|
|
149
|
+
else if (agent === "cursor-cli") delete state.cursorCliModel;
|
|
136
150
|
if (agent === "pi" && thinkingOptionId) state.piThinkingOptionId = thinkingOptionId;
|
|
137
151
|
else if (agent === "pi") delete state.piThinkingOptionId;
|
|
138
152
|
if (agent === "claude-code" && thinkingOptionId) {
|
|
@@ -151,6 +165,9 @@
|
|
|
151
165
|
if (agent === "kiro-cli" && thinkingOptionId) {
|
|
152
166
|
state.kiroCliThinkingOptionId = thinkingOptionId;
|
|
153
167
|
} else if (agent === "kiro-cli") delete state.kiroCliThinkingOptionId;
|
|
168
|
+
if (agent === "codebuddy" && thinkingOptionId) {
|
|
169
|
+
state.codeBuddyThinkingOptionId = thinkingOptionId;
|
|
170
|
+
} else if (agent === "codebuddy") delete state.codeBuddyThinkingOptionId;
|
|
154
171
|
if (agent !== "codex") {
|
|
155
172
|
const permissionModeByAgent = {};
|
|
156
173
|
for (const candidate of [
|
|
@@ -161,7 +178,9 @@
|
|
|
161
178
|
"grok",
|
|
162
179
|
"omp",
|
|
163
180
|
"antigravity",
|
|
164
|
-
"kiro-cli"
|
|
181
|
+
"kiro-cli",
|
|
182
|
+
"codebuddy",
|
|
183
|
+
"cursor-cli"
|
|
165
184
|
]) {
|
|
166
185
|
const current = state.permissionModeByAgent?.[candidate];
|
|
167
186
|
if (candidate !== agent && current) permissionModeByAgent[candidate] = current;
|
|
@@ -185,6 +204,8 @@
|
|
|
185
204
|
if (agent === "omp") return state.ompModel;
|
|
186
205
|
if (agent === "antigravity") return state.antigravityModel;
|
|
187
206
|
if (agent === "kiro-cli") return state.kiroCliModel;
|
|
207
|
+
if (agent === "codebuddy") return state.codeBuddyModel;
|
|
208
|
+
if (agent === "cursor-cli") return state.cursorCliModel;
|
|
188
209
|
return void 0;
|
|
189
210
|
}
|
|
190
211
|
thinkingOptionForAgent(composer, agent) {
|
|
@@ -196,6 +217,7 @@
|
|
|
196
217
|
if (agent === "omp") return state.ompThinkingOptionId;
|
|
197
218
|
if (agent === "antigravity") return state.antigravityThinkingOptionId;
|
|
198
219
|
if (agent === "kiro-cli") return state.kiroCliThinkingOptionId;
|
|
220
|
+
if (agent === "codebuddy") return state.codeBuddyThinkingOptionId;
|
|
199
221
|
return void 0;
|
|
200
222
|
}
|
|
201
223
|
permissionModeForAgent(composer, agent) {
|
|
@@ -219,6 +241,8 @@
|
|
|
219
241
|
else if (agent === "omp") state.ompModel = model;
|
|
220
242
|
else if (agent === "antigravity") state.antigravityModel = model;
|
|
221
243
|
else if (agent === "kiro-cli") state.kiroCliModel = model;
|
|
244
|
+
else if (agent === "codebuddy") state.codeBuddyModel = model;
|
|
245
|
+
else if (agent === "cursor-cli") state.cursorCliModel = model;
|
|
222
246
|
return state;
|
|
223
247
|
}
|
|
224
248
|
setPiConfiguration(composer, model, thinkingOptionId) {
|
|
@@ -259,6 +283,10 @@
|
|
|
259
283
|
state.kiroCliThinkingOptionId = thinkingOptionId;
|
|
260
284
|
} else if (agent === "kiro-cli") {
|
|
261
285
|
delete state.kiroCliThinkingOptionId;
|
|
286
|
+
} else if (agent === "codebuddy" && thinkingOptionId) {
|
|
287
|
+
state.codeBuddyThinkingOptionId = thinkingOptionId;
|
|
288
|
+
} else if (agent === "codebuddy") {
|
|
289
|
+
delete state.codeBuddyThinkingOptionId;
|
|
262
290
|
}
|
|
263
291
|
return state;
|
|
264
292
|
}
|
|
@@ -15484,6 +15512,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15484
15512
|
accountCredits: accountCreditsSnapshotSchema.optional()
|
|
15485
15513
|
}).strict();
|
|
15486
15514
|
|
|
15515
|
+
// ../shared-contracts/dist/reasoning-transcript.js
|
|
15516
|
+
var REASONING_TRANSCRIPT_COMMAND = "thinking";
|
|
15517
|
+
|
|
15487
15518
|
// ../shared-contracts/dist/harness-session-import.js
|
|
15488
15519
|
var HARNESS_SESSION_IMPORT_ID_MAX_LENGTH = 1024;
|
|
15489
15520
|
var HARNESS_SESSION_IMPORT_CWD_MAX_LENGTH = 16384;
|
|
@@ -15838,6 +15869,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15838
15869
|
// src/assets/kiro-agent.svg
|
|
15839
15870
|
var kiro_agent_default = 'data:image/svg+xml,<svg width="1200" height="1200" viewBox="0 0 1200 1200" fill="none" xmlns="http://www.w3.org/2000/svg">%0A<rect width="1200" height="1200" rx="260" fill="%239046FF"/>%0A<mask id="mask0_1106_4856" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="272" y="202" width="655" height="796">%0A<path d="M926.578 202.793H272.637V997.857H926.578V202.793Z" fill="white"/>%0A</mask>%0A<g mask="url(%23mask0_1106_4856)">%0A<path d="M398.554 818.914C316.315 1001.03 491.477 1046.74 620.672 940.156C658.687 1059.66 801.052 970.473 852.234 877.795C964.787 673.567 919.318 465.357 907.64 422.374C827.637 129.443 427.623 128.946 358.8 423.865C342.651 475.544 342.402 534.18 333.458 595.051C328.986 625.86 325.507 645.488 313.83 677.785C306.873 696.424 297.68 712.819 282.773 740.645C259.915 783.881 269.604 867.113 387.87 823.883L399.051 818.914H398.554Z" fill="white"/>%0A<path d="M636.123 549.353C603.328 549.353 598.359 510.097 598.359 486.742C598.359 465.623 602.086 448.977 609.293 438.293C615.504 428.852 624.697 424.131 636.123 424.131C647.555 424.131 657.492 428.852 664.447 438.541C672.398 449.474 676.623 466.12 676.623 486.742C676.623 525.998 661.471 549.353 636.375 549.353H636.123Z" fill="black"/>%0A<path d="M771.24 549.353C738.445 549.353 733.477 510.097 733.477 486.742C733.477 465.623 737.203 448.977 744.41 438.293C750.621 428.852 759.814 424.131 771.24 424.131C782.672 424.131 792.609 428.852 799.564 438.541C807.516 449.474 811.74 466.12 811.74 486.742C811.74 525.998 796.588 549.353 771.492 549.353H771.24Z" fill="black"/>%0A</g>%0A</svg>%0A';
|
|
15840
15871
|
|
|
15872
|
+
// src/assets/codebuddy-agent.svg
|
|
15873
|
+
var codebuddy_agent_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40" fill="none"><g clip-path="url(%23clip0_4958_10776)"><rect x="-0.00146484" width="40" height="40" rx="8.63158" fill="%236C4DFF"></rect><path d="M30.5918 3.12856C30.984 2.77679 31.0078 2.7632 31.2955 2.74593C31.7615 2.71193 32.1882 2.93586 32.9147 3.59728C34.6119 5.13959 36.9755 8.30995 38.4449 11.0177L39.0125 12.0691L39.8143 12.4677C40.5885 12.8589 41.8587 13.6611 42.389 14.0913C42.6286 14.2894 42.6626 14.2934 42.912 14.1964C44.0375 13.7583 45.6494 14.3393 47.0714 15.7033C48.3516 16.9303 49.5781 19.0269 50.0478 20.7767C50.1164 21.0582 50.2074 21.6636 50.2405 22.1144C50.3477 23.6973 49.84 24.9617 48.8624 25.5341C48.6628 25.6493 48.6492 25.6807 48.6548 26.1783C48.6998 28.5492 48.0606 30.9165 46.7768 33.2244C45.3276 35.8156 42.7467 38.496 39.2544 41.0214C37.3789 42.3862 32.9421 44.9717 30.9361 45.8792C26.1304 48.0428 22.278 48.8718 18.9316 48.4618C16.9356 48.22 14.6761 47.4417 13.3392 46.5373C12.9873 46.294 12.9318 46.2791 12.6629 46.3561C11.2318 46.7671 9.35752 45.9219 7.76528 44.1544C7.13027 43.448 6.10508 41.7136 5.77273 40.7853C5.00409 38.6128 5.15721 36.6516 6.18105 35.4808C6.44522 35.1797 6.4538 35.1667 6.39603 34.6598C6.30065 33.8298 6.25703 32.6017 6.30061 31.809L6.33535 31.0683L5.22371 29.1019C3.50212 26.0386 2.40857 23.4663 1.98661 21.501C1.76389 20.4233 1.77734 19.9446 2.05091 19.5908C2.21741 19.3773 2.76347 19.1568 3.42155 19.0352C5.07869 18.7442 8.69327 19.0065 12.7142 19.7165L13.1316 19.789L14.0497 18.977C15.5733 17.6274 16.5858 16.8705 18.4518 15.707C20.3967 14.4901 22.5922 13.4895 25.064 12.6968L25.8564 12.4423L26.2926 11.2974C27.8535 7.17701 29.452 4.13917 30.5918 3.12856ZM17.5169 24.2439C15.7528 25.2625 14.8705 25.7716 14.2223 26.3423C11.5975 28.6536 10.6172 32.3151 11.7346 35.6292C12.0106 36.4475 12.5193 37.3301 13.5378 39.0941C14.5563 40.8582 15.0662 41.7401 15.637 42.3882C17.9483 45.0128 21.6091 45.9938 24.923 44.8764C25.7414 44.6004 26.6233 44.0909 28.3875 43.0724L38.5362 37.213C40.3004 36.1945 41.1826 35.6854 41.8308 35.1147C44.4555 32.8034 45.4363 29.1426 44.319 25.8286C44.043 25.0103 43.5343 24.1277 42.5158 22.3637C41.4974 20.5997 40.9873 19.7177 40.4166 19.0696C38.1053 16.4448 34.4441 15.4631 31.1301 16.5806C30.3118 16.8565 29.4297 17.3661 27.6656 18.3846L17.5169 24.2439Z" fill="white"></path><rect x="18.4944" y="31.334" width="4.00904" height="8.32646" rx="2.00452" transform="rotate(-30 18.4944 31.334)" fill="white"></rect><rect x="29.311" y="25.0898" width="4.00904" height="8.32646" rx="2.00452" transform="rotate(-30 29.311 25.0898)" fill="white"></rect></g><defs><clipPath id="clip0_4958_10776"><rect x="-0.00146484" width="40" height="40" rx="8.63158" fill="white"></rect></clipPath></defs></svg>';
|
|
15874
|
+
|
|
15875
|
+
// src/assets/cursor-agent.svg
|
|
15876
|
+
var cursor_agent_default = 'data:image/svg+xml,<svg fill="none" height="512" viewBox="0 0 512 512" width="512" xmlns="http://www.w3.org/2000/svg"><path d="m512 325.5c0 7.124 0 14.24-.041 21.364-.034 5.999-.103 11.998-.268 17.99-.356 13.068-1.124 26.245-3.448 39.169-2.359 13.109-6.205 25.306-12.266 37.222-5.958 11.703-13.746 22.419-23.029 31.709-9.29 9.29-20 17.072-31.71 23.03-11.909 6.061-24.113 9.907-37.222 12.266-12.923 2.324-26.101 3.092-39.169 3.448-5.999.165-11.991.233-17.99.268-7.123.048-14.24.041-21.364.041h-139c-7.124 0-14.24 0-21.364-.041-5.999-.035-11.998-.103-17.99-.268-13.068-.356-26.245-1.124-39.169-3.448-13.109-2.359-25.306-6.205-37.2219-12.266-11.7033-5.958-22.4194-13.746-31.7095-23.03-9.29-9.29-17.0717-19.999-23.0296-31.709-6.0608-11.909-9.90707-24.113-12.26557-37.222-2.32422-12.924-3.0921-26.101-3.448618-39.169-.164546-5.999-.2331071-11.991-.2673876-17.99-.0274244-7.124-.0274244-14.24-.0274244-21.364v-139c0-7.124 0-14.24.0411366-21.364.0342805-5.999.1028414-11.998.2673884-17.99.356517-13.068 1.124405-26.245 3.448615-39.169 2.3585-13.1091 6.20478-25.3061 12.26556-37.222 5.958-11.7034 13.7465-22.4195 23.0297-31.7095 9.29-9.29 19.9992-17.0717 31.7094-23.0296 11.9091-6.06084 24.1129-9.90711 37.2222-12.26561 12.923-2.32422 26.101-3.092104 39.169-3.448622 5.999-.164546 11.991-.233107 17.99-.2673875 7.117-.0342805 14.233-.0342805 21.357-.0342805h139c7.124 0 14.24 0 21.364.0411366 5.999.0342805 11.998.1028414 17.99.2673884 13.068.356517 26.245 1.124405 39.169 3.448615 13.109 2.3585 25.306 6.20478 37.222 12.26556 11.703 5.958 22.419 13.7465 31.709 23.0297 9.29 9.29 17.072 19.9992 23.03 31.7094 6.061 11.9091 9.907 24.1129 12.266 37.2222 2.324 12.923 3.092 26.101 3.448 39.169.165 5.999.233 11.991.268 17.99.048 7.123.041 14.24.041 21.364v139z" fill="%2314120b"/><path d="m186.5 4h139c7.125 0 14.231-.00004 21.341.04102 5.985.0342 11.952.10221 17.903.26562h.001c13.003.35475 25.943 1.11709 38.569 3.3877 12.775 2.29827 24.592 6.03146 36.118 11.89356v-.001c10.974 5.5867 21.052 12.8384 29.848 21.457l.847.8379c8.993 8.993 16.525 19.3594 22.292 30.6934v.001c5.678 11.1575 9.36 22.6023 11.674 34.9208l.219 1.195c2.129 11.837 2.932 23.95 3.316 36.132l.072 2.438c.164 5.958.232 11.919.266 17.904v.004c.048 7.107.041 14.207.041 21.337v129.344l-.007-.007v9.656c0 7.125 0 14.231-.041 21.341-.034 5.985-.102 11.952-.266 17.903v.001c-.354 13.003-1.117 25.943-3.387 38.569-2.227 12.376-5.8 23.853-11.351 35.037l-.543 1.08c-5.766 11.327-13.306 21.701-22.293 30.695-8.993 8.993-19.361 16.526-30.695 22.293-11.518 5.861-23.342 9.595-36.116 11.893-11.837 2.129-23.95 2.932-36.132 3.316l-2.438.072c-5.958.164-11.919.232-17.904.266h-.004c-7.107.048-14.207.041-21.337.041h-139c-7.125 0-14.231 0-21.341-.041-5.985-.034-11.952-.102-17.903-.266h-.001c-13.003-.355-25.944-1.117-38.57-3.388-12.7742-2.298-24.5914-6.031-36.1165-11.893h.001c-10.974-5.587-21.0534-12.837-29.8496-21.456l-.8467-.838c-8.7118-8.712-16.0531-18.713-21.7461-29.634l-.5459-1.06-.5439-1.081c-5.371-10.816-8.8905-21.919-11.12991-33.84l-.21973-1.196c-2.27061-12.626-3.03294-25.566-3.38769-38.569v-.001c-.16341-5.958-.23142-11.918-.26563-17.903-.02736-7.112-.02734-14.219-.02734-21.341v-139c0-7.125-.00004-14.231.04102-21.341.0342-5.985.10221-11.952.26562-17.903v-.001c.35476-13.003 1.117-25.944 3.3877-38.57 2.29828-12.7744 6.03156-24.5916 11.89356-36.1166l-.001-.001c5.7666-11.327 13.3073-21.6999 22.294-30.6934 8.9933-8.9933 19.3607-16.5261 30.6953-22.2929 11.5173-5.8615 23.3406-9.59619 36.1148-11.89458 11.837-2.12877 23.951-2.93016 36.133-3.31445l2.438-.07227c5.958-.16342 11.919-.23142 17.904-.26562l-.001-.00098c7.104-.03421 14.211-.0332 21.335-.0332z" stroke="%23edecec" stroke-opacity=".2" stroke-width="8"/><path d="m415.035 156.35-151.503-87.4695c-4.865-2.8094-10.868-2.8094-15.733 0l-151.4969 87.4695c-4.0897 2.362-6.6146 6.729-6.6146 11.459v176.383c0 4.73 2.5249 9.097 6.6146 11.458l151.5039 87.47c4.865 2.809 10.868 2.809 15.733 0l151.504-87.47c4.089-2.361 6.614-6.728 6.614-11.458v-176.383c0-4.73-2.525-9.097-6.614-11.459zm-9.516 18.528-146.255 253.32c-.988 1.707-3.599 1.01-3.599-.967v-165.872c0-3.314-1.771-6.379-4.644-8.044l-143.645-82.932c-1.707-.988-1.01-3.599.968-3.599h292.509c4.154 0 6.75 4.503 4.673 8.101h-.007z" fill="%23edecec"/></svg>';
|
|
15877
|
+
|
|
15841
15878
|
// src/assets/omp-agent.svg
|
|
15842
15879
|
var omp_agent_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">%0A <defs>%0A <linearGradient id="omp-gradient" x1="0" y1="0" x2="1" y2="1">%0A <stop offset="0" stop-color="%23ed4abf" />%0A <stop offset=".5" stop-color="%239b4dff" />%0A <stop offset="1" stop-color="%235ad8e6" />%0A </linearGradient>%0A </defs>%0A <path%0A fill="url(%23omp-gradient)"%0A transform="translate(-14.4 -20.2) scale(1.45)"%0A d="M14 16h36v8H40v32h-8V24h-6v22h-8V24h-4z"%0A />%0A</svg>%0A';
|
|
15843
15880
|
|
|
@@ -15854,7 +15891,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15854
15891
|
grok: "Grok",
|
|
15855
15892
|
omp: "Oh My Pi",
|
|
15856
15893
|
antigravity: "Antigravity CLI",
|
|
15857
|
-
"kiro-cli": "Kiro CLI"
|
|
15894
|
+
"kiro-cli": "Kiro CLI",
|
|
15895
|
+
codebuddy: "CodeBuddy",
|
|
15896
|
+
"cursor-cli": "Cursor CLI (Experimental)"
|
|
15858
15897
|
};
|
|
15859
15898
|
var PI_PATHS = [
|
|
15860
15899
|
{
|
|
@@ -15930,9 +15969,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
15930
15969
|
image.style.flex = "none";
|
|
15931
15970
|
return image;
|
|
15932
15971
|
}
|
|
15933
|
-
if (agent === "antigravity" || agent === "kiro-cli") {
|
|
15972
|
+
if (agent === "antigravity" || agent === "kiro-cli" || agent === "codebuddy" || agent === "cursor-cli") {
|
|
15934
15973
|
const image = ownerDocument.createElement("img");
|
|
15935
|
-
image.src = agent === "kiro-cli" ? kiro_agent_default : antigravity_agent_default;
|
|
15974
|
+
image.src = agent === "codebuddy" ? codebuddy_agent_default : agent === "cursor-cli" ? cursor_agent_default : agent === "kiro-cli" ? kiro_agent_default : antigravity_agent_default;
|
|
15936
15975
|
image.alt = "";
|
|
15937
15976
|
image.draggable = false;
|
|
15938
15977
|
image.style.width = `${size}px`;
|
|
@@ -16291,6 +16330,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16291
16330
|
["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }]
|
|
16292
16331
|
];
|
|
16293
16332
|
|
|
16333
|
+
// ../../node_modules/lucide/dist/esm/icons/ellipsis.mjs
|
|
16334
|
+
var Ellipsis = [
|
|
16335
|
+
["circle", { cx: "12", cy: "12", r: "1" }],
|
|
16336
|
+
["circle", { cx: "19", cy: "12", r: "1" }],
|
|
16337
|
+
["circle", { cx: "5", cy: "12", r: "1" }]
|
|
16338
|
+
];
|
|
16339
|
+
|
|
16294
16340
|
// ../../node_modules/lucide/dist/esm/icons/folder-input.mjs
|
|
16295
16341
|
var FolderInput = [
|
|
16296
16342
|
[
|
|
@@ -16504,7 +16550,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16504
16550
|
"trash",
|
|
16505
16551
|
"terminal",
|
|
16506
16552
|
"search",
|
|
16507
|
-
"help"
|
|
16553
|
+
"help",
|
|
16554
|
+
"ellipsis"
|
|
16508
16555
|
];
|
|
16509
16556
|
var iconNodes = {
|
|
16510
16557
|
settings: Settings,
|
|
@@ -16539,7 +16586,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16539
16586
|
trash: Trash2,
|
|
16540
16587
|
terminal: Terminal,
|
|
16541
16588
|
search: Search,
|
|
16542
|
-
help: CircleQuestionMark
|
|
16589
|
+
help: CircleQuestionMark,
|
|
16590
|
+
ellipsis: Ellipsis
|
|
16543
16591
|
};
|
|
16544
16592
|
function isRendererSettingsIconName(value) {
|
|
16545
16593
|
return RENDERER_SETTINGS_ICON_NAMES.includes(value);
|
|
@@ -16579,7 +16627,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
16579
16627
|
grok: "https://grok.com/",
|
|
16580
16628
|
omp: "https://github.com/can1357/oh-my-pi",
|
|
16581
16629
|
antigravity: "https://antigravity.google/product/antigravity-cli",
|
|
16582
|
-
"kiro-cli": "https://kiro.dev/docs/cli/"
|
|
16630
|
+
"kiro-cli": "https://kiro.dev/docs/cli/",
|
|
16631
|
+
codebuddy: "https://www.codebuddy.ai/docs/zh/cli/overview",
|
|
16632
|
+
"cursor-cli": "https://cursor.com/docs/cli/installation"
|
|
16583
16633
|
});
|
|
16584
16634
|
function connectionStatusLabel(availability, messages, hasError = false) {
|
|
16585
16635
|
if (hasError && availability !== "notInstalled") return messages.connectionStatusError;
|
|
@@ -17357,6 +17407,9 @@ ${error51.stderrTail}`] : []
|
|
|
17357
17407
|
sectionsLabel: "Settings sections",
|
|
17358
17408
|
generalSection: "General",
|
|
17359
17409
|
otherSection: "Other",
|
|
17410
|
+
appearanceDescription: "Adjust how thinking text is displayed in the conversation.",
|
|
17411
|
+
reasoningSoftWrapTitle: "Wrap thinking text",
|
|
17412
|
+
reasoningSoftWrapDescription: "Wrap long thinking lines in the transcript. Ordinary shell output is unaffected. Off by default.",
|
|
17360
17413
|
pageUnavailable: "Page unavailable",
|
|
17361
17414
|
inDevelopment: "In development",
|
|
17362
17415
|
notAvailable: "Not available",
|
|
@@ -17393,26 +17446,26 @@ ${error51.stderrTail}`] : []
|
|
|
17393
17446
|
sessionImportRetryOpen: "Try opening again",
|
|
17394
17447
|
sessionImportRetrying: "Opening...",
|
|
17395
17448
|
connectionsDescription: "View runtime status by Host. Select an item to inspect details or complete its setup.",
|
|
17396
|
-
accountsDescription: "
|
|
17397
|
-
|
|
17398
|
-
|
|
17399
|
-
|
|
17400
|
-
accountAdd: "Add Account",
|
|
17449
|
+
accountsDescription: "View accounts and limits across Agents, and manage your Codex default account.",
|
|
17450
|
+
accountConnected: "Accounts",
|
|
17451
|
+
accountDefaultBadge: "Codex default",
|
|
17452
|
+
accountAdd: "Add Codex account",
|
|
17401
17453
|
accountColumnAccount: "Account",
|
|
17402
|
-
|
|
17403
|
-
|
|
17404
|
-
|
|
17405
|
-
accountEmpty: "No accounts yet. Add an account to get started.",
|
|
17454
|
+
accountColumnActions: "Manage",
|
|
17455
|
+
accountSearch: "Search accounts or Agents\u2026",
|
|
17456
|
+
accountEmpty: "No accounts yet. Add a Codex account or sign in to an Agent in its native client.",
|
|
17406
17457
|
accountNoMatches: "No matching accounts.",
|
|
17407
|
-
|
|
17408
|
-
|
|
17458
|
+
accountNativeManaged: "Native management",
|
|
17459
|
+
accountNativeManagementHint: "This account comes from {harness}'s native authentication. This page only displays identity and limits; manage sign-in, sign-out and switching in the native client.",
|
|
17460
|
+
accountMore: "Codex account actions",
|
|
17461
|
+
accountDetailsClose: "Close account details",
|
|
17462
|
+
accountDefaultHint: "Use as the default for new Codex tasks only",
|
|
17409
17463
|
accountCreditsRemaining: "Remaining",
|
|
17410
17464
|
accountCreditsLoading: "Loading limits\u2026",
|
|
17411
17465
|
accountCreditsEmpty: "No limit data available",
|
|
17412
17466
|
accountCreditsFailed: "Could not load limits",
|
|
17413
17467
|
accountCreditsRetry: "Retry",
|
|
17414
17468
|
accountCreditsRefresh: "Refresh limits",
|
|
17415
|
-
accountResetCreditsUnknown: "No reset card data available",
|
|
17416
17469
|
accountCreateFailed: "Could not add the Account.",
|
|
17417
17470
|
accountDelete: "Delete",
|
|
17418
17471
|
accountDeleteConfirm: "Delete this Account and its local data? This cannot be undone.",
|
|
@@ -17422,7 +17475,6 @@ ${error51.stderrTail}`] : []
|
|
|
17422
17475
|
accountUse: "Set as default",
|
|
17423
17476
|
accountSignIn: "Sign in",
|
|
17424
17477
|
accountSigningIn: "Starting device sign-in...",
|
|
17425
|
-
accountDeviceCodePrerequisite: "Before signing in, enable \u201CEnable device code authorization for Codex\u201D in Web Settings \u2192 Account security & sign-in.",
|
|
17426
17478
|
accountVerificationDescription: "Open the verification page and enter this one-time code:",
|
|
17427
17479
|
accountCopyCode: "Copy code",
|
|
17428
17480
|
accountCopied: "Copied",
|
|
@@ -17431,7 +17483,10 @@ ${error51.stderrTail}`] : []
|
|
|
17431
17483
|
accountLoginFailed: "Sign-in failed.",
|
|
17432
17484
|
accountLoadFailed: "Could not load Codex Accounts.",
|
|
17433
17485
|
accountCreditsUsed: "Used",
|
|
17434
|
-
|
|
17486
|
+
accountCreditsResetAt: "Quota resets: {time}",
|
|
17487
|
+
accountCreditsResetIn: "Quota resets in {time}",
|
|
17488
|
+
accountCreditsResetPending: "Awaiting refresh",
|
|
17489
|
+
accountCreditsResetPendingHint: "The reset time has passed; refresh to check the actual quota.",
|
|
17435
17490
|
accountCreditsPeriodWeekly: "Weekly limit",
|
|
17436
17491
|
accountCreditsPeriodMonthly: "Monthly limit",
|
|
17437
17492
|
accountCreditsPeriodFiveHour: "5-hour",
|
|
@@ -17547,6 +17602,7 @@ ${error51.stderrTail}`] : []
|
|
|
17547
17602
|
aboutRepository: "Open-source repository",
|
|
17548
17603
|
pageLabels: Object.freeze({
|
|
17549
17604
|
connections: "Connections",
|
|
17605
|
+
appearance: "Appearance",
|
|
17550
17606
|
accounts: "Accounts",
|
|
17551
17607
|
"session-import": "Session Import",
|
|
17552
17608
|
updates: "Updates",
|
|
@@ -17561,6 +17617,9 @@ ${error51.stderrTail}`] : []
|
|
|
17561
17617
|
sectionsLabel: "\u8BBE\u7F6E\u5206\u7C7B",
|
|
17562
17618
|
generalSection: "\u901A\u7528",
|
|
17563
17619
|
otherSection: "\u5176\u4ED6",
|
|
17620
|
+
appearanceDescription: "\u8C03\u6574\u4F1A\u8BDD\u4E2D\u601D\u8003\u6587\u672C\u7684\u663E\u793A\u65B9\u5F0F\u3002",
|
|
17621
|
+
reasoningSoftWrapTitle: "\u6362\u884C\u663E\u793A\u601D\u8003\u6587\u672C",
|
|
17622
|
+
reasoningSoftWrapDescription: "\u8BA9\u601D\u8003\u5757\u4E2D\u7684\u957F\u884C\u81EA\u52A8\u6362\u884C\u3002\u666E\u901A Shell \u8F93\u51FA\u4E0D\u53D7\u5F71\u54CD\u3002\u9ED8\u8BA4\u5173\u95ED\u3002",
|
|
17564
17623
|
pageUnavailable: "\u9875\u9762\u4E0D\u53EF\u7528",
|
|
17565
17624
|
inDevelopment: "\u5F00\u53D1\u4E2D",
|
|
17566
17625
|
notAvailable: "\u6682\u4E0D\u53EF\u7528",
|
|
@@ -17597,26 +17656,26 @@ ${error51.stderrTail}`] : []
|
|
|
17597
17656
|
sessionImportRetryOpen: "\u91CD\u8BD5\u6253\u5F00",
|
|
17598
17657
|
sessionImportRetrying: "\u6B63\u5728\u6253\u5F00\u2026\u2026",
|
|
17599
17658
|
connectionsDescription: "\u6309 Host \u67E5\u770B\u8FD0\u884C\u65F6\u72B6\u6001\u3002\u9009\u62E9\u4E00\u9879\uFF0C\u5728\u53F3\u4FA7\u68C0\u67E5\u8BE6\u60C5\u6216\u5B8C\u6210\u914D\u7F6E\u3002",
|
|
17600
|
-
accountsDescription: "\
|
|
17601
|
-
|
|
17602
|
-
|
|
17603
|
-
|
|
17604
|
-
accountAdd: "\u6DFB\u52A0\u8D26\u53F7",
|
|
17659
|
+
accountsDescription: "\u67E5\u770B\u5404 Agent \u7684\u8D26\u53F7\u4E0E\u989D\u5EA6\uFF0C\u7BA1\u7406 Codex \u9ED8\u8BA4\u8D26\u53F7\u3002",
|
|
17660
|
+
accountConnected: "\u8D26\u53F7",
|
|
17661
|
+
accountDefaultBadge: "Codex \u9ED8\u8BA4",
|
|
17662
|
+
accountAdd: "\u6DFB\u52A0 Codex \u8D26\u53F7",
|
|
17605
17663
|
accountColumnAccount: "\u8D26\u53F7",
|
|
17606
|
-
|
|
17607
|
-
|
|
17608
|
-
|
|
17609
|
-
accountEmpty: "\u8FD8\u6CA1\u6709\u8D26\u53F7\uFF0C\u6DFB\u52A0\u4E00\u4E2A\u8D26\u53F7\u5373\u53EF\u5F00\u59CB\u3002",
|
|
17664
|
+
accountColumnActions: "\u7BA1\u7406",
|
|
17665
|
+
accountSearch: "\u641C\u7D22\u8D26\u53F7\u6216 Agent\u2026",
|
|
17666
|
+
accountEmpty: "\u8FD8\u6CA1\u6709\u8D26\u53F7\uFF0C\u53EF\u6DFB\u52A0 Codex \u8D26\u53F7\u6216\u5728\u5176\u4ED6 Agent \u7684\u539F\u751F\u5BA2\u6237\u7AEF\u767B\u5F55\u3002",
|
|
17610
17667
|
accountNoMatches: "\u6CA1\u6709\u5339\u914D\u7684\u8D26\u53F7\u3002",
|
|
17611
|
-
|
|
17612
|
-
|
|
17668
|
+
accountNativeManaged: "\u539F\u751F\u7BA1\u7406",
|
|
17669
|
+
accountNativeManagementHint: "\u6B64\u8D26\u53F7\u6765\u81EA {harness} \u7684\u539F\u751F\u767B\u5F55\u3002\u8FD9\u91CC\u53EA\u8BFB\u5C55\u793A\u8EAB\u4EFD\u4E0E\u989D\u5EA6\uFF1B\u767B\u5F55\u3001\u9000\u51FA\u548C\u5207\u6362\u8BF7\u5728\u5176\u539F\u751F\u5BA2\u6237\u7AEF\u4E2D\u5B8C\u6210\u3002",
|
|
17670
|
+
accountMore: "Codex \u8D26\u53F7\u64CD\u4F5C",
|
|
17671
|
+
accountDetailsClose: "\u5173\u95ED\u8D26\u53F7\u8BE6\u60C5",
|
|
17672
|
+
accountDefaultHint: "\u4EC5\u8BBE\u4E3A\u65B0 Codex \u4EFB\u52A1\u7684\u9ED8\u8BA4\u8D26\u53F7",
|
|
17613
17673
|
accountCreditsRemaining: "\u5269\u4F59",
|
|
17614
17674
|
accountCreditsLoading: "\u6B63\u5728\u8BFB\u53D6\u989D\u5EA6\u2026",
|
|
17615
17675
|
accountCreditsEmpty: "\u6682\u65E0\u989D\u5EA6\u6570\u636E",
|
|
17616
17676
|
accountCreditsFailed: "\u989D\u5EA6\u8BFB\u53D6\u5931\u8D25",
|
|
17617
17677
|
accountCreditsRetry: "\u91CD\u8BD5",
|
|
17618
17678
|
accountCreditsRefresh: "\u5237\u65B0\u989D\u5EA6",
|
|
17619
|
-
accountResetCreditsUnknown: "\u6682\u65E0\u91CD\u7F6E\u5361\u6570\u636E",
|
|
17620
17679
|
accountCreateFailed: "\u6DFB\u52A0\u8D26\u53F7\u5931\u8D25\u3002",
|
|
17621
17680
|
accountDelete: "\u5220\u9664",
|
|
17622
17681
|
accountDeleteConfirm: "\u5220\u9664\u6B64\u8D26\u53F7\u53CA\u5176\u672C\u5730\u6570\u636E\uFF1F\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002",
|
|
@@ -17626,7 +17685,6 @@ ${error51.stderrTail}`] : []
|
|
|
17626
17685
|
accountUse: "\u8BBE\u4E3A\u9ED8\u8BA4",
|
|
17627
17686
|
accountSignIn: "\u767B\u5F55",
|
|
17628
17687
|
accountSigningIn: "\u6B63\u5728\u542F\u52A8\u8BBE\u5907\u767B\u5F55...",
|
|
17629
|
-
accountDeviceCodePrerequisite: "\u767B\u5F55\u524D\uFF0C\u8BF7\u5148\u5728 Web \u7AEF\u7684\u201C\u8BBE\u7F6E \u2192 \u8D26\u53F7\u5B89\u5168\u4E0E\u767B\u5F55\u201D\u4E2D\u5F00\u542F\u201C\u4E3A Codex \u542F\u7528\u8BBE\u5907\u4EE3\u7801\u6388\u6743\u201D\u3002",
|
|
17630
17688
|
accountVerificationDescription: "\u6253\u5F00\u9A8C\u8BC1\u9875\u9762\u5E76\u8F93\u5165\u4EE5\u4E0B\u4E00\u6B21\u6027\u4EE3\u7801\uFF1A",
|
|
17631
17689
|
accountCopyCode: "\u590D\u5236\u4EE3\u7801",
|
|
17632
17690
|
accountCopied: "\u5DF2\u590D\u5236",
|
|
@@ -17635,7 +17693,10 @@ ${error51.stderrTail}`] : []
|
|
|
17635
17693
|
accountLoginFailed: "\u767B\u5F55\u5931\u8D25\u3002",
|
|
17636
17694
|
accountLoadFailed: "\u65E0\u6CD5\u52A0\u8F7D Codex \u8D26\u53F7\u3002",
|
|
17637
17695
|
accountCreditsUsed: "\u5DF2\u7528",
|
|
17638
|
-
|
|
17696
|
+
accountCreditsResetAt: "\u989D\u5EA6\u91CD\u7F6E\u65F6\u95F4\uFF1A{time}",
|
|
17697
|
+
accountCreditsResetIn: "\u8DDD\u91CD\u7F6E\u8FD8\u6709 {time}",
|
|
17698
|
+
accountCreditsResetPending: "\u5F85\u5237\u65B0",
|
|
17699
|
+
accountCreditsResetPendingHint: "\u91CD\u7F6E\u65F6\u95F4\u5DF2\u5230\uFF0C\u8BF7\u5237\u65B0\u4EE5\u786E\u8BA4\u5B9E\u9645\u989D\u5EA6\u3002",
|
|
17639
17700
|
accountCreditsPeriodWeekly: "\u5468\u989D\u5EA6",
|
|
17640
17701
|
accountCreditsPeriodMonthly: "\u6708\u989D\u5EA6",
|
|
17641
17702
|
accountCreditsPeriodFiveHour: "5 \u5C0F\u65F6",
|
|
@@ -17751,6 +17812,7 @@ ${error51.stderrTail}`] : []
|
|
|
17751
17812
|
aboutRepository: "\u5F00\u6E90\u4ED3\u5E93",
|
|
17752
17813
|
pageLabels: Object.freeze({
|
|
17753
17814
|
connections: "\u8FDE\u63A5",
|
|
17815
|
+
appearance: "\u5916\u89C2",
|
|
17754
17816
|
accounts: "\u8D26\u53F7",
|
|
17755
17817
|
"session-import": "\u4F1A\u8BDD\u5BFC\u5165",
|
|
17756
17818
|
updates: "\u66F4\u65B0",
|
|
@@ -17803,7 +17865,9 @@ ${error51.stderrTail}`] : []
|
|
|
17803
17865
|
grok: "https://grok.com/",
|
|
17804
17866
|
omp: "https://github.com/can1357/oh-my-pi",
|
|
17805
17867
|
antigravity: "https://antigravity.google/product/antigravity-cli",
|
|
17806
|
-
"kiro-cli": "https://kiro.dev/docs/cli/"
|
|
17868
|
+
"kiro-cli": "https://kiro.dev/docs/cli/",
|
|
17869
|
+
codebuddy: "https://www.codebuddy.ai/docs/zh/cli/overview",
|
|
17870
|
+
"cursor-cli": "https://cursor.com/docs/cli/installation"
|
|
17807
17871
|
};
|
|
17808
17872
|
var CONTROL_ATTRIBUTE = "data-codexhost-agent-control";
|
|
17809
17873
|
var AGENT_MENU_WIDTH = 224;
|
|
@@ -19090,7 +19154,14 @@ ${error51.stderrTail}`] : []
|
|
|
19090
19154
|
["Workspace write", "\u5DE5\u4F5C\u533A\u5199\u5165"],
|
|
19091
19155
|
["Full access (dangerous)", "\u5B8C\u5168\u8BBF\u95EE\uFF08\u5371\u9669\uFF09"],
|
|
19092
19156
|
["Configured permissions", "\u4F7F\u7528\u5DF2\u914D\u7F6E\u6743\u9650"],
|
|
19093
|
-
["Skip permissions", "\u8DF3\u8FC7\u6743\u9650\u68C0\u67E5"]
|
|
19157
|
+
["Skip permissions", "\u8DF3\u8FC7\u6743\u9650\u68C0\u67E5"],
|
|
19158
|
+
["Always Ask", "\u59CB\u7EC8\u8BE2\u95EE"],
|
|
19159
|
+
["Accept Edits", "\u63A5\u53D7\u7F16\u8F91"],
|
|
19160
|
+
["Plan", "\u89C4\u5212\u6A21\u5F0F"],
|
|
19161
|
+
["Don't Ask", "\u4E0D\u8BE2\u95EE"],
|
|
19162
|
+
["Bypass Permissions", "\u7ED5\u8FC7\u6743\u9650"],
|
|
19163
|
+
["Full Access", "\u5B8C\u5168\u8BBF\u95EE"],
|
|
19164
|
+
["Delegate", "\u7531\u7236\u4F1A\u8BDD\u7BA1\u7406"]
|
|
19094
19165
|
]);
|
|
19095
19166
|
var CHINESE_PERMISSION_MODE_DESCRIPTIONS = /* @__PURE__ */ new Map([
|
|
19096
19167
|
[
|
|
@@ -19127,7 +19198,36 @@ ${error51.stderrTail}`] : []
|
|
|
19127
19198
|
"Use Antigravity CLI permission rules; headless prompts are denied safely.",
|
|
19128
19199
|
"\u4F7F\u7528 Antigravity CLI \u6743\u9650\u89C4\u5219\uFF1B\u65E0\u754C\u9762\u8FD0\u884C\u65F6\u5B89\u5168\u62D2\u7EDD\u9700\u8981\u4EA4\u4E92\u786E\u8BA4\u7684\u8BF7\u6C42\u3002"
|
|
19129
19200
|
],
|
|
19130
|
-
["Auto-approve every Antigravity CLI tool action.", "\u81EA\u52A8\u6279\u51C6\u6240\u6709 Antigravity CLI \u5DE5\u5177\u64CD\u4F5C\u3002"]
|
|
19201
|
+
["Auto-approve every Antigravity CLI tool action.", "\u81EA\u52A8\u6279\u51C6\u6240\u6709 Antigravity CLI \u5DE5\u5177\u64CD\u4F5C\u3002"],
|
|
19202
|
+
["Prompts for permission on first use of each tool", "\u9996\u6B21\u4F7F\u7528\u6BCF\u79CD\u5DE5\u5177\u65F6\u8BF7\u6C42\u6743\u9650\u3002"],
|
|
19203
|
+
[
|
|
19204
|
+
"Automatically accepts file edit permissions for the session",
|
|
19205
|
+
"\u81EA\u52A8\u63A5\u53D7\u672C\u4F1A\u8BDD\u4E2D\u7684\u6587\u4EF6\u7F16\u8F91\u6743\u9650\u3002"
|
|
19206
|
+
],
|
|
19207
|
+
[
|
|
19208
|
+
"Agent can analyze but not modify files or execute commands",
|
|
19209
|
+
"Agent \u53EF\u4EE5\u5206\u6790\uFF0C\u4F46\u4E0D\u80FD\u4FEE\u6539\u6587\u4EF6\u6216\u6267\u884C\u547D\u4EE4\u3002"
|
|
19210
|
+
],
|
|
19211
|
+
[
|
|
19212
|
+
"An AI classifier reviews actions that would normally prompt: safe ones are auto-approved, risky ones are denied. If the classifier is unavailable, the action falls back to a prompt (or is denied when prompts cannot be shown)",
|
|
19213
|
+
"\u7531 AI \u5206\u7C7B\u5668\u8BC4\u4F30\u539F\u672C\u9700\u8981\u8BE2\u95EE\u7684\u64CD\u4F5C\uFF1A\u5B89\u5168\u64CD\u4F5C\u81EA\u52A8\u6279\u51C6\uFF0C\u98CE\u9669\u64CD\u4F5C\u62D2\u7EDD\u3002\u5206\u7C7B\u5668\u4E0D\u53EF\u7528\u65F6\u6539\u4E3A\u8BE2\u95EE\uFF1B\u65E0\u6CD5\u663E\u793A\u8BE2\u95EE\u65F6\u62D2\u7EDD\u3002"
|
|
19214
|
+
],
|
|
19215
|
+
[
|
|
19216
|
+
"Does not show permission prompts; pre-approved and safe read-only actions run, everything else that would prompt is denied",
|
|
19217
|
+
"\u4E0D\u663E\u793A\u6743\u9650\u8BE2\u95EE\uFF1B\u5DF2\u83B7\u6279\u51C6\u548C\u5B89\u5168\u7684\u53EA\u8BFB\u64CD\u4F5C\u53EF\u4EE5\u6267\u884C\uFF0C\u5176\u4F59\u539F\u672C\u9700\u8981\u8BE2\u95EE\u7684\u64CD\u4F5C\u4F1A\u88AB\u62D2\u7EDD\u3002"
|
|
19218
|
+
],
|
|
19219
|
+
["Skips all permission prompts", "\u8DF3\u8FC7\u5E38\u89C4\u6743\u9650\u8BE2\u95EE\u3002"],
|
|
19220
|
+
[
|
|
19221
|
+
"Skips ALL permission checks including dangerous commands for all agents",
|
|
19222
|
+
"\u4E3A\u6240\u6709 Agent \u8DF3\u8FC7\u5168\u90E8\u6743\u9650\u68C0\u67E5\uFF0C\u5305\u62EC\u5371\u9669\u547D\u4EE4\u3002"
|
|
19223
|
+
],
|
|
19224
|
+
["Permissions managed by parent session", "\u7531\u7236\u4F1A\u8BDD\u7BA1\u7406\u6743\u9650\u3002"],
|
|
19225
|
+
[
|
|
19226
|
+
"Native agent mode with Cursor tool approvals",
|
|
19227
|
+
"\u6267\u884C\u4EFB\u52A1\uFF0C\u53EF\u4FEE\u6539\u6587\u4EF6\u548C\u8FD0\u884C\u547D\u4EE4\uFF1B\u9700\u8981\u5BA1\u6279\u7684\u64CD\u4F5C\u4ECD\u4F1A\u8BF7\u6C42\u786E\u8BA4\u3002"
|
|
19228
|
+
],
|
|
19229
|
+
["Native read-only planning mode", "\u53EA\u8BFB\u5206\u6790\u4EE3\u7801\u5E76\u5236\u5B9A\u5B9E\u65BD\u8BA1\u5212\uFF0C\u4E0D\u4FEE\u6539\u9879\u76EE\u6587\u4EF6\u3002"],
|
|
19230
|
+
["Native read-only question mode", "\u53EA\u8BFB\u67E5\u770B\u4EE3\u7801\u5E76\u56DE\u7B54\u95EE\u9898\uFF0C\u4E0D\u4FEE\u6539\u9879\u76EE\u6587\u4EF6\u3002"]
|
|
19131
19231
|
]);
|
|
19132
19232
|
function rendererHarnessMessages(locale) {
|
|
19133
19233
|
return locale === "zh-CN" ? CHINESE_HARNESS_MESSAGES : ENGLISH_HARNESS_MESSAGES;
|
|
@@ -19899,7 +19999,7 @@ ${error51.stderrTail}`] : []
|
|
|
19899
19999
|
if (periodType === "seven_day") return messages.sevenDay;
|
|
19900
20000
|
return messages.account;
|
|
19901
20001
|
}
|
|
19902
|
-
function productLabel(product, locale) {
|
|
20002
|
+
function productLabel(product, locale = "en") {
|
|
19903
20003
|
if (product === "GrokBuild") return "Build";
|
|
19904
20004
|
if (product === "GrokChat") return "Chat";
|
|
19905
20005
|
if (product === "GrokImagine") return "Imagine";
|
|
@@ -19907,12 +20007,22 @@ ${error51.stderrTail}`] : []
|
|
|
19907
20007
|
const messages = rendererCreditsMessages(locale);
|
|
19908
20008
|
if (product === "5-hour window") return messages.fiveHour;
|
|
19909
20009
|
if (product === "7-day window") return messages.sevenDay;
|
|
20010
|
+
if (product === "Weekly window") return messages.weekly;
|
|
19910
20011
|
if (product.endsWith(" \xB7 5-hour window")) {
|
|
19911
20012
|
return `${product.slice(0, -"5-hour window".length)}${messages.fiveHour}`;
|
|
19912
20013
|
}
|
|
19913
20014
|
if (product.endsWith(" \xB7 7-day window")) {
|
|
19914
20015
|
return `${product.slice(0, -"7-day window".length)}${messages.sevenDay}`;
|
|
19915
20016
|
}
|
|
20017
|
+
if (product.endsWith(" \xB7 Weekly window")) {
|
|
20018
|
+
return `${product.slice(0, -"Weekly window".length)}${messages.weekly}`;
|
|
20019
|
+
}
|
|
20020
|
+
if (product.endsWith(" \xB7 5-hour")) {
|
|
20021
|
+
return `${product.slice(0, -"5-hour".length)}${messages.fiveHour}`;
|
|
20022
|
+
}
|
|
20023
|
+
if (product.endsWith(" \xB7 7-day")) {
|
|
20024
|
+
return `${product.slice(0, -"7-day".length)}${messages.sevenDay}`;
|
|
20025
|
+
}
|
|
19916
20026
|
return product;
|
|
19917
20027
|
}
|
|
19918
20028
|
function toneColor(tone) {
|
|
@@ -19954,7 +20064,7 @@ ${error51.stderrTail}`] : []
|
|
|
19954
20064
|
top.style.marginBottom = "5px";
|
|
19955
20065
|
const left = document.createElement("div");
|
|
19956
20066
|
const label = document.createElement("div");
|
|
19957
|
-
label.textContent = creditsPeriodLabel(credits.periodType, locale);
|
|
20067
|
+
label.textContent = credits.label ? productLabel(credits.label, locale) : creditsPeriodLabel(credits.periodType, locale);
|
|
19958
20068
|
label.style.fontSize = "12.5px";
|
|
19959
20069
|
label.style.fontWeight = "600";
|
|
19960
20070
|
left.append(label);
|
|
@@ -20198,7 +20308,8 @@ ${error51.stderrTail}`] : []
|
|
|
20198
20308
|
}
|
|
20199
20309
|
const remaining = remainingPercent(accountCredits.usedPercent);
|
|
20200
20310
|
const percent = formatRendererCreditsPercent(remaining);
|
|
20201
|
-
const
|
|
20311
|
+
const periodLabel = accountCredits.label ? productLabel(accountCredits.label, locale) : creditsPeriodLabel(accountCredits.periodType, locale);
|
|
20312
|
+
const title = `${periodLabel} ${percent}`;
|
|
20202
20313
|
const tone = rendererCreditsTone(accountCredits.usedPercent);
|
|
20203
20314
|
const ringSlot = control.trigger.querySelector("[data-codexhost-credits-ring]");
|
|
20204
20315
|
const label = control.trigger.querySelector("[data-codexhost-credits-label]");
|
|
@@ -21035,6 +21146,51 @@ ${error51.stderrTail}`] : []
|
|
|
21035
21146
|
control.picker.dispose();
|
|
21036
21147
|
}
|
|
21037
21148
|
|
|
21149
|
+
// src/renderer-transcript-dom.ts
|
|
21150
|
+
var TRANSCRIPT_TEXT_BODY_SELECTOR = '[data-testid="exec-shell-body"]';
|
|
21151
|
+
var REASONING_SOFT_WRAP_STORAGE_KEY = "codexhost.reasoning-soft-wrap.v1";
|
|
21152
|
+
var REASONING_SOFT_WRAP_CHANGE_EVENT = "codexhost:reasoning-soft-wrap-changed";
|
|
21153
|
+
function readReasoningTranscriptSoftWrap(ownerWindow) {
|
|
21154
|
+
return ownerWindow.localStorage.getItem(REASONING_SOFT_WRAP_STORAGE_KEY) === "true";
|
|
21155
|
+
}
|
|
21156
|
+
function setReasoningTranscriptSoftWrap(ownerWindow, enabled) {
|
|
21157
|
+
ownerWindow.localStorage.setItem(REASONING_SOFT_WRAP_STORAGE_KEY, String(enabled));
|
|
21158
|
+
ownerWindow.dispatchEvent(new Event(REASONING_SOFT_WRAP_CHANGE_EVENT));
|
|
21159
|
+
}
|
|
21160
|
+
function installReasoningTranscriptSoftWrap(ownerDocument) {
|
|
21161
|
+
const ownerWindow = ownerDocument.defaultView;
|
|
21162
|
+
if (!ownerWindow) return () => {
|
|
21163
|
+
};
|
|
21164
|
+
const style = ownerDocument.createElement("style");
|
|
21165
|
+
style.setAttribute("data-codexhost-reasoning-soft-wrap", "true");
|
|
21166
|
+
const body = `${TRANSCRIPT_TEXT_BODY_SELECTOR}:has([aria-label="$ ${REASONING_TRANSCRIPT_COMMAND}"])`;
|
|
21167
|
+
style.textContent = `
|
|
21168
|
+
${body} .whitespace-pre {
|
|
21169
|
+
white-space: pre-wrap;
|
|
21170
|
+
overflow-wrap: anywhere;
|
|
21171
|
+
}
|
|
21172
|
+
${body} .whitespace-pre > .w-max {
|
|
21173
|
+
width: 100%;
|
|
21174
|
+
min-width: 0;
|
|
21175
|
+
}
|
|
21176
|
+
`;
|
|
21177
|
+
ownerDocument.head.append(style);
|
|
21178
|
+
const refresh = () => {
|
|
21179
|
+
style.disabled = !readReasoningTranscriptSoftWrap(ownerWindow);
|
|
21180
|
+
};
|
|
21181
|
+
const onStorage = (event) => {
|
|
21182
|
+
if (event.key === REASONING_SOFT_WRAP_STORAGE_KEY || event.key === null) refresh();
|
|
21183
|
+
};
|
|
21184
|
+
refresh();
|
|
21185
|
+
ownerWindow.addEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, refresh);
|
|
21186
|
+
ownerWindow.addEventListener("storage", onStorage);
|
|
21187
|
+
return () => {
|
|
21188
|
+
ownerWindow.removeEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, refresh);
|
|
21189
|
+
ownerWindow.removeEventListener("storage", onStorage);
|
|
21190
|
+
style.remove();
|
|
21191
|
+
};
|
|
21192
|
+
}
|
|
21193
|
+
|
|
21038
21194
|
// src/renderer-codex-account-state.ts
|
|
21039
21195
|
function resolveCodexAccountSelection(accounts, overrideAccountId) {
|
|
21040
21196
|
const activeAccountId = accounts.find((account) => account.active)?.accountId ?? null;
|
|
@@ -21162,6 +21318,8 @@ ${error51.stderrTail}`] : []
|
|
|
21162
21318
|
if (ownership.harnessId === "omp") return "omp";
|
|
21163
21319
|
if (ownership.harnessId === "antigravity") return "antigravity";
|
|
21164
21320
|
if (ownership.harnessId === "kiro-cli") return "kiro-cli";
|
|
21321
|
+
if (ownership.harnessId === "codebuddy") return "codebuddy";
|
|
21322
|
+
if (ownership.harnessId === "cursor-cli") return "cursor-cli";
|
|
21165
21323
|
return null;
|
|
21166
21324
|
}
|
|
21167
21325
|
var BrowserSidebarAgentIconRow = class {
|
|
@@ -21842,6 +22000,39 @@ ${error51.stderrTail}`] : []
|
|
|
21842
22000
|
};
|
|
21843
22001
|
}
|
|
21844
22002
|
|
|
22003
|
+
// src/renderer-external-queue.ts
|
|
22004
|
+
function isRecord5(value) {
|
|
22005
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
22006
|
+
}
|
|
22007
|
+
function installRendererExternalQueue(target) {
|
|
22008
|
+
if (!isRecord5(target) || typeof target.getTurnCoordinator !== "function" || typeof target.getConversation !== "function") {
|
|
22009
|
+
return null;
|
|
22010
|
+
}
|
|
22011
|
+
const coordinator = target.getTurnCoordinator();
|
|
22012
|
+
const queue = isRecord5(coordinator) ? coordinator.serverQueue : null;
|
|
22013
|
+
if (!isRecord5(queue) || typeof queue.isEnabled !== "function") return null;
|
|
22014
|
+
const descriptor = Object.getOwnPropertyDescriptor(queue, "isEnabled");
|
|
22015
|
+
if (!descriptor?.writable) return null;
|
|
22016
|
+
const original = queue.isEnabled;
|
|
22017
|
+
const getConversation = target.getConversation;
|
|
22018
|
+
const isEnabled = (...args) => {
|
|
22019
|
+
const threadId = args[0];
|
|
22020
|
+
if (typeof threadId === "string") {
|
|
22021
|
+
const conversation = getConversation.call(target, threadId);
|
|
22022
|
+
if (isRecord5(conversation) && conversation.id === threadId && // Reserved transport marker from externalThreadValue, retained by
|
|
22023
|
+
// Desktop in both newly created and hydrated conversation metadata.
|
|
22024
|
+
conversation.modelProvider === "codexhost") {
|
|
22025
|
+
return false;
|
|
22026
|
+
}
|
|
22027
|
+
}
|
|
22028
|
+
return original.apply(queue, args);
|
|
22029
|
+
};
|
|
22030
|
+
queue.isEnabled = isEnabled;
|
|
22031
|
+
return () => {
|
|
22032
|
+
if (queue.isEnabled === isEnabled) Object.defineProperty(queue, "isEnabled", descriptor);
|
|
22033
|
+
};
|
|
22034
|
+
}
|
|
22035
|
+
|
|
21845
22036
|
// src/renderer-session-import-client.ts
|
|
21846
22037
|
var RendererSessionImportUnavailableError = class extends Error {
|
|
21847
22038
|
constructor() {
|
|
@@ -21914,15 +22105,15 @@ ${error51.stderrTail}`] : []
|
|
|
21914
22105
|
var CODEX_ACCOUNT_LOGIN_CANCEL_METHOD = "codexhost/account/login/cancel";
|
|
21915
22106
|
var CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD = "codexhost/account/login/completed";
|
|
21916
22107
|
var CODEX_ACCOUNT_RESET_CREDIT_CONSUME_METHOD = "codexhost/account/rate-limit-reset/consume";
|
|
21917
|
-
function
|
|
22108
|
+
function isRecord6(value) {
|
|
21918
22109
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
21919
22110
|
}
|
|
21920
22111
|
function notifiedThreadId(notification) {
|
|
21921
|
-
if (!
|
|
22112
|
+
if (!isRecord6(notification) || notification.method !== THREAD_TOKEN_USAGE_UPDATED_METHOD && notification.method !== THREAD_USAGE_UPDATED_METHOD) {
|
|
21922
22113
|
return null;
|
|
21923
22114
|
}
|
|
21924
22115
|
const params = notification.params;
|
|
21925
|
-
if (!
|
|
22116
|
+
if (!isRecord6(params)) return null;
|
|
21926
22117
|
const parsed = hostThreadIdSchema.safeParse(params.threadId);
|
|
21927
22118
|
return parsed.success ? parsed.data : null;
|
|
21928
22119
|
}
|
|
@@ -22043,8 +22234,8 @@ ${error51.stderrTail}`] : []
|
|
|
22043
22234
|
threadId: params.threadId,
|
|
22044
22235
|
includeTurns: false
|
|
22045
22236
|
});
|
|
22046
|
-
const thread =
|
|
22047
|
-
if (!
|
|
22237
|
+
const thread = isRecord6(native) ? native.thread : null;
|
|
22238
|
+
if (!isRecord6(thread) || thread.id !== params.threadId || typeof thread.modelProvider !== "string" || !thread.modelProvider || thread.modelProvider === "codexhost" || typeof thread.cliVersion !== "string" || !thread.cliVersion || thread.cliVersion === "codexhost") {
|
|
22048
22239
|
throw new Error("Native Thread response cannot establish Codex ownership");
|
|
22049
22240
|
}
|
|
22050
22241
|
return { owner: "codex", locked: true };
|
|
@@ -22184,7 +22375,7 @@ ${error51.stderrTail}`] : []
|
|
|
22184
22375
|
return notifications.addNotificationCallback(
|
|
22185
22376
|
CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD,
|
|
22186
22377
|
(notification) => {
|
|
22187
|
-
if (!
|
|
22378
|
+
if (!isRecord6(notification) || notification.method !== CODEX_ACCOUNT_LOGIN_COMPLETED_METHOD) {
|
|
22188
22379
|
return;
|
|
22189
22380
|
}
|
|
22190
22381
|
const result = codexAccountLoginCompletedSchema.safeParse(notification.params);
|
|
@@ -22232,9 +22423,11 @@ ${error51.stderrTail}`] : []
|
|
|
22232
22423
|
if (agent === "omp") return OMP_TRANSPORT_MODEL_ID;
|
|
22233
22424
|
if (agent === "antigravity") return ANTIGRAVITY_TRANSPORT_MODEL_ID;
|
|
22234
22425
|
if (agent === "kiro-cli") return encodeHarnessPluginRoute({ harnessId: KIRO_CLI_HARNESS_ID });
|
|
22426
|
+
if (agent === "codebuddy" || agent === "cursor-cli")
|
|
22427
|
+
return encodeHarnessPluginRoute({ harnessId: harnessIdSchema.parse(agent) });
|
|
22235
22428
|
return null;
|
|
22236
22429
|
}
|
|
22237
|
-
function
|
|
22430
|
+
function isRecord7(value) {
|
|
22238
22431
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
22239
22432
|
}
|
|
22240
22433
|
function piTransportModelId(model, thinkingOptionId) {
|
|
@@ -22475,7 +22668,7 @@ ${error51.stderrTail}`] : []
|
|
|
22475
22668
|
return hostThreadIdSchema.parse(target[1]);
|
|
22476
22669
|
}
|
|
22477
22670
|
function isCurrentRequestBridge(value) {
|
|
22478
|
-
return
|
|
22671
|
+
return isRecord7(value) && typeof value.hostId === "string" && value.hostId.length > 0 && typeof value.sendRequest === "function" && typeof value.prewarmThreadStart === "function" && typeof value.enqueueRequest === "function";
|
|
22479
22672
|
}
|
|
22480
22673
|
function findActivePrewarmTargets(root) {
|
|
22481
22674
|
const editor = root.querySelector(
|
|
@@ -22503,7 +22696,7 @@ ${error51.stderrTail}`] : []
|
|
|
22503
22696
|
let hook = fiber.memoizedState;
|
|
22504
22697
|
for (let hookIndex = 0; hook && hookIndex < 100; hookIndex += 1) {
|
|
22505
22698
|
const hookState = hook.memoizedState;
|
|
22506
|
-
if (
|
|
22699
|
+
if (isRecord7(hookState)) {
|
|
22507
22700
|
const requestClient = hookState.requestClient;
|
|
22508
22701
|
const bridge = isCurrentRequestBridge(requestClient) ? requestClient : isCurrentRequestBridge(hookState) ? hookState : null;
|
|
22509
22702
|
if (bridge) {
|
|
@@ -22537,7 +22730,7 @@ ${error51.stderrTail}`] : []
|
|
|
22537
22730
|
let fiber = findComposerFiber(composer);
|
|
22538
22731
|
for (let depth = 0; fiber && depth < 120; depth += 1) {
|
|
22539
22732
|
const props = fiber.memoizedProps;
|
|
22540
|
-
if (
|
|
22733
|
+
if (isRecord7(props) && "conversationId" in props && props.conversationId != null) {
|
|
22541
22734
|
const candidate = hostThreadIdSchema.safeParse(props.conversationId);
|
|
22542
22735
|
if (!candidate.success || threadId !== void 0 && threadId !== candidate.data) {
|
|
22543
22736
|
return null;
|
|
@@ -22550,12 +22743,12 @@ ${error51.stderrTail}`] : []
|
|
|
22550
22743
|
return threadId;
|
|
22551
22744
|
}
|
|
22552
22745
|
function isCurrentDraftWrapper(value) {
|
|
22553
|
-
if (!Array.isArray(value) || value.length !== 7 || value[3] !== value[5] || value[3] !== value[6] || !
|
|
22746
|
+
if (!Array.isArray(value) || value.length !== 7 || value[3] !== value[5] || value[3] !== value[6] || !isRecord7(value[3]) || typeof value[3].get !== "function" || typeof value[2] !== "string" && value[2] !== null) {
|
|
22554
22747
|
return false;
|
|
22555
22748
|
}
|
|
22556
22749
|
try {
|
|
22557
22750
|
const draft = value[3].get();
|
|
22558
|
-
return
|
|
22751
|
+
return isRecord7(draft) && "modelSettings" in draft && "isManuallyChanged" in draft;
|
|
22559
22752
|
} catch {
|
|
22560
22753
|
return false;
|
|
22561
22754
|
}
|
|
@@ -22575,8 +22768,8 @@ ${error51.stderrTail}`] : []
|
|
|
22575
22768
|
let fiber = findComposerFiber(composer);
|
|
22576
22769
|
for (let depth = 0; fiber && depth < 120; depth += 1) {
|
|
22577
22770
|
const updateQueue = fiber.updateQueue;
|
|
22578
|
-
const memoCache =
|
|
22579
|
-
const data =
|
|
22771
|
+
const memoCache = isRecord7(updateQueue) ? updateQueue.memoCache : null;
|
|
22772
|
+
const data = isRecord7(memoCache) && Array.isArray(memoCache.data) ? memoCache.data : [];
|
|
22580
22773
|
for (const value of data) {
|
|
22581
22774
|
if (isCurrentDraftWrapper(value) && typeof value[2] === "string" && value[2].startsWith("client-new-thread:")) {
|
|
22582
22775
|
draftIds.add(value[2]);
|
|
@@ -22604,7 +22797,7 @@ ${error51.stderrTail}`] : []
|
|
|
22604
22797
|
return ["default", draftIds.values().next().value];
|
|
22605
22798
|
}
|
|
22606
22799
|
function isDraftPrewarmPolicyReady(value) {
|
|
22607
|
-
return
|
|
22800
|
+
return isRecord7(value) && value.state === "ready" && typeof value.hostId === "string" && value.hostId.length > 0 && typeof value.select === "function" && typeof value.clear === "function";
|
|
22608
22801
|
}
|
|
22609
22802
|
function prewarmTargetHostId(target) {
|
|
22610
22803
|
const bridge = target.requestClient ?? target;
|
|
@@ -22612,7 +22805,7 @@ ${error51.stderrTail}`] : []
|
|
|
22612
22805
|
return typeof hostId === "string" && hostId.length > 0 ? hostId : null;
|
|
22613
22806
|
}
|
|
22614
22807
|
function isRendererRequestTarget(value) {
|
|
22615
|
-
if (!
|
|
22808
|
+
if (!isRecord7(value) || typeof value.sendRequest !== "function") return false;
|
|
22616
22809
|
return isCurrentRequestBridge(value.requestClient ?? value);
|
|
22617
22810
|
}
|
|
22618
22811
|
function hasPolicyRequestTarget(policy) {
|
|
@@ -22674,10 +22867,10 @@ ${error51.stderrTail}`] : []
|
|
|
22674
22867
|
}
|
|
22675
22868
|
}
|
|
22676
22869
|
function modelSelectionForAgent(officialSelection, reasoningEffort, agent, model, thinkingOptionId, permissionModeId) {
|
|
22677
|
-
const transportModelId = agent === "pi" ? piTransportModelId(model, thinkingOptionId) : agent === "claude-code" ? claudeTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "deepseek-harness" ? deepSeekHarnessTransportModelId(model, permissionModeId) : agent === "opencode" ? openCodeTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "grok" ? grokTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "omp" ? ompTransportModelId(model, thinkingOptionId, permissionModeId) : agent === "antigravity" ? antigravityTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "kiro-cli" ? encodeHarnessPluginRoute({
|
|
22678
|
-
harnessId:
|
|
22870
|
+
const transportModelId = agent === "pi" ? piTransportModelId(model, thinkingOptionId) : agent === "claude-code" ? claudeTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "deepseek-harness" ? deepSeekHarnessTransportModelId(model, permissionModeId) : agent === "opencode" ? openCodeTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "grok" ? grokTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "omp" ? ompTransportModelId(model, thinkingOptionId, permissionModeId) : agent === "antigravity" ? antigravityTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "kiro-cli" || agent === "codebuddy" || agent === "cursor-cli" ? encodeHarnessPluginRoute({
|
|
22871
|
+
harnessId: harnessIdSchema.parse(agent),
|
|
22679
22872
|
...model ? { model } : {},
|
|
22680
|
-
...thinkingOptionId ? { thinkingOptionId } : {},
|
|
22873
|
+
...thinkingOptionId && agent !== "cursor-cli" ? { thinkingOptionId } : {},
|
|
22681
22874
|
...permissionModeId ? { permissionModeId } : {}
|
|
22682
22875
|
}) : transportModelIdForAgent(agent);
|
|
22683
22876
|
return transportModelId ? { model: transportModelId, reasoningEffort } : officialSelection;
|
|
@@ -22703,7 +22896,7 @@ ${error51.stderrTail}`] : []
|
|
|
22703
22896
|
() => findActivePrewarmTargets(document)
|
|
22704
22897
|
);
|
|
22705
22898
|
const clientsByTarget = /* @__PURE__ */ new WeakMap();
|
|
22706
|
-
const
|
|
22899
|
+
const turnControlCleanups = /* @__PURE__ */ new Set();
|
|
22707
22900
|
const modelClientForTargets = (targets, policy = null) => {
|
|
22708
22901
|
const target = targets[0];
|
|
22709
22902
|
if (targets.length !== 1 || !target) return null;
|
|
@@ -22713,8 +22906,10 @@ ${error51.stderrTail}`] : []
|
|
|
22713
22906
|
const client = createRendererModelClient([target]);
|
|
22714
22907
|
if (client) {
|
|
22715
22908
|
if (!cached2) {
|
|
22716
|
-
const
|
|
22717
|
-
if (
|
|
22909
|
+
const queueCleanup = installRendererExternalQueue(target);
|
|
22910
|
+
if (queueCleanup) turnControlCleanups.add(queueCleanup);
|
|
22911
|
+
const steeringCleanup = installRendererExternalSteering(target);
|
|
22912
|
+
if (steeringCleanup) turnControlCleanups.add(steeringCleanup);
|
|
22718
22913
|
}
|
|
22719
22914
|
clientsByTarget.set(target, { client, policy, requestClient: target.requestClient });
|
|
22720
22915
|
}
|
|
@@ -22933,7 +23128,7 @@ ${error51.stderrTail}`] : []
|
|
|
22933
23128
|
() => activeRoutingPolicy?.select(null),
|
|
22934
23129
|
() => syncActiveRoute(null),
|
|
22935
23130
|
() => forkControl.dispose(),
|
|
22936
|
-
...
|
|
23131
|
+
...turnControlCleanups,
|
|
22937
23132
|
() => usageSubscription.dispose()
|
|
22938
23133
|
];
|
|
22939
23134
|
for (const cleanup of cleanups) {
|
|
@@ -22983,11 +23178,11 @@ ${error51.stderrTail}`] : []
|
|
|
22983
23178
|
return null;
|
|
22984
23179
|
}
|
|
22985
23180
|
}
|
|
22986
|
-
function
|
|
23181
|
+
function isRecord8(value) {
|
|
22987
23182
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
22988
23183
|
}
|
|
22989
23184
|
function parseExternalConfiguration(value) {
|
|
22990
|
-
if (!
|
|
23185
|
+
if (!isRecord8(value)) return void 0;
|
|
22991
23186
|
const model = harnessModelRefSchema.safeParse(value.model);
|
|
22992
23187
|
if (!model.success) return void 0;
|
|
22993
23188
|
const thinkingOptionId = harnessThinkingOptionIdSchema.safeParse(value.thinkingOptionId);
|
|
@@ -23004,9 +23199,9 @@ ${error51.stderrTail}`] : []
|
|
|
23004
23199
|
const raw = storage.getItem(RENDERER_NEW_THREAD_PREFERENCE_KEY);
|
|
23005
23200
|
if (!raw) return void 0;
|
|
23006
23201
|
const parsed = JSON.parse(raw);
|
|
23007
|
-
if (!
|
|
23202
|
+
if (!isRecord8(parsed) || parsed.version !== 1) return void 0;
|
|
23008
23203
|
if (!KNOWN_RENDERER_AGENTS.some((agent) => agent === parsed.lastAgent)) return void 0;
|
|
23009
|
-
const externalByAgent =
|
|
23204
|
+
const externalByAgent = isRecord8(parsed.externalByAgent) ? parsed.externalByAgent : {};
|
|
23010
23205
|
const parsedExternal = Object.fromEntries(
|
|
23011
23206
|
KNOWN_RENDERER_AGENTS.filter(
|
|
23012
23207
|
(agent) => agent !== "codex"
|
|
@@ -23082,7 +23277,7 @@ ${error51.stderrTail}`] : []
|
|
|
23082
23277
|
var GET_LOCALE_OVERRIDE_URL = "vscode://codex/get-setting";
|
|
23083
23278
|
var GET_LOCALE_INFO_URL = "vscode://codex/locale-info";
|
|
23084
23279
|
var DEFAULT_LOCALE_REQUEST_TIMEOUT_MS = 750;
|
|
23085
|
-
function
|
|
23280
|
+
function isRecord9(value) {
|
|
23086
23281
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
23087
23282
|
}
|
|
23088
23283
|
function canonicalLocale(value) {
|
|
@@ -23104,7 +23299,7 @@ ${error51.stderrTail}`] : []
|
|
|
23104
23299
|
return new DOMException("The operation was aborted", "AbortError");
|
|
23105
23300
|
}
|
|
23106
23301
|
function parseLocaleOverride(value) {
|
|
23107
|
-
if (!
|
|
23302
|
+
if (!isRecord9(value) || !("value" in value)) {
|
|
23108
23303
|
throw new Error("Codex locale override response is malformed");
|
|
23109
23304
|
}
|
|
23110
23305
|
if (value.value === null) return { value: null };
|
|
@@ -23119,7 +23314,7 @@ ${error51.stderrTail}`] : []
|
|
|
23119
23314
|
return locale;
|
|
23120
23315
|
}
|
|
23121
23316
|
function parseLocaleInfo(value) {
|
|
23122
|
-
if (!
|
|
23317
|
+
if (!isRecord9(value)) throw new Error("Codex locale info response is malformed");
|
|
23123
23318
|
return {
|
|
23124
23319
|
ideLocale: optionalLocale(value.ideLocale, "IDE locale"),
|
|
23125
23320
|
systemLocale: optionalLocale(value.systemLocale, "system locale")
|
|
@@ -23148,7 +23343,7 @@ ${error51.stderrTail}`] : []
|
|
|
23148
23343
|
const onAbort = () => settle(() => reject(abortError2()));
|
|
23149
23344
|
const onMessage = (event) => {
|
|
23150
23345
|
const message2 = event.data;
|
|
23151
|
-
if (!
|
|
23346
|
+
if (!isRecord9(message2) || message2.type !== "fetch-response") return;
|
|
23152
23347
|
if (message2.requestId !== requestId) return;
|
|
23153
23348
|
if (message2.responseType !== "success" || typeof message2.status !== "number" || message2.status < 200 || message2.status >= 300 || typeof message2.bodyJsonString !== "string") {
|
|
23154
23349
|
settle(() => reject(new Error("Codex locale request failed")));
|
|
@@ -23871,6 +24066,50 @@ ${error51.stderrTail}`] : []
|
|
|
23871
24066
|
});
|
|
23872
24067
|
}
|
|
23873
24068
|
|
|
24069
|
+
// src/settings/appearance-page.ts
|
|
24070
|
+
function createAppearanceSettingsPage(messages) {
|
|
24071
|
+
return Object.freeze({
|
|
24072
|
+
id: "appearance",
|
|
24073
|
+
label: messages.pageLabels.appearance,
|
|
24074
|
+
icon: "settings",
|
|
24075
|
+
mount(context) {
|
|
24076
|
+
const document2 = context.content.ownerDocument;
|
|
24077
|
+
const ownerWindow = document2.defaultView;
|
|
24078
|
+
if (!ownerWindow) return;
|
|
24079
|
+
const heading = document2.createElement("div");
|
|
24080
|
+
heading.className = "settings-section-label";
|
|
24081
|
+
heading.textContent = messages.pageLabels.appearance;
|
|
24082
|
+
const description = document2.createElement("p");
|
|
24083
|
+
description.className = "settings-page-description";
|
|
24084
|
+
description.textContent = messages.appearanceDescription;
|
|
24085
|
+
const row = document2.createElement("label");
|
|
24086
|
+
row.className = "settings-preference-row";
|
|
24087
|
+
const copy = document2.createElement("span");
|
|
24088
|
+
copy.className = "settings-preference-row__copy";
|
|
24089
|
+
const title = document2.createElement("strong");
|
|
24090
|
+
title.textContent = messages.reasoningSoftWrapTitle;
|
|
24091
|
+
const detail = document2.createElement("span");
|
|
24092
|
+
detail.textContent = messages.reasoningSoftWrapDescription;
|
|
24093
|
+
copy.append(title, detail);
|
|
24094
|
+
const checkbox = document2.createElement("input");
|
|
24095
|
+
checkbox.type = "checkbox";
|
|
24096
|
+
checkbox.className = "settings-preference-checkbox";
|
|
24097
|
+
checkbox.checked = readReasoningTranscriptSoftWrap(ownerWindow);
|
|
24098
|
+
checkbox.setAttribute("aria-label", messages.reasoningSoftWrapTitle);
|
|
24099
|
+
checkbox.addEventListener("change", () => {
|
|
24100
|
+
setReasoningTranscriptSoftWrap(ownerWindow, checkbox.checked);
|
|
24101
|
+
});
|
|
24102
|
+
const sync = () => {
|
|
24103
|
+
checkbox.checked = readReasoningTranscriptSoftWrap(ownerWindow);
|
|
24104
|
+
};
|
|
24105
|
+
ownerWindow.addEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
|
|
24106
|
+
row.append(copy, checkbox);
|
|
24107
|
+
context.content.append(heading, description, row);
|
|
24108
|
+
return () => ownerWindow.removeEventListener(REASONING_SOFT_WRAP_CHANGE_EVENT, sync);
|
|
24109
|
+
}
|
|
24110
|
+
});
|
|
24111
|
+
}
|
|
24112
|
+
|
|
23874
24113
|
// src/settings/release-notes.ts
|
|
23875
24114
|
var HEADING_PATTERN = /^(#{1,6})[ \t]+(.+?)\s*$/u;
|
|
23876
24115
|
var BLOCKQUOTE_PATTERN = /^>[ \t]?(.*?)\s*$/u;
|
|
@@ -24046,6 +24285,140 @@ ${error51.stderrTail}`] : []
|
|
|
24046
24285
|
}
|
|
24047
24286
|
}
|
|
24048
24287
|
|
|
24288
|
+
// src/settings/accounts-details.ts
|
|
24289
|
+
function createAccountDetails(document2, messages, input) {
|
|
24290
|
+
const root = document2.createElement("div");
|
|
24291
|
+
root.className = "settings-account-details";
|
|
24292
|
+
const trigger = document2.createElement("button");
|
|
24293
|
+
trigger.type = "button";
|
|
24294
|
+
trigger.className = "settings-icon-button";
|
|
24295
|
+
trigger.title = input.triggerLabel ?? input.label;
|
|
24296
|
+
trigger.disabled = input.disabled ?? false;
|
|
24297
|
+
trigger.dataset.accountFocus = input.focusKey;
|
|
24298
|
+
trigger.setAttribute("aria-label", trigger.title);
|
|
24299
|
+
trigger.setAttribute("aria-haspopup", "dialog");
|
|
24300
|
+
trigger.append(createRendererSettingsIcon(input.icon, 16));
|
|
24301
|
+
const dialog = document2.createElement("dialog");
|
|
24302
|
+
dialog.className = "settings-account-dialog";
|
|
24303
|
+
dialog.id = `settings-account-${input.focusKey}-dialog`;
|
|
24304
|
+
dialog.setAttribute("aria-label", input.label);
|
|
24305
|
+
trigger.setAttribute("aria-controls", dialog.id);
|
|
24306
|
+
const heading = document2.createElement("h2");
|
|
24307
|
+
heading.textContent = input.label;
|
|
24308
|
+
const description = document2.createElement("p");
|
|
24309
|
+
description.textContent = input.description;
|
|
24310
|
+
description.id = `${dialog.id}-description`;
|
|
24311
|
+
dialog.setAttribute("aria-describedby", description.id);
|
|
24312
|
+
const close = document2.createElement("button");
|
|
24313
|
+
close.type = "button";
|
|
24314
|
+
close.className = "settings-icon-button settings-account-dialog__close";
|
|
24315
|
+
close.dataset.accountFocus = `${input.focusKey}:close`;
|
|
24316
|
+
close.setAttribute("aria-label", messages.accountDetailsClose);
|
|
24317
|
+
close.append(createRendererSettingsIcon("close", 16));
|
|
24318
|
+
close.addEventListener("click", () => dialog.close());
|
|
24319
|
+
dialog.addEventListener("close", () => {
|
|
24320
|
+
if (trigger.isConnected && !trigger.disabled) trigger.focus({ preventScroll: true });
|
|
24321
|
+
});
|
|
24322
|
+
dialog.addEventListener(
|
|
24323
|
+
"click",
|
|
24324
|
+
(event) => {
|
|
24325
|
+
if (input.actions.some((action) => action.contains(event.target))) {
|
|
24326
|
+
trigger.focus({ preventScroll: true });
|
|
24327
|
+
dialog.close();
|
|
24328
|
+
}
|
|
24329
|
+
},
|
|
24330
|
+
{ capture: true }
|
|
24331
|
+
);
|
|
24332
|
+
const actions = document2.createElement("div");
|
|
24333
|
+
actions.className = "settings-account-dialog__actions";
|
|
24334
|
+
actions.append(...input.actions);
|
|
24335
|
+
dialog.append(close, heading, description, actions);
|
|
24336
|
+
trigger.addEventListener("click", () => dialog.showModal());
|
|
24337
|
+
root.append(trigger, dialog);
|
|
24338
|
+
return root;
|
|
24339
|
+
}
|
|
24340
|
+
|
|
24341
|
+
// src/settings/accounts-reset-time.ts
|
|
24342
|
+
function formatAccountResetCountdown(value, messages, now = Date.now()) {
|
|
24343
|
+
const timestamp = Date.parse(value);
|
|
24344
|
+
if (!Number.isFinite(timestamp)) return null;
|
|
24345
|
+
const minutes = Math.max(0, Math.ceil((timestamp - now) / 6e4));
|
|
24346
|
+
if (minutes === 0) {
|
|
24347
|
+
return {
|
|
24348
|
+
text: messages.accountCreditsResetPending,
|
|
24349
|
+
description: messages.accountCreditsResetPendingHint
|
|
24350
|
+
};
|
|
24351
|
+
}
|
|
24352
|
+
const chinese = messages.locale === "zh-CN";
|
|
24353
|
+
const parts = [
|
|
24354
|
+
{ value: Math.floor(minutes / 1440), unit: "d", label: chinese ? "\u5929" : " days" },
|
|
24355
|
+
{ value: Math.floor(minutes % 1440 / 60), unit: "h", label: chinese ? "\u5C0F\u65F6" : " hours" },
|
|
24356
|
+
{ value: minutes % 60, unit: "m", label: chinese ? "\u5206\u949F" : " minutes" }
|
|
24357
|
+
].filter((part, index) => part.value > 0 && (minutes < 1440 || index < 2));
|
|
24358
|
+
return {
|
|
24359
|
+
text: parts.map((part) => `${part.value}${part.unit}`).join(""),
|
|
24360
|
+
description: messages.accountCreditsResetIn.replace(
|
|
24361
|
+
"{time}",
|
|
24362
|
+
parts.map(
|
|
24363
|
+
(part) => `${part.value}${!chinese && part.value === 1 ? part.label.slice(0, -1) : part.label}`
|
|
24364
|
+
).join(chinese ? "" : " ")
|
|
24365
|
+
)
|
|
24366
|
+
};
|
|
24367
|
+
}
|
|
24368
|
+
function updateCountdown(element, messages) {
|
|
24369
|
+
const value = formatAccountResetCountdown(element.dataset.resetsAt ?? "", messages);
|
|
24370
|
+
if (!value) return;
|
|
24371
|
+
element.textContent = value.text;
|
|
24372
|
+
element.title = value.description;
|
|
24373
|
+
element.setAttribute("aria-label", value.description);
|
|
24374
|
+
}
|
|
24375
|
+
function renderAccountResetTime(document2, value, messages) {
|
|
24376
|
+
const date5 = new Date(value);
|
|
24377
|
+
if (!Number.isFinite(date5.getTime())) return null;
|
|
24378
|
+
const countdown = document2.createElement("span");
|
|
24379
|
+
countdown.className = "settings-account-usage__countdown";
|
|
24380
|
+
countdown.dataset.resetsAt = date5.toISOString();
|
|
24381
|
+
updateCountdown(countdown, messages);
|
|
24382
|
+
const timestamp = document2.createElement("time");
|
|
24383
|
+
timestamp.className = "settings-account-usage__sub";
|
|
24384
|
+
timestamp.dateTime = date5.toISOString();
|
|
24385
|
+
const pad = (number4) => String(number4).padStart(2, "0");
|
|
24386
|
+
timestamp.textContent = `${pad(date5.getMonth() + 1)}/${pad(date5.getDate())} ${pad(date5.getHours())}:${pad(date5.getMinutes())}`;
|
|
24387
|
+
timestamp.title = messages.accountCreditsResetAt.replace(
|
|
24388
|
+
"{time}",
|
|
24389
|
+
date5.toLocaleString(messages.locale, {
|
|
24390
|
+
year: "numeric",
|
|
24391
|
+
month: "long",
|
|
24392
|
+
day: "numeric",
|
|
24393
|
+
hour: "2-digit",
|
|
24394
|
+
minute: "2-digit",
|
|
24395
|
+
hour12: false,
|
|
24396
|
+
timeZoneName: "short"
|
|
24397
|
+
})
|
|
24398
|
+
);
|
|
24399
|
+
timestamp.setAttribute("aria-label", timestamp.title);
|
|
24400
|
+
return { countdown, timestamp };
|
|
24401
|
+
}
|
|
24402
|
+
function mountAccountResetCountdowns(list, messages, signal) {
|
|
24403
|
+
const window2 = list.ownerDocument.defaultView;
|
|
24404
|
+
if (!window2 || signal.aborted) return () => void 0;
|
|
24405
|
+
const refresh = () => {
|
|
24406
|
+
if (signal.aborted) return;
|
|
24407
|
+
for (const element of list.querySelectorAll("[data-resets-at]")) {
|
|
24408
|
+
updateCountdown(element, messages);
|
|
24409
|
+
}
|
|
24410
|
+
};
|
|
24411
|
+
const timer = window2.setInterval(refresh, 6e4);
|
|
24412
|
+
window2.addEventListener("focus", refresh);
|
|
24413
|
+
const stop = () => {
|
|
24414
|
+
window2.clearInterval(timer);
|
|
24415
|
+
window2.removeEventListener("focus", refresh);
|
|
24416
|
+
signal.removeEventListener("abort", stop);
|
|
24417
|
+
};
|
|
24418
|
+
signal.addEventListener("abort", stop, { once: true });
|
|
24419
|
+
return stop;
|
|
24420
|
+
}
|
|
24421
|
+
|
|
24049
24422
|
// src/settings/accounts-usage.ts
|
|
24050
24423
|
function creditsPeriodLabel2(periodType, messages) {
|
|
24051
24424
|
if (periodType === "weekly") return messages.accountCreditsPeriodWeekly;
|
|
@@ -24080,17 +24453,80 @@ ${error51.stderrTail}`] : []
|
|
|
24080
24453
|
function resetCreditDetailLine(index, expiresAt, messages, now = /* @__PURE__ */ new Date()) {
|
|
24081
24454
|
return messages.accountResetCreditsCardExpiry.replace("{index}", String(index)).replace("{time}", formatAccountCreditsReset(expiresAt, messages.locale, now));
|
|
24082
24455
|
}
|
|
24456
|
+
function accountUsageColumnLabel(period, display, messages) {
|
|
24457
|
+
const mode = display === "remaining" ? messages.accountCreditsRemaining : messages.accountCreditsUsed;
|
|
24458
|
+
return `${creditsPeriodLabel2(period, messages)}${messages.locale === "zh-CN" ? "" : " "}${mode}`;
|
|
24459
|
+
}
|
|
24460
|
+
function splitUsageWindows(credits, messages) {
|
|
24461
|
+
const columns = {};
|
|
24462
|
+
const additional = [];
|
|
24463
|
+
const primary = {
|
|
24464
|
+
label: credits.label ?? creditsPeriodLabel2(credits.periodType, messages),
|
|
24465
|
+
usedPercent: credits.usedPercent,
|
|
24466
|
+
resetsAt: credits.resetsAt
|
|
24467
|
+
};
|
|
24468
|
+
if (!credits.label && credits.periodType === "five_hour") columns.five_hour = primary;
|
|
24469
|
+
else if (!credits.label && ["seven_day", "weekly"].includes(credits.periodType))
|
|
24470
|
+
columns.seven_day = { ...primary, label: messages.accountCreditsPeriodSevenDay };
|
|
24471
|
+
else additional.push(primary);
|
|
24472
|
+
for (const product of credits.productUsage ?? []) {
|
|
24473
|
+
const window2 = {
|
|
24474
|
+
label: creditsProductLabel(product.product, messages),
|
|
24475
|
+
usedPercent: product.usagePercent,
|
|
24476
|
+
resetsAt: product.resetsAt
|
|
24477
|
+
};
|
|
24478
|
+
const period = product.product === "7-day window" ? "seven_day" : product.product === "5-hour window" ? "five_hour" : null;
|
|
24479
|
+
if (period && !columns[period])
|
|
24480
|
+
columns[period] = { ...window2, label: creditsPeriodLabel2(period, messages) };
|
|
24481
|
+
else additional.push(window2);
|
|
24482
|
+
}
|
|
24483
|
+
return { columns, additional };
|
|
24484
|
+
}
|
|
24485
|
+
function renderUsageWindow(document2, window2, messages, display) {
|
|
24486
|
+
const meter = document2.createElement("div");
|
|
24487
|
+
meter.className = "settings-account-usage__meter";
|
|
24488
|
+
const label = document2.createElement("span");
|
|
24489
|
+
label.className = "settings-account-usage__title";
|
|
24490
|
+
label.textContent = window2.label;
|
|
24491
|
+
label.title = window2.label;
|
|
24492
|
+
const value = display === "remaining" ? 100 - window2.usedPercent : window2.usedPercent;
|
|
24493
|
+
const valueLabel = display === "remaining" ? messages.accountCreditsRemaining : messages.accountCreditsUsed;
|
|
24494
|
+
const tone = rendererCreditsTone(window2.usedPercent);
|
|
24495
|
+
const percent = document2.createElement("div");
|
|
24496
|
+
percent.className = `settings-account-usage__percent settings-account-usage__percent--${tone}`;
|
|
24497
|
+
const number4 = document2.createElement("span");
|
|
24498
|
+
number4.textContent = formatRendererCreditsPercent(value);
|
|
24499
|
+
const reset = window2.resetsAt ? renderAccountResetTime(document2, window2.resetsAt, messages) : null;
|
|
24500
|
+
if (reset) percent.append(reset.countdown);
|
|
24501
|
+
percent.append(number4);
|
|
24502
|
+
const bar = document2.createElement("div");
|
|
24503
|
+
bar.className = `settings-account-usage__bar settings-account-usage__bar--${tone}`;
|
|
24504
|
+
bar.setAttribute("role", "meter");
|
|
24505
|
+
bar.setAttribute("aria-label", `${window2.label} \xB7 ${valueLabel}`);
|
|
24506
|
+
bar.setAttribute("aria-valuemin", "0");
|
|
24507
|
+
bar.setAttribute("aria-valuemax", "100");
|
|
24508
|
+
bar.setAttribute("aria-valuenow", String(value));
|
|
24509
|
+
const fill = document2.createElement("span");
|
|
24510
|
+
fill.style.width = `${Math.min(100, Math.max(0, value))}%`;
|
|
24511
|
+
bar.append(fill);
|
|
24512
|
+
meter.append(label, percent, bar);
|
|
24513
|
+
if (reset) meter.append(reset.timestamp);
|
|
24514
|
+
return meter;
|
|
24515
|
+
}
|
|
24083
24516
|
function renderAccountUsage(document2, state, messages, display, onRetry) {
|
|
24084
|
-
if (
|
|
24085
|
-
|
|
24086
|
-
|
|
24087
|
-
|
|
24517
|
+
if (state?.status !== "ready") {
|
|
24518
|
+
const cell = document2.createElement("td");
|
|
24519
|
+
cell.colSpan = 2;
|
|
24520
|
+
cell.className = "settings-account-usage-cell settings-account-usage-cell--message";
|
|
24521
|
+
const usage = document2.createElement("div");
|
|
24522
|
+
usage.className = "settings-account-usage";
|
|
24088
24523
|
const message = document2.createElement("span");
|
|
24089
24524
|
message.className = "settings-account-usage__message";
|
|
24090
|
-
message.textContent = state.status === "loading" ? messages.accountCreditsLoading : state.status === "error" ? messages.accountCreditsFailed : messages.accountCreditsEmpty;
|
|
24525
|
+
message.textContent = !state ? "\u2014" : state.status === "loading" ? messages.accountCreditsLoading : state.status === "error" ? messages.accountCreditsFailed : messages.accountCreditsEmpty;
|
|
24526
|
+
if (!state) message.title = messages.accountCreditsEmpty;
|
|
24091
24527
|
usage.append(message);
|
|
24092
|
-
if (state
|
|
24093
|
-
if (state
|
|
24528
|
+
if (state?.status === "loading") usage.setAttribute("aria-busy", "true");
|
|
24529
|
+
if (state?.status === "error") {
|
|
24094
24530
|
const retry = document2.createElement("button");
|
|
24095
24531
|
retry.type = "button";
|
|
24096
24532
|
retry.className = "settings-command-button settings-command-button--secondary";
|
|
@@ -24098,59 +24534,35 @@ ${error51.stderrTail}`] : []
|
|
|
24098
24534
|
retry.addEventListener("click", onRetry);
|
|
24099
24535
|
usage.append(retry);
|
|
24100
24536
|
}
|
|
24101
|
-
|
|
24537
|
+
cell.append(usage);
|
|
24538
|
+
return { cells: [cell], additional: null };
|
|
24102
24539
|
}
|
|
24103
|
-
const
|
|
24104
|
-
const
|
|
24105
|
-
|
|
24106
|
-
|
|
24107
|
-
|
|
24108
|
-
|
|
24109
|
-
|
|
24110
|
-
|
|
24111
|
-
|
|
24112
|
-
|
|
24113
|
-
|
|
24114
|
-
|
|
24115
|
-
|
|
24116
|
-
|
|
24117
|
-
|
|
24118
|
-
|
|
24119
|
-
|
|
24120
|
-
|
|
24121
|
-
|
|
24122
|
-
|
|
24123
|
-
|
|
24124
|
-
|
|
24125
|
-
|
|
24126
|
-
|
|
24127
|
-
|
|
24128
|
-
|
|
24129
|
-
bar.setAttribute("aria-label", `${window2.label} \xB7 ${valueLabel}`);
|
|
24130
|
-
bar.setAttribute("aria-valuemin", "0");
|
|
24131
|
-
bar.setAttribute("aria-valuemax", "100");
|
|
24132
|
-
bar.setAttribute("aria-valuenow", String(value));
|
|
24133
|
-
const fill = document2.createElement("span");
|
|
24134
|
-
fill.style.width = `${Math.min(100, Math.max(0, value))}%`;
|
|
24135
|
-
bar.append(fill);
|
|
24136
|
-
const percent = document2.createElement("span");
|
|
24137
|
-
percent.className = `settings-account-usage__percent settings-account-usage__percent--${tone}`;
|
|
24138
|
-
const prefix = document2.createElement("span");
|
|
24139
|
-
prefix.textContent = valueLabel;
|
|
24140
|
-
prefix.className = "settings-account-usage__value-label";
|
|
24141
|
-
const number4 = document2.createElement("span");
|
|
24142
|
-
number4.textContent = formatRendererCreditsPercent(value);
|
|
24143
|
-
percent.append(prefix, number4);
|
|
24144
|
-
meter.append(label, bar, percent);
|
|
24145
|
-
if (window2.resetsAt) {
|
|
24146
|
-
const reset = document2.createElement("span");
|
|
24147
|
-
reset.className = "settings-account-usage__sub";
|
|
24148
|
-
reset.textContent = `${formatAccountCreditsReset(window2.resetsAt, messages.locale)} ${messages.accountCreditsReset}`;
|
|
24149
|
-
meter.append(reset);
|
|
24150
|
-
}
|
|
24151
|
-
usage.append(meter);
|
|
24152
|
-
}
|
|
24153
|
-
return usage;
|
|
24540
|
+
const { columns, additional } = splitUsageWindows(state.credits, messages);
|
|
24541
|
+
const cells = ["five_hour", "seven_day"].map((period) => {
|
|
24542
|
+
const cell = document2.createElement("td");
|
|
24543
|
+
cell.className = "settings-account-usage-cell";
|
|
24544
|
+
const window2 = columns[period];
|
|
24545
|
+
if (window2) cell.append(renderUsageWindow(document2, window2, messages, display));
|
|
24546
|
+
else {
|
|
24547
|
+
const missing = document2.createElement("div");
|
|
24548
|
+
missing.className = "settings-account-usage__missing";
|
|
24549
|
+
const label = document2.createElement("span");
|
|
24550
|
+
label.className = "settings-account-usage__title";
|
|
24551
|
+
label.textContent = creditsPeriodLabel2(period, messages);
|
|
24552
|
+
const dash = document2.createElement("span");
|
|
24553
|
+
dash.textContent = "\u2014";
|
|
24554
|
+
dash.setAttribute("aria-hidden", "true");
|
|
24555
|
+
missing.append(label, dash);
|
|
24556
|
+
cell.append(missing);
|
|
24557
|
+
}
|
|
24558
|
+
return cell;
|
|
24559
|
+
});
|
|
24560
|
+
if (!additional.length) return { cells, additional: null };
|
|
24561
|
+
const extra = document2.createElement("div");
|
|
24562
|
+
extra.className = "settings-account-extra-usage";
|
|
24563
|
+
for (const window2 of additional)
|
|
24564
|
+
extra.append(renderUsageWindow(document2, window2, messages, display));
|
|
24565
|
+
return { cells, additional: extra };
|
|
24154
24566
|
}
|
|
24155
24567
|
function renderAccountResetCredits(document2, credits, messages, options) {
|
|
24156
24568
|
const resetCredits = credits.resetCredits;
|
|
@@ -24162,8 +24574,11 @@ ${error51.stderrTail}`] : []
|
|
|
24162
24574
|
summary.title = messages.accountResetCreditsDetails;
|
|
24163
24575
|
const count = document2.createElement("span");
|
|
24164
24576
|
count.textContent = messages.locale === "zh-CN" ? `${resetCredits.availableCount} \u5F20` : String(resetCredits.availableCount);
|
|
24577
|
+
const label = document2.createElement("span");
|
|
24578
|
+
label.textContent = messages.accountResetCredits;
|
|
24165
24579
|
summary.append(
|
|
24166
24580
|
createRendererSettingsIcon("ticket", 16),
|
|
24581
|
+
label,
|
|
24167
24582
|
count,
|
|
24168
24583
|
createRendererSettingsIcon("chevron-right", 14)
|
|
24169
24584
|
);
|
|
@@ -24233,6 +24648,8 @@ ${error51.stderrTail}`] : []
|
|
|
24233
24648
|
return () => {
|
|
24234
24649
|
const target = key ? list.querySelector(`[data-account-focus="${CSS.escape(key)}"]`) : null;
|
|
24235
24650
|
if (target && !target.matches(":disabled")) {
|
|
24651
|
+
const dialog = target.closest("dialog");
|
|
24652
|
+
if (dialog && !dialog.open) dialog.showModal();
|
|
24236
24653
|
target.focus({ preventScroll: true });
|
|
24237
24654
|
return;
|
|
24238
24655
|
}
|
|
@@ -24248,87 +24665,100 @@ ${error51.stderrTail}`] : []
|
|
|
24248
24665
|
table.setAttribute("aria-label", messages.pageLabels.accounts);
|
|
24249
24666
|
const head = document2.createElement("thead");
|
|
24250
24667
|
const row = document2.createElement("tr");
|
|
24251
|
-
|
|
24252
|
-
messages.accountColumnAccount,
|
|
24253
|
-
messages.accountColumnUsage,
|
|
24254
|
-
messages.accountResetCredits,
|
|
24255
|
-
messages.accountColumnActions
|
|
24256
|
-
]) {
|
|
24668
|
+
const headers = Array.from({ length: 4 }, () => {
|
|
24257
24669
|
const cell = document2.createElement("th");
|
|
24258
24670
|
cell.scope = "col";
|
|
24259
|
-
cell.textContent = label;
|
|
24260
24671
|
row.append(cell);
|
|
24261
|
-
|
|
24672
|
+
return cell;
|
|
24673
|
+
});
|
|
24674
|
+
const updateDisplay = (display) => {
|
|
24675
|
+
const labels = [
|
|
24676
|
+
messages.accountColumnAccount,
|
|
24677
|
+
accountUsageColumnLabel("five_hour", display, messages),
|
|
24678
|
+
accountUsageColumnLabel("seven_day", display, messages),
|
|
24679
|
+
messages.accountColumnActions
|
|
24680
|
+
];
|
|
24681
|
+
headers.forEach((cell, index) => {
|
|
24682
|
+
cell.textContent = labels[index] ?? "";
|
|
24683
|
+
});
|
|
24684
|
+
};
|
|
24685
|
+
updateDisplay("remaining");
|
|
24262
24686
|
head.append(row);
|
|
24263
24687
|
const body = document2.createElement("tbody");
|
|
24264
24688
|
table.append(head, body);
|
|
24265
|
-
return { table, body };
|
|
24689
|
+
return { table, body, updateDisplay };
|
|
24266
24690
|
}
|
|
24267
|
-
function
|
|
24268
|
-
const row = document2.createElement("tr");
|
|
24269
|
-
row.className = "settings-account-row";
|
|
24270
|
-
row.dataset.accountId = account.accountId;
|
|
24271
|
-
row.dataset.accountFocus = `${account.accountId}:row`;
|
|
24272
|
-
row.tabIndex = -1;
|
|
24273
|
-
const name = codexAccountDisplayName(account);
|
|
24274
|
-
row.setAttribute("aria-label", name.full);
|
|
24275
|
-
const personCell = document2.createElement("td");
|
|
24691
|
+
function createAccountPerson(document2, messages, input) {
|
|
24276
24692
|
const person = document2.createElement("div");
|
|
24277
24693
|
person.className = "settings-account-row__person";
|
|
24278
|
-
const mark = document2.createElement("div");
|
|
24279
|
-
mark.className = "settings-account-row__mark";
|
|
24280
|
-
mark.setAttribute("aria-hidden", "true");
|
|
24281
|
-
mark.append(createRendererSettingsIcon("terminal", 17));
|
|
24282
24694
|
const identity = document2.createElement("div");
|
|
24283
24695
|
identity.className = "settings-account-row__identity";
|
|
24284
|
-
const title = document2.createElement("
|
|
24285
|
-
title.className = "settings-account-
|
|
24286
|
-
|
|
24287
|
-
|
|
24288
|
-
|
|
24289
|
-
local.title = name.full;
|
|
24290
|
-
title.append(local);
|
|
24291
|
-
if (account.active) {
|
|
24292
|
-
const badge = document2.createElement("span");
|
|
24293
|
-
badge.className = "settings-account-active";
|
|
24294
|
-
badge.textContent = messages.accountDefaultBadge;
|
|
24295
|
-
title.append(badge);
|
|
24296
|
-
}
|
|
24297
|
-
identity.append(title);
|
|
24696
|
+
const title = document2.createElement("strong");
|
|
24697
|
+
title.className = "settings-account-email";
|
|
24698
|
+
title.textContent = input.name;
|
|
24699
|
+
title.title = input.name;
|
|
24700
|
+
title.translate = false;
|
|
24298
24701
|
const metadata = document2.createElement("div");
|
|
24299
24702
|
metadata.className = "settings-account-metadata";
|
|
24300
|
-
|
|
24301
|
-
|
|
24302
|
-
|
|
24303
|
-
|
|
24304
|
-
|
|
24305
|
-
|
|
24306
|
-
const planLabel = accountPlanLabel(account.planType);
|
|
24307
|
-
if (planLabel) {
|
|
24308
|
-
if (name.domain) {
|
|
24703
|
+
const agent = document2.createElement("span");
|
|
24704
|
+
agent.textContent = input.agent;
|
|
24705
|
+
agent.translate = false;
|
|
24706
|
+
if (input.name !== input.agent) metadata.append(agent);
|
|
24707
|
+
if (input.plan) {
|
|
24708
|
+
if (metadata.childElementCount) {
|
|
24309
24709
|
const separator = document2.createElement("span");
|
|
24310
|
-
separator.className = "settings-account-plan-separator";
|
|
24311
24710
|
separator.textContent = "\xB7";
|
|
24312
24711
|
separator.setAttribute("aria-hidden", "true");
|
|
24313
24712
|
metadata.append(separator);
|
|
24314
24713
|
}
|
|
24315
24714
|
const plan = document2.createElement("span");
|
|
24316
|
-
plan.className =
|
|
24317
|
-
plan.textContent =
|
|
24715
|
+
plan.className = input.highlighted ? "settings-account-plan settings-account-plan--highlighted" : "settings-account-plan";
|
|
24716
|
+
plan.textContent = input.plan;
|
|
24717
|
+
plan.translate = false;
|
|
24318
24718
|
metadata.append(plan);
|
|
24319
24719
|
}
|
|
24320
|
-
if (
|
|
24321
|
-
|
|
24322
|
-
|
|
24323
|
-
|
|
24720
|
+
if (input.active) {
|
|
24721
|
+
const badge = document2.createElement("span");
|
|
24722
|
+
badge.className = "settings-account-active";
|
|
24723
|
+
badge.textContent = messages.accountDefaultBadge;
|
|
24724
|
+
badge.title = messages.accountDefaultHint;
|
|
24725
|
+
metadata.append(badge);
|
|
24726
|
+
}
|
|
24727
|
+
identity.append(title);
|
|
24728
|
+
if (metadata.childElementCount) identity.append(metadata);
|
|
24729
|
+
person.append(input.mark, identity);
|
|
24730
|
+
return person;
|
|
24731
|
+
}
|
|
24732
|
+
function renderAccountRows(document2, account, messages, input) {
|
|
24733
|
+
const row = document2.createElement("tr");
|
|
24734
|
+
row.className = "settings-account-row";
|
|
24735
|
+
row.dataset.accountId = account.accountId;
|
|
24736
|
+
row.dataset.accountFocus = `${account.accountId}:row`;
|
|
24737
|
+
row.tabIndex = -1;
|
|
24738
|
+
const name = codexAccountDisplayName(account);
|
|
24739
|
+
row.setAttribute("aria-label", name.full);
|
|
24740
|
+
const personCell = document2.createElement("td");
|
|
24741
|
+
personCell.className = "settings-account-person-cell";
|
|
24742
|
+
const mark = document2.createElement("div");
|
|
24743
|
+
mark.className = "settings-account-row__mark";
|
|
24744
|
+
mark.setAttribute("aria-hidden", "true");
|
|
24745
|
+
mark.append(createRendererSettingsIcon("terminal", 17));
|
|
24746
|
+
personCell.append(
|
|
24747
|
+
createAccountPerson(document2, messages, {
|
|
24748
|
+
name: name.full,
|
|
24749
|
+
agent: "Codex",
|
|
24750
|
+
plan: accountPlanLabel(account.planType),
|
|
24751
|
+
highlighted: account.planType === "pro" || account.planType === "prolite",
|
|
24752
|
+
active: account.active,
|
|
24753
|
+
mark
|
|
24754
|
+
})
|
|
24755
|
+
);
|
|
24324
24756
|
const usage = renderAccountUsage(document2, input.usage, messages, input.display, input.onRetry);
|
|
24325
|
-
if (usage)
|
|
24326
|
-
const resetCell = document2.createElement("td");
|
|
24327
|
-
const resetLabel2 = document2.createElement("span");
|
|
24328
|
-
resetLabel2.className = "settings-account-mobile-label";
|
|
24329
|
-
resetLabel2.textContent = messages.accountResetCredits;
|
|
24330
|
-
resetCell.append(resetLabel2);
|
|
24757
|
+
if (usage.additional) personCell.append(usage.additional);
|
|
24331
24758
|
const actionsCell = document2.createElement("td");
|
|
24759
|
+
actionsCell.className = "settings-account-management-cell";
|
|
24760
|
+
const management = document2.createElement("div");
|
|
24761
|
+
management.className = "settings-account-management";
|
|
24332
24762
|
const actions = document2.createElement("div");
|
|
24333
24763
|
actions.className = "settings-account-actions";
|
|
24334
24764
|
if (!account.active) {
|
|
@@ -24336,6 +24766,7 @@ ${error51.stderrTail}`] : []
|
|
|
24336
24766
|
activate.type = "button";
|
|
24337
24767
|
activate.className = "settings-account-action";
|
|
24338
24768
|
activate.textContent = messages.accountUse;
|
|
24769
|
+
activate.title = messages.accountDefaultHint;
|
|
24339
24770
|
activate.dataset.accountFocus = `${account.accountId}:activate`;
|
|
24340
24771
|
activate.disabled = input.actionsDisabled;
|
|
24341
24772
|
activate.addEventListener("click", input.onActivate);
|
|
@@ -24351,30 +24782,45 @@ ${error51.stderrTail}`] : []
|
|
|
24351
24782
|
signIn.addEventListener("click", input.onSignIn);
|
|
24352
24783
|
actions.append(signIn);
|
|
24353
24784
|
}
|
|
24785
|
+
const more = [];
|
|
24786
|
+
if (account.email && input.usage) {
|
|
24787
|
+
const refresh = document2.createElement("button");
|
|
24788
|
+
refresh.type = "button";
|
|
24789
|
+
refresh.className = "settings-account-action";
|
|
24790
|
+
refresh.textContent = messages.accountCreditsRefresh;
|
|
24791
|
+
refresh.dataset.accountFocus = `${account.accountId}:refresh`;
|
|
24792
|
+
refresh.disabled = input.actionsDisabled || input.usage.status === "loading";
|
|
24793
|
+
refresh.addEventListener("click", input.onRetry);
|
|
24794
|
+
more.push(refresh);
|
|
24795
|
+
}
|
|
24354
24796
|
if (!account.isDefault) {
|
|
24355
24797
|
const remove = document2.createElement("button");
|
|
24356
24798
|
remove.type = "button";
|
|
24357
|
-
remove.className = "settings-
|
|
24358
|
-
remove.
|
|
24799
|
+
remove.className = "settings-account-action settings-account-delete";
|
|
24800
|
+
remove.textContent = messages.accountDelete;
|
|
24359
24801
|
remove.dataset.accountFocus = `${account.accountId}:delete`;
|
|
24360
24802
|
remove.setAttribute("aria-label", `${messages.accountDelete}: ${name.full}`);
|
|
24361
24803
|
remove.disabled = input.actionsDisabled;
|
|
24362
|
-
remove.append(createRendererSettingsIcon("trash", 16));
|
|
24363
24804
|
remove.addEventListener("click", input.onDelete);
|
|
24364
|
-
|
|
24365
|
-
}
|
|
24366
|
-
|
|
24367
|
-
|
|
24805
|
+
more.push(remove);
|
|
24806
|
+
}
|
|
24807
|
+
if (more.length)
|
|
24808
|
+
actions.append(
|
|
24809
|
+
createAccountDetails(document2, messages, {
|
|
24810
|
+
label: messages.accountMore,
|
|
24811
|
+
triggerLabel: `${name.full} \xB7 ${messages.accountMore}`,
|
|
24812
|
+
description: name.full,
|
|
24813
|
+
focusKey: `${account.accountId}:more`,
|
|
24814
|
+
icon: "ellipsis",
|
|
24815
|
+
disabled: input.actionsDisabled,
|
|
24816
|
+
actions: more
|
|
24817
|
+
})
|
|
24818
|
+
);
|
|
24819
|
+
management.append(actions);
|
|
24820
|
+
actionsCell.append(management);
|
|
24821
|
+
row.append(personCell, ...usage.cells, actionsCell);
|
|
24368
24822
|
const reset = input.usage?.status === "ready" ? renderAccountResetCredits(document2, input.usage.credits, messages, input) : null;
|
|
24369
|
-
if (!reset)
|
|
24370
|
-
const unknown2 = document2.createElement("span");
|
|
24371
|
-
unknown2.className = "settings-account-unknown";
|
|
24372
|
-
unknown2.textContent = "\u2014";
|
|
24373
|
-
unknown2.title = messages.accountResetCreditsUnknown;
|
|
24374
|
-
unknown2.setAttribute("aria-label", messages.accountResetCreditsUnknown);
|
|
24375
|
-
resetCell.append(unknown2);
|
|
24376
|
-
return [row];
|
|
24377
|
-
}
|
|
24823
|
+
if (!reset) return [row];
|
|
24378
24824
|
const detailsRow = document2.createElement("tr");
|
|
24379
24825
|
detailsRow.className = "settings-account-details-row";
|
|
24380
24826
|
detailsRow.id = `settings-account-reset-${++resetDetailsSequence}`;
|
|
@@ -24391,120 +24837,84 @@ ${error51.stderrTail}`] : []
|
|
|
24391
24837
|
reset.summary.setAttribute("aria-expanded", String(!detailsRow.hidden));
|
|
24392
24838
|
input.onResetExpanded(!detailsRow.hidden);
|
|
24393
24839
|
});
|
|
24394
|
-
|
|
24840
|
+
management.append(reset.summary);
|
|
24395
24841
|
return [row, detailsRow];
|
|
24396
24842
|
}
|
|
24843
|
+
function renderHarnessAccountRow(document2, account, messages, display) {
|
|
24844
|
+
const row = document2.createElement("tr");
|
|
24845
|
+
row.className = "settings-account-row";
|
|
24846
|
+
row.dataset.harnessId = account.harnessId;
|
|
24847
|
+
row.tabIndex = -1;
|
|
24848
|
+
const name = account.email ?? account.label ?? account.harnessName;
|
|
24849
|
+
row.setAttribute("aria-label", name);
|
|
24850
|
+
const personCell = document2.createElement("td");
|
|
24851
|
+
personCell.className = "settings-account-person-cell";
|
|
24852
|
+
const logo = document2.createElement("div");
|
|
24853
|
+
logo.className = "settings-harness-account__logo";
|
|
24854
|
+
logo.setAttribute("aria-hidden", "true");
|
|
24855
|
+
const agent = KNOWN_RENDERER_AGENTS.find((agent2) => agent2 === account.harnessId);
|
|
24856
|
+
if (agent) logo.append(createRendererAgentIcon(agent, 26, document2));
|
|
24857
|
+
personCell.append(
|
|
24858
|
+
createAccountPerson(document2, messages, {
|
|
24859
|
+
name,
|
|
24860
|
+
agent: account.harnessName,
|
|
24861
|
+
plan: account.plan ?? null,
|
|
24862
|
+
mark: logo
|
|
24863
|
+
})
|
|
24864
|
+
);
|
|
24865
|
+
const usage = renderAccountUsage(
|
|
24866
|
+
document2,
|
|
24867
|
+
{ status: "ready", credits: account.credits },
|
|
24868
|
+
messages,
|
|
24869
|
+
display,
|
|
24870
|
+
() => void 0
|
|
24871
|
+
);
|
|
24872
|
+
if (usage.additional) personCell.append(usage.additional);
|
|
24873
|
+
const managementCell = document2.createElement("td");
|
|
24874
|
+
managementCell.className = "settings-account-management-cell";
|
|
24875
|
+
const management = document2.createElement("div");
|
|
24876
|
+
management.className = "settings-account-native";
|
|
24877
|
+
const label = document2.createElement("span");
|
|
24878
|
+
label.textContent = messages.accountNativeManaged;
|
|
24879
|
+
const info = createAccountDetails(document2, messages, {
|
|
24880
|
+
label: `${account.harnessName} \xB7 ${messages.accountNativeManaged}`,
|
|
24881
|
+
description: messages.accountNativeManagementHint.replace("{harness}", account.harnessName),
|
|
24882
|
+
focusKey: `harness:${account.harnessId}:info`,
|
|
24883
|
+
icon: "info",
|
|
24884
|
+
actions: []
|
|
24885
|
+
});
|
|
24886
|
+
management.append(label, info);
|
|
24887
|
+
managementCell.append(management);
|
|
24888
|
+
row.append(personCell, ...usage.cells, managementCell);
|
|
24889
|
+
return row;
|
|
24890
|
+
}
|
|
24397
24891
|
|
|
24398
24892
|
// src/settings/harness-accounts.ts
|
|
24399
|
-
function
|
|
24400
|
-
const document2 = context.content.ownerDocument;
|
|
24401
|
-
const section = document2.createElement("section");
|
|
24402
|
-
section.className = "settings-harness-accounts";
|
|
24403
|
-
section.hidden = true;
|
|
24404
|
-
const heading = document2.createElement("h2");
|
|
24405
|
-
heading.className = "settings-harness-accounts__title";
|
|
24406
|
-
heading.textContent = messages.harnessAccountsTitle;
|
|
24407
|
-
const list = document2.createElement("div");
|
|
24408
|
-
list.className = "settings-account-list";
|
|
24409
|
-
section.append(heading, list);
|
|
24410
|
-
context.content.append(section);
|
|
24893
|
+
function createHarnessAccounts(signal, getClient, onChange) {
|
|
24411
24894
|
let accounts = [];
|
|
24412
24895
|
let refreshing = false;
|
|
24413
|
-
let query = "";
|
|
24414
|
-
let display = "remaining";
|
|
24415
|
-
const render = () => {
|
|
24416
|
-
section.hidden = accounts.length === 0;
|
|
24417
|
-
list.replaceChildren();
|
|
24418
|
-
const visible = accounts.filter(
|
|
24419
|
-
(account) => `${account.harnessName} ${account.email ?? ""} ${account.label ?? ""} ${account.plan ?? ""}`.toLocaleLowerCase().includes(query)
|
|
24420
|
-
);
|
|
24421
|
-
for (const account of visible) {
|
|
24422
|
-
const row = document2.createElement("article");
|
|
24423
|
-
row.className = "settings-harness-account";
|
|
24424
|
-
row.dataset.harnessId = account.harnessId;
|
|
24425
|
-
const identity = document2.createElement("div");
|
|
24426
|
-
identity.className = "settings-harness-account__identity";
|
|
24427
|
-
const name = document2.createElement("strong");
|
|
24428
|
-
name.className = "settings-account-email";
|
|
24429
|
-
const accountName = account.email ?? account.label;
|
|
24430
|
-
name.textContent = accountName ?? account.harnessName;
|
|
24431
|
-
name.title = name.textContent;
|
|
24432
|
-
identity.append(name);
|
|
24433
|
-
const metadata = document2.createElement("div");
|
|
24434
|
-
metadata.className = "settings-account-metadata";
|
|
24435
|
-
if (accountName) {
|
|
24436
|
-
const harness = document2.createElement("span");
|
|
24437
|
-
harness.textContent = account.harnessName;
|
|
24438
|
-
metadata.append(harness);
|
|
24439
|
-
}
|
|
24440
|
-
if (account.plan) {
|
|
24441
|
-
if (accountName) {
|
|
24442
|
-
const separator = document2.createElement("span");
|
|
24443
|
-
separator.textContent = "\xB7";
|
|
24444
|
-
separator.setAttribute("aria-hidden", "true");
|
|
24445
|
-
metadata.append(separator);
|
|
24446
|
-
}
|
|
24447
|
-
const plan = document2.createElement("span");
|
|
24448
|
-
plan.className = "settings-account-plan";
|
|
24449
|
-
plan.textContent = account.plan;
|
|
24450
|
-
metadata.append(plan);
|
|
24451
|
-
}
|
|
24452
|
-
if (metadata.childElementCount) identity.append(metadata);
|
|
24453
|
-
const usage = renderAccountUsage(
|
|
24454
|
-
document2,
|
|
24455
|
-
{ status: "ready", credits: account.credits },
|
|
24456
|
-
messages,
|
|
24457
|
-
display,
|
|
24458
|
-
() => void 0
|
|
24459
|
-
);
|
|
24460
|
-
const person = document2.createElement("div");
|
|
24461
|
-
person.className = "settings-account-row__person";
|
|
24462
|
-
const agent = KNOWN_RENDERER_AGENTS.find((agent2) => agent2 === account.harnessId);
|
|
24463
|
-
if (agent) {
|
|
24464
|
-
const logo = document2.createElement("div");
|
|
24465
|
-
logo.className = "settings-harness-account__logo";
|
|
24466
|
-
logo.setAttribute("aria-hidden", "true");
|
|
24467
|
-
logo.append(createRendererAgentIcon(agent, 28, document2));
|
|
24468
|
-
person.append(logo);
|
|
24469
|
-
}
|
|
24470
|
-
person.append(identity);
|
|
24471
|
-
row.append(person);
|
|
24472
|
-
if (usage) row.append(usage);
|
|
24473
|
-
list.append(row);
|
|
24474
|
-
}
|
|
24475
|
-
if (accounts.length && !visible.length) {
|
|
24476
|
-
const empty = document2.createElement("p");
|
|
24477
|
-
empty.className = "settings-account-empty";
|
|
24478
|
-
empty.textContent = messages.accountNoMatches;
|
|
24479
|
-
list.append(empty);
|
|
24480
|
-
}
|
|
24481
|
-
};
|
|
24482
24896
|
return {
|
|
24897
|
+
get accounts() {
|
|
24898
|
+
return accounts;
|
|
24899
|
+
},
|
|
24483
24900
|
get refreshing() {
|
|
24484
24901
|
return refreshing;
|
|
24485
24902
|
},
|
|
24486
|
-
update(nextQuery, nextDisplay) {
|
|
24487
|
-
query = nextQuery;
|
|
24488
|
-
display = nextDisplay;
|
|
24489
|
-
render();
|
|
24490
|
-
},
|
|
24491
24903
|
async refresh() {
|
|
24492
|
-
if (refreshing ||
|
|
24904
|
+
if (refreshing || signal.aborted) return;
|
|
24493
24905
|
const client = getClient();
|
|
24494
24906
|
if (!client?.listHarnessAccounts) return;
|
|
24495
24907
|
refreshing = true;
|
|
24496
24908
|
onChange();
|
|
24497
24909
|
try {
|
|
24498
24910
|
const result = await client.listHarnessAccounts();
|
|
24499
|
-
if (!
|
|
24911
|
+
if (!signal.aborted)
|
|
24912
|
+
accounts = [...result.accounts].sort((a, b) => a.harnessId.localeCompare(b.harnessId));
|
|
24500
24913
|
} catch {
|
|
24501
|
-
if (!
|
|
24914
|
+
if (!signal.aborted) accounts = [];
|
|
24502
24915
|
} finally {
|
|
24503
24916
|
refreshing = false;
|
|
24504
|
-
if (!
|
|
24505
|
-
render();
|
|
24506
|
-
onChange();
|
|
24507
|
-
}
|
|
24917
|
+
if (!signal.aborted) onChange();
|
|
24508
24918
|
}
|
|
24509
24919
|
}
|
|
24510
24920
|
};
|
|
@@ -24524,16 +24934,13 @@ ${error51.stderrTail}`] : []
|
|
|
24524
24934
|
const header = document2.createElement("div");
|
|
24525
24935
|
header.className = "settings-account-header";
|
|
24526
24936
|
const copy = document2.createElement("div");
|
|
24527
|
-
const eyebrow = document2.createElement("p");
|
|
24528
|
-
eyebrow.className = "settings-account-eyebrow";
|
|
24529
|
-
eyebrow.textContent = "ACCOUNT MANAGEMENT";
|
|
24530
24937
|
const heading = document2.createElement("h1");
|
|
24531
24938
|
heading.className = "settings-section-label";
|
|
24532
24939
|
heading.textContent = messages.pageLabels.accounts;
|
|
24533
24940
|
const description = document2.createElement("p");
|
|
24534
24941
|
description.className = "settings-page-description";
|
|
24535
24942
|
description.textContent = messages.accountsDescription;
|
|
24536
|
-
copy.append(
|
|
24943
|
+
copy.append(heading, description);
|
|
24537
24944
|
const add = document2.createElement("button");
|
|
24538
24945
|
add.type = "button";
|
|
24539
24946
|
add.className = "settings-command-button";
|
|
@@ -24542,29 +24949,6 @@ ${error51.stderrTail}`] : []
|
|
|
24542
24949
|
const status = document2.createElement("p");
|
|
24543
24950
|
status.className = "settings-account-status";
|
|
24544
24951
|
status.setAttribute("aria-live", "polite");
|
|
24545
|
-
const helpRow = document2.createElement("div");
|
|
24546
|
-
helpRow.className = "settings-account-help-row";
|
|
24547
|
-
const taskHint = document2.createElement("p");
|
|
24548
|
-
taskHint.className = "settings-account-task-hint";
|
|
24549
|
-
const taskHintText = document2.createElement("span");
|
|
24550
|
-
taskHintText.textContent = messages.accountTaskHint;
|
|
24551
|
-
taskHint.append(createRendererSettingsIcon("info", 16), taskHintText);
|
|
24552
|
-
const help = document2.createElement("button");
|
|
24553
|
-
help.type = "button";
|
|
24554
|
-
help.className = "settings-account-help-button";
|
|
24555
|
-
help.append(createRendererSettingsIcon("help", 16), messages.accountLoginHelp);
|
|
24556
|
-
help.setAttribute("aria-expanded", "false");
|
|
24557
|
-
help.setAttribute("aria-controls", "settings-account-login-help");
|
|
24558
|
-
const deviceCodeNote = document2.createElement("p");
|
|
24559
|
-
deviceCodeNote.id = "settings-account-login-help";
|
|
24560
|
-
deviceCodeNote.className = "settings-account-device-code-note";
|
|
24561
|
-
deviceCodeNote.textContent = messages.accountDeviceCodePrerequisite;
|
|
24562
|
-
deviceCodeNote.hidden = true;
|
|
24563
|
-
help.addEventListener("click", () => {
|
|
24564
|
-
deviceCodeNote.hidden = !deviceCodeNote.hidden;
|
|
24565
|
-
help.setAttribute("aria-expanded", String(!deviceCodeNote.hidden));
|
|
24566
|
-
});
|
|
24567
|
-
helpRow.append(taskHint, help);
|
|
24568
24952
|
const toolbar = document2.createElement("div");
|
|
24569
24953
|
toolbar.className = "settings-account-toolbar";
|
|
24570
24954
|
const connected = document2.createElement("div");
|
|
@@ -24612,9 +24996,10 @@ ${error51.stderrTail}`] : []
|
|
|
24612
24996
|
toolbar.append(connected, searchWrapper, displayControls, refreshUsage);
|
|
24613
24997
|
const list = document2.createElement("div");
|
|
24614
24998
|
list.className = "settings-account-list";
|
|
24615
|
-
const { table, body } = createAccountsTable(document2, messages);
|
|
24999
|
+
const { table, body, updateDisplay } = createAccountsTable(document2, messages);
|
|
24616
25000
|
list.append(table);
|
|
24617
|
-
context.content.append(header,
|
|
25001
|
+
context.content.append(header, status, toolbar, list);
|
|
25002
|
+
const stopCountdowns = mountAccountResetCountdowns(list, messages, context.signal);
|
|
24618
25003
|
let accounts = [];
|
|
24619
25004
|
let accountCreating = false;
|
|
24620
25005
|
let accountActivating = false;
|
|
@@ -24664,18 +25049,21 @@ ${error51.stderrTail}`] : []
|
|
|
24664
25049
|
const restoreFocus = accountListFocusRestorer(list, search);
|
|
24665
25050
|
body.replaceChildren();
|
|
24666
25051
|
status.textContent = loginMessage ?? "";
|
|
24667
|
-
connectedCount.textContent = String(accounts.
|
|
25052
|
+
connectedCount.textContent = String(accounts.length + harnessAccounts.accounts.length);
|
|
25053
|
+
updateDisplay(usageDisplay);
|
|
24668
25054
|
search.disabled = login !== null || loginStartingAccountId !== null;
|
|
24669
25055
|
for (const [display, button] of displayButtons) {
|
|
24670
25056
|
button.setAttribute("aria-pressed", String(display === usageDisplay));
|
|
24671
25057
|
}
|
|
24672
25058
|
refreshUsage.disabled = (!getClient()?.inspectCodexAccountUsage || !accounts.some((account) => account.email)) && !getClient()?.listHarnessAccounts || harnessAccounts?.refreshing === true || [...usageByAccountId.values()].some((usage) => usage.status === "loading") || accountBusy();
|
|
24673
25059
|
const query = search.value.trim().toLocaleLowerCase();
|
|
24674
|
-
harnessAccounts?.update(query, usageDisplay);
|
|
24675
25060
|
const visibleAccounts = accounts.filter(
|
|
24676
|
-
(account) =>
|
|
25061
|
+
(account) => `Codex ${account.email ?? ""} ${account.label} ${accountPlanLabel(account.planType) ?? ""}`.toLocaleLowerCase().includes(query)
|
|
24677
25062
|
);
|
|
24678
|
-
|
|
25063
|
+
const visibleHarnessAccounts = harnessAccounts.accounts.filter(
|
|
25064
|
+
(account) => `${account.harnessName} ${account.email ?? ""} ${account.label ?? ""} ${account.plan ?? ""}`.toLocaleLowerCase().includes(query)
|
|
25065
|
+
);
|
|
25066
|
+
if (visibleAccounts.length + visibleHarnessAccounts.length === 0) {
|
|
24679
25067
|
const emptyRow = document2.createElement("tr");
|
|
24680
25068
|
const emptyCell = document2.createElement("td");
|
|
24681
25069
|
emptyCell.colSpan = 4;
|
|
@@ -24760,6 +25148,9 @@ ${error51.stderrTail}`] : []
|
|
|
24760
25148
|
body.append(verificationRow);
|
|
24761
25149
|
}
|
|
24762
25150
|
}
|
|
25151
|
+
for (const account of visibleHarnessAccounts) {
|
|
25152
|
+
body.append(renderHarnessAccountRow(document2, account, messages, usageDisplay));
|
|
25153
|
+
}
|
|
24763
25154
|
restoreFocus();
|
|
24764
25155
|
};
|
|
24765
25156
|
const client = () => {
|
|
@@ -24990,10 +25381,11 @@ ${error51.stderrTail}`] : []
|
|
|
24990
25381
|
});
|
|
24991
25382
|
} catch {
|
|
24992
25383
|
}
|
|
24993
|
-
const harnessAccounts =
|
|
25384
|
+
const harnessAccounts = createHarnessAccounts(context.signal, getClient, render);
|
|
24994
25385
|
void harnessAccounts.refresh();
|
|
24995
25386
|
load();
|
|
24996
25387
|
return () => {
|
|
25388
|
+
stopCountdowns();
|
|
24997
25389
|
clearLoginRefresh();
|
|
24998
25390
|
unsubscribe?.();
|
|
24999
25391
|
};
|
|
@@ -25485,6 +25877,7 @@ ${error51.stderrTail}`] : []
|
|
|
25485
25877
|
createConnectionsSettingsPage(messages, getDiagnostics),
|
|
25486
25878
|
createAccountsSettingsPage(messages, getAccountClient),
|
|
25487
25879
|
createSessionImportSettingsPage(messages, getSessionImportClient, openImportedThread),
|
|
25880
|
+
createAppearanceSettingsPage(messages),
|
|
25488
25881
|
updatesPage(messages, getUpdateClient),
|
|
25489
25882
|
aboutPage(messages)
|
|
25490
25883
|
]);
|
|
@@ -25503,10 +25896,10 @@ ${error51.stderrTail}`] : []
|
|
|
25503
25896
|
}
|
|
25504
25897
|
|
|
25505
25898
|
// src/settings/shell.css
|
|
25506
|
-
var shell_default = ':host {\n --settings-bg: light-dark(#ffffff, #202020);\n --settings-sidebar: light-dark(#f7f7f8, #191919);\n --settings-panel: light-dark(#ffffff, #232323);\n --settings-surface: light-dark(#f6f6f6, #292929);\n --settings-surface-hover: light-dark(#eeeeee, #303030);\n --settings-inset: light-dark(#f3f3f3, #161616);\n --settings-text: light-dark(#0d0d0d, #ececec);\n --settings-muted: light-dark(#676767, #a3a3a3);\n --settings-subtle: light-dark(#8a8a8a, #777777);\n --settings-border: light-dark(rgb(13 13 13 / 9%), rgb(255 255 255 / 9%));\n --settings-divider: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 7%));\n --settings-hover: light-dark(rgb(13 13 13 / 5%), rgb(255 255 255 / 7%));\n --settings-active: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 9%));\n --settings-focus: light-dark(#0b75d1, #66aaf9);\n --settings-primary: light-dark(#171717, #f4f4f4);\n --settings-primary-hover: light-dark(#2f2f2f, #ffffff);\n --settings-primary-text: light-dark(#ffffff, #171717);\n --settings-warning: light-dark(#8a5500, #f5c96a);\n --settings-warning-bg: light-dark(#fff8e6, rgb(245 201 106 / 8%));\n --settings-warning-border: light-dark(#ead8a8, rgb(245 201 106 / 24%));\n --settings-danger: light-dark(#b42318, #f87171);\n --settings-danger-bg: light-dark(#fff1f0, rgb(239 68 68 / 8%));\n --settings-danger-border: light-dark(#f3c7c3, rgb(239 68 68 / 22%));\n --settings-success: light-dark(#16784a, #4ade80);\n color: var(--settings-text);\n color-scheme: inherit;\n font:\n 13px/1.5 system-ui,\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n sans-serif;\n letter-spacing: 0;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n letter-spacing: 0;\n}\n\nbutton,\ninput,\nselect {\n font: inherit;\n}\n\nbutton {\n color: inherit;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.settings-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n.codexhost-settings-dialog {\n width: min(1120px, calc(100vw - 32px));\n height: min(780px, calc(100vh - 32px));\n max-width: none;\n max-height: none;\n margin: auto;\n padding: 0;\n overflow: hidden;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 14px;\n box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));\n}\n\n.codexhost-settings-dialog::backdrop {\n background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));\n backdrop-filter: blur(1px);\n}\n\n.settings-frame,\n.settings-layout {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n\n.settings-frame {\n display: flex;\n flex-direction: column;\n}\n\n.settings-layout {\n flex: 1;\n display: grid;\n grid-template-columns: 184px minmax(0, 1fr);\n background: var(--settings-bg);\n}\n\n.settings-sidebar {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n background: var(--settings-sidebar);\n border-right: 1px solid var(--settings-border);\n padding-top: 14px;\n}\n\n.settings-header {\n display: flex;\n align-items: center;\n min-width: 0;\n height: 48px;\n flex: none;\n padding: 0 12px;\n border-bottom: 1px solid var(--settings-border);\n}\n\n.settings-header-actions {\n display: flex;\n align-items: center;\n flex: none;\n gap: 12px;\n margin-left: auto;\n}\n\n.settings-brand {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 7px;\n}\n\n.settings-brand__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n flex: none;\n color: var(--settings-text);\n}\n\n.settings-brand__mark .codexhost-settings-icon {\n width: 24px;\n height: 24px;\n object-fit: contain;\n}\n\n.settings-brand__copy {\n display: flex;\n min-width: 0;\n align-items: baseline;\n gap: 0;\n line-height: 20px;\n}\n\n.settings-brand__name {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 600;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-brand__title {\n margin-left: 8px;\n padding-left: 8px;\n color: var(--settings-muted);\n font-size: 13px;\n font-weight: 400;\n border-left: 1px solid var(--settings-border);\n}\n\n.settings-nav {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n gap: 2px;\n padding: 0 7px 10px;\n overflow-y: auto;\n}\n\n.settings-nav-section-label {\n min-height: 24px;\n padding: 4px 9px 2px;\n color: var(--settings-subtle);\n font-size: 11px;\n font-weight: 600;\n line-height: 18px;\n}\n\n.settings-nav-section-label:not(:first-child) {\n margin-top: 8px;\n}\n\n.settings-nav-button {\n display: grid;\n grid-template-columns: 16px minmax(0, 1fr);\n align-items: center;\n width: 100%;\n position: relative;\n min-height: 34px;\n flex: none;\n gap: 9px;\n padding: 6px 9px;\n color: var(--settings-text);\n font-size: 13px;\n line-height: 20px;\n text-align: left;\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-nav-button .codexhost-settings-icon {\n width: 16px;\n height: 16px;\n opacity: 0.9;\n}\n\n.settings-nav-button:hover {\n background: var(--settings-hover);\n}\n\n.settings-nav-button[aria-current="page"] {\n background: var(--settings-active);\n color: var(--settings-text);\n font-weight: 500;\n}\n\n.settings-nav-button span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-nav-star-link {\n margin-top: 0;\n color: var(--settings-text);\n text-decoration: none;\n}\n\n.settings-nav-star-link .codexhost-settings-icon {\n color: var(--settings-warning);\n}\n\n.settings-nav-star-link:hover {\n color: var(--settings-warning);\n background: var(--settings-warning-bg);\n}\n\n.settings-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex: none;\n padding: 0;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-icon-button:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-icon-button:focus-visible,\n.settings-nav-button:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-page {\n display: block;\n position: relative;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n background: var(--settings-bg);\n scrollbar-gutter: stable;\n}\n\n.settings-page__content {\n width: min(930px, calc(100% - 80px));\n margin-inline: auto;\n}\n\n.settings-page__content {\n min-width: 0;\n padding: 28px 0 36px;\n}\n\n.settings-section-label {\n min-height: auto;\n margin: 0;\n padding: 0 0 18px;\n color: var(--settings-text);\n font-size: 18px;\n font-weight: 600;\n line-height: 26px;\n}\n\n.settings-status-list,\n.settings-empty {\n overflow: hidden;\n background: var(--settings-panel);\n}\n\n.settings-status-row {\n display: grid;\n grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);\n position: relative;\n align-items: center;\n min-height: 72px;\n gap: 20px;\n padding: 12px 0;\n}\n\n.settings-status-row:not(:last-child)::after {\n content: "";\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 1px;\n background: var(--settings-divider);\n}\n\n.settings-status-row__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n color: var(--settings-text);\n gap: 10px;\n font-size: 14px;\n font-weight: 500;\n line-height: 22px;\n}\n\n.settings-status-row__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n flex: none;\n color: var(--settings-muted);\n background: var(--settings-surface);\n border-radius: 50%;\n}\n\n.settings-status-badge {\n flex: none;\n padding: 3px 8px;\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-status-row__detail {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-page-description {\n max-width: 760px;\n margin: -10px 0 20px;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-session-import-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 24px;\n}\n\n.settings-session-import-header .settings-section-label {\n min-width: 0;\n}\n\n.settings-session-import-harness {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 12px;\n margin: -12px 0 16px;\n color: var(--settings-muted);\n font-size: 13px;\n}\n\n.settings-session-import-harness > span {\n flex: none;\n}\n\n.settings-session-import-harness__options {\n display: flex;\n align-items: center;\n min-width: 0;\n flex: 1;\n gap: 6px;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n}\n\n.settings-session-import-harness__options::-webkit-scrollbar {\n display: none;\n}\n\n.settings-session-import-harness__option {\n min-height: 32px;\n flex: none;\n padding: 6px 10px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n white-space: nowrap;\n background: rgb(255 255 255 / 4%);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-session-import-harness__option[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n border-color: rgb(51 156 255 / 50%);\n}\n\n.settings-session-import-harness__option:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.settings-session-import-harness__option:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-harness + .settings-page-description {\n margin-top: 0;\n margin-bottom: 4px;\n}\n\n.settings-session-import-availability-note {\n margin-top: 0;\n}\n\n.settings-session-import-search,\n.settings-session-import-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 10px;\n margin: 16px 0;\n}\n\n.settings-session-import-search input {\n flex: 1;\n min-width: 160px;\n}\n\n.settings-session-import-search input,\n.settings-session-import-pagination select {\n min-height: 36px;\n padding: 6px 10px;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-session-import-search input:focus-visible,\n.settings-session-import-pagination select:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-pagination {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.settings-session-import-pagination label {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.settings-session-import-pagination > span {\n flex: 1;\n min-width: 130px;\n}\n\n.settings-session-import-pagination__navigation {\n display: flex;\n gap: 8px;\n margin-left: auto;\n}\n\n.settings-session-import-content,\n.settings-session-import-list {\n display: grid;\n gap: 10px;\n}\n\n.settings-session-import-status {\n display: flex;\n align-items: center;\n min-height: 64px;\n gap: 12px;\n padding: 16px;\n color: var(--settings-muted);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-status.is-error {\n color: #ef4444;\n}\n\n.settings-session-import-recovery {\n display: grid;\n justify-items: start;\n gap: 14px;\n padding: 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-recovery:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-recovery__copy {\n display: grid;\n gap: 4px;\n}\n\n.settings-session-import-recovery__copy strong {\n color: var(--settings-text);\n font-size: 14px;\n}\n\n.settings-session-import-recovery__copy p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-session-import-recovery__path {\n display: flex;\n align-items: stretch;\n width: 100%;\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-session-import-recovery__path code {\n min-width: 0;\n flex: 1;\n padding: 8px 10px;\n overflow-x: auto;\n color: var(--settings-text);\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n}\n\n.settings-session-import-recovery__path .settings-command-button {\n min-height: 0;\n flex: none;\n border-width: 0 0 0 1px;\n border-radius: 0;\n}\n\n.settings-session-import-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 20px;\n min-width: 0;\n padding: 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-row__copy {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-session-import-row__copy strong {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 14px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-session-import-row__copy span,\n.settings-session-import-row__cwd {\n overflow: hidden;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-session-import-row__cwd {\n display: block;\n min-width: 0;\n background: transparent;\n}\n\n.settings-session-import-row__action {\n display: flex;\n align-items: flex-end;\n flex-direction: column;\n gap: 8px;\n}\n\n.settings-session-import-running {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.settings-preference-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 32px;\n min-height: 88px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-divider);\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-preference-row__copy {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n gap: 5px;\n}\n\n.settings-preference-row__copy strong {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-preference-row__copy span {\n max-width: 680px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-preference-switch {\n display: inline-flex;\n align-items: center;\n width: 42px;\n height: 24px;\n flex: none;\n padding: 2px;\n border: 0;\n border-radius: 999px;\n background: var(--settings-surface-hover);\n cursor: pointer;\n transition: background 120ms ease;\n}\n\n.settings-preference-switch[aria-checked="true"] {\n justify-content: flex-end;\n background: var(--settings-focus);\n}\n\n.settings-preference-switch:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-preference-switch__thumb {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: var(--settings-primary-text);\n box-shadow: 0 1px 3px rgb(0 0 0 / 24%);\n}\n\n.settings-connection-page-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 18px;\n margin-bottom: 18px;\n}\n\n.settings-connection-page-header .settings-section-label {\n padding-bottom: 0;\n}\n\n.settings-connection-page-header .settings-page-description {\n margin: 5px 0 0;\n}\n\n.settings-connections-content,\n.settings-connections-layout,\n.settings-connection-list,\n.settings-connection-rows {\n min-width: 0;\n}\n\n.settings-connections-layout {\n display: grid;\n grid-template-columns: minmax(0, 1.55fr) minmax(280px, 0.85fr);\n align-items: start;\n gap: 18px;\n}\n\n.settings-connection-list,\n.settings-connection-inspector {\n overflow: hidden;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-connection-host-strip {\n display: grid;\n grid-template-columns: 30px minmax(0, 1fr) 30px;\n align-items: center;\n min-width: 0;\n gap: 5px;\n padding: 9px 10px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-host-scroll {\n display: none;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 34px;\n padding: 0;\n color: var(--settings-muted);\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-connection-host-strip[data-connection-host-overflow="true"]\n .settings-connection-host-scroll {\n display: inline-flex;\n}\n\n.settings-connection-host-strip:not([data-connection-host-overflow="true"]) {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.settings-connection-host-scroll:hover:not(:disabled) {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-host-scroll:disabled {\n cursor: default;\n opacity: 0.35;\n}\n\n.settings-connection-host-scroll:focus-visible,\n.settings-connection-host-tab:focus-visible,\n.settings-connection-row:focus-visible,\n.settings-connection-install-link:focus-visible,\n.settings-connection-view-error:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-connection-host-tabs {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 6px;\n overflow-x: auto;\n overflow-y: hidden;\n overscroll-behavior-x: contain;\n scrollbar-width: none;\n scroll-behavior: smooth;\n scroll-snap-type: x proximity;\n touch-action: pan-x;\n}\n\n.settings-connection-host-tabs::-webkit-scrollbar {\n display: none;\n}\n\n.settings-connection-host-tab {\n display: inline-flex;\n align-items: center;\n height: 30px;\n min-width: max-content;\n flex: none;\n padding: 0 9px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n white-space: nowrap;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n cursor: pointer;\n scroll-snap-align: start;\n}\n\n.settings-connection-host-tab:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-host-tab[aria-selected="true"] {\n color: var(--settings-text);\n font-weight: 600;\n background: var(--settings-active);\n border-color: var(--settings-border);\n}\n\n.settings-connection-table-header,\n.settings-connection-row {\n display: grid;\n grid-template-columns: minmax(160px, 1fr) minmax(92px, auto) 108px;\n align-items: center;\n min-width: 0;\n gap: 10px;\n}\n\n.settings-connection-table-header {\n min-height: 30px;\n padding: 0 10px;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n background: transparent;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-row {\n min-height: 52px;\n padding: 8px 10px;\n cursor: pointer;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-row:last-child {\n border-bottom: 0;\n}\n\n.settings-connection-row:hover {\n background: var(--settings-hover);\n}\n\n.settings-connection-row[data-connection-selected="true"] {\n background: var(--settings-surface);\n}\n\n.settings-connection-row__identity,\n.settings-connection-inspector__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n color: var(--settings-text);\n}\n\n.settings-connection-row__identity strong,\n.settings-connection-inspector__identity strong {\n min-width: 0;\n overflow-wrap: anywhere;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-row__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n flex: none;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 700;\n background: var(--settings-surface);\n border-radius: 6px;\n}\n\n.settings-connection-row__mark--logo {\n color: var(--settings-text);\n background: transparent;\n}\n\n.settings-connection-row__mark--logo > img,\n.settings-connection-row__mark--logo > svg {\n display: block;\n max-width: 18px;\n max-height: 18px;\n}\n\n.settings-connection-row__status {\n display: inline-flex;\n align-items: center;\n width: fit-content;\n gap: 5px;\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-row__status::before {\n width: 6px;\n height: 6px;\n flex: none;\n content: "";\n background: currentColor;\n border-radius: 50%;\n}\n\n.settings-connection-row__status[data-connection-tone="ready"] {\n color: var(--settings-success);\n}\n\n.settings-connection-row__status[data-connection-tone="checking"] {\n color: var(--settings-warning);\n}\n\n.settings-connection-row__status[data-connection-tone="setup"] {\n color: var(--settings-muted);\n}\n\n.settings-connection-row__status[data-connection-tone="setup"]::before {\n background: transparent;\n border: 1.5px solid currentColor;\n}\n\n.settings-connection-row__status[data-connection-tone="failed"] {\n color: var(--settings-danger);\n}\n\n.settings-connection-row__action {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-connection-row__handle {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n color: var(--settings-muted);\n cursor: grab;\n opacity: 0.6;\n}\n\n.settings-connection-row__handle:hover {\n opacity: 1;\n}\n\n.settings-connection-row[draggable="true"] {\n cursor: grab;\n}\n\n.settings-connection-row[data-connection-dragging="true"] {\n opacity: 0.4;\n}\n\n.settings-connection-row[data-connection-drop-indicator="before"] {\n box-shadow: inset 0 2px 0 0 var(--settings-focus);\n}\n\n.settings-connection-row[data-connection-drop-indicator="after"] {\n box-shadow: inset 0 -2px 0 0 var(--settings-focus);\n}\n\n.settings-connection-row__group-toggle {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-connection-row__group-toggle:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-group-divider {\n padding: 10px 12px 6px;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n /* No border-top here: the row immediately above already carries its own\n border-bottom (it is no longer :last-child once this divider follows\n it), so adding one here would double the separator line. */\n}\n\n.settings-connection-group-more[data-connection-drag-over="true"] {\n background: rgb(51 156 255 / 8%);\n}\n\n.settings-connection-group-hint {\n display: grid;\n gap: 3px;\n margin: 0 12px 12px;\n padding: 14px 16px;\n text-align: center;\n border: 1.5px dashed var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-connection-group-more[data-connection-drag-over="true"] .settings-connection-group-hint {\n border-color: var(--settings-focus);\n}\n\n.settings-connection-group-hint strong {\n color: var(--settings-text);\n font-size: 12.5px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-group-hint span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 17px;\n}\n\n.settings-connection-group-reset {\n display: flex;\n width: 100%;\n align-items: center;\n gap: 6px;\n padding: 10px 12px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n text-align: left;\n background: transparent;\n border: 0;\n border-top: 1px solid var(--settings-divider);\n cursor: pointer;\n}\n\n.settings-connection-group-reset:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-install-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n color: var(--settings-focus);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n opacity: 0;\n transition: opacity 120ms ease;\n}\n\n.settings-connection-row:hover .settings-connection-install-link,\n.settings-connection-install-link:focus-visible {\n opacity: 1;\n}\n\n.settings-connection-install-link:hover {\n color: var(--settings-focus);\n background: var(--settings-active);\n border-color: var(--settings-border);\n}\n\n.settings-connection-view-error {\n padding: 4px 7px;\n color: var(--settings-danger);\n font: inherit;\n font-size: 11px;\n line-height: 18px;\n background: transparent;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-connection-view-error:hover {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n\n.settings-connection-inspector {\n position: sticky;\n top: 18px;\n}\n\n.settings-connection-inspector__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n min-width: 0;\n gap: 10px;\n padding: 12px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-inspector__body {\n display: grid;\n min-width: 0;\n gap: 12px;\n padding: 12px;\n}\n\n.settings-connection-install-callout {\n display: grid;\n grid-template-columns: 28px minmax(0, 1fr);\n gap: 9px;\n padding: 11px;\n background: var(--settings-surface);\n border: 0;\n border-radius: 8px;\n}\n\n.settings-connection-install-callout__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: var(--settings-focus);\n background: var(--settings-active);\n border-radius: 7px;\n}\n\n.settings-connection-install-callout strong,\n.settings-connection-error-summary strong,\n.settings-connection-state-summary strong {\n display: block;\n margin: 0 0 4px;\n color: var(--settings-text);\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-install-callout p,\n.settings-connection-error-summary p,\n.settings-connection-state-summary p,\n.settings-connection-issue-note {\n margin: 0;\n color: var(--settings-muted);\n font-size: 11px;\n line-height: 16px;\n}\n\n.settings-connection-install-button {\n width: fit-content;\n}\n\n.settings-connection-error-summary {\n padding: 13px 14px;\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n border: 1px solid var(--settings-danger-border);\n border-radius: 10px;\n}\n\n.settings-connection-error-metadata {\n display: grid;\n gap: 7px;\n padding: 12px;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 9px;\n}\n\n.settings-connection-detail-line {\n display: grid;\n grid-template-columns: 92px minmax(0, 1fr);\n gap: 10px;\n min-width: 0;\n color: var(--settings-muted);\n font-size: 10px;\n line-height: 16px;\n}\n\n.settings-connection-detail-line code {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n white-space: pre-wrap;\n}\n\n.settings-connection-error-log-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n}\n\n.settings-connection-error-log-header strong {\n color: var(--settings-text);\n font-size: 11px;\n font-weight: 600;\n}\n\n.settings-connection-error-log-header .settings-command-button {\n min-height: 30px;\n padding: 5px 9px;\n font-size: 11px;\n}\n\n.settings-connection-stderr {\n max-height: 220px;\n min-width: 0;\n margin: 0;\n padding: 11px;\n overflow: auto;\n color: var(--settings-text);\n font:\n 10px/16px ui-monospace,\n "SFMono-Regular",\n Consolas,\n "Liberation Mono",\n monospace;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 9px;\n}\n\n.settings-connection-error-actions {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 8px;\n}\n\n.settings-connection-error-actions .settings-command-button {\n width: 100%;\n}\n\n.settings-connection-issue-note {\n margin-top: -4px;\n}\n\n.settings-connection-state-summary {\n padding: 14px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-empty {\n display: flex;\n align-items: center;\n min-height: 72px;\n padding: 12px 16px;\n}\n\n.settings-empty > div {\n display: grid;\n min-width: 0;\n gap: 2px;\n}\n\n.settings-empty strong {\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 500;\n line-height: 19px;\n}\n\n.settings-empty span {\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 19px;\n}\n\n.settings-about-panel {\n display: grid;\n max-width: 720px;\n gap: 18px;\n padding: 24px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.settings-about-product {\n color: var(--settings-text);\n font-size: 24px;\n font-weight: 700;\n line-height: 32px;\n}\n\n.settings-about-tagline {\n color: var(--settings-text);\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n.settings-about-copy {\n display: grid;\n max-width: 660px;\n gap: 12px;\n}\n\n.settings-about-copy p,\n.settings-about-repository p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 21px;\n}\n\n.settings-about-star-callout {\n margin: 2px 0;\n color: var(--settings-warning);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-about-repository {\n display: grid;\n gap: 10px;\n padding-top: 18px;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-about-repository-link {\n display: flex;\n align-items: center;\n width: fit-content;\n min-width: 0;\n max-width: 100%;\n gap: 8px;\n color: var(--settings-focus);\n font-size: 13px;\n font-weight: 600;\n text-decoration: none;\n}\n\n.settings-about-repository-link:hover {\n text-decoration: underline;\n}\n\n.settings-about-repository-link code {\n min-width: 0;\n overflow: hidden;\n color: var(--settings-muted);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 11px;\n font-weight: 400;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-page-error {\n padding: 16px;\n color: var(--settings-text);\n font-size: 13px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 20px;\n}\n\n.settings-update-metadata {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 24px;\n margin-bottom: 24px;\n padding: 0 4px 20px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-update-metadata__item {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-update-metadata__item span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-metadata__item strong {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 500;\n line-height: 22px;\n}\n\n/* The only emphasis on this screen: a latest version newer than the installed one. */\n.settings-update-metadata__value--newer {\n color: var(--settings-focus);\n}\n\n.settings-update-panel {\n display: grid;\n gap: 12px;\n padding: 20px;\n color: var(--settings-text);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-update-panel__head {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-update-panel__head .codexhost-settings-icon {\n color: var(--settings-muted);\n}\n\n.settings-update-panel[data-update-state="available"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="downloading"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="installing"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="restarting"] .codexhost-settings-icon {\n color: var(--settings-focus);\n}\n\n.settings-update-panel[data-update-state="current"] .codexhost-settings-icon {\n color: var(--settings-success);\n}\n\n.settings-update-panel[data-update-state="failed"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="error"] .codexhost-settings-icon {\n color: var(--settings-danger);\n}\n\n.settings-update-panel__title {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-update-summary,\n.settings-update-error {\n margin: 0;\n overflow-wrap: anywhere;\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-summary {\n color: var(--settings-muted);\n}\n\n.settings-update-error {\n color: var(--settings-danger);\n}\n\n.settings-update-progress {\n width: 100%;\n height: 8px;\n accent-color: var(--settings-focus);\n}\n\n.settings-update-progress-detail {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n/* Release notes scroll with the page; a scroller inside a scroller traps the wheel. */\n.settings-update-notes-section {\n min-width: 0;\n margin-top: 24px;\n padding-top: 24px;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-update-notes-section:empty {\n display: none;\n}\n\n.settings-update-notes {\n display: grid;\n min-width: 0;\n gap: 12px;\n color: var(--settings-muted);\n font-size: 14px;\n line-height: 22px;\n overflow-wrap: anywhere;\n}\n\n.settings-update-notes > :first-child {\n margin-top: 0;\n}\n\n.settings-update-notes > :last-child {\n margin-bottom: 0;\n}\n\n.settings-update-notes h1,\n.settings-update-notes h2,\n.settings-update-notes h3,\n.settings-update-notes h4,\n.settings-update-notes h5,\n.settings-update-notes h6 {\n margin: 6px 0 0;\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.settings-update-notes h1 {\n font-size: 18px;\n line-height: 26px;\n}\n\n.settings-update-notes h2 {\n font-size: 17px;\n line-height: 24px;\n}\n\n.settings-update-notes h3,\n.settings-update-notes h4,\n.settings-update-notes h5,\n.settings-update-notes h6 {\n font-size: 14px;\n line-height: 22px;\n}\n\n.settings-update-notes p,\n.settings-update-notes ul,\n.settings-update-notes ol,\n.settings-update-notes pre,\n.settings-update-notes blockquote {\n margin: 0;\n}\n\n.settings-update-notes ul,\n.settings-update-notes ol {\n padding-left: 24px;\n}\n\n.settings-update-notes li {\n padding-left: 4px;\n}\n\n.settings-update-notes li::marker {\n color: var(--settings-muted);\n font-size: 0.85em;\n}\n\n.settings-update-notes li + li {\n margin-top: 14px;\n}\n\n.settings-update-notes .release-note-translation {\n display: block;\n margin-top: 3px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-notes blockquote {\n padding: 8px 12px;\n color: var(--settings-muted);\n border-left: 3px solid var(--settings-focus);\n background: var(--settings-surface);\n}\n\n.settings-update-notes hr {\n width: 100%;\n margin: 2px 0;\n border: 0;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-update-notes strong {\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.settings-update-notes a {\n color: var(--settings-focus);\n text-decoration: none;\n}\n\n.settings-update-notes a:hover {\n text-decoration: underline;\n}\n\n.settings-update-notes code {\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n}\n\n.settings-update-notes :not(pre) > code {\n padding: 1px 5px;\n background: var(--settings-surface);\n border-radius: 4px;\n}\n\n.settings-update-notes pre {\n min-width: 0;\n max-width: 100%;\n padding: 10px 12px;\n overflow-x: auto;\n overflow-y: hidden;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n\n.settings-update-notes pre code {\n line-height: 18px;\n white-space: pre-wrap;\n}\n\n/* Manual update sits directly under the status panel, not behind a disclosure:\n automatic updates can fail for machine-local reasons and this is the way out. */\n.settings-update-controls {\n display: grid;\n min-width: 0;\n gap: 10px;\n margin-top: 24px;\n}\n\n.settings-update-manual-title {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-update-manual {\n display: grid;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-update-manual[hidden] {\n display: none;\n}\n\n.settings-update-manual-description {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-manual-description.is-fallback {\n color: var(--settings-danger);\n}\n\n.settings-update-command {\n display: flex;\n align-items: stretch;\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-update-command code {\n min-width: 0;\n flex: 1;\n padding: 9px 12px;\n overflow-x: auto;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n}\n\n.settings-update-command__copy {\n display: inline-flex;\n align-items: center;\n flex: none;\n gap: 6px;\n padding: 0 12px;\n color: var(--settings-muted);\n font-size: 12px;\n background: transparent;\n border: 0;\n border-left: 1px solid var(--settings-border);\n cursor: pointer;\n}\n\n.settings-update-command__copy:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-update-command__copy:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n.settings-update-actions {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.settings-command-button,\n.settings-update-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: max-content;\n max-width: 100%;\n min-height: 30px;\n gap: 6px;\n padding: 5px 10px;\n white-space: nowrap;\n color: var(--settings-primary-text);\n font: inherit;\n font-size: 12px;\n text-decoration: none;\n background: var(--settings-primary);\n border: 1px solid var(--settings-primary);\n border-radius: 7px;\n cursor: pointer;\n}\n\n.settings-command-button--secondary,\n.settings-update-link {\n color: var(--settings-text);\n background: var(--settings-panel);\n border-color: var(--settings-border);\n}\n\n.settings-command-button:hover:not(:disabled) {\n background: var(--settings-primary-hover);\n border-color: var(--settings-primary-hover);\n}\n\n.settings-command-button--secondary:hover:not(:disabled),\n.settings-update-link:hover {\n background: var(--settings-hover);\n border-color: var(--settings-border);\n}\n\n.settings-command-button--danger {\n color: #f87171;\n}\n\n.settings-command-button--danger:hover:not(:disabled) {\n color: #fecaca;\n background: rgb(127 29 29 / 24%);\n border-color: rgb(248 113 113 / 45%);\n}\n\n.settings-command-button:disabled {\n cursor: default;\n opacity: 0.45;\n}\n\n.settings-command-button:disabled,\n.settings-command-button[aria-disabled="true"] {\n opacity: 0.55;\n cursor: not-allowed;\n filter: none;\n}\n\n.settings-command-button:focus-visible,\n.settings-update-link:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.codexhost-settings-icon {\n display: block;\n flex: none;\n stroke: currentColor;\n}\n\n@media (max-width: 720px) {\n .codexhost-settings-dialog {\n width: calc(100vw - 16px);\n height: calc(100vh - 16px);\n border-radius: 10px;\n }\n\n .settings-layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n }\n\n .settings-session-import-row {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-session-import-row__action {\n align-items: flex-start;\n }\n\n .settings-sidebar {\n border-right: 0;\n border-bottom: 1px solid var(--settings-border);\n }\n\n .settings-header {\n height: 56px;\n padding-inline: 14px;\n }\n\n .settings-sidebar {\n padding-top: 20px;\n }\n\n .settings-nav {\n flex: none;\n flex-direction: row;\n gap: 4px;\n padding: 7px 8px 8px;\n overflow-x: auto;\n overflow-y: hidden;\n }\n\n .settings-nav-section-label {\n display: none;\n }\n\n .settings-nav-button {\n width: auto;\n min-width: max-content;\n min-height: 34px;\n grid-template-columns: 16px auto;\n border-radius: 10px;\n }\n\n .settings-nav-star-link {\n margin-top: 0;\n }\n\n .settings-page__content {\n width: calc(100% - 40px);\n }\n\n .settings-page__content {\n padding-top: 32px;\n padding-bottom: 32px;\n }\n\n .settings-section-label {\n padding-bottom: 20px;\n font-size: 20px;\n line-height: 26px;\n }\n\n .settings-update-metadata {\n grid-template-columns: minmax(0, 1fr);\n gap: 16px;\n }\n\n .settings-status-row {\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 16px;\n }\n\n .settings-account-header,\n .settings-connection-page-header {\n flex-direction: column;\n }\n\n .settings-account-header > .settings-command-button,\n .settings-connection-page-header > .settings-command-button {\n width: 100%;\n }\n\n .settings-connections-layout {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-connection-inspector {\n position: static;\n }\n\n .settings-status-row__detail {\n grid-column: 1 / -1;\n margin: -8px 0 0 58px;\n }\n}\n\n@media (forced-colors: active) {\n :host {\n --settings-bg: Canvas;\n --settings-sidebar: Canvas;\n --settings-panel: Canvas;\n --settings-surface: Canvas;\n --settings-surface-hover: Highlight;\n --settings-inset: Canvas;\n --settings-text: CanvasText;\n --settings-muted: GrayText;\n --settings-subtle: GrayText;\n --settings-border: ButtonBorder;\n --settings-divider: ButtonBorder;\n --settings-hover: Highlight;\n --settings-active: Highlight;\n --settings-focus: Highlight;\n --settings-primary: ButtonFace;\n --settings-primary-hover: Highlight;\n --settings-primary-text: ButtonText;\n --settings-warning: CanvasText;\n --settings-warning-bg: Canvas;\n --settings-warning-border: ButtonBorder;\n --settings-danger: CanvasText;\n --settings-danger-bg: Canvas;\n --settings-danger-border: ButtonBorder;\n --settings-success: CanvasText;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n scroll-behavior: auto !important;\n transition-duration: 0s !important;\n }\n}\n';
|
|
25899
|
+
var shell_default = ':host {\n --settings-bg: light-dark(#ffffff, #202020);\n --settings-sidebar: light-dark(#f7f7f8, #191919);\n --settings-panel: light-dark(#ffffff, #232323);\n --settings-surface: light-dark(#f6f6f6, #292929);\n --settings-surface-hover: light-dark(#eeeeee, #303030);\n --settings-inset: light-dark(#f3f3f3, #161616);\n --settings-text: light-dark(#0d0d0d, #ececec);\n --settings-muted: light-dark(#676767, #a3a3a3);\n --settings-subtle: light-dark(#8a8a8a, #777777);\n --settings-border: light-dark(rgb(13 13 13 / 9%), rgb(255 255 255 / 9%));\n --settings-divider: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 7%));\n --settings-hover: light-dark(rgb(13 13 13 / 5%), rgb(255 255 255 / 7%));\n --settings-active: light-dark(rgb(13 13 13 / 7%), rgb(255 255 255 / 9%));\n --settings-focus: light-dark(#0b75d1, #66aaf9);\n --settings-primary: light-dark(#171717, #f4f4f4);\n --settings-primary-hover: light-dark(#2f2f2f, #ffffff);\n --settings-primary-text: light-dark(#ffffff, #171717);\n --settings-warning: light-dark(#8a5500, #f5c96a);\n --settings-warning-bg: light-dark(#fff8e6, rgb(245 201 106 / 8%));\n --settings-warning-border: light-dark(#ead8a8, rgb(245 201 106 / 24%));\n --settings-danger: light-dark(#b42318, #f87171);\n --settings-danger-bg: light-dark(#fff1f0, rgb(239 68 68 / 8%));\n --settings-danger-border: light-dark(#f3c7c3, rgb(239 68 68 / 22%));\n --settings-success: light-dark(#16784a, #4ade80);\n color: var(--settings-text);\n color-scheme: inherit;\n font:\n 13px/1.5 system-ui,\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n sans-serif;\n letter-spacing: 0;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n letter-spacing: 0;\n}\n\nbutton,\ninput,\nselect {\n font: inherit;\n}\n\nbutton {\n color: inherit;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.settings-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n.codexhost-settings-dialog {\n width: min(1120px, calc(100vw - 32px));\n height: min(780px, calc(100vh - 32px));\n max-width: none;\n max-height: none;\n margin: auto;\n padding: 0;\n overflow: hidden;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 14px;\n box-shadow: light-dark(0 16px 42px rgb(0 0 0 / 16%), 0 20px 54px rgb(0 0 0 / 42%));\n}\n\n.codexhost-settings-dialog::backdrop {\n background: light-dark(rgb(0 0 0 / 24%), rgb(0 0 0 / 56%));\n backdrop-filter: blur(1px);\n}\n\n.settings-frame,\n.settings-layout {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n\n.settings-frame {\n display: flex;\n flex-direction: column;\n}\n\n.settings-layout {\n flex: 1;\n display: grid;\n grid-template-columns: 184px minmax(0, 1fr);\n background: var(--settings-bg);\n}\n\n.settings-sidebar {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex-direction: column;\n overflow: hidden;\n background: var(--settings-sidebar);\n border-right: 1px solid var(--settings-border);\n padding-top: 14px;\n}\n\n.settings-header {\n display: flex;\n align-items: center;\n min-width: 0;\n height: 48px;\n flex: none;\n padding: 0 12px;\n border-bottom: 1px solid var(--settings-border);\n}\n\n.settings-header-actions {\n display: flex;\n align-items: center;\n flex: none;\n gap: 12px;\n margin-left: auto;\n}\n\n.settings-brand {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 7px;\n}\n\n.settings-brand__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n flex: none;\n color: var(--settings-text);\n}\n\n.settings-brand__mark .codexhost-settings-icon {\n width: 24px;\n height: 24px;\n object-fit: contain;\n}\n\n.settings-brand__copy {\n display: flex;\n min-width: 0;\n align-items: baseline;\n gap: 0;\n line-height: 20px;\n}\n\n.settings-brand__name {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 600;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-brand__title {\n margin-left: 8px;\n padding-left: 8px;\n color: var(--settings-muted);\n font-size: 13px;\n font-weight: 400;\n border-left: 1px solid var(--settings-border);\n}\n\n.settings-nav {\n display: flex;\n min-width: 0;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n gap: 2px;\n padding: 0 7px 10px;\n overflow-y: auto;\n}\n\n.settings-nav-section-label {\n min-height: 24px;\n padding: 4px 9px 2px;\n color: var(--settings-subtle);\n font-size: 11px;\n font-weight: 600;\n line-height: 18px;\n}\n\n.settings-nav-section-label:not(:first-child) {\n margin-top: 8px;\n}\n\n.settings-nav-button {\n display: grid;\n grid-template-columns: 16px minmax(0, 1fr);\n align-items: center;\n width: 100%;\n position: relative;\n min-height: 34px;\n flex: none;\n gap: 9px;\n padding: 6px 9px;\n color: var(--settings-text);\n font-size: 13px;\n line-height: 20px;\n text-align: left;\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-nav-button .codexhost-settings-icon {\n width: 16px;\n height: 16px;\n opacity: 0.9;\n}\n\n.settings-nav-button:hover {\n background: var(--settings-hover);\n}\n\n.settings-nav-button[aria-current="page"] {\n background: var(--settings-active);\n color: var(--settings-text);\n font-weight: 500;\n}\n\n.settings-nav-button span {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-nav-star-link {\n margin-top: 0;\n color: var(--settings-text);\n text-decoration: none;\n}\n\n.settings-nav-star-link .codexhost-settings-icon {\n color: var(--settings-warning);\n}\n\n.settings-nav-star-link:hover {\n color: var(--settings-warning);\n background: var(--settings-warning-bg);\n}\n\n.settings-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n flex: none;\n padding: 0;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-icon-button:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-icon-button:focus-visible,\n.settings-nav-button:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-page {\n display: block;\n position: relative;\n min-width: 0;\n min-height: 0;\n overflow-y: auto;\n background: var(--settings-bg);\n scrollbar-gutter: stable;\n}\n\n.settings-page__content {\n width: min(930px, calc(100% - 80px));\n margin-inline: auto;\n}\n\n.settings-page__content {\n min-width: 0;\n padding: 28px 0 36px;\n}\n\n.settings-section-label {\n min-height: auto;\n margin: 0;\n padding: 0 0 18px;\n color: var(--settings-text);\n font-size: 18px;\n font-weight: 600;\n line-height: 26px;\n}\n\n.settings-status-list,\n.settings-empty {\n overflow: hidden;\n background: var(--settings-panel);\n}\n\n.settings-status-row {\n display: grid;\n grid-template-columns: minmax(170px, 1fr) auto minmax(280px, 1.45fr);\n position: relative;\n align-items: center;\n min-height: 72px;\n gap: 20px;\n padding: 12px 0;\n}\n\n.settings-status-row:not(:last-child)::after {\n content: "";\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 1px;\n background: var(--settings-divider);\n}\n\n.settings-status-row__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n color: var(--settings-text);\n gap: 10px;\n font-size: 14px;\n font-weight: 500;\n line-height: 22px;\n}\n\n.settings-status-row__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n flex: none;\n color: var(--settings-muted);\n background: var(--settings-surface);\n border-radius: 50%;\n}\n\n.settings-status-badge {\n flex: none;\n padding: 3px 8px;\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-status-row__detail {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-page-description {\n max-width: 760px;\n margin: -10px 0 20px;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-session-import-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 24px;\n}\n\n.settings-session-import-header .settings-section-label {\n min-width: 0;\n}\n\n.settings-session-import-harness {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 12px;\n margin: -12px 0 16px;\n color: var(--settings-muted);\n font-size: 13px;\n}\n\n.settings-session-import-harness > span {\n flex: none;\n}\n\n.settings-session-import-harness__options {\n display: flex;\n align-items: center;\n min-width: 0;\n flex: 1;\n gap: 6px;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n}\n\n.settings-session-import-harness__options::-webkit-scrollbar {\n display: none;\n}\n\n.settings-session-import-harness__option {\n min-height: 32px;\n flex: none;\n padding: 6px 10px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n white-space: nowrap;\n background: rgb(255 255 255 / 4%);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-session-import-harness__option[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n border-color: rgb(51 156 255 / 50%);\n}\n\n.settings-session-import-harness__option:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.settings-session-import-harness__option:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-harness + .settings-page-description {\n margin-top: 0;\n margin-bottom: 4px;\n}\n\n.settings-session-import-availability-note {\n margin-top: 0;\n}\n\n.settings-session-import-search,\n.settings-session-import-pagination {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 10px;\n margin: 16px 0;\n}\n\n.settings-session-import-search input {\n flex: 1;\n min-width: 160px;\n}\n\n.settings-session-import-search input,\n.settings-session-import-pagination select {\n min-height: 36px;\n padding: 6px 10px;\n color: var(--settings-text);\n background: var(--settings-bg);\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-session-import-search input:focus-visible,\n.settings-session-import-pagination select:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-pagination {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.settings-session-import-pagination label {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.settings-session-import-pagination > span {\n flex: 1;\n min-width: 130px;\n}\n\n.settings-session-import-pagination__navigation {\n display: flex;\n gap: 8px;\n margin-left: auto;\n}\n\n.settings-session-import-content,\n.settings-session-import-list {\n display: grid;\n gap: 10px;\n}\n\n.settings-session-import-status {\n display: flex;\n align-items: center;\n min-height: 64px;\n gap: 12px;\n padding: 16px;\n color: var(--settings-muted);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-status.is-error {\n color: #ef4444;\n}\n\n.settings-session-import-recovery {\n display: grid;\n justify-items: start;\n gap: 14px;\n padding: 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-recovery:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-session-import-recovery__copy {\n display: grid;\n gap: 4px;\n}\n\n.settings-session-import-recovery__copy strong {\n color: var(--settings-text);\n font-size: 14px;\n}\n\n.settings-session-import-recovery__copy p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-session-import-recovery__path {\n display: flex;\n align-items: stretch;\n width: 100%;\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-session-import-recovery__path code {\n min-width: 0;\n flex: 1;\n padding: 8px 10px;\n overflow-x: auto;\n color: var(--settings-text);\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n}\n\n.settings-session-import-recovery__path .settings-command-button {\n min-height: 0;\n flex: none;\n border-width: 0 0 0 1px;\n border-radius: 0;\n}\n\n.settings-session-import-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: 20px;\n min-width: 0;\n padding: 16px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-session-import-row__copy {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-session-import-row__copy strong {\n overflow: hidden;\n color: var(--settings-text);\n font-size: 14px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-session-import-row__copy span,\n.settings-session-import-row__cwd {\n overflow: hidden;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-session-import-row__cwd {\n display: block;\n min-width: 0;\n background: transparent;\n}\n\n.settings-session-import-row__action {\n display: flex;\n align-items: flex-end;\n flex-direction: column;\n gap: 8px;\n}\n\n.settings-session-import-running {\n color: var(--settings-muted);\n font-size: 12px;\n}\n\n.settings-preference-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 32px;\n min-height: 88px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-divider);\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-preference-row__copy {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n gap: 5px;\n}\n\n.settings-preference-row__copy strong {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-preference-row__copy span {\n max-width: 680px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-preference-switch {\n display: inline-flex;\n align-items: center;\n width: 42px;\n height: 24px;\n flex: none;\n padding: 2px;\n border: 0;\n border-radius: 999px;\n background: var(--settings-surface-hover);\n cursor: pointer;\n transition: background 120ms ease;\n}\n\n.settings-preference-switch[aria-checked="true"] {\n justify-content: flex-end;\n background: var(--settings-focus);\n}\n\n.settings-preference-switch:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-preference-switch__thumb {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: var(--settings-primary-text);\n box-shadow: 0 1px 3px rgb(0 0 0 / 24%);\n}\n\n.settings-preference-checkbox {\n width: 18px;\n height: 18px;\n flex: none;\n margin: 0;\n accent-color: var(--settings-focus);\n cursor: pointer;\n}\n\n.settings-preference-checkbox:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.settings-connection-page-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 18px;\n margin-bottom: 18px;\n}\n\n.settings-connection-page-header .settings-section-label {\n padding-bottom: 0;\n}\n\n.settings-connection-page-header .settings-page-description {\n margin: 5px 0 0;\n}\n\n.settings-connections-content,\n.settings-connections-layout,\n.settings-connection-list,\n.settings-connection-rows {\n min-width: 0;\n}\n\n.settings-connections-layout {\n display: grid;\n grid-template-columns: minmax(0, 1.55fr) minmax(280px, 0.85fr);\n align-items: start;\n gap: 18px;\n}\n\n.settings-connection-list,\n.settings-connection-inspector {\n overflow: hidden;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-connection-host-strip {\n display: grid;\n grid-template-columns: 30px minmax(0, 1fr) 30px;\n align-items: center;\n min-width: 0;\n gap: 5px;\n padding: 9px 10px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-host-scroll {\n display: none;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 34px;\n padding: 0;\n color: var(--settings-muted);\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n cursor: pointer;\n}\n\n.settings-connection-host-strip[data-connection-host-overflow="true"]\n .settings-connection-host-scroll {\n display: inline-flex;\n}\n\n.settings-connection-host-strip:not([data-connection-host-overflow="true"]) {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.settings-connection-host-scroll:hover:not(:disabled) {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-host-scroll:disabled {\n cursor: default;\n opacity: 0.35;\n}\n\n.settings-connection-host-scroll:focus-visible,\n.settings-connection-host-tab:focus-visible,\n.settings-connection-row:focus-visible,\n.settings-connection-install-link:focus-visible,\n.settings-connection-view-error:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 1px;\n}\n\n.settings-connection-host-tabs {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 6px;\n overflow-x: auto;\n overflow-y: hidden;\n overscroll-behavior-x: contain;\n scrollbar-width: none;\n scroll-behavior: smooth;\n scroll-snap-type: x proximity;\n touch-action: pan-x;\n}\n\n.settings-connection-host-tabs::-webkit-scrollbar {\n display: none;\n}\n\n.settings-connection-host-tab {\n display: inline-flex;\n align-items: center;\n height: 30px;\n min-width: max-content;\n flex: none;\n padding: 0 9px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n line-height: 18px;\n white-space: nowrap;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n cursor: pointer;\n scroll-snap-align: start;\n}\n\n.settings-connection-host-tab:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-host-tab[aria-selected="true"] {\n color: var(--settings-text);\n font-weight: 600;\n background: var(--settings-active);\n border-color: var(--settings-border);\n}\n\n.settings-connection-table-header,\n.settings-connection-row {\n display: grid;\n grid-template-columns: minmax(160px, 1fr) minmax(92px, auto) 108px;\n align-items: center;\n min-width: 0;\n gap: 10px;\n}\n\n.settings-connection-table-header {\n min-height: 30px;\n padding: 0 10px;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n background: transparent;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-row {\n min-height: 52px;\n padding: 8px 10px;\n cursor: pointer;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-row:last-child {\n border-bottom: 0;\n}\n\n.settings-connection-row:hover {\n background: var(--settings-hover);\n}\n\n.settings-connection-row[data-connection-selected="true"] {\n background: var(--settings-surface);\n}\n\n.settings-connection-row__identity,\n.settings-connection-inspector__identity {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n color: var(--settings-text);\n}\n\n.settings-connection-row__identity strong,\n.settings-connection-inspector__identity strong {\n min-width: 0;\n overflow-wrap: anywhere;\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-row__mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n flex: none;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 700;\n background: var(--settings-surface);\n border-radius: 6px;\n}\n\n.settings-connection-row__mark--logo {\n color: var(--settings-text);\n background: transparent;\n}\n\n.settings-connection-row__mark--logo > img,\n.settings-connection-row__mark--logo > svg {\n display: block;\n max-width: 18px;\n max-height: 18px;\n}\n\n.settings-connection-row__status {\n display: inline-flex;\n align-items: center;\n width: fit-content;\n gap: 5px;\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-row__status::before {\n width: 6px;\n height: 6px;\n flex: none;\n content: "";\n background: currentColor;\n border-radius: 50%;\n}\n\n.settings-connection-row__status[data-connection-tone="ready"] {\n color: var(--settings-success);\n}\n\n.settings-connection-row__status[data-connection-tone="checking"] {\n color: var(--settings-warning);\n}\n\n.settings-connection-row__status[data-connection-tone="setup"] {\n color: var(--settings-muted);\n}\n\n.settings-connection-row__status[data-connection-tone="setup"]::before {\n background: transparent;\n border: 1.5px solid currentColor;\n}\n\n.settings-connection-row__status[data-connection-tone="failed"] {\n color: var(--settings-danger);\n}\n\n.settings-connection-row__action {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-connection-row__handle {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 16px;\n color: var(--settings-muted);\n cursor: grab;\n opacity: 0.6;\n}\n\n.settings-connection-row__handle:hover {\n opacity: 1;\n}\n\n.settings-connection-row[draggable="true"] {\n cursor: grab;\n}\n\n.settings-connection-row[data-connection-dragging="true"] {\n opacity: 0.4;\n}\n\n.settings-connection-row[data-connection-drop-indicator="before"] {\n box-shadow: inset 0 2px 0 0 var(--settings-focus);\n}\n\n.settings-connection-row[data-connection-drop-indicator="after"] {\n box-shadow: inset 0 -2px 0 0 var(--settings-focus);\n}\n\n.settings-connection-row__group-toggle {\n display: inline-flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-connection-row__group-toggle:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-group-divider {\n padding: 10px 12px 6px;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 600;\n line-height: 16px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n /* No border-top here: the row immediately above already carries its own\n border-bottom (it is no longer :last-child once this divider follows\n it), so adding one here would double the separator line. */\n}\n\n.settings-connection-group-more[data-connection-drag-over="true"] {\n background: rgb(51 156 255 / 8%);\n}\n\n.settings-connection-group-hint {\n display: grid;\n gap: 3px;\n margin: 0 12px 12px;\n padding: 14px 16px;\n text-align: center;\n border: 1.5px dashed var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-connection-group-more[data-connection-drag-over="true"] .settings-connection-group-hint {\n border-color: var(--settings-focus);\n}\n\n.settings-connection-group-hint strong {\n color: var(--settings-text);\n font-size: 12.5px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-group-hint span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 17px;\n}\n\n.settings-connection-group-reset {\n display: flex;\n width: 100%;\n align-items: center;\n gap: 6px;\n padding: 10px 12px;\n color: var(--settings-muted);\n font: inherit;\n font-size: 12px;\n text-align: left;\n background: transparent;\n border: 0;\n border-top: 1px solid var(--settings-divider);\n cursor: pointer;\n}\n\n.settings-connection-group-reset:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-connection-install-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n color: var(--settings-focus);\n text-decoration: none;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n opacity: 0;\n transition: opacity 120ms ease;\n}\n\n.settings-connection-row:hover .settings-connection-install-link,\n.settings-connection-install-link:focus-visible {\n opacity: 1;\n}\n\n.settings-connection-install-link:hover {\n color: var(--settings-focus);\n background: var(--settings-active);\n border-color: var(--settings-border);\n}\n\n.settings-connection-view-error {\n padding: 4px 7px;\n color: var(--settings-danger);\n font: inherit;\n font-size: 11px;\n line-height: 18px;\n background: transparent;\n border: 0;\n border-radius: 6px;\n cursor: pointer;\n}\n\n.settings-connection-view-error:hover {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n\n.settings-connection-inspector {\n position: sticky;\n top: 18px;\n}\n\n.settings-connection-inspector__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n min-width: 0;\n gap: 10px;\n padding: 12px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-connection-inspector__body {\n display: grid;\n min-width: 0;\n gap: 12px;\n padding: 12px;\n}\n\n.settings-connection-install-callout {\n display: grid;\n grid-template-columns: 28px minmax(0, 1fr);\n gap: 9px;\n padding: 11px;\n background: var(--settings-surface);\n border: 0;\n border-radius: 8px;\n}\n\n.settings-connection-install-callout__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n color: var(--settings-focus);\n background: var(--settings-active);\n border-radius: 7px;\n}\n\n.settings-connection-install-callout strong,\n.settings-connection-error-summary strong,\n.settings-connection-state-summary strong {\n display: block;\n margin: 0 0 4px;\n color: var(--settings-text);\n font-size: 12px;\n font-weight: 500;\n line-height: 18px;\n}\n\n.settings-connection-install-callout p,\n.settings-connection-error-summary p,\n.settings-connection-state-summary p,\n.settings-connection-issue-note {\n margin: 0;\n color: var(--settings-muted);\n font-size: 11px;\n line-height: 16px;\n}\n\n.settings-connection-install-button {\n width: fit-content;\n}\n\n.settings-connection-error-summary {\n padding: 13px 14px;\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n border: 1px solid var(--settings-danger-border);\n border-radius: 10px;\n}\n\n.settings-connection-error-metadata {\n display: grid;\n gap: 7px;\n padding: 12px;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 9px;\n}\n\n.settings-connection-detail-line {\n display: grid;\n grid-template-columns: 92px minmax(0, 1fr);\n gap: 10px;\n min-width: 0;\n color: var(--settings-muted);\n font-size: 10px;\n line-height: 16px;\n}\n\n.settings-connection-detail-line code {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n white-space: pre-wrap;\n}\n\n.settings-connection-error-log-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n}\n\n.settings-connection-error-log-header strong {\n color: var(--settings-text);\n font-size: 11px;\n font-weight: 600;\n}\n\n.settings-connection-error-log-header .settings-command-button {\n min-height: 30px;\n padding: 5px 9px;\n font-size: 11px;\n}\n\n.settings-connection-stderr {\n max-height: 220px;\n min-width: 0;\n margin: 0;\n padding: 11px;\n overflow: auto;\n color: var(--settings-text);\n font:\n 10px/16px ui-monospace,\n "SFMono-Regular",\n Consolas,\n "Liberation Mono",\n monospace;\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n background: var(--settings-inset);\n border: 1px solid var(--settings-border);\n border-radius: 9px;\n}\n\n.settings-connection-error-actions {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: 8px;\n}\n\n.settings-connection-error-actions .settings-command-button {\n width: 100%;\n}\n\n.settings-connection-issue-note {\n margin-top: -4px;\n}\n\n.settings-connection-state-summary {\n padding: 14px;\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 10px;\n}\n\n.settings-empty {\n display: flex;\n align-items: center;\n min-height: 72px;\n padding: 12px 16px;\n}\n\n.settings-empty > div {\n display: grid;\n min-width: 0;\n gap: 2px;\n}\n\n.settings-empty strong {\n color: var(--settings-text);\n font-size: 13px;\n font-weight: 500;\n line-height: 19px;\n}\n\n.settings-empty span {\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 19px;\n}\n\n.settings-about-panel {\n display: grid;\n max-width: 720px;\n gap: 18px;\n padding: 24px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n}\n\n.settings-about-product {\n color: var(--settings-text);\n font-size: 24px;\n font-weight: 700;\n line-height: 32px;\n}\n\n.settings-about-tagline {\n color: var(--settings-text);\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n}\n\n.settings-about-copy {\n display: grid;\n max-width: 660px;\n gap: 12px;\n}\n\n.settings-about-copy p,\n.settings-about-repository p {\n margin: 0;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 21px;\n}\n\n.settings-about-star-callout {\n margin: 2px 0;\n color: var(--settings-warning);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-about-repository {\n display: grid;\n gap: 10px;\n padding-top: 18px;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-about-repository-link {\n display: flex;\n align-items: center;\n width: fit-content;\n min-width: 0;\n max-width: 100%;\n gap: 8px;\n color: var(--settings-focus);\n font-size: 13px;\n font-weight: 600;\n text-decoration: none;\n}\n\n.settings-about-repository-link:hover {\n text-decoration: underline;\n}\n\n.settings-about-repository-link code {\n min-width: 0;\n overflow: hidden;\n color: var(--settings-muted);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 11px;\n font-weight: 400;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-page-error {\n padding: 16px;\n color: var(--settings-text);\n font-size: 13px;\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 20px;\n}\n\n.settings-update-metadata {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 24px;\n margin-bottom: 24px;\n padding: 0 4px 20px;\n border-bottom: 1px solid var(--settings-divider);\n}\n\n.settings-update-metadata__item {\n display: grid;\n min-width: 0;\n gap: 4px;\n}\n\n.settings-update-metadata__item span {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-metadata__item strong {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 500;\n line-height: 22px;\n}\n\n/* The only emphasis on this screen: a latest version newer than the installed one. */\n.settings-update-metadata__value--newer {\n color: var(--settings-focus);\n}\n\n.settings-update-panel {\n display: grid;\n gap: 12px;\n padding: 20px;\n color: var(--settings-text);\n background: var(--settings-panel);\n border: 1px solid var(--settings-border);\n border-radius: 8px;\n}\n\n.settings-update-panel__head {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-update-panel__head .codexhost-settings-icon {\n color: var(--settings-muted);\n}\n\n.settings-update-panel[data-update-state="available"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="downloading"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="installing"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="restarting"] .codexhost-settings-icon {\n color: var(--settings-focus);\n}\n\n.settings-update-panel[data-update-state="current"] .codexhost-settings-icon {\n color: var(--settings-success);\n}\n\n.settings-update-panel[data-update-state="failed"] .codexhost-settings-icon,\n.settings-update-panel[data-update-state="error"] .codexhost-settings-icon {\n color: var(--settings-danger);\n}\n\n.settings-update-panel__title {\n min-width: 0;\n overflow-wrap: anywhere;\n color: var(--settings-text);\n font-size: 14px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-update-summary,\n.settings-update-error {\n margin: 0;\n overflow-wrap: anywhere;\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-summary {\n color: var(--settings-muted);\n}\n\n.settings-update-error {\n color: var(--settings-danger);\n}\n\n.settings-update-progress {\n width: 100%;\n height: 8px;\n accent-color: var(--settings-focus);\n}\n\n.settings-update-progress-detail {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n/* Release notes scroll with the page; a scroller inside a scroller traps the wheel. */\n.settings-update-notes-section {\n min-width: 0;\n margin-top: 24px;\n padding-top: 24px;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-update-notes-section:empty {\n display: none;\n}\n\n.settings-update-notes {\n display: grid;\n min-width: 0;\n gap: 12px;\n color: var(--settings-muted);\n font-size: 14px;\n line-height: 22px;\n overflow-wrap: anywhere;\n}\n\n.settings-update-notes > :first-child {\n margin-top: 0;\n}\n\n.settings-update-notes > :last-child {\n margin-bottom: 0;\n}\n\n.settings-update-notes h1,\n.settings-update-notes h2,\n.settings-update-notes h3,\n.settings-update-notes h4,\n.settings-update-notes h5,\n.settings-update-notes h6 {\n margin: 6px 0 0;\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.settings-update-notes h1 {\n font-size: 18px;\n line-height: 26px;\n}\n\n.settings-update-notes h2 {\n font-size: 17px;\n line-height: 24px;\n}\n\n.settings-update-notes h3,\n.settings-update-notes h4,\n.settings-update-notes h5,\n.settings-update-notes h6 {\n font-size: 14px;\n line-height: 22px;\n}\n\n.settings-update-notes p,\n.settings-update-notes ul,\n.settings-update-notes ol,\n.settings-update-notes pre,\n.settings-update-notes blockquote {\n margin: 0;\n}\n\n.settings-update-notes ul,\n.settings-update-notes ol {\n padding-left: 24px;\n}\n\n.settings-update-notes li {\n padding-left: 4px;\n}\n\n.settings-update-notes li::marker {\n color: var(--settings-muted);\n font-size: 0.85em;\n}\n\n.settings-update-notes li + li {\n margin-top: 14px;\n}\n\n.settings-update-notes .release-note-translation {\n display: block;\n margin-top: 3px;\n color: var(--settings-muted);\n font-size: 13px;\n line-height: 20px;\n}\n\n.settings-update-notes blockquote {\n padding: 8px 12px;\n color: var(--settings-muted);\n border-left: 3px solid var(--settings-focus);\n background: var(--settings-surface);\n}\n\n.settings-update-notes hr {\n width: 100%;\n margin: 2px 0;\n border: 0;\n border-top: 1px solid var(--settings-divider);\n}\n\n.settings-update-notes strong {\n color: var(--settings-text);\n font-weight: 600;\n}\n\n.settings-update-notes a {\n color: var(--settings-focus);\n text-decoration: none;\n}\n\n.settings-update-notes a:hover {\n text-decoration: underline;\n}\n\n.settings-update-notes code {\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n}\n\n.settings-update-notes :not(pre) > code {\n padding: 1px 5px;\n background: var(--settings-surface);\n border-radius: 4px;\n}\n\n.settings-update-notes pre {\n min-width: 0;\n max-width: 100%;\n padding: 10px 12px;\n overflow-x: auto;\n overflow-y: hidden;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n\n.settings-update-notes pre code {\n line-height: 18px;\n white-space: pre-wrap;\n}\n\n/* Manual update sits directly under the status panel, not behind a disclosure:\n automatic updates can fail for machine-local reasons and this is the way out. */\n.settings-update-controls {\n display: grid;\n min-width: 0;\n gap: 10px;\n margin-top: 24px;\n}\n\n.settings-update-manual-title {\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n line-height: 22px;\n}\n\n.settings-update-manual {\n display: grid;\n min-width: 0;\n gap: 8px;\n}\n\n.settings-update-manual[hidden] {\n display: none;\n}\n\n.settings-update-manual-description {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 18px;\n}\n\n.settings-update-manual-description.is-fallback {\n color: var(--settings-danger);\n}\n\n.settings-update-command {\n display: flex;\n align-items: stretch;\n min-width: 0;\n overflow: hidden;\n border: 1px solid var(--settings-border);\n border-radius: 6px;\n}\n\n.settings-update-command code {\n min-width: 0;\n flex: 1;\n padding: 9px 12px;\n overflow-x: auto;\n color: var(--settings-text);\n font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;\n font-size: 12px;\n line-height: 20px;\n white-space: nowrap;\n}\n\n.settings-update-command__copy {\n display: inline-flex;\n align-items: center;\n flex: none;\n gap: 6px;\n padding: 0 12px;\n color: var(--settings-muted);\n font-size: 12px;\n background: transparent;\n border: 0;\n border-left: 1px solid var(--settings-border);\n cursor: pointer;\n}\n\n.settings-update-command__copy:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n\n.settings-update-command__copy:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n.settings-update-actions {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 12px;\n flex-wrap: wrap;\n}\n\n.settings-command-button,\n.settings-update-link {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: max-content;\n max-width: 100%;\n min-height: 30px;\n gap: 6px;\n padding: 5px 10px;\n white-space: nowrap;\n color: var(--settings-primary-text);\n font: inherit;\n font-size: 12px;\n text-decoration: none;\n background: var(--settings-primary);\n border: 1px solid var(--settings-primary);\n border-radius: 7px;\n cursor: pointer;\n}\n\n.settings-command-button--secondary,\n.settings-update-link {\n color: var(--settings-text);\n background: var(--settings-panel);\n border-color: var(--settings-border);\n}\n\n.settings-command-button:hover:not(:disabled) {\n background: var(--settings-primary-hover);\n border-color: var(--settings-primary-hover);\n}\n\n.settings-command-button--secondary:hover:not(:disabled),\n.settings-update-link:hover {\n background: var(--settings-hover);\n border-color: var(--settings-border);\n}\n\n.settings-command-button--danger {\n color: #f87171;\n}\n\n.settings-command-button--danger:hover:not(:disabled) {\n color: #fecaca;\n background: rgb(127 29 29 / 24%);\n border-color: rgb(248 113 113 / 45%);\n}\n\n.settings-command-button:disabled {\n cursor: default;\n opacity: 0.45;\n}\n\n.settings-command-button:disabled,\n.settings-command-button[aria-disabled="true"] {\n opacity: 0.55;\n cursor: not-allowed;\n filter: none;\n}\n\n.settings-command-button:focus-visible,\n.settings-update-link:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: 2px;\n}\n\n.codexhost-settings-icon {\n display: block;\n flex: none;\n stroke: currentColor;\n}\n\n@media (max-width: 720px) {\n .codexhost-settings-dialog {\n width: calc(100vw - 16px);\n height: calc(100vh - 16px);\n border-radius: 10px;\n }\n\n .settings-layout {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n }\n\n .settings-session-import-row {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-session-import-row__action {\n align-items: flex-start;\n }\n\n .settings-sidebar {\n border-right: 0;\n border-bottom: 1px solid var(--settings-border);\n }\n\n .settings-header {\n height: 56px;\n padding-inline: 14px;\n }\n\n .settings-sidebar {\n padding-top: 20px;\n }\n\n .settings-nav {\n flex: none;\n flex-direction: row;\n gap: 4px;\n padding: 7px 8px 8px;\n overflow-x: auto;\n overflow-y: hidden;\n }\n\n .settings-nav-section-label {\n display: none;\n }\n\n .settings-nav-button {\n width: auto;\n min-width: max-content;\n min-height: 34px;\n grid-template-columns: 16px auto;\n border-radius: 10px;\n }\n\n .settings-nav-star-link {\n margin-top: 0;\n }\n\n .settings-page__content {\n width: calc(100% - 40px);\n }\n\n .settings-page__content {\n padding-top: 32px;\n padding-bottom: 32px;\n }\n\n .settings-section-label {\n padding-bottom: 20px;\n font-size: 20px;\n line-height: 26px;\n }\n\n .settings-update-metadata {\n grid-template-columns: minmax(0, 1fr);\n gap: 16px;\n }\n\n .settings-status-row {\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 16px;\n }\n\n .settings-account-header,\n .settings-connection-page-header {\n flex-direction: column;\n }\n\n .settings-account-header > .settings-command-button,\n .settings-connection-page-header > .settings-command-button {\n width: 100%;\n }\n\n .settings-connections-layout {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .settings-connection-inspector {\n position: static;\n }\n\n .settings-status-row__detail {\n grid-column: 1 / -1;\n margin: -8px 0 0 58px;\n }\n}\n\n@media (forced-colors: active) {\n :host {\n --settings-bg: Canvas;\n --settings-sidebar: Canvas;\n --settings-panel: Canvas;\n --settings-surface: Canvas;\n --settings-surface-hover: Highlight;\n --settings-inset: Canvas;\n --settings-text: CanvasText;\n --settings-muted: GrayText;\n --settings-subtle: GrayText;\n --settings-border: ButtonBorder;\n --settings-divider: ButtonBorder;\n --settings-hover: Highlight;\n --settings-active: Highlight;\n --settings-focus: Highlight;\n --settings-primary: ButtonFace;\n --settings-primary-hover: Highlight;\n --settings-primary-text: ButtonText;\n --settings-warning: CanvasText;\n --settings-warning-bg: Canvas;\n --settings-warning-border: ButtonBorder;\n --settings-danger: CanvasText;\n --settings-danger-bg: Canvas;\n --settings-danger-border: ButtonBorder;\n --settings-success: CanvasText;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n scroll-behavior: auto !important;\n transition-duration: 0s !important;\n }\n}\n';
|
|
25507
25900
|
|
|
25508
25901
|
// src/settings/accounts.css
|
|
25509
|
-
var accounts_default = '.settings-harness-accounts {\n margin-top: 32px;\n}\n\n.settings-harness-accounts__title {\n margin: 0 0 16px;\n font-size: 14px;\n font-weight: 500;\n}\n\n.settings-harness-account__identity {\n min-width: 0;\n}\n\n.settings-harness-account__identity > .settings-account-email {\n display: block;\n max-width: 24ch;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.settings-harness-account__logo {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n flex: none;\n}\n\n.settings-harness-account {\n display: grid;\n grid-template-columns: minmax(180px, 1fr) minmax(0, 2fr);\n align-items: center;\n gap: 24px;\n padding: 24px;\n}\n\n.settings-harness-account + .settings-harness-account {\n border-top: 1px solid var(--settings-border);\n}\n\n.settings-harness-account > div {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n@media (max-width: 700px) {\n .settings-harness-account {\n grid-template-columns: minmax(0, 1fr);\n padding: 16px;\n }\n}\n\n.settings-account-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 20px;\n}\n\n.settings-account-eyebrow {\n margin: 0 0 8px;\n color: var(--settings-muted);\n font-size: 11px;\n letter-spacing: 0.13em;\n}\n\n.settings-account-header > :first-child {\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.settings-account-header > .settings-command-button {\n flex: none;\n white-space: nowrap;\n margin-top: 20px;\n min-height: 36px;\n padding: 8px 12px;\n border-radius: 7px;\n}\n\n.settings-account-header .settings-section-label {\n margin: 0;\n padding: 0;\n font-size: 27px;\n line-height: 1.4;\n font-weight: 650;\n letter-spacing: -0.035em;\n}\n.settings-account-header .settings-page-description {\n margin: 8px 0 0;\n font-size: 13px;\n}\n\n.settings-account-status {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n}\n.settings-account-status:empty {\n display: none;\n}\n\n.settings-account-help-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n margin-top: 20px;\n flex-wrap: wrap;\n}\n.settings-account-task-hint {\n display: flex;\n align-items: flex-start;\n gap: 9px;\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n flex: 1 1 280px;\n}\n.settings-account-task-hint svg {\n flex: none;\n margin-top: 1px;\n}\n.settings-account-help-button {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n padding: 8px 12px;\n color: var(--settings-muted);\n font-size: 12px;\n background: transparent;\n border: 0;\n border-radius: 7px;\n cursor: pointer;\n}\n.settings-account-help-button:hover {\n color: var(--settings-text);\n background: var(--settings-hover);\n}\n.settings-account-device-code-note {\n margin: 12px 0 0;\n font-size: 12px;\n padding: 10px 12px;\n color: var(--settings-warning);\n background: var(--settings-warning-bg);\n border: 1px solid var(--settings-warning-border);\n border-radius: 8px;\n}\n\n.settings-account-toolbar {\n margin-top: 27px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-border);\n display: flex;\n align-items: center;\n gap: 14px;\n flex-wrap: wrap;\n}\n.settings-account-count {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n white-space: nowrap;\n}\n.settings-account-count > :last-child {\n color: var(--settings-muted);\n font-variant-numeric: tabular-nums;\n}\n.settings-account-search {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--settings-muted);\n margin-right: auto;\n min-width: 0;\n max-width: 100%;\n}\n.settings-account-search svg {\n flex: none;\n}\n.settings-account-toolbar input {\n min-width: 80px;\n width: 150px;\n max-width: 100%;\n padding: 5px 0;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n font-size: 13px;\n}\n.settings-account-toolbar input::placeholder {\n color: var(--settings-muted);\n}\n.settings-account-display-controls {\n display: flex;\n padding: 3px;\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n background: var(--settings-inset);\n}\n.settings-account-display-controls button {\n padding: 4px 10px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n}\n.settings-account-display-controls button:hover {\n color: var(--settings-text);\n}\n.settings-account-display-controls button[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n}\n\n.settings-account-list {\n --account-border: light-dark(#e2e2e8, #36363b);\n --account-muted: light-dark(#676773, #a5a5af);\n border: 1px solid var(--account-border);\n border-radius: 11px;\n overflow: hidden;\n container-type: inline-size;\n}\n.settings-account-table {\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n font-size: 12px;\n}\n.settings-account-table th {\n padding: 13px 20px;\n color: var(--account-muted);\n background: light-dark(#f8f8fa, #202024);\n font-size: 11px;\n font-weight: 500;\n text-align: left;\n}\n.settings-account-table th:nth-child(1) {\n width: 32%;\n}\n.settings-account-table th:nth-child(2) {\n width: 38%;\n}\n.settings-account-table th:nth-child(3) {\n width: 12%;\n}\n.settings-account-table th:nth-child(4) {\n width: 18%;\n text-align: right;\n}\n.settings-account-table td {\n padding: 19px 20px;\n vertical-align: middle;\n border-top: 1px solid var(--settings-divider);\n}\n.settings-account-row {\n background: light-dark(#ffffff, #232326);\n}\n.settings-account-row:hover {\n background: light-dark(#f7f7fa, #26262a);\n}\n.settings-account-row__person {\n display: grid;\n grid-template-columns: 34px minmax(0, 1fr);\n align-items: center;\n gap: 11px;\n min-width: 0;\n}\n.settings-account-row__mark {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n color: light-dark(#67558d, #c3baff);\n background: light-dark(#f0ecf7, #353044);\n border: 1px solid light-dark(#d9d0e6, #4d435f);\n border-radius: 10px;\n}\n.settings-account-row__identity {\n min-width: 0;\n}\n.settings-account-title {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n}\n.settings-account-email {\n min-width: 0;\n overflow: hidden;\n font-size: 13px;\n font-weight: 550;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-metadata {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 7px;\n margin-top: 4px;\n color: var(--settings-muted);\n}\n.settings-account-domain {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-plan-separator {\n flex: none;\n}\n.settings-account-plan {\n flex: none;\n padding: 1px 6px;\n color: var(--settings-muted);\n border: 1px solid var(--settings-border);\n border-radius: 5px;\n font-size: 11px;\n white-space: nowrap;\n}\n.settings-account-plan--highlighted {\n color: light-dark(#654f91, #c8bfff);\n background: light-dark(#f2edf9, #a99bff18);\n border-color: light-dark(#d9ccea, #a99bff52);\n font-weight: 600;\n}\n.settings-account-active {\n flex: none;\n padding: 2px 7px;\n color: light-dark(#66548e, #bdb4ff);\n background: light-dark(#f4f0fb, #aca0ff12);\n border: 1px solid light-dark(#dfd5f1, #aca0ff24);\n border-radius: 5px;\n font-size: 11px;\n white-space: nowrap;\n}\n\n.settings-account-usage {\n display: grid;\n gap: 14px;\n max-width: 380px;\n}\n.settings-account-usage__meter {\n display: grid;\n grid-template-columns: 48px minmax(36px, 1fr) 96px;\n align-items: center;\n gap: 3px 10px;\n}\n:host([lang="zh-CN"]) .settings-account-usage__meter {\n grid-template-columns: 48px minmax(36px, 1fr) 72px;\n}\n\n.settings-account-usage__title {\n color: light-dark(#5d5d68, #c3c3cd);\n font-size: 12px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-usage__percent {\n display: flex;\n align-items: baseline;\n justify-content: flex-end;\n gap: 4px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.settings-account-usage__value-label {\n color: var(--settings-muted);\n font-size: 11px;\n font-weight: 400;\n}\n.settings-account-usage__percent--warn {\n color: var(--settings-warning);\n}\n.settings-account-usage__percent--hot {\n color: var(--settings-danger);\n}\n.settings-account-usage__bar {\n height: 4px;\n overflow: hidden;\n background: light-dark(#e3e1e8, #3c3c43);\n border-radius: 4px;\n}\n.settings-account-usage__bar > span {\n display: block;\n height: 100%;\n background: light-dark(#81769e, #9993b8);\n border-radius: inherit;\n}\n.settings-account-usage__bar--warn > span {\n background: var(--settings-warning);\n}\n.settings-account-usage__bar--hot > span {\n background: var(--settings-danger);\n}\n.settings-account-usage__sub {\n grid-column: 2 / -1;\n color: var(--account-muted);\n font-size: 11px;\n font-variant-numeric: tabular-nums;\n overflow-wrap: anywhere;\n}\n.settings-account-usage__message,\n.settings-account-unknown {\n color: var(--settings-muted);\n}\n.settings-account-usage > button {\n justify-self: start;\n}\n.settings-account-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n.settings-account-action {\n padding: 8px 10px;\n min-height: 36px;\n font-size: 12px;\n color: var(--settings-text);\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n white-space: nowrap;\n cursor: pointer;\n}\n.settings-account-action:hover {\n background: var(--settings-hover);\n}\n.settings-account-action:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n.settings-account-actions .settings-account-delete {\n color: var(--settings-muted);\n}\n.settings-account-actions .settings-account-delete:hover,\n.settings-account-actions .settings-account-delete:focus-visible {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n.settings-account-mobile-label {\n display: none;\n}\n.settings-account-reset-summary {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-height: 32px;\n padding: 3px 0;\n font-size: 12px;\n white-space: nowrap;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n}\n.settings-account-reset-summary:hover {\n background: var(--settings-hover);\n}\n.settings-account-reset-summary[aria-expanded="true"] > svg:last-child {\n transform: rotate(90deg);\n}\n.settings-account-details-row > td {\n background: var(--settings-inset);\n}\n.settings-account-reset-details {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n}\n.settings-account-reset-details strong {\n font-size: 12px;\n}\n.settings-account-reset-expiry {\n margin: 6px 0;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-expiry.is-warn {\n color: var(--settings-warning);\n}\n.settings-account-reset-expiry.is-hot {\n color: var(--settings-danger);\n}\n.settings-account-reset-list {\n margin: 8px 0 0;\n padding: 0;\n list-style: none;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-list li + li {\n margin-top: 4px;\n}\n.settings-account-empty {\n text-align: center;\n color: var(--settings-muted);\n}\n.settings-account-verification {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n color: var(--settings-muted);\n}\n.settings-account-verification a {\n color: var(--settings-focus);\n overflow-wrap: anywhere;\n}\n.settings-account-verification code {\n padding: 5px 8px;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n letter-spacing: 0.08em;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n.settings-account-list :focus-visible,\n.settings-account-toolbar :focus-visible,\n.settings-account-help-button:focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n@container (min-width: 611px) and (max-width: 800px) {\n .settings-account-table th,\n .settings-account-table td {\n padding-left: 12px;\n padding-right: 12px;\n }\n .settings-account-table th:nth-child(1) {\n width: 30%;\n }\n .settings-account-table th:nth-child(2) {\n width: 37%;\n }\n .settings-account-table th:nth-child(4) {\n width: 21%;\n }\n}\n\n@container (max-width: 610px) {\n .settings-account-table,\n .settings-account-table tbody {\n display: block;\n }\n .settings-account-table thead {\n display: none;\n }\n .settings-account-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n padding: 16px;\n gap: 12px;\n border-bottom: 1px solid var(--settings-divider);\n }\n .settings-account-table .settings-account-row > td {\n padding: 0;\n border: 0;\n }\n .settings-account-row > td:nth-child(1),\n .settings-account-row > td:nth-child(2) {\n grid-column: 1 / -1;\n }\n .settings-account-row > td:nth-child(3) {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n .settings-account-mobile-label {\n display: inline;\n color: var(--settings-muted);\n font-size: 11px;\n }\n .settings-account-usage {\n max-width: none;\n }\n .settings-account-table tr:not(.settings-account-row),\n .settings-account-table tr:not(.settings-account-row) > td {\n display: block;\n }\n}\n\n@media (forced-colors: active) {\n .settings-account-usage__bar {\n border: 1px solid CanvasText;\n }\n .settings-account-usage__bar > span {\n background: Highlight;\n }\n}\n';
|
|
25902
|
+
var accounts_default = '.settings-harness-account__logo {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n}\n\n.settings-account-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 20px;\n}\n\n.settings-account-header > :first-child {\n min-width: 0;\n flex: 1 1 auto;\n}\n\n.settings-account-header > .settings-command-button {\n flex: none;\n white-space: nowrap;\n margin-top: 0;\n min-height: 36px;\n padding: 8px 12px;\n border-radius: 7px;\n}\n\n.settings-account-header .settings-section-label {\n margin: 0;\n padding: 0;\n font-size: 27px;\n line-height: 1.4;\n font-weight: 650;\n letter-spacing: -0.035em;\n}\n.settings-account-header .settings-page-description {\n margin: 8px 0 0;\n font-size: 13px;\n}\n\n.settings-account-status {\n margin: 0;\n color: var(--settings-muted);\n font-size: 12px;\n}\n.settings-account-status:empty {\n display: none;\n}\n\n.settings-account-toolbar {\n margin-top: 27px;\n padding: 18px 0;\n border-top: 1px solid var(--settings-border);\n display: flex;\n align-items: center;\n gap: 14px;\n flex-wrap: wrap;\n}\n.settings-account-count {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n white-space: nowrap;\n}\n.settings-account-count > :last-child {\n color: var(--settings-muted);\n font-variant-numeric: tabular-nums;\n}\n.settings-account-search {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--settings-muted);\n margin-right: auto;\n min-width: 0;\n max-width: 100%;\n}\n.settings-account-search svg {\n flex: none;\n}\n.settings-account-toolbar input {\n min-width: 80px;\n width: 210px;\n max-width: 100%;\n padding: 5px 0;\n color: var(--settings-text);\n background: transparent;\n border: 0;\n font-size: 13px;\n}\n.settings-account-toolbar input::placeholder {\n color: var(--settings-muted);\n}\n.settings-account-display-controls {\n display: flex;\n padding: 3px;\n border: 1px solid var(--settings-border);\n border-radius: 7px;\n background: var(--settings-inset);\n}\n.settings-account-display-controls button {\n padding: 4px 10px;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n}\n.settings-account-display-controls button:hover {\n color: var(--settings-text);\n}\n.settings-account-display-controls button[aria-pressed="true"] {\n color: var(--settings-text);\n background: var(--settings-active);\n}\n\n.settings-account-list {\n --account-border: light-dark(#e2e2e8, #36363b);\n --account-muted: light-dark(#676773, #a5a5af);\n border: 1px solid var(--account-border);\n border-radius: 11px;\n overflow: hidden;\n container-type: inline-size;\n}\n.settings-account-table {\n width: 100%;\n table-layout: fixed;\n border-collapse: collapse;\n font-size: 12px;\n}\n.settings-account-table th {\n padding: 12px 16px;\n color: var(--account-muted);\n background: light-dark(#f8f8fa, #202024);\n font-size: 11px;\n font-weight: 500;\n text-align: left;\n}\n.settings-account-table th:nth-child(1) {\n width: 32%;\n}\n.settings-account-table th:nth-child(2),\n.settings-account-table th:nth-child(3) {\n width: 24%;\n}\n.settings-account-table th:nth-child(4) {\n width: 20%;\n text-align: right;\n}\n.settings-account-table td {\n padding: 17px 16px;\n vertical-align: middle;\n border-top: 1px solid var(--settings-divider);\n}\n.settings-account-row {\n background: light-dark(#ffffff, #232326);\n}\n.settings-account-row:hover {\n background: light-dark(#f7f7fa, #26262a);\n}\n.settings-account-row__person {\n display: grid;\n grid-template-columns: 34px minmax(0, 1fr);\n align-items: center;\n gap: 11px;\n min-width: 0;\n}\n.settings-account-row__mark {\n display: grid;\n place-items: center;\n width: 34px;\n height: 34px;\n color: light-dark(#67558d, #c3baff);\n background: light-dark(#f0ecf7, #353044);\n border: 1px solid light-dark(#d9d0e6, #4d435f);\n border-radius: 10px;\n}\n.settings-account-row__identity {\n min-width: 0;\n}\n.settings-account-email {\n display: block;\n min-width: 0;\n overflow: hidden;\n font-size: 12px;\n font-weight: 550;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-metadata {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 5px;\n margin-top: 4px;\n color: var(--settings-muted);\n flex-wrap: wrap;\n font-size: 11px;\n overflow-wrap: anywhere;\n}\n.settings-account-plan {\n flex: none;\n padding: 0 4px;\n color: var(--settings-muted);\n border: 1px solid var(--settings-border);\n border-radius: 5px;\n font-size: 10px;\n max-width: 100%;\n overflow-wrap: anywhere;\n}\n.settings-account-plan--highlighted {\n color: light-dark(#654f91, #c8bfff);\n background: light-dark(#f2edf9, #a99bff18);\n border-color: light-dark(#d9ccea, #a99bff52);\n font-weight: 600;\n}\n.settings-account-active {\n flex: none;\n color: light-dark(#66548e, #c8bfff);\n font-size: 10px;\n white-space: nowrap;\n}\n\n.settings-account-usage {\n display: grid;\n gap: 10px;\n}\n.settings-account-usage__meter {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n grid-template-rows: 20px 4px 17px;\n align-items: center;\n gap: 6px 0;\n min-width: 0;\n font-variant-numeric: tabular-nums;\n}\n.settings-account-usage__title {\n display: none;\n min-width: 0;\n color: var(--settings-muted);\n font-size: 11px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.settings-account-extra-usage {\n display: grid;\n gap: 12px;\n margin-top: 14px;\n}\n.settings-account-extra-usage .settings-account-usage__meter {\n grid-template-rows: auto 20px 4px 17px;\n}\n.settings-account-extra-usage .settings-account-usage__title {\n display: block;\n grid-column: 1 / -1;\n white-space: normal;\n overflow-wrap: anywhere;\n}\n.settings-account-usage__percent {\n grid-column: 1 / -1;\n min-width: 0;\n display: flex;\n align-items: baseline;\n justify-content: flex-end;\n gap: 7px;\n font-size: 14px;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n}\n.settings-account-usage__countdown {\n min-width: 0;\n color: var(--settings-muted);\n font-size: 10px;\n font-weight: 400;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.settings-account-usage__percent > :last-child {\n flex: none;\n}\n.settings-account-usage__percent--warn {\n color: var(--settings-warning);\n}\n.settings-account-usage__percent--hot {\n color: var(--settings-danger);\n}\n.settings-account-usage__bar {\n grid-column: 1 / -1;\n height: 4px;\n overflow: hidden;\n background: light-dark(#e3e1e8, #3c3c43);\n border-radius: 4px;\n}\n.settings-account-usage__bar > span {\n display: block;\n height: 100%;\n background: light-dark(#81769e, #9993b8);\n border-radius: inherit;\n}\n.settings-account-usage__bar--warn > span {\n background: var(--settings-warning);\n}\n.settings-account-usage__bar--hot > span {\n background: var(--settings-danger);\n}\n.settings-account-usage__sub {\n grid-column: 1 / -1;\n color: var(--account-muted);\n font-size: 10px;\n font-variant-numeric: tabular-nums;\n text-align: right;\n white-space: nowrap;\n}\n.settings-account-usage__message {\n color: var(--settings-muted);\n}\n.settings-account-usage__missing {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-content: center;\n gap: 6px;\n min-height: 53px;\n color: var(--settings-muted);\n}\n.settings-account-usage__missing > span:not(.settings-account-usage__title) {\n grid-column: 1 / -1;\n font-size: 14px;\n}\n.settings-account-management {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 4px;\n}\n.settings-account-native {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 3px;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-native .settings-icon-button {\n width: 25px;\n height: 28px;\n}\n.settings-account-usage > button {\n justify-self: start;\n}\n.settings-account-actions {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n.settings-account-action {\n padding: 4px 5px;\n min-height: 30px;\n font-size: 12px;\n color: var(--settings-text);\n background: transparent;\n border: 1px solid transparent;\n border-radius: 7px;\n white-space: nowrap;\n cursor: pointer;\n}\n.settings-account-action:hover {\n background: var(--settings-hover);\n}\n.settings-account-action:disabled {\n opacity: 0.45;\n cursor: not-allowed;\n}\n.settings-account-delete {\n color: var(--settings-danger);\n}\n.settings-account-delete:hover,\n.settings-account-delete:focus-visible {\n color: var(--settings-danger);\n background: var(--settings-danger-bg);\n}\n.settings-account-reset-summary {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n min-height: 24px;\n padding: 3px 0;\n font-size: 10px;\n white-space: nowrap;\n color: var(--settings-muted);\n background: transparent;\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n}\n.settings-account-reset-summary:hover {\n background: var(--settings-hover);\n}\n.settings-account-reset-summary[aria-expanded="true"] > svg:last-child {\n transform: rotate(90deg);\n}\n.settings-account-details-row > td {\n background: var(--settings-inset);\n}\n.settings-account-reset-details {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n flex-wrap: wrap;\n}\n.settings-account-reset-details strong {\n font-size: 12px;\n}\n.settings-account-reset-expiry {\n margin: 6px 0;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-expiry.is-warn {\n color: var(--settings-warning);\n}\n.settings-account-reset-expiry.is-hot {\n color: var(--settings-danger);\n}\n.settings-account-reset-list {\n margin: 8px 0 0;\n padding: 0;\n list-style: none;\n color: var(--settings-muted);\n font-size: 11px;\n}\n.settings-account-reset-list li + li {\n margin-top: 4px;\n}\n.settings-account-empty {\n text-align: center;\n color: var(--settings-muted);\n}\n.settings-account-verification {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n color: var(--settings-muted);\n}\n.settings-account-verification a {\n color: var(--settings-focus);\n overflow-wrap: anywhere;\n}\n.settings-account-verification code {\n padding: 5px 8px;\n color: var(--settings-text);\n font-size: 15px;\n font-weight: 600;\n letter-spacing: 0.08em;\n background: var(--settings-inset);\n border-radius: 6px;\n}\n.settings-account-list :focus-visible,\n.settings-account-toolbar :focus-visible {\n outline: 2px solid var(--settings-focus);\n outline-offset: -2px;\n}\n\n.settings-account-dialog {\n position: fixed;\n width: min(360px, calc(100vw - 40px));\n max-height: calc(100vh - 40px);\n overflow: auto;\n padding: 22px;\n color: var(--settings-text);\n background: var(--settings-surface);\n border: 1px solid var(--settings-border);\n border-radius: 12px;\n text-align: left;\n}\n.settings-account-dialog::backdrop {\n background: #0005;\n}\n.settings-account-dialog h2 {\n margin: 0 28px 12px 0;\n font-size: 15px;\n}\n.settings-account-dialog p {\n color: var(--settings-muted);\n font-size: 12px;\n line-height: 1.6;\n overflow-wrap: anywhere;\n}\n.settings-account-dialog__close {\n position: absolute;\n top: 12px;\n right: 12px;\n}\n.settings-account-dialog__actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n flex-wrap: wrap;\n}\n\n@container (max-width: 680px) {\n .settings-account-table,\n .settings-account-table tbody {\n display: block;\n }\n .settings-account-table thead {\n display: none;\n }\n .settings-account-row {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n padding: 18px;\n gap: 18px 22px;\n border-top: 1px solid var(--settings-divider);\n }\n .settings-account-row:first-child {\n border-top: 0;\n }\n .settings-account-table .settings-account-row > td {\n display: block;\n min-width: 0;\n padding: 0;\n border: 0;\n }\n .settings-account-person-cell,\n .settings-account-management-cell,\n .settings-account-usage-cell--message {\n grid-column: 1 / -1;\n }\n .settings-account-table .settings-account-management-cell {\n border-top: 1px solid var(--settings-divider);\n padding-top: 8px;\n }\n .settings-account-email {\n font-size: 13px;\n }\n .settings-account-usage__title {\n display: block;\n grid-column: 1;\n }\n .settings-account-usage__percent,\n .settings-account-usage__missing > span:not(.settings-account-usage__title) {\n grid-column: 2;\n text-align: right;\n }\n .settings-account-extra-usage .settings-account-usage__percent {\n grid-column: 1 / -1;\n }\n .settings-account-management {\n flex-direction: row;\n justify-content: space-between;\n }\n .settings-account-actions {\n order: 1;\n margin-left: auto;\n }\n .settings-account-native {\n justify-content: flex-start;\n }\n .settings-account-table tr:not(.settings-account-row, [hidden]),\n .settings-account-table tr:not(.settings-account-row, [hidden]) > td {\n display: block;\n }\n}\n\n@container (max-width: 360px) {\n .settings-account-row {\n grid-template-columns: minmax(0, 1fr);\n gap: 16px;\n padding: 16px;\n }\n}\n\n@media (forced-colors: active) {\n .settings-account-usage__bar {\n border: 1px solid CanvasText;\n }\n .settings-account-usage__bar > span {\n background: Highlight;\n }\n}\n';
|
|
25510
25903
|
|
|
25511
25904
|
// src/settings/shell.ts
|
|
25512
25905
|
var SETTINGS_SHELL_ATTRIBUTE = "data-codexhost-settings-shell";
|
|
@@ -26138,7 +26531,9 @@ ${accounts_default}`;
|
|
|
26138
26531
|
grok: harnessIdSchema.parse("grok"),
|
|
26139
26532
|
omp: harnessIdSchema.parse("omp"),
|
|
26140
26533
|
antigravity: harnessIdSchema.parse("antigravity"),
|
|
26141
|
-
"kiro-cli": harnessIdSchema.parse("kiro-cli")
|
|
26534
|
+
"kiro-cli": harnessIdSchema.parse("kiro-cli"),
|
|
26535
|
+
codebuddy: harnessIdSchema.parse("codebuddy"),
|
|
26536
|
+
"cursor-cli": harnessIdSchema.parse("cursor-cli")
|
|
26142
26537
|
};
|
|
26143
26538
|
var externalAgents = [
|
|
26144
26539
|
"pi",
|
|
@@ -26148,7 +26543,9 @@ ${accounts_default}`;
|
|
|
26148
26543
|
"grok",
|
|
26149
26544
|
"omp",
|
|
26150
26545
|
"antigravity",
|
|
26151
|
-
"kiro-cli"
|
|
26546
|
+
"kiro-cli",
|
|
26547
|
+
"codebuddy",
|
|
26548
|
+
"cursor-cli"
|
|
26152
26549
|
];
|
|
26153
26550
|
function isRetryableHarnessAvailability(availability, error51) {
|
|
26154
26551
|
return availability !== void 0 && availability !== "ready" && availability !== "notInstalled" && error51?.retryable === true;
|
|
@@ -26318,16 +26715,16 @@ ${accounts_default}`;
|
|
|
26318
26715
|
...permissionModeId ? { permissionModeId } : {}
|
|
26319
26716
|
};
|
|
26320
26717
|
}
|
|
26321
|
-
if (inspection.harnessId === "kiro-cli") {
|
|
26718
|
+
if (inspection.harnessId === "kiro-cli" || inspection.harnessId === "codebuddy" || inspection.harnessId === "cursor-cli") {
|
|
26322
26719
|
const route = decodeHarnessPluginRoute(inspection.transportModelId);
|
|
26323
|
-
if (!route || route.harnessId !==
|
|
26324
|
-
throw new Error("
|
|
26720
|
+
if (!route || route.harnessId !== inspection.harnessId) {
|
|
26721
|
+
throw new Error("Plugin Thread reported an incompatible transport Model");
|
|
26325
26722
|
}
|
|
26326
26723
|
const model = inspection.effectiveModel ?? route.model;
|
|
26327
|
-
const thinkingOptionId = inspection.availableThinkingOptions !== void 0 ? selectableThinkingOptionId(inspection) : inspection.effectiveThinkingOptionId ?? route.thinkingOptionId;
|
|
26724
|
+
const thinkingOptionId = inspection.harnessId === "cursor-cli" ? void 0 : inspection.availableThinkingOptions !== void 0 ? selectableThinkingOptionId(inspection) : inspection.effectiveThinkingOptionId ?? route.thinkingOptionId;
|
|
26328
26725
|
const permissionModeId = inspection.effectivePermissionModeId ?? route.permissionModeId;
|
|
26329
26726
|
return {
|
|
26330
|
-
agent:
|
|
26727
|
+
agent: inspection.harnessId,
|
|
26331
26728
|
...model ? { model } : {},
|
|
26332
26729
|
...thinkingOptionId ? { thinkingOptionId } : {},
|
|
26333
26730
|
...permissionModeId ? { permissionModeId } : {}
|
|
@@ -26406,6 +26803,7 @@ ${accounts_default}`;
|
|
|
26406
26803
|
const mountedByComposer = /* @__PURE__ */ new Map();
|
|
26407
26804
|
const pendingReplacements = /* @__PURE__ */ new Map();
|
|
26408
26805
|
let disposed = false;
|
|
26806
|
+
const disposeReasoningSoftWrap = installReasoningTranscriptSoftWrap(document);
|
|
26409
26807
|
let scanScheduled = false;
|
|
26410
26808
|
let refreshTargetsOnNextScan = false;
|
|
26411
26809
|
let adapterDispose = null;
|
|
@@ -26476,7 +26874,9 @@ ${accounts_default}`;
|
|
|
26476
26874
|
grok: void 0,
|
|
26477
26875
|
omp: void 0,
|
|
26478
26876
|
antigravity: void 0,
|
|
26479
|
-
"kiro-cli": void 0
|
|
26877
|
+
"kiro-cli": void 0,
|
|
26878
|
+
codebuddy: void 0,
|
|
26879
|
+
"cursor-cli": void 0
|
|
26480
26880
|
},
|
|
26481
26881
|
webUi: Object.fromEntries(
|
|
26482
26882
|
externalAgents.map((agent) => [agent, false])
|
|
@@ -28225,6 +28625,7 @@ ${accounts_default}`;
|
|
|
28225
28625
|
applyAdapterAgent = null;
|
|
28226
28626
|
modelControl = null;
|
|
28227
28627
|
mutationObserver.disconnect();
|
|
28628
|
+
disposeReasoningSoftWrap();
|
|
28228
28629
|
sidebarAgentIcons.dispose();
|
|
28229
28630
|
settingsLifecycle.dispose();
|
|
28230
28631
|
document.removeEventListener("beforeinput", onBeforeInput, true);
|
|
@@ -28307,6 +28708,7 @@ lucide/dist/esm/icons/circle-off.mjs:
|
|
|
28307
28708
|
lucide/dist/esm/icons/copy.mjs:
|
|
28308
28709
|
lucide/dist/esm/icons/download.mjs:
|
|
28309
28710
|
lucide/dist/esm/icons/external-link.mjs:
|
|
28711
|
+
lucide/dist/esm/icons/ellipsis.mjs:
|
|
28310
28712
|
lucide/dist/esm/icons/folder-input.mjs:
|
|
28311
28713
|
lucide/dist/esm/icons/grip-vertical.mjs:
|
|
28312
28714
|
lucide/dist/esm/icons/info.mjs:
|