codebay 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.mochi/import-css/index-0nwv3654.css +18 -0
- package/.mochi/import-css/index-xndx4980.css +54 -0
- package/.mochi/manifest.json +1608 -0
- package/.mochi/server-island.js +1 -0
- package/.mochi/svelte-client/HydratableIsland-ps09gjy2.js +1 -0
- package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-62w5zwww.js +2 -0
- package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-jmm501zf.js +13 -0
- package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-ewk4n2c0.js +1 -0
- package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-e7e89md0.js +23 -0
- package/.mochi/svelte-client/chunk-jx5cekhh.js +2 -0
- package/.mochi/svelte-client/chunk-k3my1snp.js +2 -0
- package/.mochi/svelte-client/chunk-kgn1b2t1.js +4 -0
- package/.mochi/svelte-client/chunk-ry7q5zk5.js +1 -0
- package/.mochi/svelte-client/chunk-x843txjc.js +2 -0
- package/.mochi/svelte-client/chunk-zjcg8kw5.js +2 -0
- package/.mochi/svelte-compile/App-8k1gyxdc.server.js +1167 -0
- package/.mochi/svelte-compile/Avatars-f7c6rp96.server.js +351 -0
- package/.mochi/svelte-compile/ClientStats-z3tn9ad6.server.js +99 -0
- package/.mochi/svelte-compile/DefaultError-wh77vebf.server.js +52 -0
- package/.mochi/svelte-compile/Instance-yvps12zg.server.js +355 -0
- package/.mochi/svelte-compile/Settings-jwg3httb.server.js +1169 -0
- package/.mochi/svelte-compile/chunk-4kwy539a.js +14 -0
- package/.mochi/svelte-compile/chunk-9bjk7yx6.js +81 -0
- package/.mochi/svelte-compile/chunk-dqgstte4.js +52 -0
- package/.mochi/svelte-compile/chunk-sxqys3nw.js +1668 -0
- package/.mochi/svelte-compile/chunk-v6796ga4.js +3295 -0
- package/.mochi/svelte-compile/chunk-we0ggtws.js +34 -0
- package/.mochi/svelte-css/AppBar-3bxinv4pabv8l.css +1 -0
- package/.mochi/svelte-css/AppShell-36mpg5smnbmuw.css +1 -0
- package/.mochi/svelte-css/Avatar-24th63awm9mna.css +1 -0
- package/.mochi/svelte-css/AvatarEditor-1ryrs1md5g36y.css +1 -0
- package/.mochi/svelte-css/AvatarsView-3hq37u4dgtljn.css +1 -0
- package/.mochi/svelte-css/BackLink-2wlu0eovz9j86.css +1 -0
- package/.mochi/svelte-css/BranchBox-1yqu1q2mgnjwz.css +1 -0
- package/.mochi/svelte-css/Brand-1la7zw5uhcbl4.css +1 -0
- package/.mochi/svelte-css/Button-2vtbrzb5kgu25.css +1 -0
- package/.mochi/svelte-css/CheckmarkIcon-3qlazj2oc50jc.css +1 -0
- package/.mochi/svelte-css/ClientStats-19qzckq40p2q9.css +1 -0
- package/.mochi/svelte-css/CoinButton-1rej3sh3tkjud.css +1 -0
- package/.mochi/svelte-css/CredMenu-9hwgeptp7crb.css +1 -0
- package/.mochi/svelte-css/DashboardView-1cy4xpqhja9sx.css +1 -0
- package/.mochi/svelte-css/DefaultError-2b0daamydxgb2.css +1 -0
- package/.mochi/svelte-css/ErrorIcon-2x0tzsqxskw28.css +1 -0
- package/.mochi/svelte-css/FolderBrowser-1x428zb3f2kti.css +1 -0
- package/.mochi/svelte-css/HealthBox-er2her0jukwl.css +1 -0
- package/.mochi/svelte-css/IdeBar-2qoqi2ya9zdn3.css +1 -0
- package/.mochi/svelte-css/IdeLoader-26rlko8e00j3g.css +1 -0
- package/.mochi/svelte-css/InstanceCard-16f77aysm7lgp.css +1 -0
- package/.mochi/svelte-css/InstanceView-wq85bxtusont.css +1 -0
- package/.mochi/svelte-css/LoaderIcon-soq5wt3p05ye.css +1 -0
- package/.mochi/svelte-css/PortsBox-1t25b5yg7jva3.css +1 -0
- package/.mochi/svelte-css/SettingsCog-jftyadvo64qo.css +1 -0
- package/.mochi/svelte-css/SettingsView-3bbkzsvnrth3v.css +1 -0
- package/.mochi/svelte-css/Skeleton-8k69usiju43h.css +1 -0
- package/.mochi/svelte-css/StatusBadge-3mq0j7z6aq4j.css +1 -0
- package/.mochi/svelte-css/ThemePicker-1ir8jyocm8mvi.css +1 -0
- package/.mochi/svelte-css/ToastBar-3havgkmtofntq.css +1 -0
- package/.mochi/svelte-css/ToastIcon-2z5wrkc95khg0.css +1 -0
- package/.mochi/svelte-css/ToastMessage-2jfwb2og2lfa8.css +1 -0
- package/.mochi/svelte-css/ToastWrapper-1fbnym10rm2nv.css +1 -0
- package/.mochi/svelte-css/Toaster-kk60j193854n.css +1 -0
- package/.mochi/svelte-css/TopBar-2q87li6yt8ids.css +1 -0
- package/LICENSE +21 -0
- package/README.md +33 -3
- package/bin/codebay.ts +22 -0
- package/migrations/0001_init.sql +20 -0
- package/migrations/0002_port_forwards.sql +9 -0
- package/migrations/0003_options.sql +4 -0
- package/migrations/0004_instance_image.sql +1 -0
- package/package.json +87 -9
- package/public/sounds/done.wav +0 -0
- package/public/sounds/waiting.wav +0 -0
- package/src/__fixtures__/HelloWorld.svelte +4 -0
- package/src/additional-svelte-typings.d.ts +1 -0
- package/src/api.ts +61 -0
- package/src/avatars/anchor.ts +17 -0
- package/src/avatars/bear.ts +17 -0
- package/src/avatars/bee.ts +17 -0
- package/src/avatars/bob-marley.ts +17 -0
- package/src/avatars/car.ts +17 -0
- package/src/avatars/carpathians.ts +17 -0
- package/src/avatars/cat-body.ts +17 -0
- package/src/avatars/cat-sits.ts +17 -0
- package/src/avatars/cat.ts +17 -0
- package/src/avatars/celtic-cross.ts +17 -0
- package/src/avatars/cherry.ts +17 -0
- package/src/avatars/cotton.ts +17 -0
- package/src/avatars/crab.ts +17 -0
- package/src/avatars/crown.ts +17 -0
- package/src/avatars/diamond.ts +17 -0
- package/src/avatars/dog.ts +17 -0
- package/src/avatars/elephant.ts +17 -0
- package/src/avatars/fish.ts +17 -0
- package/src/avatars/fleur-de-lis.ts +17 -0
- package/src/avatars/flower.ts +17 -0
- package/src/avatars/fox.ts +17 -0
- package/src/avatars/frog.ts +17 -0
- package/src/avatars/ghost.ts +17 -0
- package/src/avatars/giraffe.ts +17 -0
- package/src/avatars/glasses.ts +17 -0
- package/src/avatars/heart.ts +17 -0
- package/src/avatars/index.ts +128 -0
- package/src/avatars/invader.ts +17 -0
- package/src/avatars/kangaroo.ts +17 -0
- package/src/avatars/key.ts +17 -0
- package/src/avatars/lightning.ts +17 -0
- package/src/avatars/mushroom.ts +17 -0
- package/src/avatars/octopus.ts +17 -0
- package/src/avatars/owl.ts +17 -0
- package/src/avatars/penguin.ts +17 -0
- package/src/avatars/planet.ts +17 -0
- package/src/avatars/rabbit.ts +17 -0
- package/src/avatars/rat.ts +17 -0
- package/src/avatars/robot.ts +17 -0
- package/src/avatars/rocket.ts +17 -0
- package/src/avatars/sea.ts +17 -0
- package/src/avatars/serialize.ts +65 -0
- package/src/avatars/skull.ts +17 -0
- package/src/avatars/snail.ts +17 -0
- package/src/avatars/snake.ts +17 -0
- package/src/avatars/snakegame.ts +17 -0
- package/src/avatars/star.ts +17 -0
- package/src/avatars/svelte.ts +17 -0
- package/src/avatars/target.ts +17 -0
- package/src/avatars/tree.ts +17 -0
- package/src/avatars/types.ts +24 -0
- package/src/avatars/ukraine.ts +17 -0
- package/src/avatars/whale.ts +17 -0
- package/src/avatars/wheat.ts +17 -0
- package/src/avatars/yinyan.ts +17 -0
- package/src/components/AppBar.svelte +35 -0
- package/src/components/AppShell.svelte +302 -0
- package/src/components/Avatar.svelte +235 -0
- package/src/components/AvatarEditor.svelte +321 -0
- package/src/components/AvatarsView.svelte +113 -0
- package/src/components/BranchBox.svelte +32 -0
- package/src/components/Brand.svelte +41 -0
- package/src/components/Button.svelte +161 -0
- package/src/components/CoinButton.svelte +121 -0
- package/src/components/CredMenu.svelte +171 -0
- package/src/components/DashboardView.svelte +198 -0
- package/src/components/FolderBrowser.svelte +635 -0
- package/src/components/HealthBox.svelte +161 -0
- package/src/components/IdeBar.svelte +186 -0
- package/src/components/IdeLoader.svelte +135 -0
- package/src/components/InstanceCard.svelte +220 -0
- package/src/components/InstanceView.svelte +565 -0
- package/src/components/PortsBox.svelte +73 -0
- package/src/components/SettingsCog.svelte +22 -0
- package/src/components/SettingsView.svelte +1484 -0
- package/src/components/Skeleton.svelte +43 -0
- package/src/components/StatusBadge.svelte +54 -0
- package/src/components/ThemePicker.svelte +77 -0
- package/src/components/TopBar.svelte +64 -0
- package/src/components/UiShowcase.svelte +578 -0
- package/src/components/ui-showcase/ComponentDemo.svelte +85 -0
- package/src/container-injections/attention-hooks.ts +117 -0
- package/src/container-injections/claude-aliases.ts +43 -0
- package/src/container-injections/claude-code-credentials.ts +145 -0
- package/src/container-injections/claude-code-custom.ts +125 -0
- package/src/container-injections/claude-no-coauthor.ts +35 -0
- package/src/container-injections/claude-skip-permissions.ts +38 -0
- package/src/container-injections/claude-statusline.ts +109 -0
- package/src/container-injections/git-identity.ts +63 -0
- package/src/container-injections/git-safe-directory.ts +18 -0
- package/src/container-injections/github-credentials.ts +162 -0
- package/src/container-injections/host-env-vars.ts +108 -0
- package/src/container-injections/tmux.ts +67 -0
- package/src/fontsource.d.ts +3 -0
- package/src/index.ts +81 -0
- package/src/lib/auth.server.ts +95 -0
- package/src/lib/bridge.server.ts +34 -0
- package/src/lib/config.server.ts +122 -0
- package/src/lib/crypto.server.ts +12 -0
- package/src/lib/db.server.ts +196 -0
- package/src/lib/devcontainer.server.ts +503 -0
- package/src/lib/docker-client.server.ts +61 -0
- package/src/lib/docker.server.ts +139 -0
- package/src/lib/exec.server.ts +92 -0
- package/src/lib/git.server.ts +68 -0
- package/src/lib/health.server.ts +105 -0
- package/src/lib/injections.server.ts +72 -0
- package/src/lib/instances.server.ts +552 -0
- package/src/lib/picker.server.ts +46 -0
- package/src/lib/ports.server.ts +9 -0
- package/src/lib/proxy.server.ts +170 -0
- package/src/lib/repo-url.ts +60 -0
- package/src/lib/spawn.server.ts +14 -0
- package/src/lib/theme.server.ts +22 -0
- package/src/live.ts +50 -0
- package/src/pages/App.svelte +14 -0
- package/src/pages/Avatars.svelte +7 -0
- package/src/pages/Instance.svelte +9 -0
- package/src/pages/Settings.svelte +73 -0
- package/src/pages/UI.svelte +10 -0
- package/src/routes.ts +440 -0
- package/src/settings.ts +14 -0
- package/src/shell.html +100 -0
- package/src/sound.ts +69 -0
- package/src/theme.ts +24 -0
- package/src/types.ts +79 -0
- package/svelte.config.js +5 -0
|
@@ -0,0 +1,1169 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
Plus,
|
|
4
|
+
playChime,
|
|
5
|
+
setSoundEnabled,
|
|
6
|
+
soundEnabled,
|
|
7
|
+
unlockAudio
|
|
8
|
+
} from "./chunk-9bjk7yx6.js";
|
|
9
|
+
import {
|
|
10
|
+
X
|
|
11
|
+
} from "./chunk-4kwy539a.js";
|
|
12
|
+
import {
|
|
13
|
+
AppBar,
|
|
14
|
+
Avatar,
|
|
15
|
+
Button,
|
|
16
|
+
Toaster
|
|
17
|
+
} from "./chunk-sxqys3nw.js";
|
|
18
|
+
import {
|
|
19
|
+
HydratableBoundary,
|
|
20
|
+
Icon,
|
|
21
|
+
cookies,
|
|
22
|
+
emitIslandProps
|
|
23
|
+
} from "./chunk-v6796ga4.js";
|
|
24
|
+
import"./chunk-we0ggtws.js";
|
|
25
|
+
|
|
26
|
+
// src/pages/Settings.svelte
|
|
27
|
+
import"svelte/internal/flags/async";
|
|
28
|
+
import * as $18 from "svelte/internal/server";
|
|
29
|
+
|
|
30
|
+
// src/components/SettingsView.svelte
|
|
31
|
+
import"svelte/internal/flags/async";
|
|
32
|
+
import * as $17 from "svelte/internal/server";
|
|
33
|
+
|
|
34
|
+
// node_modules/@lucide/svelte/dist/icons/container.svelte
|
|
35
|
+
import"svelte/internal/flags/async";
|
|
36
|
+
import * as $ from "svelte/internal/server";
|
|
37
|
+
function Container($$renderer, $$props) {
|
|
38
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
39
|
+
const iconNode = [
|
|
40
|
+
[
|
|
41
|
+
"path",
|
|
42
|
+
{
|
|
43
|
+
d: "M22 7.7c0-.6-.4-1.2-.8-1.5l-6.3-3.9a1.72 1.72 0 0 0-1.7 0l-10.3 6c-.5.2-.9.8-.9 1.4v6.6c0 .5.4 1.2.8 1.5l6.3 3.9a1.72 1.72 0 0 0 1.7 0l10.3-6c.5-.3.9-1 .9-1.5Z"
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
["path", { d: "M10 21.9V14L2.1 9.1" }],
|
|
47
|
+
["path", { d: "m10 14 11.9-6.9" }],
|
|
48
|
+
["path", { d: "M14 19.8v-8.1" }],
|
|
49
|
+
["path", { d: "M18 17.5V9.4" }]
|
|
50
|
+
];
|
|
51
|
+
Icon($$renderer, $.spread_props([{ name: "container" }, props, { iconNode }]));
|
|
52
|
+
}
|
|
53
|
+
// node_modules/@lucide/svelte/dist/icons/power.svelte
|
|
54
|
+
import"svelte/internal/flags/async";
|
|
55
|
+
import * as $2 from "svelte/internal/server";
|
|
56
|
+
function Power($$renderer, $$props) {
|
|
57
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
58
|
+
const iconNode = [
|
|
59
|
+
["path", { d: "M12 2v10" }],
|
|
60
|
+
["path", { d: "M18.4 6.6a9 9 0 1 1-12.77.04" }]
|
|
61
|
+
];
|
|
62
|
+
Icon($$renderer, $2.spread_props([{ name: "power" }, props, { iconNode }]));
|
|
63
|
+
}
|
|
64
|
+
// node_modules/@lucide/svelte/dist/icons/rotate-ccw.svelte
|
|
65
|
+
import"svelte/internal/flags/async";
|
|
66
|
+
import * as $3 from "svelte/internal/server";
|
|
67
|
+
function Rotate_ccw($$renderer, $$props) {
|
|
68
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
69
|
+
const iconNode = [
|
|
70
|
+
[
|
|
71
|
+
"path",
|
|
72
|
+
{ d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }
|
|
73
|
+
],
|
|
74
|
+
["path", { d: "M3 3v5h5" }]
|
|
75
|
+
];
|
|
76
|
+
Icon($$renderer, $3.spread_props([{ name: "rotate-ccw" }, props, { iconNode }]));
|
|
77
|
+
}
|
|
78
|
+
// node_modules/@lucide/svelte/dist/icons/volume-2.svelte
|
|
79
|
+
import"svelte/internal/flags/async";
|
|
80
|
+
import * as $4 from "svelte/internal/server";
|
|
81
|
+
function Volume_2($$renderer, $$props) {
|
|
82
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
83
|
+
const iconNode = [
|
|
84
|
+
[
|
|
85
|
+
"path",
|
|
86
|
+
{
|
|
87
|
+
d: "M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z"
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
["path", { d: "M16 9a5 5 0 0 1 0 6" }],
|
|
91
|
+
["path", { d: "M19.364 18.364a9 9 0 0 0 0-12.728" }]
|
|
92
|
+
];
|
|
93
|
+
Icon($$renderer, $4.spread_props([{ name: "volume-2" }, props, { iconNode }]));
|
|
94
|
+
}
|
|
95
|
+
// node_modules/@lucide/svelte/dist/icons/sun-moon.svelte
|
|
96
|
+
import"svelte/internal/flags/async";
|
|
97
|
+
import * as $5 from "svelte/internal/server";
|
|
98
|
+
function Sun_moon($$renderer, $$props) {
|
|
99
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
100
|
+
const iconNode = [
|
|
101
|
+
["path", { d: "M12 2v2" }],
|
|
102
|
+
[
|
|
103
|
+
"path",
|
|
104
|
+
{
|
|
105
|
+
d: "M14.837 16.385a6 6 0 1 1-7.223-7.222c.624-.147.97.66.715 1.248a4 4 0 0 0 5.26 5.259c.589-.255 1.396.09 1.248.715"
|
|
106
|
+
}
|
|
107
|
+
],
|
|
108
|
+
["path", { d: "M16 12a4 4 0 0 0-4-4" }],
|
|
109
|
+
["path", { d: "m19 5-1.256 1.256" }],
|
|
110
|
+
["path", { d: "M20 12h2" }]
|
|
111
|
+
];
|
|
112
|
+
Icon($$renderer, $5.spread_props([{ name: "sun-moon" }, props, { iconNode }]));
|
|
113
|
+
}
|
|
114
|
+
// src/components/ThemePicker.svelte
|
|
115
|
+
import"svelte/internal/flags/async";
|
|
116
|
+
import * as $9 from "svelte/internal/server";
|
|
117
|
+
|
|
118
|
+
// node_modules/@lucide/svelte/dist/icons/sun.svelte
|
|
119
|
+
import"svelte/internal/flags/async";
|
|
120
|
+
import * as $6 from "svelte/internal/server";
|
|
121
|
+
function Sun($$renderer, $$props) {
|
|
122
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
123
|
+
const iconNode = [
|
|
124
|
+
["circle", { cx: "12", cy: "12", r: "4" }],
|
|
125
|
+
["path", { d: "M12 2v2" }],
|
|
126
|
+
["path", { d: "M12 20v2" }],
|
|
127
|
+
["path", { d: "m4.93 4.93 1.41 1.41" }],
|
|
128
|
+
["path", { d: "m17.66 17.66 1.41 1.41" }],
|
|
129
|
+
["path", { d: "M2 12h2" }],
|
|
130
|
+
["path", { d: "M20 12h2" }],
|
|
131
|
+
["path", { d: "m6.34 17.66-1.41 1.41" }],
|
|
132
|
+
["path", { d: "m19.07 4.93-1.41 1.41" }]
|
|
133
|
+
];
|
|
134
|
+
Icon($$renderer, $6.spread_props([{ name: "sun" }, props, { iconNode }]));
|
|
135
|
+
}
|
|
136
|
+
// node_modules/@lucide/svelte/dist/icons/moon.svelte
|
|
137
|
+
import"svelte/internal/flags/async";
|
|
138
|
+
import * as $7 from "svelte/internal/server";
|
|
139
|
+
function Moon($$renderer, $$props) {
|
|
140
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
141
|
+
const iconNode = [
|
|
142
|
+
[
|
|
143
|
+
"path",
|
|
144
|
+
{
|
|
145
|
+
d: "M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
];
|
|
149
|
+
Icon($$renderer, $7.spread_props([{ name: "moon" }, props, { iconNode }]));
|
|
150
|
+
}
|
|
151
|
+
// node_modules/@lucide/svelte/dist/icons/monitor.svelte
|
|
152
|
+
import"svelte/internal/flags/async";
|
|
153
|
+
import * as $8 from "svelte/internal/server";
|
|
154
|
+
function Monitor($$renderer, $$props) {
|
|
155
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
156
|
+
const iconNode = [
|
|
157
|
+
[
|
|
158
|
+
"rect",
|
|
159
|
+
{ width: "20", height: "14", x: "2", y: "3", rx: "2" }
|
|
160
|
+
],
|
|
161
|
+
["line", { x1: "8", x2: "16", y1: "21", y2: "21" }],
|
|
162
|
+
["line", { x1: "12", x2: "12", y1: "17", y2: "21" }]
|
|
163
|
+
];
|
|
164
|
+
Icon($$renderer, $8.spread_props([{ name: "monitor" }, props, { iconNode }]));
|
|
165
|
+
}
|
|
166
|
+
// src/theme.ts
|
|
167
|
+
var THEME_KEY = "theme";
|
|
168
|
+
function getTheme() {
|
|
169
|
+
const value = cookies.get(THEME_KEY);
|
|
170
|
+
return value === "dark" || value === "light" ? value : "auto";
|
|
171
|
+
}
|
|
172
|
+
function setTheme(theme) {
|
|
173
|
+
cookies.set(THEME_KEY, theme, { expires: 400, path: "/" });
|
|
174
|
+
}
|
|
175
|
+
function applyTheme(theme) {
|
|
176
|
+
if (theme === "auto")
|
|
177
|
+
delete document.documentElement.dataset.theme;
|
|
178
|
+
else
|
|
179
|
+
document.documentElement.dataset.theme = theme;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// src/components/ThemePicker.svelte
|
|
183
|
+
function ThemePicker($$renderer, $$props) {
|
|
184
|
+
$$renderer.component(($$renderer2) => {
|
|
185
|
+
let theme = getTheme();
|
|
186
|
+
const options = [
|
|
187
|
+
{ value: "auto", label: "Auto", icon: Monitor },
|
|
188
|
+
{ value: "light", label: "Light", icon: Sun },
|
|
189
|
+
{ value: "dark", label: "Dark", icon: Moon }
|
|
190
|
+
];
|
|
191
|
+
function select(value) {
|
|
192
|
+
theme = value;
|
|
193
|
+
setTheme(value);
|
|
194
|
+
applyTheme(value);
|
|
195
|
+
}
|
|
196
|
+
$$renderer2.push(`<div class="picker svelte-3gcwuj" role="radiogroup" aria-label="Theme"><!--[-->`);
|
|
197
|
+
const each_array = $9.ensure_array_like(options);
|
|
198
|
+
for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
|
|
199
|
+
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)}>`);
|
|
201
|
+
if (Icon2) {
|
|
202
|
+
$$renderer2.push("<!--[-->");
|
|
203
|
+
Icon2($$renderer2, { size: 13 });
|
|
204
|
+
$$renderer2.push("<!--]-->");
|
|
205
|
+
} else {
|
|
206
|
+
$$renderer2.push("<!--[!-->");
|
|
207
|
+
$$renderer2.push("<!--]-->");
|
|
208
|
+
}
|
|
209
|
+
$$renderer2.push(` ${$9.escape(label)}</button>`);
|
|
210
|
+
}
|
|
211
|
+
$$renderer2.push(`<!--]--></div>`);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// node_modules/@lucide/svelte/dist/icons/layers.svelte
|
|
216
|
+
import"svelte/internal/flags/async";
|
|
217
|
+
import * as $10 from "svelte/internal/server";
|
|
218
|
+
function Layers($$renderer, $$props) {
|
|
219
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
220
|
+
const iconNode = [
|
|
221
|
+
[
|
|
222
|
+
"path",
|
|
223
|
+
{
|
|
224
|
+
d: "M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z"
|
|
225
|
+
}
|
|
226
|
+
],
|
|
227
|
+
[
|
|
228
|
+
"path",
|
|
229
|
+
{
|
|
230
|
+
d: "M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12"
|
|
231
|
+
}
|
|
232
|
+
],
|
|
233
|
+
[
|
|
234
|
+
"path",
|
|
235
|
+
{
|
|
236
|
+
d: "M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17"
|
|
237
|
+
}
|
|
238
|
+
]
|
|
239
|
+
];
|
|
240
|
+
Icon($$renderer, $10.spread_props([{ name: "layers" }, props, { iconNode }]));
|
|
241
|
+
}
|
|
242
|
+
// node_modules/@lucide/svelte/dist/icons/folder-minus.svelte
|
|
243
|
+
import"svelte/internal/flags/async";
|
|
244
|
+
import * as $11 from "svelte/internal/server";
|
|
245
|
+
function Folder_minus($$renderer, $$props) {
|
|
246
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
247
|
+
const iconNode = [
|
|
248
|
+
["path", { d: "M9 13h6" }],
|
|
249
|
+
[
|
|
250
|
+
"path",
|
|
251
|
+
{
|
|
252
|
+
d: "M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"
|
|
253
|
+
}
|
|
254
|
+
]
|
|
255
|
+
];
|
|
256
|
+
Icon($$renderer, $11.spread_props([{ name: "folder-minus" }, props, { iconNode }]));
|
|
257
|
+
}
|
|
258
|
+
// node_modules/@lucide/svelte/dist/icons/trash-2.svelte
|
|
259
|
+
import"svelte/internal/flags/async";
|
|
260
|
+
import * as $12 from "svelte/internal/server";
|
|
261
|
+
function Trash_2($$renderer, $$props) {
|
|
262
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
263
|
+
const iconNode = [
|
|
264
|
+
["path", { d: "M10 11v6" }],
|
|
265
|
+
["path", { d: "M14 11v6" }],
|
|
266
|
+
["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" }],
|
|
267
|
+
["path", { d: "M3 6h18" }],
|
|
268
|
+
["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }]
|
|
269
|
+
];
|
|
270
|
+
Icon($$renderer, $12.spread_props([{ name: "trash-2" }, props, { iconNode }]));
|
|
271
|
+
}
|
|
272
|
+
// node_modules/@lucide/svelte/dist/icons/hammer.svelte
|
|
273
|
+
import"svelte/internal/flags/async";
|
|
274
|
+
import * as $13 from "svelte/internal/server";
|
|
275
|
+
function Hammer($$renderer, $$props) {
|
|
276
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
277
|
+
const iconNode = [
|
|
278
|
+
["path", { d: "m15 12-9.373 9.373a1 1 0 0 1-3.001-3L12 9" }],
|
|
279
|
+
["path", { d: "m18 15 4-4" }],
|
|
280
|
+
[
|
|
281
|
+
"path",
|
|
282
|
+
{
|
|
283
|
+
d: "m21.5 11.5-1.914-1.914A2 2 0 0 1 19 8.172v-.344a2 2 0 0 0-.586-1.414l-1.657-1.657A6 6 0 0 0 12.516 3H9l1.243 1.243A6 6 0 0 1 12 8.485V10l2 2h1.172a2 2 0 0 1 1.414.586L18.5 14.5"
|
|
284
|
+
}
|
|
285
|
+
]
|
|
286
|
+
];
|
|
287
|
+
Icon($$renderer, $13.spread_props([{ name: "hammer" }, props, { iconNode }]));
|
|
288
|
+
}
|
|
289
|
+
// node_modules/@lucide/svelte/dist/icons/key-round.svelte
|
|
290
|
+
import"svelte/internal/flags/async";
|
|
291
|
+
import * as $14 from "svelte/internal/server";
|
|
292
|
+
function Key_round($$renderer, $$props) {
|
|
293
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
294
|
+
const iconNode = [
|
|
295
|
+
[
|
|
296
|
+
"path",
|
|
297
|
+
{
|
|
298
|
+
d: "M2.586 17.414A2 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-.814a6.5 6.5 0 1 0-4-4z"
|
|
299
|
+
}
|
|
300
|
+
],
|
|
301
|
+
[
|
|
302
|
+
"circle",
|
|
303
|
+
{ cx: "16.5", cy: "7.5", r: ".5", fill: "currentColor" }
|
|
304
|
+
]
|
|
305
|
+
];
|
|
306
|
+
Icon($$renderer, $14.spread_props([{ name: "key-round" }, props, { iconNode }]));
|
|
307
|
+
}
|
|
308
|
+
// node_modules/@lucide/svelte/dist/icons/variable.svelte
|
|
309
|
+
import"svelte/internal/flags/async";
|
|
310
|
+
import * as $15 from "svelte/internal/server";
|
|
311
|
+
function Variable($$renderer, $$props) {
|
|
312
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
313
|
+
const iconNode = [
|
|
314
|
+
["path", { d: "M8 21s-4-3-4-9 4-9 4-9" }],
|
|
315
|
+
["path", { d: "M16 3s4 3 4 9-4 9-4 9" }],
|
|
316
|
+
["line", { x1: "15", x2: "9", y1: "9", y2: "15" }],
|
|
317
|
+
["line", { x1: "9", x2: "15", y1: "9", y2: "15" }]
|
|
318
|
+
];
|
|
319
|
+
Icon($$renderer, $15.spread_props([{ name: "variable" }, props, { iconNode }]));
|
|
320
|
+
}
|
|
321
|
+
// src/components/SettingsView.svelte
|
|
322
|
+
import { flushSync } from "svelte";
|
|
323
|
+
|
|
324
|
+
// src/components/CoinButton.svelte
|
|
325
|
+
import"svelte/internal/flags/async";
|
|
326
|
+
import * as $16 from "svelte/internal/server";
|
|
327
|
+
function CoinButton($$renderer, $$props) {
|
|
328
|
+
let { href = "/avatars" } = $$props;
|
|
329
|
+
const coinArt = {
|
|
330
|
+
name: "coin",
|
|
331
|
+
pixels: [
|
|
332
|
+
"..####..",
|
|
333
|
+
".#....#.",
|
|
334
|
+
"#..##..#",
|
|
335
|
+
"#.####.#",
|
|
336
|
+
"#.####.#",
|
|
337
|
+
"#..##..#",
|
|
338
|
+
".#....#.",
|
|
339
|
+
"..####.."
|
|
340
|
+
]
|
|
341
|
+
};
|
|
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">`);
|
|
343
|
+
Avatar($$renderer, { art: coinArt, name: "coin", scale: 3 });
|
|
344
|
+
$$renderer.push(`<!----></span></a> <span class="pixel-line svelte-1ioj7vz" aria-hidden="true"></span></div>`);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// src/components/SettingsView.svelte
|
|
348
|
+
function SettingsView($$renderer, $$props) {
|
|
349
|
+
$$renderer.component(($$renderer2) => {
|
|
350
|
+
let {
|
|
351
|
+
defaultImage,
|
|
352
|
+
builtinImage,
|
|
353
|
+
disableBuildCache,
|
|
354
|
+
copyIgnorePatterns,
|
|
355
|
+
builtinCopyIgnore,
|
|
356
|
+
dockerArch,
|
|
357
|
+
manualTokensEnabled,
|
|
358
|
+
githubTokenSet,
|
|
359
|
+
claudeTokenSet,
|
|
360
|
+
customEndpointEnabled,
|
|
361
|
+
customEndpointBaseUrl,
|
|
362
|
+
customEndpointTokenSet,
|
|
363
|
+
customEndpointOpusModel,
|
|
364
|
+
customEndpointSonnetModel,
|
|
365
|
+
customEndpointHaikuModel,
|
|
366
|
+
customEndpointSmallFastModel,
|
|
367
|
+
customEndpointModel,
|
|
368
|
+
hostEnvVarsEnabled,
|
|
369
|
+
hostEnvVarNames,
|
|
370
|
+
hostEnvVarPresence
|
|
371
|
+
} = $$props;
|
|
372
|
+
let sound = soundEnabled();
|
|
373
|
+
let shuttingDown = false;
|
|
374
|
+
function saveOpts(handlers) {
|
|
375
|
+
return {
|
|
376
|
+
onPending: handlers.setSaving,
|
|
377
|
+
submit: ({ cancel }) => {
|
|
378
|
+
if (handlers.confirmMessage && !confirm(handlers.confirmMessage)) {
|
|
379
|
+
cancel();
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
handlers.setError(null);
|
|
383
|
+
handlers.setMsg?.(null);
|
|
384
|
+
return ({ result }) => {
|
|
385
|
+
if (result.type === "success") {
|
|
386
|
+
handlers.onSuccess(result.data);
|
|
387
|
+
} else if (result.type === "failure") {
|
|
388
|
+
handlers.setError(result.data?.error ?? "Request failed");
|
|
389
|
+
} else if (result.type === "error") {
|
|
390
|
+
handlers.setError("Network error. Try again.");
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
function toggleOpts(handlers) {
|
|
397
|
+
return {
|
|
398
|
+
onPending: handlers.setSaving,
|
|
399
|
+
submit: ({ formData }) => {
|
|
400
|
+
const intended = formData.get("enabled") === "on";
|
|
401
|
+
handlers.setError(null);
|
|
402
|
+
return ({ result }) => {
|
|
403
|
+
if (result.type === "success") {
|
|
404
|
+
handlers.onSuccess?.(result.data);
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
handlers.set(!intended);
|
|
408
|
+
handlers.setError(result.type === "failure" ? result.data?.error ?? "Request failed" : "Network error. Try again.");
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
let image = defaultImage;
|
|
414
|
+
let savingImage = false;
|
|
415
|
+
let imageError = null;
|
|
416
|
+
let imageSaved = false;
|
|
417
|
+
let imageFormEl;
|
|
418
|
+
const imageOpts = saveOpts({
|
|
419
|
+
setSaving: (v) => savingImage = v,
|
|
420
|
+
setError: (v) => imageError = v,
|
|
421
|
+
setMsg: (v) => imageSaved = !!v,
|
|
422
|
+
onSuccess: (data) => {
|
|
423
|
+
image = data?.image ?? image;
|
|
424
|
+
imageSaved = true;
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
function resetImage() {
|
|
428
|
+
flushSync(() => image = builtinImage);
|
|
429
|
+
imageFormEl?.requestSubmit();
|
|
430
|
+
}
|
|
431
|
+
let copyIgnore = copyIgnorePatterns;
|
|
432
|
+
let savingCopyIgnore = false;
|
|
433
|
+
let copyIgnoreError = null;
|
|
434
|
+
let copyIgnoreSaved = false;
|
|
435
|
+
let copyIgnoreFormEl;
|
|
436
|
+
const copyIgnoreOpts = saveOpts({
|
|
437
|
+
setSaving: (v) => savingCopyIgnore = v,
|
|
438
|
+
setError: (v) => copyIgnoreError = v,
|
|
439
|
+
setMsg: (v) => copyIgnoreSaved = !!v,
|
|
440
|
+
onSuccess: (data) => {
|
|
441
|
+
copyIgnore = data?.patterns ?? copyIgnore;
|
|
442
|
+
copyIgnoreSaved = true;
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
function resetCopyIgnore() {
|
|
446
|
+
flushSync(() => copyIgnore = builtinCopyIgnore);
|
|
447
|
+
copyIgnoreFormEl?.requestSubmit();
|
|
448
|
+
}
|
|
449
|
+
let noCache = disableBuildCache;
|
|
450
|
+
let savingCache = false;
|
|
451
|
+
let cacheError = null;
|
|
452
|
+
const buildCacheToggleOpts = toggleOpts({
|
|
453
|
+
set: (v) => noCache = v,
|
|
454
|
+
setSaving: (v) => savingCache = v,
|
|
455
|
+
setError: (v) => cacheError = v
|
|
456
|
+
});
|
|
457
|
+
let clearing = false;
|
|
458
|
+
let clearMsg = null;
|
|
459
|
+
let clearError = null;
|
|
460
|
+
function formatBytes(n) {
|
|
461
|
+
if (n <= 0)
|
|
462
|
+
return "0 B";
|
|
463
|
+
const units = ["B", "KB", "MB", "GB", "TB"];
|
|
464
|
+
const i = Math.min(Math.floor(Math.log(n) / Math.log(1024)), units.length - 1);
|
|
465
|
+
return `${(n / 1024 ** i).toFixed(i === 0 ? 0 : 1)} ${units[i]}`;
|
|
466
|
+
}
|
|
467
|
+
const clearCacheOpts = saveOpts({
|
|
468
|
+
setSaving: (v) => clearing = v,
|
|
469
|
+
setError: (v) => clearError = v,
|
|
470
|
+
setMsg: (v) => clearMsg = v,
|
|
471
|
+
onSuccess: (data) => {
|
|
472
|
+
clearMsg = `Cleared \u2014 freed ${formatBytes(data?.spaceReclaimed ?? 0)}.`;
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
let rebuilding = false;
|
|
476
|
+
let rebuildMsg = null;
|
|
477
|
+
let rebuildError = null;
|
|
478
|
+
const rebuildAllOpts = saveOpts({
|
|
479
|
+
setSaving: (v) => rebuilding = v,
|
|
480
|
+
setError: (v) => rebuildError = v,
|
|
481
|
+
setMsg: (v) => rebuildMsg = v,
|
|
482
|
+
confirmMessage: "Rebuild every running container from scratch (no build cache)? Each will restart and may take a while.",
|
|
483
|
+
onSuccess: (data) => {
|
|
484
|
+
const n = data?.count ?? 0;
|
|
485
|
+
rebuildMsg = n === 0 ? "No running containers to rebuild." : `Rebuilding ${n} container(s)\u2026`;
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
let manualTokens = manualTokensEnabled;
|
|
489
|
+
let savingManualToggle = false;
|
|
490
|
+
let manualToggleError = null;
|
|
491
|
+
const manualTokensToggleOpts = toggleOpts({
|
|
492
|
+
set: (v) => manualTokens = v,
|
|
493
|
+
setSaving: (v) => savingManualToggle = v,
|
|
494
|
+
setError: (v) => manualToggleError = v
|
|
495
|
+
});
|
|
496
|
+
let ghSaved = githubTokenSet;
|
|
497
|
+
let githubToken = "";
|
|
498
|
+
let savingGithub = false;
|
|
499
|
+
let githubMsg = null;
|
|
500
|
+
let githubError = null;
|
|
501
|
+
const githubTokenOpts = saveOpts({
|
|
502
|
+
setSaving: (v) => savingGithub = v,
|
|
503
|
+
setError: (v) => githubError = v,
|
|
504
|
+
setMsg: (v) => githubMsg = v,
|
|
505
|
+
onSuccess: (data) => {
|
|
506
|
+
ghSaved = data?.set ?? false;
|
|
507
|
+
githubToken = "";
|
|
508
|
+
githubMsg = ghSaved ? "Saved." : "Cleared.";
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
let claudeSaved = claudeTokenSet;
|
|
512
|
+
let claudeToken = "";
|
|
513
|
+
let savingClaude = false;
|
|
514
|
+
let claudeMsg = null;
|
|
515
|
+
let claudeError = null;
|
|
516
|
+
const claudeTokenOpts = saveOpts({
|
|
517
|
+
setSaving: (v) => savingClaude = v,
|
|
518
|
+
setError: (v) => claudeError = v,
|
|
519
|
+
setMsg: (v) => claudeMsg = v,
|
|
520
|
+
onSuccess: (data) => {
|
|
521
|
+
claudeSaved = data?.set ?? false;
|
|
522
|
+
claudeToken = "";
|
|
523
|
+
claudeMsg = claudeSaved ? "Saved." : "Cleared.";
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
let customEndpoint = customEndpointEnabled;
|
|
527
|
+
let savingCustomToggle = false;
|
|
528
|
+
let customToggleError = null;
|
|
529
|
+
const customEndpointToggleOpts = toggleOpts({
|
|
530
|
+
set: (v) => customEndpoint = v,
|
|
531
|
+
setSaving: (v) => savingCustomToggle = v,
|
|
532
|
+
setError: (v) => customToggleError = v
|
|
533
|
+
});
|
|
534
|
+
let customBaseUrl = customEndpointBaseUrl;
|
|
535
|
+
let savingCustomBaseUrl = false;
|
|
536
|
+
let customBaseUrlMsg = null;
|
|
537
|
+
let customBaseUrlError = null;
|
|
538
|
+
const customBaseUrlOpts = saveOpts({
|
|
539
|
+
setSaving: (v) => savingCustomBaseUrl = v,
|
|
540
|
+
setError: (v) => customBaseUrlError = v,
|
|
541
|
+
setMsg: (v) => customBaseUrlMsg = v,
|
|
542
|
+
onSuccess: (data) => {
|
|
543
|
+
customBaseUrlMsg = data?.set ? "Saved." : "Cleared.";
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
let customToken = "";
|
|
547
|
+
let customTokenSaved = customEndpointTokenSet;
|
|
548
|
+
let savingCustomToken = false;
|
|
549
|
+
let customTokenMsg = null;
|
|
550
|
+
let customTokenError = null;
|
|
551
|
+
const customTokenOpts = saveOpts({
|
|
552
|
+
setSaving: (v) => savingCustomToken = v,
|
|
553
|
+
setError: (v) => customTokenError = v,
|
|
554
|
+
setMsg: (v) => customTokenMsg = v,
|
|
555
|
+
onSuccess: (data) => {
|
|
556
|
+
customTokenSaved = data?.set ?? false;
|
|
557
|
+
customToken = "";
|
|
558
|
+
customTokenMsg = customTokenSaved ? "Saved." : "Cleared.";
|
|
559
|
+
}
|
|
560
|
+
});
|
|
561
|
+
let customOpusModel = customEndpointOpusModel;
|
|
562
|
+
let customSonnetModel = customEndpointSonnetModel;
|
|
563
|
+
let customHaikuModel = customEndpointHaikuModel;
|
|
564
|
+
let customSmallFastModel = customEndpointSmallFastModel;
|
|
565
|
+
let customDefaultModel = customEndpointModel;
|
|
566
|
+
let savingCustomModels = false;
|
|
567
|
+
let customModelsMsg = null;
|
|
568
|
+
let customModelsError = null;
|
|
569
|
+
const customModelsOpts = saveOpts({
|
|
570
|
+
setSaving: (v) => savingCustomModels = v,
|
|
571
|
+
setError: (v) => customModelsError = v,
|
|
572
|
+
setMsg: (v) => customModelsMsg = v,
|
|
573
|
+
onSuccess: () => {
|
|
574
|
+
customModelsMsg = "Saved.";
|
|
575
|
+
}
|
|
576
|
+
});
|
|
577
|
+
let hostEnvVars = hostEnvVarsEnabled;
|
|
578
|
+
let savingHostEnvToggle = false;
|
|
579
|
+
let hostEnvToggleError = null;
|
|
580
|
+
const hostEnvVarsToggleOpts = toggleOpts({
|
|
581
|
+
set: (v) => hostEnvVars = v,
|
|
582
|
+
setSaving: (v) => savingHostEnvToggle = v,
|
|
583
|
+
setError: (v) => hostEnvToggleError = v,
|
|
584
|
+
onSuccess: (data) => {
|
|
585
|
+
hostEnvPresence = data?.presence ?? {};
|
|
586
|
+
}
|
|
587
|
+
});
|
|
588
|
+
let hostEnvNames = [...hostEnvVarNames];
|
|
589
|
+
let hostEnvPresence = { ...hostEnvVarPresence };
|
|
590
|
+
let newHostEnvName = "";
|
|
591
|
+
let savingHostEnvNames = false;
|
|
592
|
+
let hostEnvNamesMsg = null;
|
|
593
|
+
let hostEnvNamesError = null;
|
|
594
|
+
const addHostEnvOpts = {
|
|
595
|
+
onPending: (v) => savingHostEnvNames = v,
|
|
596
|
+
submit: ({ formData, cancel }) => {
|
|
597
|
+
hostEnvNamesError = null;
|
|
598
|
+
hostEnvNamesMsg = null;
|
|
599
|
+
const existing = formData.getAll("names").map(String);
|
|
600
|
+
const typed = existing.pop() ?? "";
|
|
601
|
+
const name = typed.trim().toUpperCase();
|
|
602
|
+
if (!name) {
|
|
603
|
+
cancel();
|
|
604
|
+
return;
|
|
605
|
+
}
|
|
606
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
|
|
607
|
+
hostEnvNamesError = `Invalid variable name: ${name}`;
|
|
608
|
+
cancel();
|
|
609
|
+
return;
|
|
610
|
+
}
|
|
611
|
+
newHostEnvName = "";
|
|
612
|
+
if (existing.includes(name)) {
|
|
613
|
+
cancel();
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
const names = [...existing, name];
|
|
617
|
+
formData.delete("names");
|
|
618
|
+
for (const n of names)
|
|
619
|
+
formData.append("names", n);
|
|
620
|
+
return ({ result }) => {
|
|
621
|
+
if (result.type === "success") {
|
|
622
|
+
hostEnvNames = names;
|
|
623
|
+
hostEnvPresence = result.data?.presence ?? {};
|
|
624
|
+
hostEnvNamesMsg = "Saved.";
|
|
625
|
+
} else if (result.type === "failure") {
|
|
626
|
+
hostEnvNamesError = result.data?.error ?? "Request failed";
|
|
627
|
+
} else if (result.type === "error") {
|
|
628
|
+
hostEnvNamesError = "Network error. Try again.";
|
|
629
|
+
}
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
};
|
|
633
|
+
function removeHostEnvOpts(name) {
|
|
634
|
+
return saveOpts({
|
|
635
|
+
setSaving: (v) => savingHostEnvNames = v,
|
|
636
|
+
setError: (v) => hostEnvNamesError = v,
|
|
637
|
+
setMsg: (v) => hostEnvNamesMsg = v,
|
|
638
|
+
onSuccess: (data) => {
|
|
639
|
+
hostEnvNames = hostEnvNames.filter((n) => n !== name);
|
|
640
|
+
hostEnvPresence = data?.presence ?? {};
|
|
641
|
+
}
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
function toggleSound(on) {
|
|
645
|
+
sound = on;
|
|
646
|
+
setSoundEnabled(on);
|
|
647
|
+
unlockAudio();
|
|
648
|
+
if (on)
|
|
649
|
+
playChime("done");
|
|
650
|
+
}
|
|
651
|
+
const shutdownOpts = {
|
|
652
|
+
submit: ({ cancel }) => {
|
|
653
|
+
if (!confirm("Delete the database, remove all instances and their containers, and shut down the server? This cannot be undone.")) {
|
|
654
|
+
cancel();
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
shuttingDown = true;
|
|
658
|
+
}
|
|
659
|
+
};
|
|
660
|
+
$$renderer2.push(`<div class="page svelte-1n6ht58">`);
|
|
661
|
+
AppBar($$renderer2, {
|
|
662
|
+
children: ($$renderer3) => {
|
|
663
|
+
$$renderer3.push(`<span class="title svelte-1n6ht58">Settings</span>`);
|
|
664
|
+
},
|
|
665
|
+
$$slots: { default: true }
|
|
666
|
+
});
|
|
667
|
+
$$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">`);
|
|
668
|
+
Container($$renderer2, { size: 18 });
|
|
669
|
+
$$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Default container image `);
|
|
670
|
+
if (dockerArch) {
|
|
671
|
+
$$renderer2.push("<!--[0-->");
|
|
672
|
+
$$renderer2.push(`<span class="arch svelte-1n6ht58" title="Docker daemon architecture">${$17.escape(dockerArch)}</span>`);
|
|
673
|
+
} else {
|
|
674
|
+
$$renderer2.push("<!--[-1-->");
|
|
675
|
+
}
|
|
676
|
+
$$renderer2.push(`<!--]--></div> <div class="desc svelte-1n6ht58">Used only when a project folder ships no devcontainer.json. Takes effect for instances
|
|
677
|
+
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"/> `);
|
|
678
|
+
Button($$renderer2, {
|
|
679
|
+
type: "submit",
|
|
680
|
+
disabled: savingImage,
|
|
681
|
+
children: ($$renderer3) => {
|
|
682
|
+
$$renderer3.push(`<!---->Save`);
|
|
683
|
+
},
|
|
684
|
+
$$slots: { default: true }
|
|
685
|
+
});
|
|
686
|
+
$$renderer2.push(`<!----> `);
|
|
687
|
+
Button($$renderer2, {
|
|
688
|
+
type: "button",
|
|
689
|
+
icon: Rotate_ccw,
|
|
690
|
+
disabled: savingImage,
|
|
691
|
+
onclick: resetImage,
|
|
692
|
+
title: `Reset to default (${$17.stringify(builtinImage)})`,
|
|
693
|
+
"aria-label": "Reset to default image"
|
|
694
|
+
});
|
|
695
|
+
$$renderer2.push(`<!----></div> <div class="desc tip svelte-1n6ht58">`);
|
|
696
|
+
if (dockerArch) {
|
|
697
|
+
$$renderer2.push("<!--[0-->");
|
|
698
|
+
$$renderer2.push(`Your Docker daemon runs on <strong>${$17.escape(dockerArch)}</strong> \u2014 pick an image that publishes
|
|
699
|
+
an <strong>${$17.escape(dockerArch)}</strong> manifest, or the pull will fail.`);
|
|
700
|
+
} else {
|
|
701
|
+
$$renderer2.push("<!--[-1-->");
|
|
702
|
+
$$renderer2.push(`Pick an image whose manifest covers your Docker daemon's architecture, or the pull will
|
|
703
|
+
fail.`);
|
|
704
|
+
}
|
|
705
|
+
$$renderer2.push(`<!--]--></div> `);
|
|
706
|
+
if (imageError) {
|
|
707
|
+
$$renderer2.push("<!--[0-->");
|
|
708
|
+
$$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(imageError)}</div>`);
|
|
709
|
+
} else if (imageSaved) {
|
|
710
|
+
$$renderer2.push("<!--[1-->");
|
|
711
|
+
$$renderer2.push(`<div class="msg ok svelte-1n6ht58">Saved.</div>`);
|
|
712
|
+
} else {
|
|
713
|
+
$$renderer2.push("<!--[-1-->");
|
|
714
|
+
}
|
|
715
|
+
$$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">`);
|
|
716
|
+
Folder_minus($$renderer2, { size: 18 });
|
|
717
|
+
$$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
|
|
718
|
+
new instance's workspace. Leave blank to copy everything. Only applies to local
|
|
719
|
+
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"/> `);
|
|
720
|
+
Button($$renderer2, {
|
|
721
|
+
type: "submit",
|
|
722
|
+
disabled: savingCopyIgnore,
|
|
723
|
+
children: ($$renderer3) => {
|
|
724
|
+
$$renderer3.push(`<!---->Save`);
|
|
725
|
+
},
|
|
726
|
+
$$slots: { default: true }
|
|
727
|
+
});
|
|
728
|
+
$$renderer2.push(`<!----> `);
|
|
729
|
+
Button($$renderer2, {
|
|
730
|
+
type: "button",
|
|
731
|
+
icon: Rotate_ccw,
|
|
732
|
+
disabled: savingCopyIgnore,
|
|
733
|
+
onclick: resetCopyIgnore,
|
|
734
|
+
title: `Reset to default (${$17.stringify(builtinCopyIgnore)})`,
|
|
735
|
+
"aria-label": "Reset to default copy-ignore patterns"
|
|
736
|
+
});
|
|
737
|
+
$$renderer2.push(`<!----></div> `);
|
|
738
|
+
if (copyIgnoreError) {
|
|
739
|
+
$$renderer2.push("<!--[0-->");
|
|
740
|
+
$$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(copyIgnoreError)}</div>`);
|
|
741
|
+
} else if (copyIgnoreSaved) {
|
|
742
|
+
$$renderer2.push("<!--[1-->");
|
|
743
|
+
$$renderer2.push(`<div class="msg ok svelte-1n6ht58">Saved.</div>`);
|
|
744
|
+
} else {
|
|
745
|
+
$$renderer2.push("<!--[-1-->");
|
|
746
|
+
}
|
|
747
|
+
$$renderer2.push(`<!--]--></form></section> <section class="card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/disableBuildCache"><div class="label svelte-1n6ht58">`);
|
|
748
|
+
Layers($$renderer2, { size: 18 });
|
|
749
|
+
$$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
|
|
750
|
+
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> `);
|
|
751
|
+
if (cacheError) {
|
|
752
|
+
$$renderer2.push("<!--[0-->");
|
|
753
|
+
$$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$17.escape(cacheError)}</div></div>`);
|
|
754
|
+
} else {
|
|
755
|
+
$$renderer2.push("<!--[-1-->");
|
|
756
|
+
}
|
|
757
|
+
$$renderer2.push(`<!--]--> <form class="row divided svelte-1n6ht58" method="POST" action="?/clearBuildCache"><div class="label svelte-1n6ht58">`);
|
|
758
|
+
Trash_2($$renderer2, { size: 18 });
|
|
759
|
+
$$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
|
|
760
|
+
remove pulled images.</div> `);
|
|
761
|
+
if (clearError) {
|
|
762
|
+
$$renderer2.push("<!--[0-->");
|
|
763
|
+
$$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(clearError)}</div>`);
|
|
764
|
+
} else if (clearMsg) {
|
|
765
|
+
$$renderer2.push("<!--[1-->");
|
|
766
|
+
$$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(clearMsg)}</div>`);
|
|
767
|
+
} else {
|
|
768
|
+
$$renderer2.push("<!--[-1-->");
|
|
769
|
+
}
|
|
770
|
+
$$renderer2.push(`<!--]--></div></div> `);
|
|
771
|
+
Button($$renderer2, {
|
|
772
|
+
type: "submit",
|
|
773
|
+
icon: Trash_2,
|
|
774
|
+
disabled: clearing,
|
|
775
|
+
children: ($$renderer3) => {
|
|
776
|
+
$$renderer3.push(`<!---->${$17.escape(clearing ? "Clearing\u2026" : "Clear cache")}`);
|
|
777
|
+
},
|
|
778
|
+
$$slots: { default: true }
|
|
779
|
+
});
|
|
780
|
+
$$renderer2.push(`<!----></form> <form class="row divided svelte-1n6ht58" method="POST" action="?/rebuildAllNoCache"><div class="label svelte-1n6ht58">`);
|
|
781
|
+
Hammer($$renderer2, { size: 18 });
|
|
782
|
+
$$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.
|
|
783
|
+
In-container edits are kept; stopped instances are left alone.</div> `);
|
|
784
|
+
if (rebuildError) {
|
|
785
|
+
$$renderer2.push("<!--[0-->");
|
|
786
|
+
$$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(rebuildError)}</div>`);
|
|
787
|
+
} else if (rebuildMsg) {
|
|
788
|
+
$$renderer2.push("<!--[1-->");
|
|
789
|
+
$$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(rebuildMsg)}</div>`);
|
|
790
|
+
} else {
|
|
791
|
+
$$renderer2.push("<!--[-1-->");
|
|
792
|
+
}
|
|
793
|
+
$$renderer2.push(`<!--]--></div></div> `);
|
|
794
|
+
Button($$renderer2, {
|
|
795
|
+
type: "submit",
|
|
796
|
+
icon: Hammer,
|
|
797
|
+
disabled: rebuilding,
|
|
798
|
+
children: ($$renderer3) => {
|
|
799
|
+
$$renderer3.push(`<!---->${$17.escape(rebuilding ? "Starting\u2026" : "Rebuild all")}`);
|
|
800
|
+
},
|
|
801
|
+
$$slots: { default: true }
|
|
802
|
+
});
|
|
803
|
+
$$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">`);
|
|
804
|
+
Key_round($$renderer2, { size: 18 });
|
|
805
|
+
$$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">Set tokens manually `);
|
|
806
|
+
if (customEndpoint) {
|
|
807
|
+
$$renderer2.push("<!--[0-->");
|
|
808
|
+
$$renderer2.push(`<span class="arch svelte-1n6ht58" title="Disabled while LiteLLM + Bedrock mode is on">disabled</span>`);
|
|
809
|
+
} else {
|
|
810
|
+
$$renderer2.push("<!--[-1-->");
|
|
811
|
+
}
|
|
812
|
+
$$renderer2.push(`<!--]--></div> <div class="desc svelte-1n6ht58">`);
|
|
813
|
+
if (customEndpoint) {
|
|
814
|
+
$$renderer2.push("<!--[0-->");
|
|
815
|
+
$$renderer2.push(`Not available while LiteLLM + Bedrock mode is enabled \u2014 Claude credentials are
|
|
816
|
+
provided by the LiteLLM endpoint instead.`);
|
|
817
|
+
} else {
|
|
818
|
+
$$renderer2.push("<!--[-1-->");
|
|
819
|
+
$$renderer2.push(`Provide GitHub and Claude Code tokens yourself instead of discovering them from this
|
|
820
|
+
machine. Useful on a headless server or when signed in as a different identity. A
|
|
821
|
+
token set here is injected into every new container and overrides host credential
|
|
822
|
+
discovery.`);
|
|
823
|
+
}
|
|
824
|
+
$$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> `);
|
|
825
|
+
if (manualToggleError) {
|
|
826
|
+
$$renderer2.push("<!--[0-->");
|
|
827
|
+
$$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$17.escape(manualToggleError)}</div></div>`);
|
|
828
|
+
} else {
|
|
829
|
+
$$renderer2.push("<!--[-1-->");
|
|
830
|
+
}
|
|
831
|
+
$$renderer2.push(`<!--]--> `);
|
|
832
|
+
if (manualTokens && !customEndpoint) {
|
|
833
|
+
$$renderer2.push("<!--[0-->");
|
|
834
|
+
$$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
|
|
835
|
+
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")}/> `);
|
|
836
|
+
Button($$renderer2, {
|
|
837
|
+
type: "submit",
|
|
838
|
+
disabled: savingGithub,
|
|
839
|
+
children: ($$renderer3) => {
|
|
840
|
+
$$renderer3.push(`<!---->Save`);
|
|
841
|
+
},
|
|
842
|
+
$$slots: { default: true }
|
|
843
|
+
});
|
|
844
|
+
$$renderer2.push(`<!----></div> `);
|
|
845
|
+
if (githubError) {
|
|
846
|
+
$$renderer2.push("<!--[0-->");
|
|
847
|
+
$$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(githubError)}</div>`);
|
|
848
|
+
} else if (githubMsg) {
|
|
849
|
+
$$renderer2.push("<!--[1-->");
|
|
850
|
+
$$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(githubMsg)}</div>`);
|
|
851
|
+
} else {
|
|
852
|
+
$$renderer2.push("<!--[-1-->");
|
|
853
|
+
}
|
|
854
|
+
$$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
|
|
855
|
+
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
|
|
856
|
+
the first <code class="svelte-1n6ht58">claude</code> to refresh it signs the other one out. Leave blank and Save
|
|
857
|
+
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")}/> `);
|
|
858
|
+
Button($$renderer2, {
|
|
859
|
+
type: "submit",
|
|
860
|
+
disabled: savingClaude,
|
|
861
|
+
children: ($$renderer3) => {
|
|
862
|
+
$$renderer3.push(`<!---->Save`);
|
|
863
|
+
},
|
|
864
|
+
$$slots: { default: true }
|
|
865
|
+
});
|
|
866
|
+
$$renderer2.push(`<!----></div> `);
|
|
867
|
+
if (claudeError) {
|
|
868
|
+
$$renderer2.push("<!--[0-->");
|
|
869
|
+
$$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(claudeError)}</div>`);
|
|
870
|
+
} else if (claudeMsg) {
|
|
871
|
+
$$renderer2.push("<!--[1-->");
|
|
872
|
+
$$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(claudeMsg)}</div>`);
|
|
873
|
+
} else {
|
|
874
|
+
$$renderer2.push("<!--[-1-->");
|
|
875
|
+
}
|
|
876
|
+
$$renderer2.push(`<!--]--></form>`);
|
|
877
|
+
} else {
|
|
878
|
+
$$renderer2.push("<!--[-1-->");
|
|
879
|
+
}
|
|
880
|
+
$$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">`);
|
|
881
|
+
Key_round($$renderer2, { size: 18 });
|
|
882
|
+
$$renderer2.push(`<!----> <div class="text svelte-1n6ht58"><div class="name svelte-1n6ht58">LiteLLM + Bedrock `);
|
|
883
|
+
if (manualTokens) {
|
|
884
|
+
$$renderer2.push("<!--[0-->");
|
|
885
|
+
$$renderer2.push(`<span class="arch svelte-1n6ht58" title="Disabled while Set tokens manually is on">disabled</span>`);
|
|
886
|
+
} else {
|
|
887
|
+
$$renderer2.push("<!--[-1-->");
|
|
888
|
+
}
|
|
889
|
+
$$renderer2.push(`<!--]--></div> <div class="desc svelte-1n6ht58">`);
|
|
890
|
+
if (manualTokens) {
|
|
891
|
+
$$renderer2.push("<!--[0-->");
|
|
892
|
+
$$renderer2.push(`Not available while "Set tokens manually" is enabled \u2014 these modes are mutually
|
|
893
|
+
incompatible.`);
|
|
894
|
+
} else {
|
|
895
|
+
$$renderer2.push("<!--[-1-->");
|
|
896
|
+
$$renderer2.push(`Route <code class="svelte-1n6ht58">claude</code> through a LiteLLM proxy fronting AWS Bedrock instead of Anthropic's
|
|
897
|
+
default API. When enabled, the Bedrock endpoint variables are injected into every new
|
|
898
|
+
container, host OAuth credentials are not used, and "Set tokens manually" is disabled.`);
|
|
899
|
+
}
|
|
900
|
+
$$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> `);
|
|
901
|
+
if (customToggleError) {
|
|
902
|
+
$$renderer2.push("<!--[0-->");
|
|
903
|
+
$$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$17.escape(customToggleError)}</div></div>`);
|
|
904
|
+
} else {
|
|
905
|
+
$$renderer2.push("<!--[-1-->");
|
|
906
|
+
}
|
|
907
|
+
$$renderer2.push(`<!--]--> `);
|
|
908
|
+
if (customEndpoint) {
|
|
909
|
+
$$renderer2.push("<!--[0-->");
|
|
910
|
+
$$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"/> `);
|
|
911
|
+
Button($$renderer2, {
|
|
912
|
+
type: "submit",
|
|
913
|
+
disabled: savingCustomBaseUrl,
|
|
914
|
+
children: ($$renderer3) => {
|
|
915
|
+
$$renderer3.push(`<!---->Save`);
|
|
916
|
+
},
|
|
917
|
+
$$slots: { default: true }
|
|
918
|
+
});
|
|
919
|
+
$$renderer2.push(`<!----></div> `);
|
|
920
|
+
if (customBaseUrlError) {
|
|
921
|
+
$$renderer2.push("<!--[0-->");
|
|
922
|
+
$$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(customBaseUrlError)}</div>`);
|
|
923
|
+
} else if (customBaseUrlMsg) {
|
|
924
|
+
$$renderer2.push("<!--[1-->");
|
|
925
|
+
$$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(customBaseUrlMsg)}</div>`);
|
|
926
|
+
} else {
|
|
927
|
+
$$renderer2.push("<!--[-1-->");
|
|
928
|
+
}
|
|
929
|
+
$$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
|
|
930
|
+
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")}/> `);
|
|
931
|
+
Button($$renderer2, {
|
|
932
|
+
type: "submit",
|
|
933
|
+
disabled: savingCustomToken,
|
|
934
|
+
children: ($$renderer3) => {
|
|
935
|
+
$$renderer3.push(`<!---->Save`);
|
|
936
|
+
},
|
|
937
|
+
$$slots: { default: true }
|
|
938
|
+
});
|
|
939
|
+
$$renderer2.push(`<!----></div> `);
|
|
940
|
+
if (customTokenError) {
|
|
941
|
+
$$renderer2.push("<!--[0-->");
|
|
942
|
+
$$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(customTokenError)}</div>`);
|
|
943
|
+
} else if (customTokenMsg) {
|
|
944
|
+
$$renderer2.push("<!--[1-->");
|
|
945
|
+
$$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(customTokenMsg)}</div>`);
|
|
946
|
+
} else {
|
|
947
|
+
$$renderer2.push("<!--[-1-->");
|
|
948
|
+
}
|
|
949
|
+
$$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
|
|
950
|
+
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">`);
|
|
951
|
+
Button($$renderer2, {
|
|
952
|
+
type: "submit",
|
|
953
|
+
disabled: savingCustomModels,
|
|
954
|
+
children: ($$renderer3) => {
|
|
955
|
+
$$renderer3.push(`<!---->Save models`);
|
|
956
|
+
},
|
|
957
|
+
$$slots: { default: true }
|
|
958
|
+
});
|
|
959
|
+
$$renderer2.push(`<!----></div></div> `);
|
|
960
|
+
if (customModelsError) {
|
|
961
|
+
$$renderer2.push("<!--[0-->");
|
|
962
|
+
$$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(customModelsError)}</div>`);
|
|
963
|
+
} else if (customModelsMsg) {
|
|
964
|
+
$$renderer2.push("<!--[1-->");
|
|
965
|
+
$$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(customModelsMsg)}</div>`);
|
|
966
|
+
} else {
|
|
967
|
+
$$renderer2.push("<!--[-1-->");
|
|
968
|
+
}
|
|
969
|
+
$$renderer2.push(`<!--]--></form>`);
|
|
970
|
+
} else {
|
|
971
|
+
$$renderer2.push("<!--[-1-->");
|
|
972
|
+
}
|
|
973
|
+
$$renderer2.push(`<!--]--></section> <section class="card svelte-1n6ht58"><form class="row svelte-1n6ht58" method="POST" action="?/hostEnvVarsToggle"><div class="label svelte-1n6ht58">`);
|
|
974
|
+
Variable($$renderer2, { size: 18 });
|
|
975
|
+
$$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
|
|
976
|
+
interactive shells. Values are read from this process's own environment at container
|
|
977
|
+
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> `);
|
|
978
|
+
if (hostEnvToggleError) {
|
|
979
|
+
$$renderer2.push("<!--[0-->");
|
|
980
|
+
$$renderer2.push(`<div class="sub svelte-1n6ht58"><div class="msg error svelte-1n6ht58">${$17.escape(hostEnvToggleError)}</div></div>`);
|
|
981
|
+
} else {
|
|
982
|
+
$$renderer2.push("<!--[-1-->");
|
|
983
|
+
}
|
|
984
|
+
$$renderer2.push(`<!--]--> `);
|
|
985
|
+
if (hostEnvVars) {
|
|
986
|
+
$$renderer2.push("<!--[0-->");
|
|
987
|
+
$$renderer2.push(`<div class="row divided var-row svelte-1n6ht58"><div class="var-list svelte-1n6ht58">`);
|
|
988
|
+
const each_array = $17.ensure_array_like(hostEnvNames);
|
|
989
|
+
if (each_array.length !== 0) {
|
|
990
|
+
$$renderer2.push("<!--[-->");
|
|
991
|
+
for (let $$index_1 = 0, $$length = each_array.length;$$index_1 < $$length; $$index_1++) {
|
|
992
|
+
let name = each_array[$$index_1];
|
|
993
|
+
$$renderer2.push(`<form class="var-item svelte-1n6ht58" method="POST" action="?/hostEnvVarNames"><!--[-->`);
|
|
994
|
+
const each_array_1 = $17.ensure_array_like(hostEnvNames.filter((n) => n !== name));
|
|
995
|
+
for (let $$index = 0, $$length2 = each_array_1.length;$$index < $$length2; $$index++) {
|
|
996
|
+
let other = each_array_1[$$index];
|
|
997
|
+
$$renderer2.push(`<input type="hidden" name="names"${$17.attr("value", other)}/>`);
|
|
998
|
+
}
|
|
999
|
+
$$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}`)}>`);
|
|
1000
|
+
X($$renderer2, { size: 13 });
|
|
1001
|
+
$$renderer2.push(`<!----></button></form>`);
|
|
1002
|
+
}
|
|
1003
|
+
} else {
|
|
1004
|
+
$$renderer2.push("<!--[!-->");
|
|
1005
|
+
$$renderer2.push(`<div class="var-empty svelte-1n6ht58">No variables added yet.</div>`);
|
|
1006
|
+
}
|
|
1007
|
+
$$renderer2.push(`<!--]--></div> <form class="var-add svelte-1n6ht58" method="POST" action="?/hostEnvVarNames"><!--[-->`);
|
|
1008
|
+
const each_array_2 = $17.ensure_array_like(hostEnvNames);
|
|
1009
|
+
for (let $$index_2 = 0, $$length = each_array_2.length;$$index_2 < $$length; $$index_2++) {
|
|
1010
|
+
let name = each_array_2[$$index_2];
|
|
1011
|
+
$$renderer2.push(`<input type="hidden" name="names"${$17.attr("value", name)}/>`);
|
|
1012
|
+
}
|
|
1013
|
+
$$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"/> `);
|
|
1014
|
+
Button($$renderer2, {
|
|
1015
|
+
type: "submit",
|
|
1016
|
+
icon: Plus,
|
|
1017
|
+
disabled: savingHostEnvNames,
|
|
1018
|
+
children: ($$renderer3) => {
|
|
1019
|
+
$$renderer3.push(`<!---->Add`);
|
|
1020
|
+
},
|
|
1021
|
+
$$slots: { default: true }
|
|
1022
|
+
});
|
|
1023
|
+
$$renderer2.push(`<!----></form> `);
|
|
1024
|
+
if (hostEnvNamesError) {
|
|
1025
|
+
$$renderer2.push("<!--[0-->");
|
|
1026
|
+
$$renderer2.push(`<div class="msg error svelte-1n6ht58">${$17.escape(hostEnvNamesError)}</div>`);
|
|
1027
|
+
} else if (hostEnvNamesMsg) {
|
|
1028
|
+
$$renderer2.push("<!--[1-->");
|
|
1029
|
+
$$renderer2.push(`<div class="msg ok svelte-1n6ht58">${$17.escape(hostEnvNamesMsg)}</div>`);
|
|
1030
|
+
} else {
|
|
1031
|
+
$$renderer2.push("<!--[-1-->");
|
|
1032
|
+
}
|
|
1033
|
+
$$renderer2.push(`<!--]--></div>`);
|
|
1034
|
+
} else {
|
|
1035
|
+
$$renderer2.push("<!--[-1-->");
|
|
1036
|
+
}
|
|
1037
|
+
$$renderer2.push(`<!--]--></section> <section class="card svelte-1n6ht58"><div class="row svelte-1n6ht58"><div class="label svelte-1n6ht58">`);
|
|
1038
|
+
Sun_moon($$renderer2, { size: 18 });
|
|
1039
|
+
$$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> `);
|
|
1040
|
+
ThemePicker($$renderer2, {});
|
|
1041
|
+
$$renderer2.push(`<!----></div></section> <section class="card svelte-1n6ht58"><div class="row svelte-1n6ht58"><div class="label svelte-1n6ht58">`);
|
|
1042
|
+
Volume_2($$renderer2, { size: 18 });
|
|
1043
|
+
$$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">`);
|
|
1044
|
+
Power($$renderer2, { size: 18 });
|
|
1045
|
+
$$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
|
|
1046
|
+
database, then shut down the server. This cannot be undone.</div></div></div> `);
|
|
1047
|
+
if (shuttingDown) {
|
|
1048
|
+
$$renderer2.push("<!--[0-->");
|
|
1049
|
+
$$renderer2.push(`<span class="shutting svelte-1n6ht58">Server is shutting down \u2014 you can close this tab.</span>`);
|
|
1050
|
+
} else {
|
|
1051
|
+
$$renderer2.push("<!--[-1-->");
|
|
1052
|
+
Button($$renderer2, {
|
|
1053
|
+
type: "submit",
|
|
1054
|
+
variant: "danger",
|
|
1055
|
+
children: ($$renderer3) => {
|
|
1056
|
+
$$renderer3.push(`<!---->Delete & shut down`);
|
|
1057
|
+
},
|
|
1058
|
+
$$slots: { default: true }
|
|
1059
|
+
});
|
|
1060
|
+
}
|
|
1061
|
+
$$renderer2.push(`<!--]--></form></section> `);
|
|
1062
|
+
CoinButton($$renderer2, {});
|
|
1063
|
+
$$renderer2.push(`<!----></main></div> `);
|
|
1064
|
+
Toaster($$renderer2, {
|
|
1065
|
+
toastOptions: {
|
|
1066
|
+
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;"
|
|
1067
|
+
}
|
|
1068
|
+
});
|
|
1069
|
+
$$renderer2.push(`<!---->`);
|
|
1070
|
+
});
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
// src/pages/Settings.svelte
|
|
1074
|
+
function Settings($$renderer, $$props) {
|
|
1075
|
+
$$renderer.component(($$renderer2) => {
|
|
1076
|
+
let {
|
|
1077
|
+
defaultImage,
|
|
1078
|
+
builtinImage,
|
|
1079
|
+
disableBuildCache,
|
|
1080
|
+
copyIgnorePatterns,
|
|
1081
|
+
builtinCopyIgnore,
|
|
1082
|
+
dockerArch,
|
|
1083
|
+
manualTokensEnabled,
|
|
1084
|
+
githubTokenSet,
|
|
1085
|
+
claudeTokenSet,
|
|
1086
|
+
customEndpointEnabled,
|
|
1087
|
+
customEndpointBaseUrl,
|
|
1088
|
+
customEndpointTokenSet,
|
|
1089
|
+
customEndpointOpusModel,
|
|
1090
|
+
customEndpointSonnetModel,
|
|
1091
|
+
customEndpointHaikuModel,
|
|
1092
|
+
customEndpointSmallFastModel,
|
|
1093
|
+
customEndpointModel,
|
|
1094
|
+
hostEnvVarsEnabled,
|
|
1095
|
+
hostEnvVarNames,
|
|
1096
|
+
hostEnvVarPresence
|
|
1097
|
+
} = $$props;
|
|
1098
|
+
if (true) {
|
|
1099
|
+
let failed = function($$renderer3, error) {
|
|
1100
|
+
$$renderer3.push(`<mochi-island-failure data-component="SettingsView"${$18.attr("data-message", error.message)}></mochi-island-failure>`);
|
|
1101
|
+
};
|
|
1102
|
+
$$renderer2.push("<!--[0-->");
|
|
1103
|
+
$$renderer2.boundary({ failed }, ($$renderer3) => {
|
|
1104
|
+
$$renderer3.push(`<!--[-->`);
|
|
1105
|
+
{
|
|
1106
|
+
HydratableBoundary($$renderer3, {
|
|
1107
|
+
children: ($$renderer4) => {
|
|
1108
|
+
$$renderer4.push(`<mochi-hydratable-island component-name="SettingsView_8hmarwmf8onq" component-url="__MOCHI_COMPONENT_URL__SettingsView_8hmarwmf8onq__"${$18.attr("props-ref", emitIslandProps({
|
|
1109
|
+
defaultImage,
|
|
1110
|
+
builtinImage,
|
|
1111
|
+
disableBuildCache,
|
|
1112
|
+
copyIgnorePatterns,
|
|
1113
|
+
builtinCopyIgnore,
|
|
1114
|
+
dockerArch,
|
|
1115
|
+
manualTokensEnabled,
|
|
1116
|
+
githubTokenSet,
|
|
1117
|
+
claudeTokenSet,
|
|
1118
|
+
customEndpointEnabled,
|
|
1119
|
+
customEndpointBaseUrl,
|
|
1120
|
+
customEndpointTokenSet,
|
|
1121
|
+
customEndpointOpusModel,
|
|
1122
|
+
customEndpointSonnetModel,
|
|
1123
|
+
customEndpointHaikuModel,
|
|
1124
|
+
customEndpointSmallFastModel,
|
|
1125
|
+
customEndpointModel,
|
|
1126
|
+
hostEnvVarsEnabled,
|
|
1127
|
+
hostEnvVarNames,
|
|
1128
|
+
hostEnvVarPresence
|
|
1129
|
+
}))}>`);
|
|
1130
|
+
$$renderer4.push(`<!--[-->`);
|
|
1131
|
+
{
|
|
1132
|
+
SettingsView($$renderer4, {
|
|
1133
|
+
defaultImage,
|
|
1134
|
+
builtinImage,
|
|
1135
|
+
disableBuildCache,
|
|
1136
|
+
copyIgnorePatterns,
|
|
1137
|
+
builtinCopyIgnore,
|
|
1138
|
+
dockerArch,
|
|
1139
|
+
manualTokensEnabled,
|
|
1140
|
+
githubTokenSet,
|
|
1141
|
+
claudeTokenSet,
|
|
1142
|
+
customEndpointEnabled,
|
|
1143
|
+
customEndpointBaseUrl,
|
|
1144
|
+
customEndpointTokenSet,
|
|
1145
|
+
customEndpointOpusModel,
|
|
1146
|
+
customEndpointSonnetModel,
|
|
1147
|
+
customEndpointHaikuModel,
|
|
1148
|
+
customEndpointSmallFastModel,
|
|
1149
|
+
customEndpointModel,
|
|
1150
|
+
hostEnvVarsEnabled,
|
|
1151
|
+
hostEnvVarNames,
|
|
1152
|
+
hostEnvVarPresence
|
|
1153
|
+
});
|
|
1154
|
+
}
|
|
1155
|
+
$$renderer4.push(`<!--]-->`);
|
|
1156
|
+
$$renderer4.push(`</mochi-hydratable-island>`);
|
|
1157
|
+
},
|
|
1158
|
+
$$slots: { default: true }
|
|
1159
|
+
});
|
|
1160
|
+
}
|
|
1161
|
+
$$renderer3.push(`<!--]-->`);
|
|
1162
|
+
});
|
|
1163
|
+
}
|
|
1164
|
+
$$renderer2.push(`<!--]-->`);
|
|
1165
|
+
});
|
|
1166
|
+
}
|
|
1167
|
+
export {
|
|
1168
|
+
Settings as default
|
|
1169
|
+
};
|