codebay 0.9.0 → 0.10.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 (78) hide show
  1. package/.mochi/manifest.json +216 -149
  2. package/.mochi/svelte-client/HydratableIsland-aebn1fa1.js +1 -0
  3. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-rx6arrv5.js +2 -0
  4. package/.mochi/svelte-client/{_hydrate-AvatarsView_257s9yq1wwr4f-92hepzby.js → _hydrate-AvatarsView_257s9yq1wwr4f-jpjdmgpe.js} +1 -1
  5. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-c9y47dat.js +1 -0
  6. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-d61feq89.js +38 -0
  7. package/.mochi/svelte-client/{chunk-2j95sv83.js → chunk-0fjx3z3r.js} +1 -1
  8. package/.mochi/svelte-client/chunk-8xvr02wh.js +2 -0
  9. package/.mochi/svelte-client/{chunk-m497q88s.js → chunk-9143wy3j.js} +2 -2
  10. package/.mochi/svelte-client/{chunk-v65n8th6.js → chunk-bn731rda.js} +1 -1
  11. package/.mochi/svelte-client/{chunk-a2psjmrm.js → chunk-j72r8pkk.js} +2 -2
  12. package/.mochi/svelte-client/chunk-k37wj1jm.js +2 -0
  13. package/.mochi/svelte-client/{chunk-mpv3qx28.js → chunk-p20tkpde.js} +1 -1
  14. package/.mochi/svelte-client/chunk-pc0fm37c.js +2 -0
  15. package/.mochi/svelte-client/{chunk-6rbs0mhx.js → chunk-t0ap7q89.js} +1 -1
  16. package/.mochi/svelte-client/{chunk-rs41by6w.js → chunk-wvtkwfsh.js} +1 -1
  17. package/.mochi/svelte-compile/{App-7vjcp38v.server.js → App-59cdj86f.server.js} +167 -103
  18. package/.mochi/svelte-compile/{Avatars-e2cfc95t.server.js → Avatars-fmagfyj2.server.js} +1 -1
  19. package/.mochi/svelte-compile/{Instance-h78n2dsv.server.js → Instance-s1gqwzmx.server.js} +16 -10
  20. package/.mochi/svelte-compile/{Settings-tav2asn7.server.js → Settings-k447mt0x.server.js} +540 -88
  21. package/.mochi/svelte-compile/{chunk-brjv9pyd.js → chunk-3t7v4hk0.js} +1 -7
  22. package/.mochi/svelte-compile/chunk-gkjgybb2.js +15 -0
  23. package/.mochi/svelte-compile/{chunk-m8ygpyhr.js → chunk-th2dbqvc.js} +20 -32
  24. package/.mochi/svelte-css/Button-oharop2xz6am.css +1 -0
  25. package/.mochi/svelte-css/IdeBar-3bgr3m5z0lpeg.css +1 -0
  26. package/.mochi/svelte-css/{InstanceView-3vzow3ttxzlh3.css → InstanceView-1pd7j16bd2b16.css} +1 -1
  27. package/.mochi/svelte-css/SettingsView-n3oy75uonzp2.css +1 -0
  28. package/.mochi/svelte-css/{TopBar-2q87li6yt8ids.css → TopBar-2y76zxwehrfos.css} +1 -1
  29. package/migrations/0007_instance_avatar.sql +1 -0
  30. package/package.json +2 -2
  31. package/src/avatars/diamond.ts +5 -6
  32. package/src/avatars/index.ts +1 -16
  33. package/src/avatars/pick.server.ts +25 -0
  34. package/src/avatars/whale.ts +7 -8
  35. package/src/components/AppShell.svelte +29 -4
  36. package/src/components/Avatar.svelte +8 -8
  37. package/src/components/Button.svelte +22 -1
  38. package/src/components/DashboardView.svelte +14 -2
  39. package/src/components/FolderBrowser.svelte +6 -2
  40. package/src/components/IdeBar.svelte +56 -13
  41. package/src/components/IdeLoader.svelte +15 -3
  42. package/src/components/InstanceCard.svelte +6 -1
  43. package/src/components/InstanceView.svelte +33 -15
  44. package/src/components/SettingsView.svelte +548 -1
  45. package/src/components/TopBar.svelte +37 -10
  46. package/src/components/UiShowcase.svelte +5 -10
  47. package/src/container-injections/claude-aliases.ts +1 -1
  48. package/src/container-injections/claude-code-custom.ts +2 -1
  49. package/src/container-injections/claude-code-ide-extension.ts +5 -0
  50. package/src/container-injections/claude-code-install.ts +67 -0
  51. package/src/container-injections/claude-code-models.ts +2 -1
  52. package/src/container-injections/claude-code-update.ts +62 -1
  53. package/src/container-injections/claude-effort-level.ts +32 -0
  54. package/src/container-injections/claude-permission-mode.ts +40 -0
  55. package/src/container-injections/custom-env-vars.ts +82 -0
  56. package/src/container-injections/host-env-vars.ts +2 -1
  57. package/src/lib/config.server.ts +3 -0
  58. package/src/lib/db.server.ts +8 -3
  59. package/src/lib/devcontainer.server.ts +182 -47
  60. package/src/lib/health.server.ts +55 -11
  61. package/src/lib/injections.server.ts +46 -36
  62. package/src/lib/instances.server.ts +185 -19
  63. package/src/lib/log-capture.server.ts +262 -0
  64. package/src/lib/ports.server.ts +31 -0
  65. package/src/lib/proxy.server.ts +21 -76
  66. package/src/pages/Settings.svelte +22 -1
  67. package/src/routes.ts +98 -2
  68. package/src/types.ts +36 -0
  69. package/.mochi/svelte-client/HydratableIsland-k6q8esj4.js +0 -1
  70. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-sg96rp17.js +0 -2
  71. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-p3f649gk.js +0 -1
  72. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-dzmgmv78.js +0 -29
  73. package/.mochi/svelte-client/chunk-7wkvn2vx.js +0 -2
  74. package/.mochi/svelte-client/chunk-m4fzsd5b.js +0 -2
  75. package/.mochi/svelte-css/Button-2vtbrzb5kgu25.css +0 -1
  76. package/.mochi/svelte-css/IdeBar-10xodudcx57qr.css +0 -1
  77. package/.mochi/svelte-css/SettingsView-2qfauz68axro1.css +0 -1
  78. package/src/container-injections/claude-skip-permissions.ts +0 -28
@@ -8,6 +8,10 @@ import {
8
8
  soundEnabled,
9
9
  unlockAudio
10
10
  } from "./chunk-bpqwf1nw.js";
11
+ import {
12
+ CLAUDE_EFFORT_LEVELS,
13
+ CLAUDE_PERMISSION_MODES
14
+ } from "./chunk-gkjgybb2.js";
11
15
  import {
12
16
  Rotate_ccw
13
17
  } from "./chunk-jx6h1xzp.js";
@@ -18,7 +22,7 @@ import {
18
22
  Toaster,
19
23
  avatars,
20
24
  findAvatar
21
- } from "./chunk-m8ygpyhr.js";
25
+ } from "./chunk-th2dbqvc.js";
22
26
  import {
23
27
  HydratableBoundary,
24
28
  Icon,
@@ -30,11 +34,11 @@ import"./chunk-xpt1a7jm.js";
30
34
 
31
35
  // src/pages/Settings.svelte
32
36
  import"svelte/internal/flags/async";
33
- import * as $20 from "svelte/internal/server";
37
+ import * as $27 from "svelte/internal/server";
34
38
 
35
39
  // src/components/SettingsView.svelte
36
40
  import"svelte/internal/flags/async";
37
- import * as $19 from "svelte/internal/server";
41
+ import * as $26 from "svelte/internal/server";
38
42
 
39
43
  // node_modules/@lucide/svelte/dist/icons/container.svelte
40
44
  import"svelte/internal/flags/async";
@@ -373,12 +377,123 @@ function Variable($$renderer, $$props) {
373
377
  ];
374
378
  Icon($$renderer, $17.spread_props([{ name: "variable" }, props, { iconNode }]));
375
379
  }
