codebay 0.3.0 → 0.4.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.
Files changed (53) hide show
  1. package/.mochi/manifest.json +297 -269
  2. package/.mochi/svelte-client/HydratableIsland-79z9xq4b.js +1 -0
  3. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-f5rzyjm8.js +2 -0
  4. package/.mochi/svelte-client/{_hydrate-AvatarsView_257s9yq1wwr4f-3w16y9jh.js → _hydrate-AvatarsView_257s9yq1wwr4f-fxyd5qx4.js} +2 -2
  5. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-nv31ptdp.js +1 -0
  6. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-r9vvc7rx.js +28 -0
  7. package/.mochi/svelte-client/chunk-6eexkr6p.js +2 -0
  8. package/.mochi/svelte-client/chunk-7znwaf7t.js +2 -0
  9. package/.mochi/svelte-client/chunk-dz1019cy.js +1 -0
  10. package/.mochi/svelte-client/{chunk-qxwt25hn.js → chunk-nmf4dq86.js} +1 -1
  11. package/.mochi/svelte-client/{chunk-0jtmkpx4.js → chunk-ssa0ad2f.js} +2 -2
  12. package/.mochi/svelte-client/chunk-zmmb1c4b.js +2 -0
  13. package/.mochi/svelte-compile/{App-f0q5n4rk.server.js → App-9qjy14bc.server.js} +38 -23
  14. package/.mochi/svelte-compile/{Avatars-p8gfef7x.server.js → Avatars-sq8mjn6k.server.js} +2 -2
  15. package/.mochi/svelte-compile/{Instance-atjwsczx.server.js → Instance-13j59daw.server.js} +2 -2
  16. package/.mochi/svelte-compile/{Settings-q88xw6h8.server.js → Settings-p0s2awg1.server.js} +404 -103
  17. package/.mochi/svelte-compile/{chunk-9bjk7yx6.js → chunk-6ghzacpg.js} +1 -1
  18. package/.mochi/svelte-compile/{chunk-4kwy539a.js → chunk-bacb4b0r.js} +1 -1
  19. package/.mochi/svelte-compile/{chunk-sxqys3nw.js → chunk-dfe2km6a.js} +5 -2
  20. package/.mochi/svelte-compile/{chunk-v6796ga4.js → chunk-fpe16ywq.js} +28 -6
  21. package/.mochi/svelte-css/Brand-1bh2b800g5vrn.css +1 -0
  22. package/.mochi/svelte-css/SettingsView-3uycxa8z548m4.css +1 -0
  23. package/README.md +4 -0
  24. package/package.json +8 -8
  25. package/src/avatars/index.ts +5 -0
  26. package/src/components/AppBar.svelte +8 -1
  27. package/src/components/AppShell.svelte +17 -3
  28. package/src/components/Brand.svelte +15 -4
  29. package/src/components/DashboardView.svelte +5 -2
  30. package/src/components/IdeBar.svelte +9 -1
  31. package/src/components/InstanceCard.svelte +7 -3
  32. package/src/components/InstanceView.svelte +4 -1
  33. package/src/components/SettingsCog.svelte +9 -1
  34. package/src/components/SettingsView.svelte +476 -18
  35. package/src/components/TopBar.svelte +4 -1
  36. package/src/container-injections/claude-code-models.ts +74 -0
  37. package/src/container-injections/git-identity.ts +30 -3
  38. package/src/lib/injections.server.ts +3 -0
  39. package/src/lib/instances.server.ts +10 -1
  40. package/src/lib/popup-nav.ts +37 -0
  41. package/src/pages/App.svelte +10 -3
  42. package/src/pages/Settings.svelte +31 -0
  43. package/src/routes.ts +88 -2
  44. package/.mochi/svelte-client/HydratableIsland-wrq79y0w.js +0 -1
  45. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-faqf4hmc.js +0 -2
  46. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-5g8meb6a.js +0 -1
  47. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-jsw4edxb.js +0 -23
  48. package/.mochi/svelte-client/chunk-04qv4w6w.js +0 -2
  49. package/.mochi/svelte-client/chunk-597d17x0.js +0 -1
  50. package/.mochi/svelte-client/chunk-5p31aqh0.js +0 -2
  51. package/.mochi/svelte-client/chunk-gjjhya9m.js +0 -2
  52. package/.mochi/svelte-css/Brand-1la7zw5uhcbl4.css +0 -1
  53. package/.mochi/svelte-css/SettingsView-1nfdwnm16cpp2.css +0 -1
@@ -5,31 +5,33 @@ import {
5
5
  setSoundEnabled,
6
6
  soundEnabled,
7
7
  unlockAudio
8
- } from "./chunk-9bjk7yx6.js";
8
+ } from "./chunk-6ghzacpg.js";
9
9
  import {
10
10
  X
11
- } from "./chunk-4kwy539a.js";
11
+ } from "./chunk-bacb4b0r.js";
12
12
  import {
13
13
  AppBar,
14
14
  Avatar,
15
15
  Button,
16
- Toaster
17
- } from "./chunk-sxqys3nw.js";
16
+ Toaster,
17
+ avatars,
18
+ findAvatar
19
+ } from "./chunk-dfe2km6a.js";
18
20
  import {
19
21
  HydratableBoundary,
20
22
  Icon,
21
23
  cookies,
22
24
  emitIslandProps
23
- } from "./chunk-v6796ga4.js";
25
+ } from "./chunk-fpe16ywq.js";
24
26
  import"./chunk-we0ggtws.js";
25
27
 
26
28
  // src/pages/Settings.svelte
27
29
  import"svelte/internal/flags/async";
28
- import * as $18 from "svelte/internal/server";
30
+ import * as $21 from "svelte/internal/server";
29
31
 
30
32
  // src/components/SettingsView.svelte
31
33
  import"svelte/internal/flags/async";
32
- import * as $17 from "svelte/internal/server";
34
+ import * as $20 from "svelte/internal/server";
33
35
 
34
36
  // node_modules/@lucide/svelte/dist/icons/container.svelte
35
37
  import"svelte/internal/flags/async";
@@ -92,9 +94,27 @@ function Volume_2($$renderer, $$props) {
92
94
  ];
93
95
  Icon($$renderer, $4.spread_props([{ name: "volume-2" }, props, { iconNode }]));
94
96
  }
95
- // node_modules/@lucide/svelte/dist/icons/sun-moon.svelte
97
+ // node_modules/@lucide/svelte/dist/icons/paw-print.svelte
96
98
  import"svelte/internal/flags/async";
97
99
  import * as $5 from "svelte/internal/server";
100
+ function Paw_print($$renderer, $$props) {
101
+ let { $$slots, $$events, ...props } = $$props;
102
+ const iconNode = [
103
+ ["circle", { cx: "11", cy: "4", r: "2" }],
104
+ ["circle", { cx: "18", cy: "8", r: "2" }],
105
+ ["circle", { cx: "20", cy: "16", r: "2" }],
106
+ [
107
+ "path",
108
+ {
109
+ d: "M9 10a5 5 0 0 1 5 5v3.5a3.5 3.5 0 0 1-6.84 1.045Q6.52 17.48 4.46 16.84A3.5 3.5 0 0 1 5.5 10Z"
110
+ }
111
+ ]
112
+ ];
113
+ Icon($$renderer, $5.spread_props([{ name: "paw-print" }, props, { iconNode }]));
114
+ }
115
+ // node_modules/@lucide/svelte/dist/icons/sun-moon.svelte
116
+ import"svelte/internal/flags/async";
117
+ import * as $6 from "svelte/internal/server";
98
118
  function Sun_moon($$renderer, $$props) {
99
119
  let { $$slots, $$events, ...props } = $$props;
100
120
  const iconNode = [
@@ -109,15 +129,15 @@ function Sun_moon($$renderer, $$props) {
109
129
  ["path", { d: "m19 5-1.256 1.256" }],
110
130
  ["path", { d: "M20 12h2" }]
111
131
  ];
112
- Icon($$renderer, $5.spread_props([{ name: "sun-moon" }, props, { iconNode }]));
132
+ Icon($$renderer, $6.spread_props([{ name: "sun-moon" }, props, { iconNode }]));
113
133
  }
114
134
  // src/components/ThemePicker.svelte
115
135
  import"svelte/internal/flags/async";
116
- import * as $9 from "svelte/internal/server";
136
+ import * as $10 from "svelte/internal/server";
117
137
 
118
138
  // node_modules/@lucide/svelte/dist/icons/sun.svelte
119
139
  import"svelte/internal/flags/async";
120
- import * as $6 from "svelte/internal/server";
140
+ import * as $7 from "svelte/internal/server";
121
141
  function Sun($$renderer, $$props) {
122
142
  let { $$slots, $$events, ...props } = $$props;
123
143
  const iconNode = [
@@ -131,11 +151,11 @@ function Sun($$renderer, $$props) {
131
151
  ["path", { d: "m6.34 17.66-1.41 1.41" }],
132
152
  ["path", { d: "m19.07 4.93-1.41 1.41" }]
133
153
  ];
134
- Icon($$renderer, $6.spread_props([{ name: "sun" }, props, { iconNode }]));
154
+ Icon($$renderer, $7.spread_props([{ name: "sun" }, props, { iconNode }]));
135
155
  }
136
156
  // node_modules/@lucide/svelte/dist/icons/moon.svelte
137
157
  import"svelte/internal/flags/async";
138
- import * as $7 from "svelte/internal/server";
158
+ import * as $8 from "svelte/internal/server";
139
159
  function Moon($$renderer, $$props) {
140
160
  let { $$slots, $$events, ...props } = $$props;
141
161
  const iconNode = [
@@ -146,11 +166,11 @@ function Moon($$renderer, $$props) {
146
166
  }
147
167
  ]
148
168
  ];
149
- Icon($$renderer, $7.spread_props([{ name: "moon" }, props, { iconNode }]));
169
+ Icon($$renderer, $8.spread_props([{ name: "moon" }, props, { iconNode }]));
150
170
  }
151
171
  // node_modules/@lucide/svelte/dist/icons/monitor.svelte
152
172
  import"svelte/internal/flags/async";
153
- import * as $8 from "svelte/internal/server";
173
+ import * as $9 from "svelte/internal/server";
154
174
  function Monitor($$renderer, $$props) {
155
175
  let { $$slots, $$events, ...props } = $$props;
156
176
  const iconNode = [
@@ -161,7 +181,7 @@ function Monitor($$renderer, $$props) {
161
181
  ["line", { x1: "8", x2: "16", y1: "21", y2: "21" }],
162
182
  ["line", { x1: "12", x2: "12", y1: "17", y2: "21" }]
163
183
  ];
164
- Icon($$renderer, $8.spread_props([{ name: "monitor" }, props, { iconNode }]));
184
+ Icon($$renderer, $9.spread_props([{ name: "monitor" }, props, { iconNode }]));
165
185
  }
166
186
  // src/theme.ts
167
187
  var THEME_KEY = "theme";
@@ -194,10 +214,10 @@ function ThemePicker($$renderer, $$props) {
194
214
  applyTheme(value);
195
215
  }
196
216
  $$renderer2.push(`<div class="picker svelte-3gcwuj" role="radiogroup" aria-label="Theme"><!--[-->`);
197
- const each_array = $9.ensure_array_like(options);
217
+ const each_array = $10.ensure_array_like(options);
198
218
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
199
219
  let { value, label, icon: Icon2 } = each_array[$$index];
200
- $$renderer2.push(`<button type="button"${$9.attr_class("segment svelte-3gcwuj", undefined, { active: theme === value })} role="radio"${$9.attr("aria-checked", theme === value)}>`);
220
+ $$renderer2.push(`<button type="button"${$10.attr_class("segment svelte-3gcwuj", undefined, { active: theme === value })} role="radio"${$10.attr("aria-checked", theme === value)}>`);
201
221
  if (Icon2) {
202
222
  $$renderer2.push("<!--[-->");
203
223
  Icon2($$renderer2, { size: 13 });
@@ -206,7 +226,7 @@ function ThemePicker($$renderer, $$props) {
206
226
  $$renderer2.push("<!--[!-->");
207
227
  $$renderer2.push("<!--]-->");
208
228
  }
209
- $$renderer2.push(` ${$9.escape(label)}</button>`);
229
+ $$renderer2.push(` ${$10.escape(label)}</button>`);
210
230
  }
211
231
  $$renderer2.push(`<!--]--></div>`);
212
232
  });
@@ -214,7 +234,7 @@ function ThemePicker($$renderer, $$props) {
214
234
 
215
235
  // node_modules/@lucide/svelte/dist/icons/layers.svelte
216
236
  import"svelte/internal/flags/async";
217
- import * as $10 from "svelte/internal/server";
237
+ import * as $11 from "svelte/internal/server";
218
238
  function Layers($$renderer, $$props) {
219
239
  let { $$slots, $$events, ...props } = $$props;
220
240
  const iconNode = [
@@ -237,11 +257,11 @@ function Layers($$renderer, $$props) {
237
257
  }
238
258
  ]
239
259
  ];
240
- Icon($$renderer, $10.spread_props([{ name: "layers" }, props, { iconNode }]));
260
+ Icon($$renderer, $11.spread_props([{ name: "layers" }, props, { iconNode }]));
241
261
  }
242
262
  // node_modules/@lucide/svelte/dist/icons/folder-minus.svelte
243
263
  import"svelte/internal/flags/async";
244
- import * as $11 from "svelte/internal/server";
264
+ import * as $12 from "svelte/internal/server";
245
265
  function Folder_minus($$renderer, $$props) {
246
266
  let { $$slots, $$events, ...props } = $$props;
247
267
  const iconNode = [
@@ -253,11 +273,11 @@ function Folder_minus($$renderer, $$props) {
253
273
  }
254
274
  ]
255
275
  ];
256
- Icon($$renderer, $11.spread_props([{ name: "folder-minus" }, props, { iconNode }]));
276
+ Icon($$renderer, $12.spread_props([{ name: "folder-minus" }, props, { iconNode }]));
257
277
  }
258
278
  // node_modules/@lucide/svelte/dist/icons/trash-2.svelte
259
279
  import"svelte/internal/flags/async";