380
+ // node_modules/@lucide/svelte/dist/icons/key-square.svelte
381
+ import"svelte/internal/flags/async";
382
+ import * as $18 from "svelte/internal/server";
383
+ function Key_square($$renderer, $$props) {
384
+ let { $$slots, $$events, ...props } = $$props;
385
+ const iconNode = [
386
+ [
387
+ "path",
388
+ {
389
+ d: "M12.4 2.7a2.5 2.5 0 0 1 3.4 0l5.5 5.5a2.5 2.5 0 0 1 0 3.4l-3.7 3.7a2.5 2.5 0 0 1-3.4 0L8.7 9.8a2.5 2.5 0 0 1 0-3.4z"
390
+ }
391
+ ],
392
+ ["path", { d: "m14 7 3 3" }],
393
+ [
394
+ "path",
395
+ {
396
+ d: "m9.4 10.6-6.814 6.814A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814"
397
+ }
398
+ ]
399
+ ];
400
+ Icon($$renderer, $18.spread_props([{ name: "key-square" }, props, { iconNode }]));
401
+ }
402
+ // node_modules/@lucide/svelte/dist/icons/sliders-horizontal.svelte
403
+ import"svelte/internal/flags/async";
404
+ import * as $19 from "svelte/internal/server";
405
+ function Sliders_horizontal($$renderer, $$props) {
406
+ let { $$slots, $$events, ...props } = $$props;
407
+ const iconNode = [
408
+ ["path", { d: "M10 5H3" }],
409
+ ["path", { d: "M12 19H3" }],
410
+ ["path", { d: "M14 3v4" }],
411
+ ["path", { d: "M16 17v4" }],
412
+ ["path", { d: "M21 12h-9" }],
413
+ ["path", { d: "M21 19h-5" }],
414
+ ["path", { d: "M21 5h-7" }],
415
+ ["path", { d: "M8 10v4" }],
416
+ ["path", { d: "M8 12H3" }]
417
+ ];
418
+ Icon($$renderer, $19.spread_props([{ name: "sliders-horizontal" }, props, { iconNode }]));
419
+ }
420
+ // node_modules/@lucide/svelte/dist/icons/list-ordered.svelte
421
+ import"svelte/internal/flags/async";
422
+ import * as $20 from "svelte/internal/server";
423
+ function List_ordered($$renderer, $$props) {
424
+ let { $$slots, $$events, ...props } = $$props;
425
+ const iconNode = [
426
+ ["path", { d: "M11 5h10" }],
427
+ ["path", { d: "M11 12h10" }],
428
+ ["path", { d: "M11 19h10" }],
429
+ ["path", { d: "M4 4h1v5" }],
430
+ ["path", { d: "M4 9h2" }],
431
+ [
432
+ "path",
433
+ {
434
+ d: "M6.5 20H3.4c0-1 2.6-1.925 2.6-3.5a1.5 1.5 0 0 0-2.6-1.02"
435
+ }
436
+ ]
437
+ ];
438
+ Icon($$renderer, $20.spread_props([{ name: "list-ordered" }, props, { iconNode }]));
439
+ }
440
+ // node_modules/@lucide/svelte/dist/icons/boxes.svelte
441
+ import"svelte/internal/flags/async";
442
+ import * as $21 from "svelte/internal/server";
443
+ function Boxes($$renderer, $$props) {
444
+ let { $$slots, $$events, ...props } = $$props;
445
+ const iconNode = [
446
+ [
447
+ "path",
448
+ {
449
+ d: "M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z"
450
+ }
451
+ ],
452
+ ["path", { d: "m7 16.5-4.74-2.85" }],
453
+ ["path", { d: "m7 16.5 5-3" }],
454
+ ["path", { d: "M7 16.5v5.17" }],
455
+ [
456
+ "path",
457
+ {
458
+ d: "M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z"
459
+ }
460
+ ],
461
+ ["path", { d: "m17 16.5-5-3" }],
462
+ ["path", { d: "m17 16.5 4.74-2.85" }],
463
+ ["path", { d: "M17 16.5v5.17" }],
464
+ [
465
+ "path",
466
+ {
467
+ d: "M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z"
468
+ }
469
+ ],
470
+ ["path", { d: "M12 8 7.26 5.15" }],
471
+ ["path", { d: "m12 8 4.74-2.85" }],
472
+ ["path", { d: "M12 13.5V8" }]
473
+ ];
474
+ Icon($$renderer, $21.spread_props([{ name: "boxes" }, props, { iconNode }]));
475
+ }
476
+ // node_modules/@lucide/svelte/dist/icons/puzzle.svelte
477
+ import"svelte/internal/flags/async";
478
+ import * as $22 from "svelte/internal/server";
479
+ function Puzzle($$renderer, $$props) {
480
+ let { $$slots, $$events, ...props } = $$props;
481
+ const iconNode = [
482
+ [
483
+ "path",
484
+ {
485
+ d: "M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z"
486
+ }
487
+ ]
488
+ ];
489
+ Icon($$renderer, $22.spread_props([{ name: "puzzle" }, props, { iconNode }]));
490
+ }
376
491
  // src/components/SettingsView.svelte
377
492
  import { flushSync } from "svelte";
378
493
 
379
494
  // src/components/CoinButton.svelte
380
495
  import"svelte/internal/flags/async";
381
- import * as $18 from "svelte/internal/server";
496
+ import * as $23 from "svelte/internal/server";
382
497
  function CoinButton($$renderer, $$props) {
383
498
  let { href = "/avatars" } = $$props;
384
499
  const coinArt = {
@@ -394,17 +509,46 @@ function CoinButton($$renderer, $$props) {
394
509
  "..####.."
395
510
  ]
396
511
  };
397
- $$renderer.push(`<div class="coin-row svelte-1ioj7vz"><span class="pixel-line svelte-1ioj7vz" aria-hidden="true"></span> <a class="coin-btn svelte-1ioj7vz"${$18.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">`);
512
+ $$renderer.push(`<div class="coin-row svelte-1ioj7vz"><span class="pixel-line svelte-1ioj7vz" aria-hidden="true"></span> <a class="coin-btn svelte-1ioj7vz"${$23.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">`);
398
513
  Avatar($$renderer, { art: coinArt, name: "coin", scale: 3 });
399
514
  $$renderer.push(`<!----></span></a> <span class="pixel-line svelte-1ioj7vz" aria-hidden="true"></span></div>`);
400
515
  }
401
516
 
517
+ // node_modules/@lucide/svelte/dist/icons/shield-check.svelte
518
+ import"svelte/internal/flags/async";
519
+ import * as $24 from "svelte/internal/server";
520
+ function Shield_check($$renderer, $$props) {
521
+ let { $$slots, $$events, ...props } = $$props;
522
+ const iconNode = [
523
+ [
524
+ "path",
525
+ {
526
+ d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"
527
+ }
528
+ ],
529
+ ["path", { d: "m9 12 2 2 4-4" }]
530
+ ];
531
+ Icon($$renderer, $24.spread_props([{ name: "shield-check" }, props, { iconNode }]));
532
+ }
533
+ // node_modules/@lucide/svelte/dist/icons/gauge.svelte
534
+ import"svelte/internal/flags/async";
535
+ import * as $25 from "svelte/internal/server";
536
+ function Gauge($$renderer, $$props) {
537
+ let { $$slots, $$events, ...props } = $$props;
538
+ const iconNode = [
539
+ ["path", { d: "m12 14 4-4" }],
540
+ ["path", { d: "M3.34 19a10 10 0 1 1 17.32 0" }]
541
+ ];
542
+ Icon($$renderer, $25.spread_props([{ name: "gauge" }, props, { iconNode }]));
543
+ }
402
544
  // src/components/SettingsView.svelte
403
545
  function SettingsView($$renderer, $$props) {
404
546
  $$renderer.component(($$renderer2) => {
405
547
  let {
406
548
  pet,
407
549
  defaultMode,
550
+ claudePermissionMode,
551
+ claudeEffortLevel,
408
552
  defaultImage,
409
553
  builtinImage,
410
554
  disableBuildCache,
@@ -434,6 +578,11 @@ function SettingsView($$renderer, $$props) {
434
578
  hostEnvVarsEnabled,
435
579
  hostEnvVarNames,
436
580
  hostEnvVarPresence,
581
+ customEnvVarsEnabled,
582
+ customEnvVarNames,
583
+ advancedSerialInjections,
584
+ advancedNoBuildkit,
585
+ advancedBlockingExtInstall,
437
586
  version
438
587
  } = $$props;
439
588
  let sound = soundEnabled();
@@ -499,6 +648,57 @@ function SettingsView($$renderer, $$props) {
499
648
  flushSync(() => modeChoice = next);
500
649
  modeFormEl?.requestSubmit();
501
650
  }
651
+ let permissionChoice = claudePermissionMode;
652
+ let savingPermission = false;
653
+ let permissionError = null;
654
+ let permissionFormEl;
655
+ const permissionModeOpts = saveOpts({
656
+ setSaving: (v) => savingPermission = v,
657
+ setError: (v) => permissionError = v,
658
+ setMsg: () => {},
659
+ onSuccess: (data) => {
660
+ if (data?.mode)
661
+ permissionChoice = data.mode;
662
+ }
663
+ });
664
+ const PERMISSION_LABELS = {
665
+ default: "Default",
666
+ manual: "Manual",
667
+ auto: "Auto",
668
+ plan: "Plan"
669
+ };
670
+ function choosePermissionMode(next) {
671
+ if (next === permissionChoice)
672
+ return;
673
+ flushSync(() => permissionChoice = next);
674
+ permissionFormEl?.requestSubmit();
675
+ }
676
+ let effortChoice = claudeEffortLevel;
677
+ let savingEffort = false;
678
+ let effortError = null;
679
+ let effortFormEl;
680
+ const effortLevelOpts = saveOpts({
681
+ setSaving: (v) => savingEffort = v,
682
+ setError: (v) => effortError = v,
683
+ setMsg: () => {},
684
+ onSuccess: (data) => {
685
+ if (data?.level)
686
+ effortChoice = data.level;
687
+ }
688
+ });
689
+ const EFFORT_LABELS = {
690
+ low: "Low",
691
+ medium: "Medium",
692
+ high: "High",
693
+ xhigh: "X-High",
694
+ max: "Max"
695
+ };
696
+ function chooseEffort(next) {
697
+ if (next === effortChoice)
698
+ return;
699
+ flushSync(() => effortChoice = next);
700
+ effortFormEl?.requestSubmit();
701
+ }
502
702
  let image = defaultImage;
503
703
  let savingImage = false;
504
704
  let imageError = null;
@@ -597,6 +797,41 @@ function SettingsView($$renderer, $$props) {
597
797
  rebuildMsg = n === 0 ? "No running containers to rebuild." : `Rebuilding ${n} container(s)\u2026`;
598
798
  }
599
799
  });
800
+ let serialInjections = advancedSerialInjections;
801
+ let savingSerial = false;
802
+ let serialError = null;
803
+ const serialOpts = toggleOpts({
804
+ set: (v) => serialInjections = v,
805
+ setSaving: (v) => savingSerial = v,
806
+ setError: (v) => serialError = v
807
+ });
808
+ let noBuildkit = advancedNoBuildkit;
809
+ let savingBuildkit = false;
810
+ let buildkitError = null;
811
+ const buildkitOpts = toggleOpts({
812
+ set: (v) => noBuildkit = v,
813
+ setSaving: (v) => savingBuildkit = v,
814
+ setError: (v) => buildkitError = v
815
+ });
816
+ let blockingExtInstall = advancedBlockingExtInstall;
817
+ let savingBlocking = false;
818
+ let blockingError = null;
819
+ const blockingOpts = toggleOpts({
820
+ set: (v) => blockingExtInstall = v,
821
+ setSaving: (v) => savingBlocking = v,
822
+ setError: (v) => blockingError = v
823
+ });
824
+ let clearingVer = false;
825
+ let verMsg = null;
826
+ let verError = null;
827
+ const clearVersionOpts = saveOpts({
828
+ setSaving: (v) => clearingVer = v,
829
+ setError: (v) => verError = v,
830
+ setMsg: (v) => verMsg = v,
831
+ onSuccess: () => {
832
+ verMsg = "Cleared \u2014 the next instance boot re-checks the registry.";
833
+ }
834
+ });
600
835
  let manualTokens = manualTokensEnabled;
601
836
  let savingManualToggle = false;
602
837
  let manualToggleError = null;
@@ -718,7 +953,7 @@ function SettingsView($$renderer, $$props) {
718
953
  manualModelsMsg = "Saved.";
719
954
  }
720
955
  });