260
- import * as $12 from "svelte/internal/server";
280
+ import * as $13 from "svelte/internal/server";
261
281
  function Trash_2($$renderer, $$props) {
262
282
  let { $$slots, $$events, ...props } = $$props;
263
283
  const iconNode = [
@@ -267,11 +287,11 @@ function Trash_2($$renderer, $$props) {
267
287
  ["path", { d: "M3 6h18" }],
268
288
  ["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }]
269
289
  ];
270
- Icon($$renderer, $12.spread_props([{ name: "trash-2" }, props, { iconNode }]));
290
+ Icon($$renderer, $13.spread_props([{ name: "trash-2" }, props, { iconNode }]));
271
291
  }
272
292
  // node_modules/@lucide/svelte/dist/icons/hammer.svelte
273
293
  import"svelte/internal/flags/async";
274
- import * as $13 from "svelte/internal/server";
294
+ import * as $14 from "svelte/internal/server";
275
295
  function Hammer($$renderer, $$props) {
276
296
  let { $$slots, $$events, ...props } = $$props;
277
297
  const iconNode = [
@@ -284,11 +304,11 @@ function Hammer($$renderer, $$props) {
284
304
  }
285
305
  ]
286
306
  ];
287
- Icon($$renderer, $13.spread_props([{ name: "hammer" }, props, { iconNode }]));
307
+ Icon($$renderer, $14.spread_props([{ name: "hammer" }, props, { iconNode }]));
288
308
  }
289
309
  // node_modules/@lucide/svelte/dist/icons/key-round.svelte
290
310
  import"svelte/internal/flags/async";
291
- import * as $14 from "svelte/internal/server";
311
+ import * as $15 from "svelte/internal/server";
292
312
  function Key_round($$renderer, $$props) {
293
313
  let { $$slots, $$events, ...props } = $$props;
294
314
  const iconNode = [
@@ -303,11 +323,57 @@ function Key_round($$renderer, $$props) {
303
323
  { cx: "16.5", cy: "7.5", r: ".5", fill: "currentColor" }
304
324
  ]
305
325
  ];
306
- Icon($$renderer, $14.spread_props([{ name: "key-round" }, props, { iconNode }]));
326
+ Icon($$renderer, $15.spread_props([{ name: "key-round" }, props, { iconNode }]));
327
+ }
328
+ // node_modules/@lucide/svelte/dist/icons/user-cog.svelte
329
+ import"svelte/internal/flags/async";
330
+ import * as $16 from "svelte/internal/server";
331
+ function User_cog($$renderer, $$props) {
332
+ let { $$slots, $$events, ...props } = $$props;
333
+ const iconNode = [
334
+ ["path", { d: "M10 15H6a4 4 0 0 0-4 4v2" }],
335
+ ["path", { d: "m14.305 16.53.923-.382" }],
336
+ ["path", { d: "m15.228 13.852-.923-.383" }],
337
+ ["path", { d: "m16.852 12.228-.383-.923" }],
338
+ ["path", { d: "m16.852 17.772-.383.924" }],
339
+ ["path", { d: "m19.148 12.228.383-.923" }],
340
+ ["path", { d: "m19.53 18.696-.382-.924" }],
341
+ ["path", { d: "m20.772 13.852.924-.383" }],
342
+ ["path", { d: "m20.772 16.148.924.383" }],
343
+ ["circle", { cx: "18", cy: "15", r: "3" }],
344
+ ["circle", { cx: "9", cy: "7", r: "4" }]
345
+ ];
346
+ Icon($$renderer, $16.spread_props([{ name: "user-cog" }, props, { iconNode }]));
347
+ }
348
+ // node_modules/@lucide/svelte/dist/icons/cpu.svelte
349
+ import"svelte/internal/flags/async";
350
+ import * as $17 from "svelte/internal/server";
351
+ function Cpu($$renderer, $$props) {
352
+ let { $$slots, $$events, ...props } = $$props;
353
+ const iconNode = [
354
+ ["path", { d: "M12 20v2" }],
355
+ ["path", { d: "M12 2v2" }],
356
+ ["path", { d: "M17 20v2" }],
357
+ ["path", { d: "M17 2v2" }],
358
+ ["path", { d: "M2 12h2" }],
359
+ ["path", { d: "M2 17h2" }],
360
+ ["path", { d: "M2 7h2" }],
361
+ ["path", { d: "M20 12h2" }],
362
+ ["path", { d: "M20 17h2" }],
363
+ ["path", { d: "M20 7h2" }],
364
+ ["path", { d: "M7 20v2" }],
365
+ ["path", { d: "M7 2v2" }],
366
+ [
367
+ "rect",
368
+ { x: "4", y: "4", width: "16", height: "16", rx: "2" }
369
+ ],
370
+ ["rect", { x: "8", y: "8", width: "8", height: "8", rx: "1" }]
371
+ ];
372
+ Icon($$renderer, $17.spread_props([{ name: "cpu" }, props, { iconNode }]));
307
373
  }
308
374
  // node_modules/@lucide/svelte/dist/icons/variable.svelte
309
375
  import"svelte/internal/flags/async";
310
- import * as $15 from "svelte/internal/server";
376
+ import * as $18 from "svelte/internal/server";
311
377
  function Variable($$renderer, $$props) {
312
378
  let { $$slots, $$events, ...props } = $$props;
313
379
  const iconNode = [
@@ -316,14 +382,14 @@ function Variable($$renderer, $$props) {
316
382
  ["line", { x1: "15", x2: "9", y1: "9", y2: "15" }],
317
383
  ["line", { x1: "9", x2: "15", y1: "9", y2: "15" }]
318
384
  ];
319
- Icon($$renderer, $15.spread_props([{ name: "variable" }, props, { iconNode }]));
385
+ Icon($$renderer, $18.spread_props([{ name: "variable" }, props, { iconNode }]));
320
386
  }
321
387
  // src/components/SettingsView.svelte
322
388
  import { flushSync } from "svelte";
323
389
 
324
390
  // src/components/CoinButton.svelte
325
391
  import"svelte/internal/flags/async";
326
- import * as $16 from "svelte/internal/server";
392
+ import * as $19 from "svelte/internal/server";
327
393
  function CoinButton($$renderer, $$props) {
328
394
  let { href = "/avatars" } = $$props;
329
395
  const coinArt = {
@@ -339,7 +405,7 @@ function CoinButton($$renderer, $$props) {
339
405
  "..####.."
340
406
  ]
341
407
  };
342
- $$renderer.push(`<div class="coin-row svelte-1ioj7vz"><span class="pixel-line svelte-1ioj7vz" aria-hidden="true"></span> <a class="coin-btn svelte-1ioj7vz"${$16.attr("href", href)} aria-label="Draw your own avatar" title="Draw your own avatar"><span class="new svelte-1ioj7vz" aria-hidden="true">New</span> <span class="coin svelte-1ioj7vz" aria-hidden="true">`);
408
+ $$renderer.push(`<div class="coin-row svelte-1ioj7vz"><span class="pixel-line svelte-1ioj7vz" aria-hidden="true"></span> <a class="coin-btn svelte-1ioj7vz"${$19.attr("href", href)} aria-label="Draw your own avatar" title="Draw your own avatar"><span class="new svelte-1ioj7vz" aria-hidden="true">New</span> <span class="coin svelte-1ioj7vz" aria-hidden="true">`);
343
409
  Avatar($$renderer, { art: coinArt, name: "coin", scale: 3 });
344
410
  $$renderer.push(`<!----></span></a> <span class="pixel-line svelte-1ioj7vz" aria-hidden="true"></span></div>`);
345
411
  }
@@ -348,11 +414,15 @@ function CoinButton($$renderer, $$props) {
348
414
  function SettingsView($$renderer, $$props) {
349
415
  $$renderer.component(($$renderer2) => {
350
416
  let {
417
+ pet,
351
418
  defaultImage,
352
419
  builtinImage,
353
420
  disableBuildCache,
354
421
  copyIgnorePatterns,
355
422
  builtinCopyIgnore,
423
+ gitIdentityEnabled,
424
+ gitIdentityName,
425
+ gitIdentityEmail,
356
426
  dockerArch,
357
427
  manualTokensEnabled,
358
428
  githubTokenSet,
@@ -365,12 +435,21 @@ function SettingsView($$renderer, $$props) {
365
435
  customEndpointHaikuModel,
366
436
  customEndpointSmallFastModel,
367
437
  customEndpointModel,
438
+ manualModelOverrideEnabled,
439
+ manualOpusModel,
440
+ manualSonnetModel,
441
+ manualHaikuModel,
442
+ manualSmallFastModel,
443
+ manualModel,
368
444
  hostEnvVarsEnabled,
369
445
  hostEnvVarNames,
370
446
  hostEnvVarPresence,
371
447
  version
372
448
  } = $$props;
373
449
  let sound = soundEnabled();
450
+ let petArt = pet;
451
+ let savingPet = false;
452
+ let petError = null;
374
453
  let shuttingDown = false;
375
454
  function saveOpts(handlers) {
376
455
  return {
@@ -447,6 +526,29 @@ function SettingsView($$renderer, $$props) {
447
526
  flushSync(() => copyIgnore = builtinCopyIgnore);
448
527
  copyIgnoreFormEl?.requestSubmit();
449
528
  }
529
+ let gitIdentity = gitIdentityEnabled;
530
+ let savingGitToggle = false;
531
+ let gitToggleError = null;
532
+ const gitIdentityToggleOpts = toggleOpts({
533
+ set: (v) => gitIdentity = v,
534
+ setSaving: (v) => savingGitToggle = v,
535
+ setError: (v) => gitToggleError = v
536
+ });
537
+ let gitName = gitIdentityName;
538
+ let gitEmail = gitIdentityEmail;
539
+ let savingGitIdentity = false;
540
+ let gitIdentityError = null;
541
+ let gitIdentitySaved = false;
542
+ const gitIdentityOpts = saveOpts({
543
+ setSaving: (v) => savingGitIdentity = v,
544
+ setError: (v) => gitIdentityError = v,
545
+ setMsg: (v) => gitIdentitySaved = !!v,
546
+ onSuccess: (data) => {
547
+ gitName = data?.name ?? gitName;
548
+ gitEmail = data?.email ?? gitEmail;
549
+ gitIdentitySaved = true;
550
+ }
551
+ });
450
552
  let noCache = disableBuildCache;
451
553
  let savingCache = false;
452
554
  let cacheError = null;
@@ -530,7 +632,11 @@ function SettingsView($$renderer, $$props) {
530
632
  const customEndpointToggleOpts = toggleOpts({
531
633
  set: (v) => customEndpoint = v,
532
634
  setSaving: (v) => savingCustomToggle = v,
533
- setError: (v) => customToggleError = v
635
+ setError: (v) => customToggleError = v,
636
+ onSuccess: (data) => {
637
+ if (data?.enabled)
638
+ manualModelOverride = false;
639
+ }
534
640
  });
535
641
  let customBaseUrl = customEndpointBaseUrl;
536
642
  let savingCustomBaseUrl = false;
@@ -575,6 +681,35 @@ function SettingsView($$renderer, $$props) {
575
681
  customModelsMsg = "Saved.";
576
682
  }
577
683
  });
684
+ let manualModelOverride = manualModelOverrideEnabled;
685
+ let savingManualModelToggle = false;
686
+ let manualModelToggleError = null;
687
+ const manualModelToggleOpts = toggleOpts({
688
+ set: (v) => manualModelOverride = v,
689
+ setSaving: (v) => savingManualModelToggle = v,
690
+ setError: (v) => manualModelToggleError = v,
691
+ onSuccess: (data) => {
692
+ if (data?.enabled)
693
+ customEndpoint = false;
694
+ }
695
+ });
696
+ let manualOpus = manualOpusModel;
697
+ let manualSonnet = manualSonnetModel;
698
+ let manualHaiku = manualHaikuModel;
699
+ let manualSmallFast = manualSmallFastModel;
700
+ let manualDefault = manualModel;
701
+ let savingManualModels = false;
702
+ let manualModelsMsg = null;
703
+ let manualModelsError = null;
704
+ const manualModelsOpts = saveOpts({
705
+ setSaving: (v) => savingManualModels = v,
706
+ setError: (v) => manualModelsError = v,
707
+ setMsg: (v) => manualModelsMsg = v,
708
+ onSuccess: () => {
709
+ manualModelsMsg = "Saved.";
710
+ }
711
+ });
712
+ let litellmBlocker = $20.derived(() => manualTokens ? "Set tokens manually" : manualModelOverride ? "Override models manually" : null);
578
713
  let hostEnvVars = hostEnvVarsEnabled;
579
714
  let savingHostEnvToggle = false;
580
715
  let hostEnvToggleError = null;
@@ -649,6 +784,28 @@ function SettingsView($$renderer, $$props) {
649
784
  if (on)
650
785
  playChime("done");
651
786
  }
787
+ const petToggleOpts = {
788
+ onPending: (v) => savingPet = v,
789
+ submit: () => {
790
+ petError = null;
791
+ return ({ result }) => {
792
+ if (result.type === "success") {
793
+ petArt = result.data?.name ? findAvatar(result.data.name) : undefined;
794
+ return;
795
+ }
796
+ petError = result.type === "failure" ? result.data?.error ?? "Request failed" : "Network error. Try again.";
797
+ };
798
+ }
799
+ };
800
+ function petChooseOpts(art) {
801
+ return saveOpts({
802
+ setSaving: (v) => savingPet = v,
803
+ setError: (v) => petError = v,
804
+ onSuccess: (data) => {
805
+ petArt = (data?.name ? findAvatar(data.name) : undefined) ?? art;
806
+ }
807
+ });
808
+ }
652
809
  const shutdownOpts = {
653
810
  submit: ({ cancel }) => {
654
811
  if (!confirm("Delete the database, remove all instances and their containers, and shut down the server? This cannot be undone.")) {
@@ -666,16 +823,16 @@ function SettingsView($$renderer, $$props) {
666
823
  $$slots: { default: true }
667
824
  });
668
825
  $$renderer2.push(`<!----> <main class="content svelte-1n6ht58"><section class="card svelte-1n6ht58"><form class="row image-row svelte-1n6ht58" method="POST" action="?/defaultImage"><div class="label svelte-1n6ht58">`);
669
- Container($$renderer2, { size: 18 });
826
+ Container($$renderer2, { size: 20 });
670
827
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Default container image `);
671
828
  if (dockerArch) {
672
829
  $$renderer2.push("<!--[0-->");
673
- $$renderer2.push(`<span class="arch svelte-1n6ht58" title="Docker daemon architecture">${$17.escape(dockerArch)}</span>`);
830
+ $$renderer2.push(`<span class="arch svelte-1n6ht58" title="Docker daemon architecture">${$20.escape(dockerArch)}</span>`);
674
831
  } else {
675
832
  $$renderer2.push("<!--[-1-->");
676
833
  }
677
834
  $$renderer2.push(`<!--]--></div> <div class="desc svelte-1n6ht58">Used only when a project folder ships no devcontainer.json. Takes effect for instances
678
- created from now on.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="text" name="image" class="image-input svelte-1n6ht58"${$17.attr("value", image)} spellcheck="false" autocapitalize="off" autocorrect="off" placeholder="mcr.microsoft.com/devcontainers/base:ubuntu"/> `);
835
+ created from now on.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="text" name="image" class="image-input svelte-1n6ht58"${$20.attr("value", image)} spellcheck="false" autocapitalize="off" autocorrect="off" placeholder="mcr.microsoft.com/devcontainers/base:ubuntu"/> `);
679
836
  Button($$renderer2, {
680
837
  type: "submit",
681
838
  disabled: savingImage,
@@ -690,14 +847,14 @@ function SettingsView($$renderer, $$props) {
690
847
  icon: Rotate_ccw,
691
848
  disabled: savingImage,
692
849
  onclick: resetImage,
693
- title: `Reset to default (${$17.stringify(builtinImage)})`,
850
+ title: `Reset to default (${$20.stringify(builtinImage)})`,
694
851
  "aria-label": "Reset to default image"
695
852
  });
696
853
  $$renderer2.push(`<!----></div> <div class="desc tip svelte-1n6ht58">`);
697
854
  if (dockerArch) {
698
855
  $$renderer2.push("<!--[0-->");
699
- $$renderer2.push(`Your Docker daemon runs on <strong>${$17.escape(dockerArch)}</strong> \u2014 pick an image that publishes
700
- an <strong>${$17.escape(dockerArch)}</strong> manifest, or the pull will fail.`);
856
+ $$renderer2.push(`Your Docker daemon runs on <strong>${$20.escape(dockerArch)}</strong> \u2014 pick an image that publishes
857
+ an <strong>${$20.escape(dockerArch)}</strong> manifest, or the pull will fail.`);
701
858
  } else {
702
859
  $$renderer2.push("<!--[-1-->");
703
860
  $$renderer2.push(`Pick an image whose manifest covers your Docker daemon's architecture, or the pull will
@@ -706,7 +863,7 @@ function SettingsView($$renderer, $$props) {
706
863
  $$renderer2.push(`<!--]--></div> `);
707
864
  if (imageError) {
708
865
  $$renderer2.push("<!--[0-->");
709
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(imageError)}</div>`);
866
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$20.escape(imageError)}</div>`);
710
867
  } else if (imageSaved) {
711
868
  $$renderer2.push("<!--[1-->");
712
869
  $$renderer2.push(`<div class="msg ok svelte-1n6ht58">Saved.</div>`);
@@ -714,10 +871,10 @@ function SettingsView($$renderer, $$props) {
714
871
  $$renderer2.push("<!--[-1-->");
715
872
  }
716
873
  $$renderer2.push(`<!--]--></form></section> <section class="card svelte-1n6ht58"><form class="row image-row svelte-1n6ht58" method="POST" action="?/copyIgnorePatterns"><div class="label svelte-1n6ht58">`);
717
- Folder_minus($$renderer2, { size: 18 });
874
+ Folder_minus($$renderer2, { size: 20 });
718
875
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Skip when copying a local folder</div> <div class="desc svelte-1n6ht58">Comma-separated folder/file names excluded when copying a local source folder into a
719
876
  new instance's workspace. Leave blank to copy everything. Only applies to local
720
- folders \u2014 cloning a Git repo URL is unaffected.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="text" name="patterns" class="image-input svelte-1n6ht58"${$17.attr("value", copyIgnore)} spellcheck="false" autocapitalize="off" autocorrect="off" placeholder="node_modules, .venv, dist"/> `);
877
+ folders \u2014 cloning a Git repo URL is unaffected.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="text" name="patterns" class="image-input svelte-1n6ht58"${$20.attr("value", copyIgnore)} spellcheck="false" autocapitalize="off" autocorrect="off" placeholder="node_modules, .venv, dist"/> `);
721
878
  Button($$renderer2, {
722
879
  type: "submit",
723
880
  disabled: savingCopyIgnore,
@@ -732,39 +889,77 @@ function SettingsView($$renderer, $$props) {
732
889
  icon: Rotate_ccw,
733
890
  disabled: savingCopyIgnore,
734
891
  onclick: resetCopyIgnore,
735
- title: `Reset to default (${$17.stringify(builtinCopyIgnore)})`,
892
+ title: `Reset to default (${$20.stringify(builtinCopyIgnore)})`,
736
893
  "aria-label": "Reset to default copy-ignore patterns"
737
894
  });
738
895
  $$renderer2.push(`<!----></div> `);
739
896
  if (copyIgnoreError) {
740
897
  $$renderer2.push("<!--[0-->");
741
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(copyIgnoreError)}</div>`);
898
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$20.escape(copyIgnoreError)}</div>`);
742
899
  } else if (copyIgnoreSaved) {
743
900
  $$renderer2.push("<!--[1-->");
744
901
  $$renderer2.push(`<div class="msg ok svelte-1n6ht58">Saved.</div>`);
745
902
  } else {
746
903
  $$renderer2.push("<!--[-1-->");
747
904
  }
748
- $$renderer2.push(`<!--]--></form></section> <section class="card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/disableBuildCache"><div class="label svelte-1n6ht58">`);
749
- Layers($$renderer2, { size: 18 });
905
+ $$renderer2.push(`<!--]--></form></section> <section class="card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/gitIdentityToggle"><div class="label svelte-1n6ht58">`);
906
+ User_cog($$renderer2, { size: 20 });
907
+ $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Override git identity</div> <div class="desc svelte-1n6ht58">Inject a name and email as <code class="svelte-1n6ht58">git config --global user.name/user.email</code> in every
908
+ new container, taking precedence over the host's own git config. When off, each container
909
+ falls back to the host's identity.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$20.attr("checked", gitIdentity, true)}${$20.attr("disabled", savingGitToggle, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
910
+ if (gitToggleError) {
911
+ $$renderer2.push("<!--[0-->");
912
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$20.escape(gitToggleError)}</div></div>`);
913
+ } else {
914
+ $$renderer2.push("<!--[-1-->");
915
+ }
916
+ $$renderer2.push(`<!--]--> `);
917
+ if (gitIdentity) {
918
+ $$renderer2.push("<!--[0-->");
919
+ $$renderer2.push(`<form class="row divided token-row svelte-1n6ht58" method="POST" action="?/gitIdentityOverride"><div class="label svelte-1n6ht58"><div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Identity</div> <div class="desc svelte-1n6ht58">Both fields are required \u2014 leave either blank and the container falls back to the
920
+ host's identity.</div></div></div> <div class="model-fields svelte-1n6ht58"><label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Name</span> <input type="text" name="name" class="image-input svelte-1n6ht58"${$20.attr("value", gitName)} spellcheck="false" autocapitalize="off" autocorrect="off" placeholder="Jane Doe"/></label> <label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Email</span> <input type="text" name="email" class="image-input svelte-1n6ht58"${$20.attr("value", gitEmail)} spellcheck="false" autocapitalize="off" autocorrect="off" placeholder="jane@example.com"/></label> <div class="model-save-row svelte-1n6ht58">`);
921
+ Button($$renderer2, {
922
+ type: "submit",
923
+ disabled: savingGitIdentity,
924
+ children: ($$renderer3) => {
925
+ $$renderer3.push(`<!---->Save`);
926
+ },
927
+ $$slots: { default: true }
928
+ });
929
+ $$renderer2.push(`<!----></div></div> `);
930
+ if (gitIdentityError) {
931
+ $$renderer2.push("<!--[0-->");
932
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$20.escape(gitIdentityError)}</div>`);
933
+ } else if (gitIdentitySaved) {
934
+ $$renderer2.push("<!--[1-->");
935
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">Saved.</div>`);
936
+ } else {
937
+ $$renderer2.push("<!--[-1-->");
938
+ }
939
+ $$renderer2.push(`<!--]--></form>`);
940
+ } else {
941
+ $$renderer2.push("<!--[-1-->");
942
+ }
943
+ $$renderer2.push(`<!--]--></section> <section class="card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/disableBuildCache"><div class="label svelte-1n6ht58">`);
944
+ Layers($$renderer2, { size: 20 });
750
945
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Disable build cache</div> <div class="desc svelte-1n6ht58">Build every new container with <code class="svelte-1n6ht58">--build-no-cache</code>. Applies to first boot
751
- and rebuilds \u2014 slower, but always picks up upstream image/layer changes.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$17.attr("checked", noCache, true)}${$17.attr("disabled", savingCache, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
946
+ and rebuilds \u2014 slower, but always picks up upstream image/layer changes.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$20.attr("checked", noCache, true)}${$20.attr("disabled", savingCache, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
752
947
  if (cacheError) {
753
948
  $$renderer2.push("<!--[0-->");
754
- $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$17.escape(cacheError)}</div></div>`);
949
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$20.escape(cacheError)}</div></div>`);
755
950
  } else {
756
951
  $$renderer2.push("<!--[-1-->");
757
952
  }
758
953
  $$renderer2.push(`<!--]--> <form class="row divided svelte-1n6ht58" method="POST" action="?/clearBuildCache"><div class="label svelte-1n6ht58">`);
759
- Trash_2($$renderer2, { size: 18 });
954
+ Trash_2($$renderer2, { size: 20 });
760
955
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Clear build cache</div> <div class="desc svelte-1n6ht58">Purge Docker's BuildKit layer cache now, so the next build runs uncached. Doesn't
761
956
  remove pulled images.</div> `);
762
957
  if (clearError) {
763
958
  $$renderer2.push("<!--[0-->");
764
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(clearError)}</div>`);
959
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$20.escape(clearError)}</div>`);
765
960
  } else if (clearMsg) {
766
961
  $$renderer2.push("<!--[1-->");
767
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(clearMsg)}</div>`);
962
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$20.escape(clearMsg)}</div>`);
768
963
  } else {
769
964
  $$renderer2.push("<!--[-1-->");
770
965
  }
@@ -774,20 +969,20 @@ function SettingsView($$renderer, $$props) {
774
969
  icon: Trash_2,
775
970
  disabled: clearing,
776
971
  children: ($$renderer3) => {
777
- $$renderer3.push(`<!---->${$17.escape(clearing ? "Clearing\u2026" : "Clear cache")}`);
972
+ $$renderer3.push(`<!---->${$20.escape(clearing ? "Clearing\u2026" : "Clear cache")}`);
778
973
  },
779
974
  $$slots: { default: true }
780
975
  });
781
976
  $$renderer2.push(`<!----></form> <form class="row divided svelte-1n6ht58" method="POST" action="?/rebuildAllNoCache"><div class="label svelte-1n6ht58">`);
782
- Hammer($$renderer2, { size: 18 });
977
+ Hammer($$renderer2, { size: 20 });
783
978
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Rebuild running containers (no cache)</div> <div class="desc svelte-1n6ht58">Re-run <code class="svelte-1n6ht58">devcontainer up --build-no-cache</code> for every currently-running instance.
784
979
  In-container edits are kept; stopped instances are left alone.</div> `);