721
- let litellmBlocker = $19.derived(() => manualTokens ? "Set tokens manually" : manualModelOverride ? "Override models manually" : null);
956
+ let litellmBlocker = $26.derived(() => manualTokens ? "Set tokens manually" : manualModelOverride ? "Override models manually" : null);
722
957
  let hostEnvVars = hostEnvVarsEnabled;
723
958
  let savingHostEnvToggle = false;
724
959
  let hostEnvToggleError = null;
@@ -786,6 +1021,62 @@ function SettingsView($$renderer, $$props) {
786
1021
  }
787
1022
  });
788
1023
  }
1024
+ let customEnvEnabled = customEnvVarsEnabled;
1025
+ let savingCustomEnvToggle = false;
1026
+ let customEnvToggleError = null;
1027
+ const customEnvVarsToggleOpts = toggleOpts({
1028
+ set: (v) => customEnvEnabled = v,
1029
+ setSaving: (v) => savingCustomEnvToggle = v,
1030
+ setError: (v) => customEnvToggleError = v
1031
+ });
1032
+ let customEnvNames = [...customEnvVarNames];
1033
+ let newCustomEnvName = "";
1034
+ let newCustomEnvValue = "";
1035
+ let savingCustomEnv = false;
1036
+ let customEnvMsg = null;
1037
+ let customEnvError = null;
1038
+ const addCustomEnvOpts = {
1039
+ onPending: (v) => savingCustomEnv = v,
1040
+ submit: ({ formData, cancel }) => {
1041
+ customEnvError = null;
1042
+ customEnvMsg = null;
1043
+ const name = String(formData.get("name") ?? "").trim();
1044
+ const value = String(formData.get("value") ?? "");
1045
+ if (!name || !value) {
1046
+ customEnvError = !name ? "Name is required." : "Value is required.";
1047
+ cancel();
1048
+ return;
1049
+ }
1050
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
1051
+ customEnvError = `Invalid variable name: ${name}`;
1052
+ cancel();
1053
+ return;
1054
+ }
1055
+ formData.set("name", name);
1056
+ return ({ result }) => {
1057
+ if (result.type === "success") {
1058
+ customEnvNames = result.data?.names ?? customEnvNames;
1059
+ newCustomEnvName = "";
1060
+ newCustomEnvValue = "";
1061
+ customEnvMsg = "Saved.";
1062
+ } else if (result.type === "failure") {
1063
+ customEnvError = result.data?.error ?? "Request failed";
1064
+ } else if (result.type === "error") {
1065
+ customEnvError = "Network error. Try again.";
1066
+ }
1067
+ };
1068
+ }
1069
+ };
1070
+ function removeCustomEnvOpts(name) {
1071
+ return saveOpts({
1072
+ setSaving: (v) => savingCustomEnv = v,
1073
+ setError: (v) => customEnvError = v,
1074
+ setMsg: (v) => customEnvMsg = v,
1075
+ onSuccess: (data) => {
1076
+ customEnvNames = data?.names ?? customEnvNames.filter((n) => n !== name);
1077
+ }
1078
+ });
1079
+ }
789
1080
  function toggleSound(on) {
790
1081
  sound = on;
791
1082
  setSoundEnabled(on);
@@ -834,14 +1125,47 @@ function SettingsView($$renderer, $$props) {
834
1125
  $$renderer2.push(`<!----> <main class="content svelte-1n6ht58"><section class="card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/defaultMode"><div class="label svelte-1n6ht58">`);
835
1126
  Terminal($$renderer2, { size: 20 });
836
1127
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Default editor</div> <div class="desc svelte-1n6ht58">What new instances start in. <strong>Full IDE</strong> serves browser VS Code; <strong>Terminal</strong> is lighter \u2014 just Claude Code in a terminal, no code-server. You
837
- can override this per instance when creating one.</div></div></div> <input type="hidden" name="mode"${$19.attr("value", modeChoice)}/> <div class="mode-toggle svelte-1n6ht58" role="group" aria-label="Default editor mode"><button type="button"${$19.attr_class("mode-btn svelte-1n6ht58", undefined, { active: modeChoice === "ide" })}${$19.attr("aria-pressed", modeChoice === "ide")}${$19.attr("disabled", savingMode, true)}>`);
1128
+ can override this per instance when creating one.</div></div></div> <input type="hidden" name="mode"${$26.attr("value", modeChoice)}/> <div class="mode-toggle svelte-1n6ht58" role="group" aria-label="Default editor mode"><button type="button"${$26.attr_class("mode-btn svelte-1n6ht58", undefined, { active: modeChoice === "ide" })}${$26.attr("aria-pressed", modeChoice === "ide")}${$26.attr("disabled", savingMode, true)}>`);
838
1129
  Layout_template($$renderer2, { size: 15 });
839
- $$renderer2.push(`<!----> Full IDE</button> <button type="button"${$19.attr_class("mode-btn svelte-1n6ht58", undefined, { active: modeChoice === "terminal" })}${$19.attr("aria-pressed", modeChoice === "terminal")}${$19.attr("disabled", savingMode, true)}>`);
1130
+ $$renderer2.push(`<!----> Full IDE</button> <button type="button"${$26.attr_class("mode-btn svelte-1n6ht58", undefined, { active: modeChoice === "terminal" })}${$26.attr("aria-pressed", modeChoice === "terminal")}${$26.attr("disabled", savingMode, true)}>`);
840
1131
  Terminal($$renderer2, { size: 15 });
841
1132
  $$renderer2.push(`<!----> Terminal</button></div></form> `);
842
1133
  if (modeError) {
843
1134
  $$renderer2.push("<!--[0-->");
844
- $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$19.escape(modeError)}</div></div>`);
1135
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(modeError)}</div></div>`);
1136
+ } else {
1137
+ $$renderer2.push("<!--[-1-->");
1138
+ }
1139
+ $$renderer2.push(`<!--]--></section> <section class="card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/claudePermissionMode"><div class="label svelte-1n6ht58">`);
1140
+ Shield_check($$renderer2, { size: 20 });
1141
+ $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Claude permission mode</div> <div class="desc svelte-1n6ht58">The mode Claude Code starts in inside new instances. <strong>Default</strong> runs <code class="svelte-1n6ht58">--dangerously-skip-permissions</code>, which never prompts; the other three pass <code class="svelte-1n6ht58">--permission-mode</code> instead, because the skip flag overrides them. Applies on
1142
+ create and rebuild, not to already-running instances.</div></div></div> <input type="hidden" name="mode"${$26.attr("value", permissionChoice)}/> <div class="mode-toggle svelte-1n6ht58" role="group" aria-label="Claude permission mode"><!--[-->`);
1143
+ const each_array = $26.ensure_array_like(CLAUDE_PERMISSION_MODES);
1144
+ for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
1145
+ let option = each_array[$$index];
1146
+ $$renderer2.push(`<button type="button"${$26.attr_class("mode-btn svelte-1n6ht58", undefined, { active: permissionChoice === option })}${$26.attr("aria-pressed", permissionChoice === option)}${$26.attr("disabled", savingPermission, true)}>${$26.escape(PERMISSION_LABELS[option])}</button>`);
1147
+ }
1148
+ $$renderer2.push(`<!--]--></div></form> `);
1149
+ if (permissionError) {
1150
+ $$renderer2.push("<!--[0-->");
1151
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(permissionError)}</div></div>`);
1152
+ } else {
1153
+ $$renderer2.push("<!--[-1-->");
1154
+ }
1155
+ $$renderer2.push(`<!--]--></section> <section class="card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/claudeEffortLevel"><div class="label svelte-1n6ht58">`);
1156
+ Gauge($$renderer2, { size: 20 });
1157
+ $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Claude effort level</div> <div class="desc svelte-1n6ht58">The default reasoning effort Claude Code starts new sessions at inside instances,
1158
+ written to <code class="svelte-1n6ht58">~/.claude/settings.json</code>. Applies on create and rebuild, not to
1159
+ already-running instances.</div></div></div> <input type="hidden" name="level"${$26.attr("value", effortChoice)}/> <div class="mode-toggle svelte-1n6ht58" role="group" aria-label="Claude effort level"><!--[-->`);
1160
+ const each_array_1 = $26.ensure_array_like(CLAUDE_EFFORT_LEVELS);
1161
+ for (let $$index_1 = 0, $$length = each_array_1.length;$$index_1 < $$length; $$index_1++) {
1162
+ let option = each_array_1[$$index_1];
1163
+ $$renderer2.push(`<button type="button"${$26.attr_class("mode-btn svelte-1n6ht58", undefined, { active: effortChoice === option })}${$26.attr("aria-pressed", effortChoice === option)}${$26.attr("disabled", savingEffort, true)}>${$26.escape(EFFORT_LABELS[option])}</button>`);
1164
+ }
1165
+ $$renderer2.push(`<!--]--></div></form> `);
1166
+ if (effortError) {
1167
+ $$renderer2.push("<!--[0-->");
1168
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(effortError)}</div></div>`);
845
1169
  } else {
846
1170
  $$renderer2.push("<!--[-1-->");
847
1171
  }