785
980
  if (rebuildError) {
786
981
  $$renderer2.push("<!--[0-->");
787
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(rebuildError)}</div>`);
982
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$20.escape(rebuildError)}</div>`);
788
983
  } else if (rebuildMsg) {
789
984
  $$renderer2.push("<!--[1-->");
790
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(rebuildMsg)}</div>`);
985
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$20.escape(rebuildMsg)}</div>`);
791
986
  } else {
792
987
  $$renderer2.push("<!--[-1-->");
793
988
  }
@@ -797,12 +992,12 @@ function SettingsView($$renderer, $$props) {
797
992
  icon: Hammer,
798
993
  disabled: rebuilding,
799
994
  children: ($$renderer3) => {
800
- $$renderer3.push(`<!---->${$17.escape(rebuilding ? "Starting\u2026" : "Rebuild all")}`);
995
+ $$renderer3.push(`<!---->${$20.escape(rebuilding ? "Starting\u2026" : "Rebuild all")}`);
801
996
  },
802
997
  $$slots: { default: true }
803
998
  });
804
- $$renderer2.push(`<!----></form></section> <section${$17.attr_class("card svelte-1n6ht58", undefined, { "disabled-card": customEndpoint })}><form class="row svelte-1n6ht58" method="POST" action="?/manualTokensToggle"><div class="label svelte-1n6ht58">`);
805
- Key_round($$renderer2, { size: 18 });
999
+ $$renderer2.push(`<!----></form></section> <section${$20.attr_class("card svelte-1n6ht58", undefined, { "disabled-card": customEndpoint })}><form class="row svelte-1n6ht58" method="POST" action="?/manualTokensToggle"><div class="label svelte-1n6ht58">`);
1000
+ Key_round($$renderer2, { size: 20 });
806
1001
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Set tokens manually `);
807
1002
  if (customEndpoint) {
808
1003
  $$renderer2.push("<!--[0-->");
@@ -822,10 +1017,10 @@ function SettingsView($$renderer, $$props) {
822
1017
  token set here is injected into every new container and overrides host credential
823
1018
  discovery.`);