@@ -850,12 +1174,12 @@ function SettingsView($$renderer, $$props) {
850
1174
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Default container image `);
851
1175
  if (dockerArch) {
852
1176
  $$renderer2.push("<!--[0-->");
853
- $$renderer2.push(`<span class="arch svelte-1n6ht58" title="Docker daemon architecture">${$19.escape(dockerArch)}</span>`);
1177
+ $$renderer2.push(`<span class="arch svelte-1n6ht58" title="Docker daemon architecture">${$26.escape(dockerArch)}</span>`);
854
1178
  } else {
855
1179
  $$renderer2.push("<!--[-1-->");
856
1180
  }
857
1181
  $$renderer2.push(`<!--]--></div> <div class="desc svelte-1n6ht58">Used only when a project folder ships no devcontainer.json. Takes effect for instances
858
- created from now on.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="text" name="image" class="image-input svelte-1n6ht58"${$19.attr("value", image)} spellcheck="false" autocapitalize="off" autocorrect="off" placeholder="mcr.microsoft.com/devcontainers/base:ubuntu"/> `);
1182
+ created from now on.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="text" name="image" class="image-input svelte-1n6ht58"${$26.attr("value", image)} spellcheck="false" autocapitalize="off" autocorrect="off" placeholder="mcr.microsoft.com/devcontainers/base:ubuntu"/> `);
859
1183
  Button($$renderer2, {
860
1184
  type: "submit",
861
1185
  disabled: savingImage,
@@ -870,14 +1194,14 @@ function SettingsView($$renderer, $$props) {
870
1194
  icon: Rotate_ccw,
871
1195
  disabled: savingImage,
872
1196
  onclick: resetImage,
873
- title: `Reset to default (${$19.stringify(builtinImage)})`,
1197
+ title: `Reset to default (${$26.stringify(builtinImage)})`,
874
1198
  "aria-label": "Reset to default image"
875
1199
  });
876
1200
  $$renderer2.push(`<!----></div> <div class="desc tip svelte-1n6ht58">`);
877
1201
  if (dockerArch) {
878
1202
  $$renderer2.push("<!--[0-->");
879
- $$renderer2.push(`Your Docker daemon runs on <strong>${$19.escape(dockerArch)}</strong> \u2014 pick an image that publishes
880
- an <strong>${$19.escape(dockerArch)}</strong> manifest, or the pull will fail.`);
1203
+ $$renderer2.push(`Your Docker daemon runs on <strong>${$26.escape(dockerArch)}</strong> \u2014 pick an image that publishes
1204
+ an <strong>${$26.escape(dockerArch)}</strong> manifest, or the pull will fail.`);
881
1205
  } else {
882
1206
  $$renderer2.push("<!--[-1-->");
883
1207
  $$renderer2.push(`Pick an image whose manifest covers your Docker daemon's architecture, or the pull will
@@ -886,7 +1210,7 @@ function SettingsView($$renderer, $$props) {
886
1210
  $$renderer2.push(`<!--]--></div> `);
887
1211
  if (imageError) {
888
1212
  $$renderer2.push("<!--[0-->");
889
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$19.escape(imageError)}</div>`);
1213
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(imageError)}</div>`);
890
1214
  } else if (imageSaved) {
891
1215
  $$renderer2.push("<!--[1-->");
892
1216
  $$renderer2.push(`<div class="msg ok svelte-1n6ht58">Saved.</div>`);
@@ -897,7 +1221,7 @@ function SettingsView($$renderer, $$props) {
897
1221
  Folder_minus($$renderer2, { size: 20 });
898
1222
  $$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
899
1223
  new instance's workspace. Leave blank to copy everything. Only applies to local
900
- 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"${$19.attr("value", copyIgnore)} spellcheck="false" autocapitalize="off" autocorrect="off" placeholder="node_modules, .venv, dist"/> `);
1224
+ 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"${$26.attr("value", copyIgnore)} spellcheck="false" autocapitalize="off" autocorrect="off" placeholder="node_modules, .venv, dist"/> `);
901
1225
  Button($$renderer2, {
902
1226
  type: "submit",
903
1227
  disabled: savingCopyIgnore,
@@ -912,13 +1236,13 @@ function SettingsView($$renderer, $$props) {
912
1236
  icon: Rotate_ccw,
913
1237
  disabled: savingCopyIgnore,
914
1238
  onclick: resetCopyIgnore,
915
- title: `Reset to default (${$19.stringify(builtinCopyIgnore)})`,
1239
+ title: `Reset to default (${$26.stringify(builtinCopyIgnore)})`,
916
1240
  "aria-label": "Reset to default copy-ignore patterns"
917
1241
  });
918
1242
  $$renderer2.push(`<!----></div> `);
919
1243
  if (copyIgnoreError) {
920
1244
  $$renderer2.push("<!--[0-->");
921
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$19.escape(copyIgnoreError)}</div>`);
1245
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(copyIgnoreError)}</div>`);
922
1246
  } else if (copyIgnoreSaved) {
923
1247
  $$renderer2.push("<!--[1-->");
924
1248
  $$renderer2.push(`<div class="msg ok svelte-1n6ht58">Saved.</div>`);
@@ -929,10 +1253,10 @@ function SettingsView($$renderer, $$props) {
929
1253
  User_cog($$renderer2, { size: 20 });
930
1254
  $$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
931
1255
  new container, taking precedence over the host's own git config. When off, each container
932
- falls back to the host's identity.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$19.attr("checked", gitIdentity, true)}${$19.attr("disabled", savingGitToggle, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1256
+ falls back to the host's identity.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$26.attr("checked", gitIdentity, true)}${$26.attr("disabled", savingGitToggle, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
933
1257
  if (gitToggleError) {
934
1258
  $$renderer2.push("<!--[0-->");
935
- $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$19.escape(gitToggleError)}</div></div>`);
1259
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(gitToggleError)}</div></div>`);
936
1260
  } else {
937
1261
  $$renderer2.push("<!--[-1-->");
938
1262
  }
@@ -940,7 +1264,7 @@ function SettingsView($$renderer, $$props) {
940
1264
  if (gitIdentity) {
941
1265
  $$renderer2.push("<!--[0-->");
942
1266
  $$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
943
- 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"${$19.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"${$19.attr("value", gitEmail)} spellcheck="false" autocapitalize="off" autocorrect="off" placeholder="jane@example.com"/></label> <div class="model-save-row svelte-1n6ht58">`);
1267
+ 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"${$26.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"${$26.attr("value", gitEmail)} spellcheck="false" autocapitalize="off" autocorrect="off" placeholder="jane@example.com"/></label> <div class="model-save-row svelte-1n6ht58">`);
944
1268
  Button($$renderer2, {
945
1269
  type: "submit",
946
1270
  disabled: savingGitIdentity,
@@ -952,7 +1276,7 @@ function SettingsView($$renderer, $$props) {
952
1276
  $$renderer2.push(`<!----></div></div> `);
953
1277
  if (gitIdentityError) {
954
1278
  $$renderer2.push("<!--[0-->");
955
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$19.escape(gitIdentityError)}</div>`);
1279
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(gitIdentityError)}</div>`);
956
1280
  } else if (gitIdentitySaved) {
957
1281
  $$renderer2.push("<!--[1-->");
958
1282
  $$renderer2.push(`<div class="msg ok svelte-1n6ht58">Saved.</div>`);
@@ -966,10 +1290,10 @@ function SettingsView($$renderer, $$props) {
966
1290
  $$renderer2.push(`<!--]--></section> <section class="card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/disableBuildCache"><div class="label svelte-1n6ht58">`);
967
1291
  Layers($$renderer2, { size: 20 });
968
1292
  $$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
969
- 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"${$19.attr("checked", noCache, true)}${$19.attr("disabled", savingCache, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1293
+ 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"${$26.attr("checked", noCache, true)}${$26.attr("disabled", savingCache, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
970
1294
  if (cacheError) {
971
1295
  $$renderer2.push("<!--[0-->");
972
- $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$19.escape(cacheError)}</div></div>`);
1296
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(cacheError)}</div></div>`);
973
1297
  } else {
974
1298
  $$renderer2.push("<!--[-1-->");
975
1299
  }
@@ -979,10 +1303,10 @@ function SettingsView($$renderer, $$props) {
979
1303
  remove pulled images.</div> `);
980
1304
  if (clearError) {
981
1305
  $$renderer2.push("<!--[0-->");
982
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$19.escape(clearError)}</div>`);
1306
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(clearError)}</div>`);
983
1307
  } else if (clearMsg) {
984
1308
  $$renderer2.push("<!--[1-->");
985
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$19.escape(clearMsg)}</div>`);
1309
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$26.escape(clearMsg)}</div>`);
986
1310
  } else {
987
1311
  $$renderer2.push("<!--[-1-->");
988
1312
  }
@@ -992,7 +1316,7 @@ function SettingsView($$renderer, $$props) {
992
1316
  icon: Trash_2,
993
1317
  disabled: clearing,
994
1318
  children: ($$renderer3) => {
995
- $$renderer3.push(`<!---->${$19.escape(clearing ? "Clearing\u2026" : "Clear cache")}`);
1319
+ $$renderer3.push(`<!---->${$26.escape(clearing ? "Clearing\u2026" : "Clear cache")}`);
996
1320
  },
997
1321
  $$slots: { default: true }
998
1322
  });
@@ -1002,10 +1326,10 @@ function SettingsView($$renderer, $$props) {
1002
1326
  layers. In-container edits are kept; stopped instances are left alone.</div> `);
1003
1327
  if (rebuildError) {
1004
1328
  $$renderer2.push("<!--[0-->");
1005
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$19.escape(rebuildError)}</div>`);
1329
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(rebuildError)}</div>`);
1006
1330
  } else if (rebuildMsg) {
1007
1331
  $$renderer2.push("<!--[1-->");
1008
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$19.escape(rebuildMsg)}</div>`);
1332
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$26.escape(rebuildMsg)}</div>`);
1009
1333
  } else {
1010
1334
  $$renderer2.push("<!--[-1-->");
1011
1335
  }
@@ -1015,11 +1339,11 @@ function SettingsView($$renderer, $$props) {
1015
1339
  icon: Hammer,
1016
1340
  disabled: rebuilding,
1017
1341
  children: ($$renderer3) => {
1018
- $$renderer3.push(`<!---->${$19.escape(rebuilding ? "Starting\u2026" : "Rebuild all")}`);
1342
+ $$renderer3.push(`<!---->${$26.escape(rebuilding ? "Starting\u2026" : "Rebuild all")}`);
1019
1343
  },
1020
1344
  $$slots: { default: true }
1021
1345
  });
1022
- $$renderer2.push(`<!----></form></section> <section${$19.attr_class("card svelte-1n6ht58", undefined, { "disabled-card": customEndpoint })}><form class="row svelte-1n6ht58" method="POST" action="?/manualTokensToggle"><div class="label svelte-1n6ht58">`);
1346
+ $$renderer2.push(`<!----></form></section> <section${$26.attr_class("card svelte-1n6ht58", undefined, { "disabled-card": customEndpoint })}><form class="row svelte-1n6ht58" method="POST" action="?/manualTokensToggle"><div class="label svelte-1n6ht58">`);
1023
1347
  Key_round($$renderer2, { size: 20 });
1024
1348
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Set tokens manually `);
1025
1349
  if (customEndpoint) {
@@ -1040,10 +1364,10 @@ function SettingsView($$renderer, $$props) {
1040
1364
  token set here is injected into every new container and overrides host credential
1041
1365
  discovery.`);
1042
1366
  }
1043
- $$renderer2.push(`<!--]--></div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$19.attr("checked", manualTokens, true)}${$19.attr("disabled", savingManualToggle || customEndpoint, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1367
+ $$renderer2.push(`<!--]--></div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$26.attr("checked", manualTokens, true)}${$26.attr("disabled", savingManualToggle || customEndpoint, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1044
1368
  if (manualToggleError) {
1045
1369
  $$renderer2.push("<!--[0-->");
1046
- $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$19.escape(manualToggleError)}</div></div>`);
1370
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(manualToggleError)}</div></div>`);
1047
1371
  } else {
1048
1372
  $$renderer2.push("<!--[-1-->");
1049
1373
  }
@@ -1051,7 +1375,7 @@ function SettingsView($$renderer, $$props) {
1051
1375
  if (manualTokens && !customEndpoint) {
1052
1376
  $$renderer2.push("<!--[0-->");
1053
1377
  $$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
1054
- 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"${$19.attr("value", githubToken)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"${$19.attr("placeholder", ghSaved ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (saved)" : "ghp_\u2026 / gho_\u2026")}/> `);
1378
+ 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"${$26.attr("value", githubToken)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"${$26.attr("placeholder", ghSaved ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (saved)" : "ghp_\u2026 / gho_\u2026")}/> `);
1055
1379
  Button($$renderer2, {
1056
1380
  type: "submit",
1057
1381
  disabled: savingGithub,
@@ -1063,17 +1387,17 @@ function SettingsView($$renderer, $$props) {
1063
1387
  $$renderer2.push(`<!----></div> `);
1064
1388
  if (githubError) {
1065
1389
  $$renderer2.push("<!--[0-->");
1066
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$19.escape(githubError)}</div>`);
1390
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(githubError)}</div>`);
1067
1391
  } else if (githubMsg) {
1068
1392
  $$renderer2.push("<!--[1-->");
1069
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$19.escape(githubMsg)}</div>`);
1393
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$26.escape(githubMsg)}</div>`);
1070
1394
  } else {
1071
1395
  $$renderer2.push("<!--[-1-->");
1072
1396
  }
1073
1397
  $$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
1074
1398
  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
1075
1399
  the first <code class="svelte-1n6ht58">claude</code> to refresh it signs the other one out. Leave blank and Save
1076
- to clear.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="password" name="claudeToken" class="image-input svelte-1n6ht58"${$19.attr("value", claudeToken)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"${$19.attr("placeholder", claudeSaved ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (saved)" : "sk-ant-oat\u2026")}/> `);
1400
+ to clear.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="password" name="claudeToken" class="image-input svelte-1n6ht58"${$26.attr("value", claudeToken)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"${$26.attr("placeholder", claudeSaved ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (saved)" : "sk-ant-oat\u2026")}/> `);
1077
1401
  Button($$renderer2, {
1078
1402
  type: "submit",
1079
1403
  disabled: savingClaude,
@@ -1085,10 +1409,10 @@ function SettingsView($$renderer, $$props) {
1085
1409
  $$renderer2.push(`<!----></div> `);
1086
1410
  if (claudeError) {
1087
1411
  $$renderer2.push("<!--[0-->");
1088
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$19.escape(claudeError)}</div>`);
1412
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(claudeError)}</div>`);
1089
1413
  } else if (claudeMsg) {
1090
1414
  $$renderer2.push("<!--[1-->");
1091
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$19.escape(claudeMsg)}</div>`);
1415
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$26.escape(claudeMsg)}</div>`);
1092
1416
  } else {
1093
1417
  $$renderer2.push("<!--[-1-->");
1094
1418
  }
@@ -1096,19 +1420,19 @@ function SettingsView($$renderer, $$props) {
1096
1420
  } else {
1097
1421
  $$renderer2.push("<!--[-1-->");
1098
1422
  }
1099
- $$renderer2.push(`<!--]--></section> <section${$19.attr_class("card svelte-1n6ht58", undefined, { "disabled-card": litellmBlocker() })}><form class="row svelte-1n6ht58" method="POST" action="?/customEndpointToggle"><div class="label svelte-1n6ht58">`);
1423
+ $$renderer2.push(`<!--]--></section> <section${$26.attr_class("card svelte-1n6ht58", undefined, { "disabled-card": litellmBlocker() })}><form class="row svelte-1n6ht58" method="POST" action="?/customEndpointToggle"><div class="label svelte-1n6ht58">`);
1100
1424
  Key_round($$renderer2, { size: 20 });
1101
1425
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">LiteLLM + Bedrock `);
1102
1426
  if (litellmBlocker()) {
1103
1427
  $$renderer2.push("<!--[0-->");
1104
- $$renderer2.push(`<span class="arch svelte-1n6ht58"${$19.attr("title", `Disabled while ${$19.stringify(litellmBlocker())} is on`)}>disabled</span>`);
1428
+ $$renderer2.push(`<span class="arch svelte-1n6ht58"${$26.attr("title", `Disabled while ${$26.stringify(litellmBlocker())} is on`)}>disabled</span>`);
1105
1429
  } else {
1106
1430
  $$renderer2.push("<!--[-1-->");
1107
1431
  }
1108
1432
  $$renderer2.push(`<!--]--></div> <div class="desc svelte-1n6ht58">`);
1109
1433
  if (litellmBlocker()) {
1110
1434
  $$renderer2.push("<!--[0-->");
1111
- $$renderer2.push(`Not available while "${$19.escape(litellmBlocker())}" is enabled \u2014 these modes are mutually
1435
+ $$renderer2.push(`Not available while "${$26.escape(litellmBlocker())}" is enabled \u2014 these modes are mutually
1112
1436
  incompatible.`);
1113
1437
  } else {
1114
1438
  $$renderer2.push("<!--[-1-->");
@@ -1116,17 +1440,17 @@ function SettingsView($$renderer, $$props) {
1116
1440
  default API. When enabled, the Bedrock endpoint variables are injected into every new
1117
1441
  container, host OAuth credentials are not used, and "Set tokens manually" is disabled.`);
1118
1442
  }
1119
- $$renderer2.push(`<!--]--></div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$19.attr("checked", customEndpoint, true)}${$19.attr("disabled", savingCustomToggle || !!litellmBlocker(), true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1443
+ $$renderer2.push(`<!--]--></div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$26.attr("checked", customEndpoint, true)}${$26.attr("disabled", savingCustomToggle || !!litellmBlocker(), true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1120
1444
  if (customToggleError) {
1121
1445
  $$renderer2.push("<!--[0-->");
1122
- $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$19.escape(customToggleError)}</div></div>`);
1446
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(customToggleError)}</div></div>`);
1123
1447
  } else {
1124
1448
  $$renderer2.push("<!--[-1-->");
1125
1449
  }
1126
1450
  $$renderer2.push(`<!--]--> `);
1127
1451
  if (customEndpoint) {
1128
1452
  $$renderer2.push("<!--[0-->");
1129
- $$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"${$19.attr("value", customBaseUrl)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" placeholder="https://litellm.example.com/bedrock"/> `);
1453
+ $$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"${$26.attr("value", customBaseUrl)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" placeholder="https://litellm.example.com/bedrock"/> `);
1130
1454
  Button($$renderer2, {
1131
1455
  type: "submit",
1132
1456
  disabled: savingCustomBaseUrl,
@@ -1138,15 +1462,15 @@ function SettingsView($$renderer, $$props) {
1138
1462
  $$renderer2.push(`<!----></div> `);
1139
1463
  if (customBaseUrlError) {
1140
1464
  $$renderer2.push("<!--[0-->");
1141
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$19.escape(customBaseUrlError)}</div>`);
1465
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(customBaseUrlError)}</div>`);
1142
1466
  } else if (customBaseUrlMsg) {
1143
1467
  $$renderer2.push("<!--[1-->");
1144
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$19.escape(customBaseUrlMsg)}</div>`);
1468
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$26.escape(customBaseUrlMsg)}</div>`);
1145
1469
  } else {
1146
1470
  $$renderer2.push("<!--[-1-->");
1147
1471
  }