824
1019
  }
825
- $$renderer2.push(`<!--]--></div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$17.attr("checked", manualTokens, true)}${$17.attr("disabled", savingManualToggle || customEndpoint, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1020
+ $$renderer2.push(`<!--]--></div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$20.attr("checked", manualTokens, true)}${$20.attr("disabled", savingManualToggle || customEndpoint, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
826
1021
  if (manualToggleError) {
827
1022
  $$renderer2.push("<!--[0-->");
828
- $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$17.escape(manualToggleError)}</div></div>`);
1023
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$20.escape(manualToggleError)}</div></div>`);
829
1024
  } else {
830
1025
  $$renderer2.push("<!--[-1-->");
831
1026
  }
@@ -833,7 +1028,7 @@ function SettingsView($$renderer, $$props) {
833
1028
  if (manualTokens && !customEndpoint) {
834
1029
  $$renderer2.push("<!--[0-->");
835
1030
  $$renderer2.push(`<form class="row divided token-row svelte-1n6ht58" method="POST" action="?/githubToken"><div class="label svelte-1n6ht58"><div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">GitHub token</div> <div class="desc svelte-1n6ht58">macOS / Linux: run <code class="svelte-1n6ht58">gh auth token</code> to print your GitHub CLI token, or
836
- create a Personal Access Token at <code class="svelte-1n6ht58">github.com/settings/tokens</code> (scopes: <code class="svelte-1n6ht58">repo</code>, <code class="svelte-1n6ht58">read:org</code>). Leave blank and Save to clear.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="password" name="githubToken" class="image-input svelte-1n6ht58"${$17.attr("value", githubToken)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"${$17.attr("placeholder", ghSaved ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (saved)" : "ghp_\u2026 / gho_\u2026")}/> `);
1031
+ create a Personal Access Token at <code class="svelte-1n6ht58">github.com/settings/tokens</code> (scopes: <code class="svelte-1n6ht58">repo</code>, <code class="svelte-1n6ht58">read:org</code>). Leave blank and Save to clear.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="password" name="githubToken" class="image-input svelte-1n6ht58"${$20.attr("value", githubToken)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"${$20.attr("placeholder", ghSaved ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (saved)" : "ghp_\u2026 / gho_\u2026")}/> `);
837
1032
  Button($$renderer2, {
838
1033
  type: "submit",
839
1034
  disabled: savingGithub,
@@ -845,17 +1040,17 @@ function SettingsView($$renderer, $$props) {
845
1040
  $$renderer2.push(`<!----></div> `);
846
1041
  if (githubError) {
847
1042
  $$renderer2.push("<!--[0-->");
848
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(githubError)}</div>`);
1043
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$20.escape(githubError)}</div>`);
849
1044
  } else if (githubMsg) {
850
1045
  $$renderer2.push("<!--[1-->");
851
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(githubMsg)}</div>`);
1046
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$20.escape(githubMsg)}</div>`);
852
1047
  } else {
853
1048
  $$renderer2.push("<!--[-1-->");
854
1049
  }
855
1050
  $$renderer2.push(`<!--]--></form> <form class="row divided token-row svelte-1n6ht58" method="POST" action="?/claudeToken"><div class="label svelte-1n6ht58"><div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Claude Code token</div> <div class="desc svelte-1n6ht58">macOS / Linux: run <code class="svelte-1n6ht58">claude setup-token</code> to mint a long-lived token and
856
1051
  paste it here. Copying a live login out of the keychain or <code class="svelte-1n6ht58">~/.claude/.credentials.json</code> works too, but that credential rotates \u2014
857
1052
  the first <code class="svelte-1n6ht58">claude</code> to refresh it signs the other one out. Leave blank and Save
858
- to clear.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="password" name="claudeToken" class="image-input svelte-1n6ht58"${$17.attr("value", claudeToken)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"${$17.attr("placeholder", claudeSaved ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (saved)" : "sk-ant-oat\u2026")}/> `);
1053
+ to clear.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="password" name="claudeToken" class="image-input svelte-1n6ht58"${$20.attr("value", claudeToken)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"${$20.attr("placeholder", claudeSaved ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (saved)" : "sk-ant-oat\u2026")}/> `);
859
1054
  Button($$renderer2, {
860
1055
  type: "submit",
861
1056
  disabled: savingClaude,
@@ -867,10 +1062,10 @@ function SettingsView($$renderer, $$props) {
867
1062
  $$renderer2.push(`<!----></div> `);
868
1063
  if (claudeError) {
869
1064
  $$renderer2.push("<!--[0-->");
870
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(claudeError)}</div>`);
1065
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$20.escape(claudeError)}</div>`);
871
1066
  } else if (claudeMsg) {
872
1067
  $$renderer2.push("<!--[1-->");
873
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(claudeMsg)}</div>`);
1068
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$20.escape(claudeMsg)}</div>`);
874
1069
  } else {
875
1070
  $$renderer2.push("<!--[-1-->");
876
1071
  }
@@ -878,19 +1073,19 @@ function SettingsView($$renderer, $$props) {
878
1073
  } else {
879
1074
  $$renderer2.push("<!--[-1-->");
880
1075
  }
881
- $$renderer2.push(`<!--]--></section> <section${$17.attr_class("card svelte-1n6ht58", undefined, { "disabled-card": manualTokens })}><form class="row svelte-1n6ht58" method="POST" action="?/customEndpointToggle"><div class="label svelte-1n6ht58">`);
882
- Key_round($$renderer2, { size: 18 });
1076
+ $$renderer2.push(`<!--]--></section> <section${$20.attr_class("card svelte-1n6ht58", undefined, { "disabled-card": litellmBlocker() })}><form class="row svelte-1n6ht58" method="POST" action="?/customEndpointToggle"><div class="label svelte-1n6ht58">`);
1077
+ Key_round($$renderer2, { size: 20 });
883
1078
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">LiteLLM + Bedrock `);
884
- if (manualTokens) {
1079
+ if (litellmBlocker()) {
885
1080
  $$renderer2.push("<!--[0-->");
886
- $$renderer2.push(`<span class="arch svelte-1n6ht58" title="Disabled while Set tokens manually is on">disabled</span>`);
1081
+ $$renderer2.push(`<span class="arch svelte-1n6ht58"${$20.attr("title", `Disabled while ${$20.stringify(litellmBlocker())} is on`)}>disabled</span>`);
887
1082
  } else {
888
1083
  $$renderer2.push("<!--[-1-->");
889
1084
  }
890
1085
  $$renderer2.push(`<!--]--></div> <div class="desc svelte-1n6ht58">`);
891
- if (manualTokens) {
1086
+ if (litellmBlocker()) {
892
1087
  $$renderer2.push("<!--[0-->");
893
- $$renderer2.push(`Not available while "Set tokens manually" is enabled \u2014 these modes are mutually
1088
+ $$renderer2.push(`Not available while "${$20.escape(litellmBlocker())}" is enabled \u2014 these modes are mutually
894
1089
  incompatible.`);
895
1090
  } else {
896
1091
  $$renderer2.push("<!--[-1-->");
@@ -898,17 +1093,17 @@ function SettingsView($$renderer, $$props) {
898
1093
  default API. When enabled, the Bedrock endpoint variables are injected into every new
899
1094
  container, host OAuth credentials are not used, and "Set tokens manually" is disabled.`);
900
1095
  }
901
- $$renderer2.push(`<!--]--></div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$17.attr("checked", customEndpoint, true)}${$17.attr("disabled", savingCustomToggle || manualTokens, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1096
+ $$renderer2.push(`<!--]--></div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$20.attr("checked", customEndpoint, true)}${$20.attr("disabled", savingCustomToggle || !!litellmBlocker(), true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
902
1097
  if (customToggleError) {
903
1098
  $$renderer2.push("<!--[0-->");
904
- $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$17.escape(customToggleError)}</div></div>`);
1099
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$20.escape(customToggleError)}</div></div>`);
905
1100
  } else {
906
1101
  $$renderer2.push("<!--[-1-->");
907
1102
  }
908
1103
  $$renderer2.push(`<!--]--> `);
909
1104
  if (customEndpoint) {
910
1105
  $$renderer2.push("<!--[0-->");
911
- $$renderer2.push(`<form class="row divided token-row svelte-1n6ht58" method="POST" action="?/customBaseUrl"><div class="label svelte-1n6ht58"><div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Base URL</div> <div class="desc svelte-1n6ht58">The LiteLLM proxy endpoint, e.g. <code class="svelte-1n6ht58">https://litellm.example.com/bedrock</code>. Passed as <code class="svelte-1n6ht58">ANTHROPIC_BEDROCK_BASE_URL</code>.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="text" name="baseUrl" class="image-input svelte-1n6ht58"${$17.attr("value", customBaseUrl)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" placeholder="https://litellm.example.com/bedrock"/> `);
1106
+ $$renderer2.push(`<form class="row divided token-row svelte-1n6ht58" method="POST" action="?/customBaseUrl"><div class="label svelte-1n6ht58"><div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Base URL</div> <div class="desc svelte-1n6ht58">The LiteLLM proxy endpoint, e.g. <code class="svelte-1n6ht58">https://litellm.example.com/bedrock</code>. Passed as <code class="svelte-1n6ht58">ANTHROPIC_BEDROCK_BASE_URL</code>.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="text" name="baseUrl" class="image-input svelte-1n6ht58"${$20.attr("value", customBaseUrl)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" placeholder="https://litellm.example.com/bedrock"/> `);
912
1107
  Button($$renderer2, {
913
1108
  type: "submit",
914
1109
  disabled: savingCustomBaseUrl,
@@ -920,15 +1115,15 @@ function SettingsView($$renderer, $$props) {
920
1115
  $$renderer2.push(`<!----></div> `);
921
1116
  if (customBaseUrlError) {
922
1117
  $$renderer2.push("<!--[0-->");
923
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(customBaseUrlError)}</div>`);
1118
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$20.escape(customBaseUrlError)}</div>`);
924
1119
  } else if (customBaseUrlMsg) {
925
1120
  $$renderer2.push("<!--[1-->");
926
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(customBaseUrlMsg)}</div>`);
1121
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$20.escape(customBaseUrlMsg)}</div>`);
927
1122
  } else {
928
1123
  $$renderer2.push("<!--[-1-->");
929
1124
  }
930
1125
  $$renderer2.push(`<!--]--></form> <form class="row divided token-row svelte-1n6ht58" method="POST" action="?/customToken"><div class="label svelte-1n6ht58"><div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Auth token</div> <div class="desc svelte-1n6ht58">Your LiteLLM API key. Passed as <code class="svelte-1n6ht58">ANTHROPIC_AUTH_TOKEN</code>. Leave blank and
931
- Save to clear.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="password" name="token" class="image-input svelte-1n6ht58"${$17.attr("value", customToken)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"${$17.attr("placeholder", customTokenSaved ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (saved)" : "sk-\u2026")}/> `);
1126
+ Save to clear.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="password" name="token" class="image-input svelte-1n6ht58"${$20.attr("value", customToken)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"${$20.attr("placeholder", customTokenSaved ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (saved)" : "sk-\u2026")}/> `);
932
1127
  Button($$renderer2, {
933
1128
  type: "submit",
934
1129
  disabled: savingCustomToken,
@@ -940,15 +1135,15 @@ function SettingsView($$renderer, $$props) {
940
1135
  $$renderer2.push(`<!----></div> `);
941
1136
  if (customTokenError) {
942
1137
  $$renderer2.push("<!--[0-->");
943
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(customTokenError)}</div>`);
1138
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$20.escape(customTokenError)}</div>`);
944
1139
  } else if (customTokenMsg) {
945
1140
  $$renderer2.push("<!--[1-->");
946
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(customTokenMsg)}</div>`);
1141
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$20.escape(customTokenMsg)}</div>`);
947
1142
  } else {
948
1143
  $$renderer2.push("<!--[-1-->");
949
1144
  }
950
1145
  $$renderer2.push(`<!--]--></form> <form class="row divided token-row svelte-1n6ht58" method="POST" action="?/customModels"><div class="label svelte-1n6ht58"><div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Model IDs</div> <div class="desc svelte-1n6ht58">Model aliases to use for each tier. Prefilled with defaults from the reference
951
- launcher script. Leave a field as-is to keep its current value.</div></div></div> <div class="model-fields svelte-1n6ht58"><label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Opus</span> <input type="text" name="opusModel" class="image-input svelte-1n6ht58"${$17.attr("value", customOpusModel)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Sonnet</span> <input type="text" name="sonnetModel" class="image-input svelte-1n6ht58"${$17.attr("value", customSonnetModel)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Haiku</span> <input type="text" name="haikuModel" class="image-input svelte-1n6ht58"${$17.attr("value", customHaikuModel)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Small/fast</span> <input type="text" name="smallFastModel" class="image-input svelte-1n6ht58"${$17.attr("value", customSmallFastModel)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Default</span> <input type="text" name="defaultModel" class="image-input svelte-1n6ht58"${$17.attr("value", customDefaultModel)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <div class="model-save-row svelte-1n6ht58">`);
1146
+ launcher script. Leave a field as-is to keep its current value.</div></div></div> <div class="model-fields svelte-1n6ht58"><label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Opus</span> <input type="text" name="opusModel" class="image-input svelte-1n6ht58"${$20.attr("value", customOpusModel)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Sonnet</span> <input type="text" name="sonnetModel" class="image-input svelte-1n6ht58"${$20.attr("value", customSonnetModel)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Haiku</span> <input type="text" name="haikuModel" class="image-input svelte-1n6ht58"${$20.attr("value", customHaikuModel)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Small/fast</span> <input type="text" name="smallFastModel" class="image-input svelte-1n6ht58"${$20.attr("value", customSmallFastModel)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Default</span> <input type="text" name="defaultModel" class="image-input svelte-1n6ht58"${$20.attr("value", customDefaultModel)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <div class="model-save-row svelte-1n6ht58">`);
952
1147
  Button($$renderer2, {
953
1148
  type: "submit",
954
1149
  disabled: savingCustomModels,
@@ -960,10 +1155,62 @@ function SettingsView($$renderer, $$props) {
960
1155
  $$renderer2.push(`<!----></div></div> `);
961
1156
  if (customModelsError) {
962
1157
  $$renderer2.push("<!--[0-->");
963
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(customModelsError)}</div>`);
1158
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$20.escape(customModelsError)}</div>`);
964
1159
  } else if (customModelsMsg) {
965
1160
  $$renderer2.push("<!--[1-->");
966
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(customModelsMsg)}</div>`);
1161
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$20.escape(customModelsMsg)}</div>`);
1162
+ } else {
1163
+ $$renderer2.push("<!--[-1-->");
1164
+ }
1165
+ $$renderer2.push(`<!--]--></form>`);
1166
+ } else {
1167
+ $$renderer2.push("<!--[-1-->");
1168
+ }
1169
+ $$renderer2.push(`<!--]--></section> <section${$20.attr_class("card svelte-1n6ht58", undefined, { "disabled-card": customEndpoint })}><form class="row svelte-1n6ht58" method="POST" action="?/manualModelToggle"><div class="label svelte-1n6ht58">`);
1170
+ Cpu($$renderer2, { size: 18 });
1171
+ $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Override models manually `);
1172
+ if (customEndpoint) {
1173
+ $$renderer2.push("<!--[0-->");
1174
+ $$renderer2.push(`<span class="arch svelte-1n6ht58" title="Disabled while LiteLLM + Bedrock is on">disabled</span>`);
1175
+ } else {
1176
+ $$renderer2.push("<!--[-1-->");
1177
+ }
1178
+ $$renderer2.push(`<!--]--></div> <div class="desc svelte-1n6ht58">`);
1179
+ if (customEndpoint) {
1180
+ $$renderer2.push("<!--[0-->");
1181
+ $$renderer2.push(`Not available while "LiteLLM + Bedrock" is enabled \u2014 these modes are mutually
1182
+ incompatible.`);
1183
+ } else {
1184
+ $$renderer2.push("<!--[-1-->");
1185
+ $$renderer2.push(`Pin which model <code class="svelte-1n6ht58">claude</code> uses on the standard (subscription) path. Only
1186
+ the fields you fill are injected into new containers as <code class="svelte-1n6ht58">ANTHROPIC_*_MODEL</code> variables; blanks fall through to Claude Code's own defaults.`);
1187
+ }
1188
+ $$renderer2.push(`<!--]--></div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$20.attr("checked", manualModelOverride, true)}${$20.attr("disabled", savingManualModelToggle || customEndpoint, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1189
+ if (manualModelToggleError) {
1190
+ $$renderer2.push("<!--[0-->");
1191
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$20.escape(manualModelToggleError)}</div></div>`);
1192
+ } else {
1193
+ $$renderer2.push("<!--[-1-->");
1194
+ }
1195
+ $$renderer2.push(`<!--]--> `);
1196
+ if (manualModelOverride) {
1197
+ $$renderer2.push("<!--[0-->");
1198
+ $$renderer2.push(`<form class="row divided token-row svelte-1n6ht58" method="POST" action="?/manualModels"><div class="label svelte-1n6ht58"><div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Model IDs</div> <div class="desc svelte-1n6ht58">A model name or alias per tier, e.g. <code class="svelte-1n6ht58">opusplan</code>, <code class="svelte-1n6ht58">opus</code>, <code class="svelte-1n6ht58">sonnet</code>, or a full <code class="svelte-1n6ht58">claude-\u2026</code> id. Leave a field blank to skip it.</div></div></div> <div class="model-fields svelte-1n6ht58"><label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Opus</span> <input type="text" name="opusModel" class="image-input svelte-1n6ht58"${$20.attr("value", manualOpus)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Sonnet</span> <input type="text" name="sonnetModel" class="image-input svelte-1n6ht58"${$20.attr("value", manualSonnet)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Haiku</span> <input type="text" name="haikuModel" class="image-input svelte-1n6ht58"${$20.attr("value", manualHaiku)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Small/fast</span> <input type="text" name="smallFastModel" class="image-input svelte-1n6ht58"${$20.attr("value", manualSmallFast)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <label class="model-row svelte-1n6ht58"><span class="model-label svelte-1n6ht58">Default</span> <input type="text" name="defaultModel" class="image-input svelte-1n6ht58"${$20.attr("value", manualDefault)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <div class="model-save-row svelte-1n6ht58">`);
1199
+ Button($$renderer2, {
1200
+ type: "submit",
1201
+ disabled: savingManualModels,
1202
+ children: ($$renderer3) => {
1203
+ $$renderer3.push(`<!---->Save models`);
1204
+ },
1205
+ $$slots: { default: true }
1206
+ });
1207
+ $$renderer2.push(`<!----></div></div> `);
1208
+ if (manualModelsError) {
1209
+ $$renderer2.push("<!--[0-->");
1210
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$20.escape(manualModelsError)}</div>`);
1211
+ } else if (manualModelsMsg) {
1212
+ $$renderer2.push("<!--[1-->");
1213
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$20.escape(manualModelsMsg)}</div>`);
967
1214
  } else {
968
1215
  $$renderer2.push("<!--[-1-->");
969
1216
  }