1148
1472
  $$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
1149
- Save to clear.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="password" name="token" class="image-input svelte-1n6ht58"${$19.attr("value", customToken)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"${$19.attr("placeholder", customTokenSaved ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (saved)" : "sk-\u2026")}/> `);
1473
+ Save to clear.</div></div></div> <div class="image-controls svelte-1n6ht58"><input type="password" name="token" class="image-input svelte-1n6ht58"${$26.attr("value", customToken)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"${$26.attr("placeholder", customTokenSaved ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022 (saved)" : "sk-\u2026")}/> `);
1150
1474
  Button($$renderer2, {
1151
1475
  type: "submit",
1152
1476
  disabled: savingCustomToken,
@@ -1158,15 +1482,15 @@ function SettingsView($$renderer, $$props) {
1158
1482
  $$renderer2.push(`<!----></div> `);
1159
1483
  if (customTokenError) {
1160
1484
  $$renderer2.push("<!--[0-->");
1161
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$19.escape(customTokenError)}</div>`);
1485
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(customTokenError)}</div>`);
1162
1486
  } else if (customTokenMsg) {
1163
1487
  $$renderer2.push("<!--[1-->");
1164
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$19.escape(customTokenMsg)}</div>`);
1488
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$26.escape(customTokenMsg)}</div>`);
1165
1489
  } else {
1166
1490
  $$renderer2.push("<!--[-1-->");
1167
1491
  }
1168
1492
  $$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