@@ -972,13 +1219,13 @@ function SettingsView($$renderer, $$props) {
972
1219
  $$renderer2.push("<!--[-1-->");
973
1220
  }
974
1221
  $$renderer2.push(`<!--]--></section> <section class="card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/hostEnvVarsToggle"><div class="label svelte-1n6ht58">`);
975
- Variable($$renderer2, { size: 18 });
1222
+ Variable($$renderer2, { size: 20 });
976
1223
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Host environment variables</div> <div class="desc svelte-1n6ht58">Forward selected environment variables from this machine into every new container's
977
1224
  interactive shells. Values are read from this process's own environment at container
978
- start and are never shown here or stored \u2014 only the variable names are saved.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$17.attr("checked", hostEnvVars, true)}${$17.attr("disabled", savingHostEnvToggle, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1225
+ start and are never shown here or stored \u2014 only the variable names are saved.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$20.attr("checked", hostEnvVars, true)}${$20.attr("disabled", savingHostEnvToggle, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
979
1226
  if (hostEnvToggleError) {
980
1227
  $$renderer2.push("<!--[0-->");
981
- $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$17.escape(hostEnvToggleError)}</div></div>`);
1228
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$20.escape(hostEnvToggleError)}</div></div>`);
982
1229
  } else {
983
1230
  $$renderer2.push("<!--[-1-->");
984
1231
  }
@@ -986,18 +1233,18 @@ function SettingsView($$renderer, $$props) {
986
1233
  if (hostEnvVars) {
987
1234
  $$renderer2.push("<!--[0-->");
988
1235
  $$renderer2.push(`<div class="row divided var-row svelte-1n6ht58"><div class="var-list svelte-1n6ht58">`);
989
- const each_array = $17.ensure_array_like(hostEnvNames);
1236
+ const each_array = $20.ensure_array_like(hostEnvNames);
990
1237
  if (each_array.length !== 0) {
991
1238
  $$renderer2.push("<!--[-->");
992
1239
  for (let $$index_1 = 0, $$length = each_array.length;$$index_1 < $$length; $$index_1++) {
993
1240
  let name = each_array[$$index_1];
994
1241
  $$renderer2.push(`<form class="var-item svelte-1n6ht58" method="POST" action="?/hostEnvVarNames"><!--[-->`);
995
- const each_array_1 = $17.ensure_array_like(hostEnvNames.filter((n) => n !== name));
1242
+ const each_array_1 = $20.ensure_array_like(hostEnvNames.filter((n) => n !== name));
996
1243
  for (let $$index = 0, $$length2 = each_array_1.length;$$index < $$length2; $$index++) {
997
1244
  let other = each_array_1[$$index];
998
- $$renderer2.push(`<input type="hidden" name="names"${$17.attr("value", other)}/>`);
1245
+ $$renderer2.push(`<input type="hidden" name="names"${$20.attr("value", other)}/>`);
999
1246
  }
1000
- $$renderer2.push(`<!--]--> <span class="var-name svelte-1n6ht58">${$17.escape(name)}</span> <span${$17.attr_class("var-status svelte-1n6ht58", undefined, { present: hostEnvPresence[name] })}${$17.attr("title", hostEnvPresence[name] ? "Set on this host \u2014 will be injected" : "Not set on this host \u2014 will be skipped")}>${$17.escape(hostEnvPresence[name] ? "set" : "missing")}</span> <button type="submit" class="var-remove svelte-1n6ht58"${$17.attr("disabled", savingHostEnvNames, true)}${$17.attr("aria-label", `Remove ${name}`)}>`);
1247
+ $$renderer2.push(`<!--]--> <span class="var-name svelte-1n6ht58">${$20.escape(name)}</span> <span${$20.attr_class("var-status svelte-1n6ht58", undefined, { present: hostEnvPresence[name] })}${$20.attr("title", hostEnvPresence[name] ? "Set on this host \u2014 will be injected" : "Not set on this host \u2014 will be skipped")}>${$20.escape(hostEnvPresence[name] ? "set" : "missing")}</span> <button type="submit" class="var-remove svelte-1n6ht58"${$20.attr("disabled", savingHostEnvNames, true)}${$20.attr("aria-label", `Remove ${name}`)}>`);
1001
1248
  X($$renderer2, { size: 13 });
1002
1249
  $$renderer2.push(`<!----></button></form>`);
1003
1250
  }
@@ -1006,12 +1253,12 @@ function SettingsView($$renderer, $$props) {
1006
1253
  $$renderer2.push(`<div class="var-empty svelte-1n6ht58">No variables added yet.</div>`);
1007
1254
  }
1008
1255
  $$renderer2.push(`<!--]--></div> <form class="var-add svelte-1n6ht58" method="POST" action="?/hostEnvVarNames"><!--[-->`);
1009
- const each_array_2 = $17.ensure_array_like(hostEnvNames);
1256
+ const each_array_2 = $20.ensure_array_like(hostEnvNames);
1010
1257
  for (let $$index_2 = 0, $$length = each_array_2.length;$$index_2 < $$length; $$index_2++) {
1011
1258
  let name = each_array_2[$$index_2];
1012
- $$renderer2.push(`<input type="hidden" name="names"${$17.attr("value", name)}/>`);
1259
+ $$renderer2.push(`<input type="hidden" name="names"${$20.attr("value", name)}/>`);
1013
1260
  }
1014
- $$renderer2.push(`<!--]--> <input type="text" name="names" class="image-input svelte-1n6ht58"${$17.attr("value", newHostEnvName)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" placeholder="AWS_ACCESS_KEY_ID"/> `);
1261
+ $$renderer2.push(`<!--]--> <input type="text" name="names" class="image-input svelte-1n6ht58"${$20.attr("value", newHostEnvName)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" placeholder="AWS_ACCESS_KEY_ID"/> `);
1015
1262
  Button($$renderer2, {
1016
1263
  type: "submit",
1017
1264
  icon: Plus,
@@ -1024,10 +1271,10 @@ function SettingsView($$renderer, $$props) {
1024
1271
  $$renderer2.push(`<!----></form> `);
1025
1272
  if (hostEnvNamesError) {
1026
1273
  $$renderer2.push("<!--[0-->");
1027
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(hostEnvNamesError)}</div>`);
1274
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$20.escape(hostEnvNamesError)}</div>`);
1028
1275
  } else if (hostEnvNamesMsg) {
1029
1276
  $$renderer2.push("<!--[1-->");
1030
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(hostEnvNamesMsg)}</div>`);
1277
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$20.escape(hostEnvNamesMsg)}</div>`);
1031
1278
  } else {
1032
1279
  $$renderer2.push("<!--[-1-->");
1033
1280
  }
@@ -1036,13 +1283,37 @@ function SettingsView($$renderer, $$props) {
1036
1283
  $$renderer2.push("<!--[-1-->");
1037
1284
  }
1038
1285
  $$renderer2.push(`<!--]--></section> <section class="card svelte-1n6ht58"><div class="row svelte-1n6ht58"><div class="label svelte-1n6ht58">`);
1039
- Sun_moon($$renderer2, { size: 18 });
1286
+ Sun_moon($$renderer2, { size: 20 });
1040
1287
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Theme</div> <div class="desc svelte-1n6ht58">Light, dark, or follow the browser preference automatically (auto).</div></div></div> `);
1041
1288
  ThemePicker($$renderer2, {});
1042
1289
  $$renderer2.push(`<!----></div></section> <section class="card svelte-1n6ht58"><div class="row svelte-1n6ht58"><div class="label svelte-1n6ht58">`);
1043
- Volume_2($$renderer2, { size: 18 });
1044
- $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Attention sound</div> <div class="desc svelte-1n6ht58">Play a chime when an instance finishes a task or needs your input.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox"${$17.attr("checked", sound, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></div></section> <section class="card danger-card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/shutdown"><div class="label svelte-1n6ht58">`);
1045
- Power($$renderer2, { size: 18 });
1290
+ Volume_2($$renderer2, { size: 20 });
1291
+ $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Attention sound</div> <div class="desc svelte-1n6ht58">Play a chime when an instance finishes a task or needs your input.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox"${$20.attr("checked", sound, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></div></section> <section class="card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/petToggle"><div class="label svelte-1n6ht58">`);
1292
+ Paw_print($$renderer2, { size: 18 });
1293
+ $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Pet logo</div> <div class="desc svelte-1n6ht58">Swap the box in the header for a pixel pet.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$20.attr("checked", !!petArt, true)}${$20.attr("disabled", savingPet, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1294
+ if (petError) {
1295
+ $$renderer2.push("<!--[0-->");
1296
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$20.escape(petError)}</div></div>`);
1297
+ } else {
1298
+ $$renderer2.push("<!--[-1-->");
1299
+ }
1300
+ $$renderer2.push(`<!--]--> `);
1301
+ if (petArt) {
1302
+ $$renderer2.push("<!--[0-->");
1303
+ $$renderer2.push(`<div class="sub pets svelte-1n6ht58"><!--[-->`);
1304
+ const each_array_3 = $20.ensure_array_like(avatars);
1305
+ for (let $$index_3 = 0, $$length = each_array_3.length;$$index_3 < $$length; $$index_3++) {
1306
+ let art = each_array_3[$$index_3];
1307
+ $$renderer2.push(`<form method="POST" action="?/petChoose" class="svelte-1n6ht58"><input type="hidden" name="name"${$20.attr("value", art.name)}/> <button type="submit"${$20.attr_class("pet svelte-1n6ht58", undefined, { selected: art.name === petArt.name })}${$20.attr("disabled", savingPet, true)}${$20.attr("title", art.name)}${$20.attr("aria-label", art.name)}${$20.attr("aria-pressed", art.name === petArt.name)}>`);
1308
+ Avatar($$renderer2, { art, name: art.name, scale: 4 });
1309
+ $$renderer2.push(`<!----></button></form>`);
1310
+ }
1311
+ $$renderer2.push(`<!--]--></div>`);
1312
+ } else {
1313
+ $$renderer2.push("<!--[-1-->");
1314
+ }
1315
+ $$renderer2.push(`<!--]--></section> <section class="card danger-card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/shutdown"><div class="label svelte-1n6ht58">`);
1316
+ Power($$renderer2, { size: 20 });
1046
1317
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Delete database, containers, and shut down</div> <div class="desc svelte-1n6ht58">Stop and remove every instance and its container, delete all copied workspaces and the
1047
1318
  database, then shut down the server. This cannot be undone.</div></div></div> `);