1169
- 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"${$19.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"${$19.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"${$19.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"${$19.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"${$19.attr("value", customDefaultModel)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <div class="model-save-row svelte-1n6ht58">`);
1493
+ 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"${$26.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"${$26.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"${$26.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"${$26.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"${$26.attr("value", customDefaultModel)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <div class="model-save-row svelte-1n6ht58">`);
1170
1494
  Button($$renderer2, {
1171
1495
  type: "submit",
1172
1496
  disabled: savingCustomModels,
@@ -1178,10 +1502,10 @@ function SettingsView($$renderer, $$props) {
1178
1502
  $$renderer2.push(`<!----></div></div> `);
1179
1503
  if (customModelsError) {
1180
1504
  $$renderer2.push("<!--[0-->");
1181
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$19.escape(customModelsError)}</div>`);
1505
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(customModelsError)}</div>`);
1182
1506
  } else if (customModelsMsg) {
1183
1507
  $$renderer2.push("<!--[1-->");
1184
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$19.escape(customModelsMsg)}</div>`);
1508
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$26.escape(customModelsMsg)}</div>`);
1185
1509
  } else {
1186
1510
  $$renderer2.push("<!--[-1-->");
1187
1511
  }
@@ -1189,7 +1513,7 @@ function SettingsView($$renderer, $$props) {
1189
1513
  } else {
1190
1514
  $$renderer2.push("<!--[-1-->");
1191
1515
  }
1192
- $$renderer2.push(`<!--]--></section> <section${$19.attr_class("card svelte-1n6ht58", undefined, { "disabled-card": customEndpoint })}><form class="row svelte-1n6ht58" method="POST" action="?/manualModelToggle"><div class="label svelte-1n6ht58">`);
1516
+ $$renderer2.push(`<!--]--></section> <section${$26.attr_class("card svelte-1n6ht58", undefined, { "disabled-card": customEndpoint })}><form class="row svelte-1n6ht58" method="POST" action="?/manualModelToggle"><div class="label svelte-1n6ht58">`);
1193
1517
  Cpu($$renderer2, { size: 18 });
1194
1518
  $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Override models manually `);
1195
1519
  if (customEndpoint) {
@@ -1208,17 +1532,17 @@ function SettingsView($$renderer, $$props) {
1208
1532
  $$renderer2.push(`Pin which model <code class="svelte-1n6ht58">claude</code> uses on the standard (subscription) path. Only
1209
1533
  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.`);
1210
1534
  }
1211
- $$renderer2.push(`<!--]--></div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$19.attr("checked", manualModelOverride, true)}${$19.attr("disabled", savingManualModelToggle || customEndpoint, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1535
+ $$renderer2.push(`<!--]--></div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$26.attr("checked", manualModelOverride, true)}${$26.attr("disabled", savingManualModelToggle || customEndpoint, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1212
1536
  if (manualModelToggleError) {
1213
1537
  $$renderer2.push("<!--[0-->");
1214
- $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$19.escape(manualModelToggleError)}</div></div>`);
1538
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(manualModelToggleError)}</div></div>`);
1215
1539
  } else {
1216
1540
  $$renderer2.push("<!--[-1-->");
1217
1541
  }
1218
1542
  $$renderer2.push(`<!--]--> `);
1219
1543
  if (manualModelOverride) {
1220
1544
  $$renderer2.push("<!--[0-->");
1221
- $$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"${$19.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"${$19.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"${$19.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"${$19.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"${$19.attr("value", manualDefault)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <div class="model-save-row svelte-1n6ht58">`);
1545
+ $$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"${$26.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"${$26.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"${$26.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"${$26.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"${$26.attr("value", manualDefault)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off"/></label> <div class="model-save-row svelte-1n6ht58">`);
1222
1546
  Button($$renderer2, {
1223
1547
  type: "submit",
1224
1548
  disabled: savingManualModels,
@@ -1230,10 +1554,10 @@ function SettingsView($$renderer, $$props) {
1230
1554
  $$renderer2.push(`<!----></div></div> `);
1231
1555
  if (manualModelsError) {
1232
1556
  $$renderer2.push("<!--[0-->");
1233
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$19.escape(manualModelsError)}</div>`);
1557
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(manualModelsError)}</div>`);
1234
1558
  } else if (manualModelsMsg) {
1235
1559
  $$renderer2.push("<!--[1-->");
1236
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$19.escape(manualModelsMsg)}</div>`);
1560
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$26.escape(manualModelsMsg)}</div>`);
1237
1561
  } else {
1238
1562
  $$renderer2.push("<!--[-1-->");
1239
1563
  }
@@ -1245,10 +1569,10 @@ function SettingsView($$renderer, $$props) {
1245
1569
  Variable($$renderer2, { size: 20 });
1246
1570
  $$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
1247
1571
  interactive shells. Values are read from this process's own environment at container
1248
- 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"${$19.attr("checked", hostEnvVars, true)}${$19.attr("disabled", savingHostEnvToggle, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1572
+ 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"${$26.attr("checked", hostEnvVars, true)}${$26.attr("disabled", savingHostEnvToggle, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1249
1573
  if (hostEnvToggleError) {
1250
1574
  $$renderer2.push("<!--[0-->");
1251
- $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$19.escape(hostEnvToggleError)}</div></div>`);
1575
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(hostEnvToggleError)}</div></div>`);
1252
1576
  } else {
1253
1577
  $$renderer2.push("<!--[-1-->");
1254
1578
  }
@@ -1256,18 +1580,18 @@ function SettingsView($$renderer, $$props) {
1256
1580
  if (hostEnvVars) {
1257
1581
  $$renderer2.push("<!--[0-->");
1258
1582
  $$renderer2.push(`<div class="row divided var-row svelte-1n6ht58"><div class="var-list svelte-1n6ht58">`);
1259
- const each_array = $19.ensure_array_like(hostEnvNames);
1260
- if (each_array.length !== 0) {
1583
+ const each_array_2 = $26.ensure_array_like(hostEnvNames);
1584
+ if (each_array_2.length !== 0) {
1261
1585
  $$renderer2.push("<!--[-->");
1262
- for (let $$index_1 = 0, $$length = each_array.length;$$index_1 < $$length; $$index_1++) {
1263
- let name = each_array[$$index_1];
1586
+ for (let $$index_3 = 0, $$length = each_array_2.length;$$index_3 < $$length; $$index_3++) {
1587
+ let name = each_array_2[$$index_3];
1264
1588
  $$renderer2.push(`<form class="var-item svelte-1n6ht58" method="POST" action="?/hostEnvVarNames"><!--[-->`);
1265
- const each_array_1 = $19.ensure_array_like(hostEnvNames.filter((n) => n !== name));
1266
- for (let $$index = 0, $$length2 = each_array_1.length;$$index < $$length2; $$index++) {
1267
- let other = each_array_1[$$index];
1268
- $$renderer2.push(`<input type="hidden" name="names"${$19.attr("value", other)}/>`);
1589
+ const each_array_3 = $26.ensure_array_like(hostEnvNames.filter((n) => n !== name));
1590
+ for (let $$index_2 = 0, $$length2 = each_array_3.length;$$index_2 < $$length2; $$index_2++) {
1591
+ let other = each_array_3[$$index_2];
1592
+ $$renderer2.push(`<input type="hidden" name="names"${$26.attr("value", other)}/>`);
1269
1593
  }
1270
- $$renderer2.push(`<!--]--> <span class="var-name svelte-1n6ht58">${$19.escape(name)}</span> <span${$19.attr_class("var-status svelte-1n6ht58", undefined, { present: hostEnvPresence[name] })}${$19.attr("title", hostEnvPresence[name] ? "Set on this host \u2014 will be injected" : "Not set on this host \u2014 will be skipped")}>${$19.escape(hostEnvPresence[name] ? "set" : "missing")}</span> <button type="submit" class="var-remove svelte-1n6ht58"${$19.attr("disabled", savingHostEnvNames, true)}${$19.attr("aria-label", `Remove ${name}`)}>`);
1594
+ $$renderer2.push(`<!--]--> <span class="var-name svelte-1n6ht58">${$26.escape(name)}</span> <span${$26.attr_class("var-status svelte-1n6ht58", undefined, { present: hostEnvPresence[name] })}${$26.attr("title", hostEnvPresence[name] ? "Set on this host \u2014 will be injected" : "Not set on this host \u2014 will be skipped")}>${$26.escape(hostEnvPresence[name] ? "set" : "missing")}</span> <button type="submit" class="var-remove svelte-1n6ht58"${$26.attr("disabled", savingHostEnvNames, true)}${$26.attr("aria-label", `Remove ${name}`)}>`);
1271
1595
  X($$renderer2, { size: 13 });
1272
1596
  $$renderer2.push(`<!----></button></form>`);
1273
1597
  }
@@ -1276,12 +1600,12 @@ function SettingsView($$renderer, $$props) {
1276
1600
  $$renderer2.push(`<div class="var-empty svelte-1n6ht58">No variables added yet.</div>`);
1277
1601
  }
1278
1602
  $$renderer2.push(`<!--]--></div> <form class="var-add svelte-1n6ht58" method="POST" action="?/hostEnvVarNames"><!--[-->`);
1279
- const each_array_2 = $19.ensure_array_like(hostEnvNames);
1280
- for (let $$index_2 = 0, $$length = each_array_2.length;$$index_2 < $$length; $$index_2++) {
1281
- let name = each_array_2[$$index_2];
1282
- $$renderer2.push(`<input type="hidden" name="names"${$19.attr("value", name)}/>`);
1603
+ const each_array_4 = $26.ensure_array_like(hostEnvNames);
1604
+ for (let $$index_4 = 0, $$length = each_array_4.length;$$index_4 < $$length; $$index_4++) {
1605
+ let name = each_array_4[$$index_4];
1606
+ $$renderer2.push(`<input type="hidden" name="names"${$26.attr("value", name)}/>`);
1283
1607
  }
1284
- $$renderer2.push(`<!--]--> <input type="text" name="names" class="image-input svelte-1n6ht58"${$19.attr("value", newHostEnvName)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" placeholder="AWS_ACCESS_KEY_ID"/> `);
1608
+ $$renderer2.push(`<!--]--> <input type="text" name="names" class="image-input svelte-1n6ht58"${$26.attr("value", newHostEnvName)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" placeholder="AWS_ACCESS_KEY_ID"/> `);
1285
1609
  Button($$renderer2, {
1286
1610
  type: "submit",
1287
1611
  icon: Plus,
@@ -1294,10 +1618,62 @@ function SettingsView($$renderer, $$props) {
1294
1618
  $$renderer2.push(`<!----></form> `);
1295
1619
  if (hostEnvNamesError) {
1296
1620
  $$renderer2.push("<!--[0-->");
1297
- $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$19.escape(hostEnvNamesError)}</div>`);
1621
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(hostEnvNamesError)}</div>`);
1298
1622
  } else if (hostEnvNamesMsg) {
1299
1623
  $$renderer2.push("<!--[1-->");
1300
- $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$19.escape(hostEnvNamesMsg)}</div>`);
1624
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$26.escape(hostEnvNamesMsg)}</div>`);
1625
+ } else {
1626
+ $$renderer2.push("<!--[-1-->");
1627
+ }
1628
+ $$renderer2.push(`<!--]--></div>`);
1629
+ } else {
1630
+ $$renderer2.push("<!--[-1-->");
1631
+ }
1632
+ $$renderer2.push(`<!--]--></section> <section class="card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/customEnvVarsToggle"><div class="label svelte-1n6ht58">`);
1633
+ Key_square($$renderer2, { size: 20 });
1634
+ $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Custom environment variables</div> <div class="desc svelte-1n6ht58">Inject your own <code class="svelte-1n6ht58">NAME=value</code> pairs into every new container as <code class="svelte-1n6ht58">containerEnv</code>, available to all processes. Values are secret \u2014 stored
1635
+ locally, masked in the build log, and never shown here after saving. Re-add a name to
1636
+ update its value.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$26.attr("checked", customEnvEnabled, true)}${$26.attr("disabled", savingCustomEnvToggle, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1637
+ if (customEnvToggleError) {
1638
+ $$renderer2.push("<!--[0-->");
1639
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(customEnvToggleError)}</div></div>`);
1640
+ } else {
1641
+ $$renderer2.push("<!--[-1-->");
1642
+ }
1643
+ $$renderer2.push(`<!--]--> `);
1644
+ if (customEnvEnabled) {
1645
+ $$renderer2.push("<!--[0-->");
1646
+ $$renderer2.push(`<div class="row divided var-row svelte-1n6ht58"><div class="var-list svelte-1n6ht58">`);
1647
+ const each_array_5 = $26.ensure_array_like(customEnvNames);
1648
+ if (each_array_5.length !== 0) {
1649
+ $$renderer2.push("<!--[-->");
1650
+ for (let $$index_5 = 0, $$length = each_array_5.length;$$index_5 < $$length; $$index_5++) {
1651
+ let name = each_array_5[$$index_5];
1652
+ $$renderer2.push(`<form class="var-item svelte-1n6ht58" method="POST" action="?/removeCustomEnvVar"><input type="hidden" name="name"${$26.attr("value", name)}/> <span class="var-name svelte-1n6ht58">${$26.escape(name)}</span> <span class="var-status present svelte-1n6ht58" title="Set \u2014 injected into every new container">\u2022\u2022\u2022\u2022 saved</span> <button type="submit" class="var-remove svelte-1n6ht58"${$26.attr("disabled", savingCustomEnv, true)}${$26.attr("aria-label", `Remove ${name}`)}>`);
1653
+ X($$renderer2, { size: 13 });
1654
+ $$renderer2.push(`<!----></button></form>`);
1655
+ }
1656
+ } else {
1657
+ $$renderer2.push("<!--[!-->");
1658
+ $$renderer2.push(`<div class="var-empty svelte-1n6ht58">No variables added yet.</div>`);
1659
+ }
1660
+ $$renderer2.push(`<!--]--></div> <form class="var-add svelte-1n6ht58" method="POST" action="?/setCustomEnvVar"><input type="text" name="name" class="image-input svelte-1n6ht58"${$26.attr("value", newCustomEnvName)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" placeholder="MY_SECRET"/> <input type="password" name="value" class="image-input svelte-1n6ht58"${$26.attr("value", newCustomEnvValue)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" placeholder="value"/> `);
1661
+ Button($$renderer2, {
1662
+ type: "submit",
1663
+ icon: Plus,
1664
+ disabled: savingCustomEnv,
1665
+ children: ($$renderer3) => {
1666
+ $$renderer3.push(`<!---->Add`);
1667
+ },
1668
+ $$slots: { default: true }
1669
+ });
1670
+ $$renderer2.push(`<!----></form> `);
1671
+ if (customEnvError) {
1672
+ $$renderer2.push("<!--[0-->");
1673
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(customEnvError)}</div>`);
1674
+ } else if (customEnvMsg) {
1675
+ $$renderer2.push("<!--[1-->");
1676
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$26.escape(customEnvMsg)}</div>`);
1301
1677
  } else {
1302
1678
  $$renderer2.push("<!--[-1-->");
1303
1679
  }
@@ -1311,12 +1687,12 @@ function SettingsView($$renderer, $$props) {
1311
1687
  ThemePicker($$renderer2, {});
1312
1688
  $$renderer2.push(`<!----></div></section> <section class="card svelte-1n6ht58"><div class="row svelte-1n6ht58"><div class="label svelte-1n6ht58">`);
1313
1689
  Volume_2($$renderer2, { size: 20 });
1314
- $$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"${$19.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">`);
1690
+ $$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"${$26.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">`);
1315
1691
  Paw_print($$renderer2, { size: 18 });
1316
- $$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"${$19.attr("checked", !!petArt, true)}${$19.attr("disabled", savingPet, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1692
+ $$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"${$26.attr("checked", !!petArt, true)}${$26.attr("disabled", savingPet, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1317
1693
  if (petError) {
1318
1694
  $$renderer2.push("<!--[0-->");
1319
- $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$19.escape(petError)}</div></div>`);
1695
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(petError)}</div></div>`);
1320
1696
  } else {
1321
1697
  $$renderer2.push("<!--[-1-->");
1322
1698
  }
@@ -1324,10 +1700,10 @@ function SettingsView($$renderer, $$props) {
1324
1700
  if (petArt) {
1325
1701
  $$renderer2.push("<!--[0-->");
1326
1702
  $$renderer2.push(`<div class="sub pets svelte-1n6ht58"><!--[-->`);
1327
- const each_array_3 = $19.ensure_array_like(avatars);
1328
- for (let $$index_3 = 0, $$length = each_array_3.length;$$index_3 < $$length; $$index_3++) {
1329
- let art = each_array_3[$$index_3];
1330
- $$renderer2.push(`<form method="POST" action="?/petChoose" class="svelte-1n6ht58"><input type="hidden" name="name"${$19.attr("value", art.name)}/> <button type="submit"${$19.attr_class("pet svelte-1n6ht58", undefined, { selected: art.name === petArt.name })}${$19.attr("disabled", savingPet, true)}${$19.attr("title", art.name)}${$19.attr("aria-label", art.name)}${$19.attr("aria-pressed", art.name === petArt.name)}>`);
1703
+ const each_array_6 = $26.ensure_array_like(avatars);
1704
+ for (let $$index_6 = 0, $$length = each_array_6.length;$$index_6 < $$length; $$index_6++) {
1705
+ let art = each_array_6[$$index_6];
1706
+ $$renderer2.push(`<form method="POST" action="?/petChoose" class="svelte-1n6ht58"><input type="hidden" name="name"${$26.attr("value", art.name)}/> <button type="submit"${$26.attr_class("pet svelte-1n6ht58", undefined, { selected: art.name === petArt.name })}${$26.attr("disabled", savingPet, true)}${$26.attr("title", art.name)}${$26.attr("aria-label", art.name)}${$26.attr("aria-pressed", art.name === petArt.name)}>`);
1331
1707
  Avatar($$renderer2, { art, name: art.name, scale: 4 });
1332
1708
  $$renderer2.push(`<!----></button></form>`);
1333
1709
  }
@@ -1335,7 +1711,62 @@ function SettingsView($$renderer, $$props) {
1335
1711
  } else {
1336
1712
  $$renderer2.push("<!--[-1-->");
1337
1713
  }
1338
- $$renderer2.push(`<!--]--></section> <section class="card danger-card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/shutdown"><div class="label svelte-1n6ht58">`);
1714
+ $$renderer2.push(`<!--]--></section> <section class="card svelte-1n6ht58"><details class="advanced svelte-1n6ht58"><summary class="svelte-1n6ht58">`);
1715
+ Sliders_horizontal($$renderer2, { size: 20 });
1716
+ $$renderer2.push(`<!----> <span class="name svelte-1n6ht58">Advanced</span> <span class="hint svelte-1n6ht58">escape hatches \u2014 defaults are right for almost everyone</span></summary> <form class="row divided svelte-1n6ht58" method="POST" action="?/serialInjectionsToggle"><div class="label svelte-1n6ht58">`);
1717
+ List_ordered($$renderer2, { size: 20 });
1718
+ $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Serial boot injections</div> <div class="desc svelte-1n6ht58">Run boot injections one at a time instead of in parallel stages. Slower boot; useful
1719
+ when diagnosing injection interference.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$26.attr("checked", serialInjections, true)}${$26.attr("disabled", savingSerial, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1720
+ if (serialError) {
1721
+ $$renderer2.push("<!--[0-->");
1722
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(serialError)}</div></div>`);
1723
+ } else {
1724
+ $$renderer2.push("<!--[-1-->");
1725
+ }
1726
+ $$renderer2.push(`<!--]--> <form class="row divided svelte-1n6ht58" method="POST" action="?/noBuildkitToggle"><div class="label svelte-1n6ht58">`);
1727
+ Boxes($$renderer2, { size: 20 });
1728
+ $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Don't force BuildKit</div> <div class="desc svelte-1n6ht58">Skip setting <code class="svelte-1n6ht58">DOCKER_BUILDKIT=1</code> for container builds and let the daemon's
1729
+ default builder decide. For daemons where forcing BuildKit breaks builds.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$26.attr("checked", noBuildkit, true)}${$26.attr("disabled", savingBuildkit, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1730
+ if (buildkitError) {
1731
+ $$renderer2.push("<!--[0-->");
1732
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(buildkitError)}</div></div>`);
1733
+ } else {
1734
+ $$renderer2.push("<!--[-1-->");
1735
+ }
1736
+ $$renderer2.push(`<!--]--> <form class="row divided svelte-1n6ht58" method="POST" action="?/blockingExtInstallToggle"><div class="label svelte-1n6ht58">`);
1737
+ Puzzle($$renderer2, { size: 20 });
1738
+ $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Blocking IDE extension install</div> <div class="desc svelte-1n6ht58">Install the Claude Code IDE extension before code-server starts, so the first window
1739
+ always has it active. Slower first boot.</div></div></div> <label class="switch svelte-1n6ht58"><input type="checkbox" name="enabled"${$26.attr("checked", blockingExtInstall, true)}${$26.attr("disabled", savingBlocking, true)} class="svelte-1n6ht58"/> <span class="track svelte-1n6ht58"><span class="thumb svelte-1n6ht58"></span></span></label></form> `);
1740
+ if (blockingError) {
1741
+ $$renderer2.push("<!--[0-->");
1742
+ $$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$26.escape(blockingError)}</div></div>`);
1743
+ } else {
1744
+ $$renderer2.push("<!--[-1-->");
1745
+ }
1746
+ $$renderer2.push(`<!--]--> <form class="row divided svelte-1n6ht58" method="POST" action="?/clearVersionCache"><div class="label svelte-1n6ht58">`);
1747
+ Trash_2($$renderer2, { size: 20 });
1748
+ $$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Clear claude-code version cache</div> <div class="desc svelte-1n6ht58">Forget the cached latest-version check; the next instance boot asks the npm registry
1749
+ again.</div> `);
1750
+ if (verError) {
1751
+ $$renderer2.push("<!--[0-->");
1752
+ $$renderer2.push(`<div class="msg error svelte-1n6ht58">${$26.escape(verError)}</div>`);
1753
+ } else if (verMsg) {
1754
+ $$renderer2.push("<!--[1-->");
1755
+ $$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$26.escape(verMsg)}</div>`);
1756
+ } else {
1757
+ $$renderer2.push("<!--[-1-->");
1758
+ }
1759
+ $$renderer2.push(`<!--]--></div></div> `);
1760
+ Button($$renderer2, {
1761
+ type: "submit",
1762
+ icon: Trash_2,
1763
+ disabled: clearingVer,
1764
+ children: ($$renderer3) => {
1765
+ $$renderer3.push(`<!---->${$26.escape(clearingVer ? "Clearing\u2026" : "Clear cache")}`);
1766
+ },
1767
+ $$slots: { default: true }
1768
+ });
1769
+ $$renderer2.push(`<!----></form></details></section> <section class="card danger-card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/shutdown"><div class="label svelte-1n6ht58">`);
1339
1770
  Power($$renderer2, { size: 20 });
1340
1771
  $$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
1341
1772
  database, then shut down the server. This cannot be undone.</div></div></div> `);