1048
1319
  if (shuttingDown) {
@@ -1061,7 +1332,7 @@ function SettingsView($$renderer, $$props) {
1061
1332
  }
1062
1333
  $$renderer2.push(`<!--]--></form></section> `);
1063
1334
  CoinButton($$renderer2, {});
1064
- $$renderer2.push(`<!----> <div class="version svelte-1n6ht58">Codebay v${$17.escape(version)}</div></main></div> `);
1335
+ $$renderer2.push(`<!----> <div class="version svelte-1n6ht58">Codebay v${$20.escape(version)}</div></main></div> `);
1065
1336
  Toaster($$renderer2, {
1066
1337
  toastOptions: {
1067
1338
  style: "border:1px solid var(--ink); background:var(--bg-card); color:var(--ink); box-shadow:4px 4px 0 var(--ink); font-family:var(--font-mono); font-size:13px;"
@@ -1075,11 +1346,15 @@ function SettingsView($$renderer, $$props) {
1075
1346
  function Settings($$renderer, $$props) {
1076
1347
  $$renderer.component(($$renderer2) => {
1077
1348
  let {
1349
+ pet,
1078
1350
  defaultImage,
1079
1351
  builtinImage,
1080
1352
  disableBuildCache,
1081
1353
  copyIgnorePatterns,
1082
1354
  builtinCopyIgnore,
1355
+ gitIdentityEnabled,
1356
+ gitIdentityName,
1357
+ gitIdentityEmail,
1083
1358
  dockerArch,
1084
1359
  manualTokensEnabled,
1085
1360
  githubTokenSet,
@@ -1092,6 +1367,12 @@ function Settings($$renderer, $$props) {
1092
1367
  customEndpointHaikuModel,
1093
1368
  customEndpointSmallFastModel,
1094
1369
  customEndpointModel,
1370
+ manualModelOverrideEnabled,
1371
+ manualOpusModel,
1372
+ manualSonnetModel,
1373
+ manualHaikuModel,
1374
+ manualSmallFastModel,
1375
+ manualModel,
1095
1376
  hostEnvVarsEnabled,
1096
1377
  hostEnvVarNames,
1097
1378
  hostEnvVarPresence,
@@ -1099,7 +1380,7 @@ function Settings($$renderer, $$props) {
1099
1380
  } = $$props;
1100
1381
  if (true) {
1101
1382
  let failed = function($$renderer3, error) {
1102
- $$renderer3.push(`<mochi-island-failure data-component="SettingsView"${$18.attr("data-message", error.message)}></mochi-island-failure>`);
1383
+ $$renderer3.push(`<mochi-island-failure data-component="SettingsView"${$21.attr("data-message", error.message)}></mochi-island-failure>`);
1103
1384
  };
1104
1385
  $$renderer2.push("<!--[0-->");
1105
1386
  $$renderer2.boundary({ failed }, ($$renderer3) => {
@@ -1107,12 +1388,16 @@ function Settings($$renderer, $$props) {
1107
1388
  {
1108
1389
  HydratableBoundary($$renderer3, {
1109
1390
  children: ($$renderer4) => {
1110
- $$renderer4.push(`<mochi-hydratable-island component-name="SettingsView_8hmarwmf8onq" component-url="__MOCHI_COMPONENT_URL__SettingsView_8hmarwmf8onq__"${$18.attr("props-ref", emitIslandProps({
1391
+ $$renderer4.push(`<mochi-hydratable-island component-name="SettingsView_8hmarwmf8onq" component-url="__MOCHI_COMPONENT_URL__SettingsView_8hmarwmf8onq__"${$21.attr("props-ref", emitIslandProps({
1392
+ pet,
1111
1393
  defaultImage,
1112
1394
  builtinImage,
1113
1395
  disableBuildCache,
1114
1396
  copyIgnorePatterns,
1115
1397
  builtinCopyIgnore,
1398
+ gitIdentityEnabled,
1399
+ gitIdentityName,
1400
+ gitIdentityEmail,
1116
1401
  dockerArch,
1117
1402
  manualTokensEnabled,
1118
1403
  githubTokenSet,
@@ -1125,6 +1410,12 @@ function Settings($$renderer, $$props) {
1125
1410
  customEndpointHaikuModel,
1126
1411
  customEndpointSmallFastModel,
1127
1412
  customEndpointModel,
1413
+ manualModelOverrideEnabled,
1414
+ manualOpusModel,
1415
+ manualSonnetModel,
1416
+ manualHaikuModel,
1417
+ manualSmallFastModel,
1418
+ manualModel,
1128
1419
  hostEnvVarsEnabled,
1129
1420
  hostEnvVarNames,
1130
1421
  hostEnvVarPresence,
@@ -1133,11 +1424,15 @@ function Settings($$renderer, $$props) {
1133
1424
  $$renderer4.push(`<!--[-->`);
1134
1425
  {
1135
1426
  SettingsView($$renderer4, {
1427
+ pet,
1136
1428
  defaultImage,
1137
1429
  builtinImage,
1138
1430
  disableBuildCache,
1139
1431
  copyIgnorePatterns,
1140
1432
  builtinCopyIgnore,
1433
+ gitIdentityEnabled,
1434
+ gitIdentityName,
1435
+ gitIdentityEmail,
1141
1436
  dockerArch,
1142
1437
  manualTokensEnabled,
1143
1438
  githubTokenSet,
@@ -1150,6 +1445,12 @@ function Settings($$renderer, $$props) {
1150
1445
  customEndpointHaikuModel,
1151
1446
  customEndpointSmallFastModel,
1152
1447
  customEndpointModel,
1448
+ manualModelOverrideEnabled,
1449
+ manualOpusModel,
1450
+ manualSonnetModel,
1451
+ manualHaikuModel,
1452
+ manualSmallFastModel,
1453
+ manualModel,
1153
1454
  hostEnvVarsEnabled,
1154
1455
  hostEnvVarNames,
1155
1456
  hostEnvVarPresence,