@@ -1355,7 +1786,7 @@ function SettingsView($$renderer, $$props) {
1355
1786
  }
1356
1787
  $$renderer2.push(`<!--]--></form></section> `);
1357
1788
  CoinButton($$renderer2, {});
1358
- $$renderer2.push(`<!----> <div class="version svelte-1n6ht58">Codebay v${$19.escape(version)}</div></main></div> `);
1789
+ $$renderer2.push(`<!----> <div class="version svelte-1n6ht58">Codebay v${$26.escape(version)}</div></main></div> `);
1359
1790
  Toaster($$renderer2, {
1360
1791
  toastOptions: {
1361
1792
  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;"
@@ -1371,6 +1802,8 @@ function Settings($$renderer, $$props) {
1371
1802
  let {
1372
1803
  pet,
1373
1804
  defaultMode,
1805
+ claudePermissionMode,
1806
+ claudeEffortLevel,
1374
1807
  defaultImage,
1375
1808
  builtinImage,
1376
1809
  disableBuildCache,
@@ -1400,11 +1833,16 @@ function Settings($$renderer, $$props) {
1400
1833
  hostEnvVarsEnabled,
1401
1834
  hostEnvVarNames,
1402
1835
  hostEnvVarPresence,
1836
+ customEnvVarsEnabled,
1837
+ customEnvVarNames,
1838
+ advancedSerialInjections,
1839
+ advancedNoBuildkit,
1840
+ advancedBlockingExtInstall,
1403
1841
  version
1404
1842
  } = $$props;
1405
1843
  if (true) {
1406
1844
  let failed = function($$renderer3, error) {
1407
- $$renderer3.push(`<mochi-island-failure data-component="SettingsView"${$20.attr("data-message", error.message)}></mochi-island-failure>`);
1845
+ $$renderer3.push(`<mochi-island-failure data-component="SettingsView"${$27.attr("data-message", error.message)}></mochi-island-failure>`);
1408
1846
  };
1409
1847
  $$renderer2.push("<!--[0-->");
1410
1848
  $$renderer2.boundary({ failed }, ($$renderer3) => {
@@ -1412,9 +1850,11 @@ function Settings($$renderer, $$props) {
1412
1850
  {
1413
1851
  HydratableBoundary($$renderer3, {
1414
1852
  children: ($$renderer4) => {
1415
- $$renderer4.push(`<mochi-hydratable-island component-name="SettingsView_8hmarwmf8onq" component-url="__MOCHI_COMPONENT_URL__SettingsView_8hmarwmf8onq__"${$20.attr("props-ref", emitIslandProps({
1853
+ $$renderer4.push(`<mochi-hydratable-island component-name="SettingsView_8hmarwmf8onq" component-url="__MOCHI_COMPONENT_URL__SettingsView_8hmarwmf8onq__"${$27.attr("props-ref", emitIslandProps({
1416
1854
  pet,
1417
1855
  defaultMode,
1856
+ claudePermissionMode,
1857
+ claudeEffortLevel,
1418
1858
  defaultImage,
1419
1859
  builtinImage,
1420
1860
  disableBuildCache,
@@ -1444,6 +1884,11 @@ function Settings($$renderer, $$props) {
1444
1884
  hostEnvVarsEnabled,
1445
1885
  hostEnvVarNames,
1446
1886
  hostEnvVarPresence,
1887
+ customEnvVarsEnabled,
1888
+ customEnvVarNames,
1889
+ advancedSerialInjections,
1890
+ advancedNoBuildkit,
1891
+ advancedBlockingExtInstall,
1447
1892
  version
1448
1893
  }))}>`);
1449
1894
  $$renderer4.push(`<!--[-->`);
@@ -1451,6 +1896,8 @@ function Settings($$renderer, $$props) {
1451
1896
  SettingsView($$renderer4, {
1452
1897
  pet,
1453
1898
  defaultMode,
1899
+ claudePermissionMode,
1900
+ claudeEffortLevel,
1454
1901
  defaultImage,
1455
1902
  builtinImage,
1456
1903
  disableBuildCache,
@@ -1480,6 +1927,11 @@ function Settings($$renderer, $$props) {
1480
1927
  hostEnvVarsEnabled,
1481
1928
  hostEnvVarNames,
1482
1929
  hostEnvVarPresence,
1930
+ customEnvVarsEnabled,
1931
+ customEnvVarNames,
1932
+ advancedSerialInjections,
1933
+ advancedNoBuildkit,
1934
+ advancedBlockingExtInstall,
1483
1935
  version
1484
1936
  });
1485
1937
  }