codebay 0.0.1 → 0.2.1
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 +1612 -0
- package/.mochi/server-island.js +1 -0
- package/.mochi/svelte-client/HydratableIsland-wrq79y0w.js +1 -0
- package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-7xgbmxxg.js +2 -0
- package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-3cnbjpz2.js +13 -0
- package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-2ntmdm3e.js +1 -0
- package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-t08spym1.js +23 -0
- package/.mochi/svelte-client/chunk-04qv4w6w.js +2 -0
- package/.mochi/svelte-client/chunk-5jnepvzx.js +2 -0
- package/.mochi/svelte-client/chunk-hcztrd75.js +1 -0
- package/.mochi/svelte-client/chunk-qxwt25hn.js +4 -0
- package/.mochi/svelte-client/chunk-sjmcgh7f.js +2 -0
- package/.mochi/svelte-client/chunk-tr67wtwn.js +2 -0
- package/.mochi/svelte-compile/App-f0q5n4rk.server.js +1168 -0
- package/.mochi/svelte-compile/Avatars-p8gfef7x.server.js +332 -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-atjwsczx.server.js +356 -0
- package/.mochi/svelte-compile/Settings-q88xw6h8.server.js +1173 -0
- package/.mochi/svelte-compile/chunk-4kwy539a.js +14 -0
- package/.mochi/svelte-compile/chunk-9bjk7yx6.js +81 -0
- package/.mochi/svelte-compile/chunk-btmcxhqy.js +58 -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-1nfdwnm16cpp2.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 +34 -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/name-prompts.ts +30 -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 +297 -0
- package/src/components/AvatarsView.svelte +115 -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 +567 -0
- package/src/components/PortsBox.svelte +74 -0
- package/src/components/SettingsCog.svelte +22 -0
- package/src/components/SettingsView.svelte +1494 -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 +140 -0
- package/src/lib/crypto.server.ts +12 -0
- package/src/lib/db.server.ts +196 -0
- package/src/lib/devcontainer.server.ts +511 -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/links.ts +9 -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 +9 -0
- package/src/pages/Instance.svelte +9 -0
- package/src/pages/Settings.svelte +76 -0
- package/src/pages/UI.svelte +10 -0
- package/src/routes.ts +444 -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,1168 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
StatusBadge,
|
|
4
|
+
apiDelete,
|
|
5
|
+
apiFetch,
|
|
6
|
+
apiPost,
|
|
7
|
+
forwardedPortUrl,
|
|
8
|
+
ideUrl
|
|
9
|
+
} from "./chunk-btmcxhqy.js";
|
|
10
|
+
import {
|
|
11
|
+
Plus
|
|
12
|
+
} from "./chunk-9bjk7yx6.js";
|
|
13
|
+
import {
|
|
14
|
+
X
|
|
15
|
+
} from "./chunk-4kwy539a.js";
|
|
16
|
+
import {
|
|
17
|
+
AppBar,
|
|
18
|
+
Avatar,
|
|
19
|
+
Button,
|
|
20
|
+
Toaster,
|
|
21
|
+
dist_default
|
|
22
|
+
} from "./chunk-sxqys3nw.js";
|
|
23
|
+
import {
|
|
24
|
+
HydratableBoundary,
|
|
25
|
+
Icon,
|
|
26
|
+
emitIslandProps,
|
|
27
|
+
isDev
|
|
28
|
+
} from "./chunk-v6796ga4.js";
|
|
29
|
+
import"./chunk-we0ggtws.js";
|
|
30
|
+
|
|
31
|
+
// src/pages/App.svelte
|
|
32
|
+
import"svelte/internal/flags/async";
|
|
33
|
+
import * as $23 from "svelte/internal/server";
|
|
34
|
+
|
|
35
|
+
// src/components/AppShell.svelte
|
|
36
|
+
import"svelte/internal/flags/async";
|
|
37
|
+
import * as $22 from "svelte/internal/server";
|
|
38
|
+
import { SvelteSet } from "svelte/reactivity";
|
|
39
|
+
|
|
40
|
+
// src/components/DashboardView.svelte
|
|
41
|
+
import"svelte/internal/flags/async";
|
|
42
|
+
import * as $19 from "svelte/internal/server";
|
|
43
|
+
|
|
44
|
+
// src/components/FolderBrowser.svelte
|
|
45
|
+
import"svelte/internal/flags/async";
|
|
46
|
+
import * as $6 from "svelte/internal/server";
|
|
47
|
+
import { tick } from "svelte";
|
|
48
|
+
|
|
49
|
+
// src/lib/repo-url.ts
|
|
50
|
+
var SEGMENT = /^[A-Za-z0-9._-]+$/;
|
|
51
|
+
function parseRepoUrl(input) {
|
|
52
|
+
const raw = input.trim();
|
|
53
|
+
if (!raw)
|
|
54
|
+
return null;
|
|
55
|
+
let host;
|
|
56
|
+
let path;
|
|
57
|
+
const scp = raw.match(/^[A-Za-z0-9._-]+@([A-Za-z0-9.-]+):(.+)$/);
|
|
58
|
+
if (scp) {
|
|
59
|
+
host = scp[1];
|
|
60
|
+
path = scp[2];
|
|
61
|
+
} else if (/^[a-z][a-z0-9+.-]*:\/\//i.test(raw)) {
|
|
62
|
+
let url;
|
|
63
|
+
try {
|
|
64
|
+
url = new URL(raw);
|
|
65
|
+
} catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
if (url.protocol !== "http:" && url.protocol !== "https:" && url.protocol !== "ssh:") {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
host = url.hostname;
|
|
72
|
+
path = url.pathname;
|
|
73
|
+
} else {
|
|
74
|
+
const m = raw.match(/^([A-Za-z0-9-]+\.[A-Za-z0-9.-]+)\/(.+)$/);
|
|
75
|
+
if (!m)
|
|
76
|
+
return null;
|
|
77
|
+
host = m[1];
|
|
78
|
+
path = m[2];
|
|
79
|
+
}
|
|
80
|
+
if (!host || !path)
|
|
81
|
+
return null;
|
|
82
|
+
const segments = path.replace(/\.git$/i, "").split("/").filter(Boolean);
|
|
83
|
+
const [owner, repo] = segments;
|
|
84
|
+
if (!owner || !repo || !SEGMENT.test(owner) || !SEGMENT.test(repo))
|
|
85
|
+
return null;
|
|
86
|
+
return { host, owner, repo, cloneUrl: `https://${host}/${owner}/${repo}.git` };
|
|
87
|
+
}
|
|
88
|
+
function isRepoUrl(input) {
|
|
89
|
+
return parseRepoUrl(input) !== null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// node_modules/@lucide/svelte/dist/icons/folder-clock.svelte
|
|
93
|
+
import"svelte/internal/flags/async";
|
|
94
|
+
import * as $ from "svelte/internal/server";
|
|
95
|
+
function Folder_clock($$renderer, $$props) {
|
|
96
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
97
|
+
const iconNode = [
|
|
98
|
+
["path", { d: "M16 14v2.2l1.6 1" }],
|
|
99
|
+
[
|
|
100
|
+
"path",
|
|
101
|
+
{
|
|
102
|
+
d: "M7 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2"
|
|
103
|
+
}
|
|
104
|
+
],
|
|
105
|
+
["circle", { cx: "16", cy: "16", r: "6" }]
|
|
106
|
+
];
|
|
107
|
+
Icon($$renderer, $.spread_props([{ name: "folder-clock" }, props, { iconNode }]));
|
|
108
|
+
}
|
|
109
|
+
// node_modules/@lucide/svelte/dist/icons/git-branch.svelte
|
|
110
|
+
import"svelte/internal/flags/async";
|
|
111
|
+
import * as $2 from "svelte/internal/server";
|
|
112
|
+
function Git_branch($$renderer, $$props) {
|
|
113
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
114
|
+
const iconNode = [
|
|
115
|
+
["path", { d: "M15 6a9 9 0 0 0-9 9V3" }],
|
|
116
|
+
["circle", { cx: "18", cy: "6", r: "3" }],
|
|
117
|
+
["circle", { cx: "6", cy: "18", r: "3" }]
|
|
118
|
+
];
|
|
119
|
+
Icon($$renderer, $2.spread_props([{ name: "git-branch" }, props, { iconNode }]));
|
|
120
|
+
}
|
|
121
|
+
// node_modules/@lucide/svelte/dist/icons/arrow-up.svelte
|
|
122
|
+
import"svelte/internal/flags/async";
|
|
123
|
+
import * as $3 from "svelte/internal/server";
|
|
124
|
+
function Arrow_up($$renderer, $$props) {
|
|
125
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
126
|
+
const iconNode = [
|
|
127
|
+
["path", { d: "m5 12 7-7 7 7" }],
|
|
128
|
+
["path", { d: "M12 19V5" }]
|
|
129
|
+
];
|
|
130
|
+
Icon($$renderer, $3.spread_props([{ name: "arrow-up" }, props, { iconNode }]));
|
|
131
|
+
}
|
|
132
|
+
// node_modules/@lucide/svelte/dist/icons/folder.svelte
|
|
133
|
+
import"svelte/internal/flags/async";
|
|
134
|
+
import * as $4 from "svelte/internal/server";
|
|
135
|
+
function Folder($$renderer, $$props) {
|
|
136
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
137
|
+
const iconNode = [
|
|
138
|
+
[
|
|
139
|
+
"path",
|
|
140
|
+
{
|
|
141
|
+
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"
|
|
142
|
+
}
|
|
143
|
+
]
|
|
144
|
+
];
|
|
145
|
+
Icon($$renderer, $4.spread_props([{ name: "folder" }, props, { iconNode }]));
|
|
146
|
+
}
|
|
147
|
+
// node_modules/@lucide/svelte/dist/icons/triangle-alert.svelte
|
|
148
|
+
import"svelte/internal/flags/async";
|
|
149
|
+
import * as $5 from "svelte/internal/server";
|
|
150
|
+
function Triangle_alert($$renderer, $$props) {
|
|
151
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
152
|
+
const iconNode = [
|
|
153
|
+
[
|
|
154
|
+
"path",
|
|
155
|
+
{
|
|
156
|
+
d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"
|
|
157
|
+
}
|
|
158
|
+
],
|
|
159
|
+
["path", { d: "M12 9v4" }],
|
|
160
|
+
["path", { d: "M12 17h.01" }]
|
|
161
|
+
];
|
|
162
|
+
Icon($$renderer, $5.spread_props([{ name: "triangle-alert" }, props, { iconNode }]));
|
|
163
|
+
}
|
|
164
|
+
// src/components/FolderBrowser.svelte
|
|
165
|
+
function FolderBrowser($$renderer, $$props) {
|
|
166
|
+
$$renderer.component(($$renderer2) => {
|
|
167
|
+
let { onpick, onclose } = $$props;
|
|
168
|
+
let result = null;
|
|
169
|
+
let loading = true;
|
|
170
|
+
let errorMsg = null;
|
|
171
|
+
let query = "";
|
|
172
|
+
let searchInput = null;
|
|
173
|
+
let history2 = [];
|
|
174
|
+
let showAll = false;
|
|
175
|
+
let repoUrl = "";
|
|
176
|
+
let repoBranch = "";
|
|
177
|
+
const repoValid = $6.derived(() => isRepoUrl(repoUrl));
|
|
178
|
+
function cloneRepoUrl() {
|
|
179
|
+
if (!repoValid())
|
|
180
|
+
return;
|
|
181
|
+
onpick(repoUrl.trim(), { branch: repoBranch.trim() || undefined });
|
|
182
|
+
}
|
|
183
|
+
const filtered = $6.derived(() => result ? result.entries.filter((e) => e.name.toLowerCase().includes(query.trim().toLowerCase())) : []);
|
|
184
|
+
const shownHistory = $6.derived(() => showAll ? history2 : history2.slice(0, 5));
|
|
185
|
+
async function loadHistory() {
|
|
186
|
+
try {
|
|
187
|
+
const data = await apiFetch("/api/history");
|
|
188
|
+
history2 = data.history ?? [];
|
|
189
|
+
} catch {}
|
|
190
|
+
}
|
|
191
|
+
async function removeHistory(path) {
|
|
192
|
+
const prev = history2;
|
|
193
|
+
history2 = history2.filter((h) => h.source_path !== path);
|
|
194
|
+
try {
|
|
195
|
+
await apiDelete("/api/history", { sourcePath: path });
|
|
196
|
+
} catch {
|
|
197
|
+
history2 = prev;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async function load(path = null) {
|
|
201
|
+
loading = true;
|
|
202
|
+
errorMsg = null;
|
|
203
|
+
query = "";
|
|
204
|
+
try {
|
|
205
|
+
const url = path ? `/api/browse?path=${encodeURIComponent(path)}` : "/api/browse";
|
|
206
|
+
result = await apiFetch(url, undefined, "Could not list folder");
|
|
207
|
+
} catch (err) {
|
|
208
|
+
errorMsg = err.message;
|
|
209
|
+
} finally {
|
|
210
|
+
loading = false;
|
|
211
|
+
}
|
|
212
|
+
await tick();
|
|
213
|
+
searchInput?.focus();
|
|
214
|
+
}
|
|
215
|
+
$$renderer2.push(`<div class="overlay svelte-oq97c4" role="button" tabindex="0"><div class="modal panel svelte-oq97c4" role="dialog" aria-modal="true" aria-label="Pick a project folder" tabindex="-1"><div class="head svelte-oq97c4"><h2 class="svelte-oq97c4">Pick a project folder</h2> <button class="x svelte-oq97c4" aria-label="Close">`);
|
|
216
|
+
X($$renderer2, { size: 16 });
|
|
217
|
+
$$renderer2.push(`<!----></button></div> <div class="clone svelte-oq97c4"><div class="clone-label svelte-oq97c4">Clone a Git repository</div> <div class="clone-row svelte-oq97c4"><input class="clone-url svelte-oq97c4" type="text" placeholder="https://github.com/owner/repo"${$6.attr("value", repoUrl)} spellcheck="false" autocomplete="off"/> <input class="clone-branch svelte-oq97c4" type="text" placeholder="branch (optional)"${$6.attr("value", repoBranch)} spellcheck="false" autocomplete="off"/> <button class="clone-btn svelte-oq97c4"${$6.attr("disabled", !repoValid(), true)}>Clone</button></div></div> <div class="crumbs svelte-oq97c4"><code class="svelte-oq97c4">${$6.escape(result?.path ?? "\u2026")}</code></div> `);
|
|
218
|
+
if (history2.length > 0) {
|
|
219
|
+
$$renderer2.push("<!--[0-->");
|
|
220
|
+
$$renderer2.push(`<div class="recent svelte-oq97c4"><div class="recent-label svelte-oq97c4">Recent</div> <!--[-->`);
|
|
221
|
+
const each_array = $6.ensure_array_like(shownHistory());
|
|
222
|
+
for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
|
|
223
|
+
let entry = each_array[$$index];
|
|
224
|
+
$$renderer2.push(`<div class="recent-row svelte-oq97c4"><button class="recent-pick svelte-oq97c4"><span class="icon svelte-oq97c4">`);
|
|
225
|
+
if (isRepoUrl(entry.source_path)) {
|
|
226
|
+
$$renderer2.push("<!--[0-->");
|
|
227
|
+
Git_branch($$renderer2, { size: 16 });
|
|
228
|
+
} else {
|
|
229
|
+
$$renderer2.push("<!--[-1-->");
|
|
230
|
+
Folder_clock($$renderer2, { size: 16 });
|
|
231
|
+
}
|
|
232
|
+
$$renderer2.push(`<!--]--></span> <span class="recent-text svelte-oq97c4"><span class="recent-name svelte-oq97c4">${$6.escape(entry.name)}</span> <span class="recent-path svelte-oq97c4">${$6.escape(entry.source_path)}</span></span></button> <button class="recent-x svelte-oq97c4"${$6.attr("aria-label", `Remove ${$6.stringify(entry.name)} from history`)} title="Remove from history">`);
|
|
233
|
+
X($$renderer2, { size: 14 });
|
|
234
|
+
$$renderer2.push(`<!----></button></div>`);
|
|
235
|
+
}
|
|
236
|
+
$$renderer2.push(`<!--]--> `);
|
|
237
|
+
if (history2.length > 5) {
|
|
238
|
+
$$renderer2.push("<!--[0-->");
|
|
239
|
+
$$renderer2.push(`<button class="recent-toggle svelte-oq97c4">${$6.escape(showAll ? "Show fewer" : `Show all (${history2.length})`)}</button>`);
|
|
240
|
+
} else {
|
|
241
|
+
$$renderer2.push("<!--[-1-->");
|
|
242
|
+
}
|
|
243
|
+
$$renderer2.push(`<!--]--></div>`);
|
|
244
|
+
} else {
|
|
245
|
+
$$renderer2.push("<!--[-1-->");
|
|
246
|
+
}
|
|
247
|
+
$$renderer2.push(`<!--]--> <div class="search svelte-oq97c4"><input type="text" placeholder="Filter folders\u2026"${$6.attr("value", query)} spellcheck="false" autocomplete="off" class="svelte-oq97c4"/></div> <div class="list svelte-oq97c4">`);
|
|
248
|
+
if (loading) {
|
|
249
|
+
$$renderer2.push("<!--[0-->");
|
|
250
|
+
$$renderer2.push(`<div class="muted svelte-oq97c4">Loading\u2026</div>`);
|
|
251
|
+
} else if (errorMsg) {
|
|
252
|
+
$$renderer2.push("<!--[1-->");
|
|
253
|
+
$$renderer2.push(`<div class="muted err svelte-oq97c4">${$6.escape(errorMsg)}</div>`);
|
|
254
|
+
} else if (result) {
|
|
255
|
+
$$renderer2.push("<!--[2-->");
|
|
256
|
+
if (result.parent && !query) {
|
|
257
|
+
$$renderer2.push("<!--[0-->");
|
|
258
|
+
$$renderer2.push(`<div class="row svelte-oq97c4"><button class="nav svelte-oq97c4"><span class="icon svelte-oq97c4">`);
|
|
259
|
+
Arrow_up($$renderer2, { size: 16 });
|
|
260
|
+
$$renderer2.push(`<!----></span> <span class="ename svelte-oq97c4">..</span></button></div>`);
|
|
261
|
+
} else {
|
|
262
|
+
$$renderer2.push("<!--[-1-->");
|
|
263
|
+
}
|
|
264
|
+
$$renderer2.push(`<!--]--> `);
|
|
265
|
+
if (filtered().length === 0) {
|
|
266
|
+
$$renderer2.push("<!--[0-->");
|
|
267
|
+
$$renderer2.push(`<div class="muted svelte-oq97c4">${$6.escape(query ? "No folders match." : "No subfolders here.")}</div>`);
|
|
268
|
+
} else {
|
|
269
|
+
$$renderer2.push("<!--[-1-->");
|
|
270
|
+
}
|
|
271
|
+
$$renderer2.push(`<!--]--> <!--[-->`);
|
|
272
|
+
const each_array_1 = $6.ensure_array_like(filtered());
|
|
273
|
+
for (let i = 0, $$length = each_array_1.length;i < $$length; i++) {
|
|
274
|
+
let entry = each_array_1[i];
|
|
275
|
+
$$renderer2.push(`<div${$6.attr_class("row svelte-oq97c4", undefined, { "first-match": query.trim() && i === 0 })}><button class="nav svelte-oq97c4"><span class="icon svelte-oq97c4">`);
|
|
276
|
+
Folder($$renderer2, { size: 16 });
|
|
277
|
+
$$renderer2.push(`<!----></span> <span class="ename svelte-oq97c4">${$6.escape(entry.name)}</span> `);
|
|
278
|
+
if (entry.hasDevcontainer) {
|
|
279
|
+
$$renderer2.push("<!--[0-->");
|
|
280
|
+
$$renderer2.push(`<span class="badge svelte-oq97c4">devcontainer</span>`);
|
|
281
|
+
} else {
|
|
282
|
+
$$renderer2.push("<!--[-1-->");
|
|
283
|
+
}
|
|
284
|
+
$$renderer2.push(`<!--]--></button> <button class="pick-inline svelte-oq97c4">Select</button></div>`);
|
|
285
|
+
}
|
|
286
|
+
$$renderer2.push(`<!--]-->`);
|
|
287
|
+
} else {
|
|
288
|
+
$$renderer2.push("<!--[-1-->");
|
|
289
|
+
}
|
|
290
|
+
$$renderer2.push(`<!--]--></div> `);
|
|
291
|
+
if (result && !result.hasDevcontainer) {
|
|
292
|
+
$$renderer2.push("<!--[0-->");
|
|
293
|
+
$$renderer2.push(`<div class="warn svelte-oq97c4">`);
|
|
294
|
+
Triangle_alert($$renderer2, { size: 15 });
|
|
295
|
+
$$renderer2.push(`<!----> <span>No <code class="svelte-oq97c4">devcontainer.json</code> in this folder \u2014 a default image will be used if you select
|
|
296
|
+
it.</span></div>`);
|
|
297
|
+
} else {
|
|
298
|
+
$$renderer2.push("<!--[-1-->");
|
|
299
|
+
}
|
|
300
|
+
$$renderer2.push(`<!--]--> <div class="foot svelte-oq97c4"><span class="hint svelte-oq97c4">Browse to a folder, then select this folder or any subfolder.</span> <button class="primary svelte-oq97c4"${$6.attr("disabled", !result, true)}>Select this folder</button></div></div></div>`);
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// src/components/InstanceCard.svelte
|
|
305
|
+
import"svelte/internal/flags/async";
|
|
306
|
+
import * as $10 from "svelte/internal/server";
|
|
307
|
+
|
|
308
|
+
// src/components/BranchBox.svelte
|
|
309
|
+
import"svelte/internal/flags/async";
|
|
310
|
+
import * as $7 from "svelte/internal/server";
|
|
311
|
+
function BranchBox($$renderer, $$props) {
|
|
312
|
+
let { branch } = $$props;
|
|
313
|
+
$$renderer.push(`<div class="branch svelte-jv8lut" title="Branch checked out in the container">`);
|
|
314
|
+
Git_branch($$renderer, { size: 12 });
|
|
315
|
+
$$renderer.push(`<!----><span class="svelte-jv8lut">${$7.escape(branch)}</span></div>`);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// src/components/PortsBox.svelte
|
|
319
|
+
import"svelte/internal/flags/async";
|
|
320
|
+
import * as $9 from "svelte/internal/server";
|
|
321
|
+
|
|
322
|
+
// node_modules/@lucide/svelte/dist/icons/cable.svelte
|
|
323
|
+
import"svelte/internal/flags/async";
|
|
324
|
+
import * as $8 from "svelte/internal/server";
|
|
325
|
+
function Cable($$renderer, $$props) {
|
|
326
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
327
|
+
const iconNode = [
|
|
328
|
+
[
|
|
329
|
+
"path",
|
|
330
|
+
{
|
|
331
|
+
d: "M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1z"
|
|
332
|
+
}
|
|
333
|
+
],
|
|
334
|
+
["path", { d: "M17 21v-2" }],
|
|
335
|
+
[
|
|
336
|
+
"path",
|
|
337
|
+
{ d: "M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10" }
|
|
338
|
+
],
|
|
339
|
+
["path", { d: "M21 21v-2" }],
|
|
340
|
+
["path", { d: "M3 5V3" }],
|
|
341
|
+
[
|
|
342
|
+
"path",
|
|
343
|
+
{
|
|
344
|
+
d: "M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2z"
|
|
345
|
+
}
|
|
346
|
+
],
|
|
347
|
+
["path", { d: "M7 5V3" }]
|
|
348
|
+
];
|
|
349
|
+
Icon($$renderer, $8.spread_props([{ name: "cable" }, props, { iconNode }]));
|
|
350
|
+
}
|
|
351
|
+
// src/components/PortsBox.svelte
|
|
352
|
+
function PortsBox($$renderer, $$props) {
|
|
353
|
+
$$renderer.component(($$renderer2) => {
|
|
354
|
+
let { ports } = $$props;
|
|
355
|
+
if (ports.length) {
|
|
356
|
+
$$renderer2.push("<!--[0-->");
|
|
357
|
+
$$renderer2.push(`<div class="fports svelte-1uaz383" title="Forwarded ports \u2014 click to open">`);
|
|
358
|
+
Cable($$renderer2, { size: 12 });
|
|
359
|
+
$$renderer2.push(`<!----> <span class="list svelte-1uaz383"><!--[-->`);
|
|
360
|
+
const each_array = $9.ensure_array_like(ports);
|
|
361
|
+
for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
|
|
362
|
+
let f = each_array[$$index];
|
|
363
|
+
$$renderer2.push(`<a${$9.attr_class("fport svelte-1uaz383", undefined, { open: f.open })}${$9.attr("href", forwardedPortUrl(f.host_port))} target="_blank" rel="noopener"${$9.attr("title", `container :${f.container_port} \u2192 ${forwardedPortUrl(f.host_port)} ${f.open ? "(open)" : "(not published yet)"}`)}>${$9.escape(f.container_port)}</a>`);
|
|
364
|
+
}
|
|
365
|
+
$$renderer2.push(`<!--]--></span></div>`);
|
|
366
|
+
} else {
|
|
367
|
+
$$renderer2.push("<!--[-1-->");
|
|
368
|
+
}
|
|
369
|
+
$$renderer2.push(`<!--]-->`);
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// src/components/InstanceCard.svelte
|
|
374
|
+
function InstanceCard($$renderer, $$props) {
|
|
375
|
+
$$renderer.component(($$renderer2) => {
|
|
376
|
+
let {
|
|
377
|
+
instance,
|
|
378
|
+
editing,
|
|
379
|
+
editingName = undefined,
|
|
380
|
+
onact,
|
|
381
|
+
onstartrename,
|
|
382
|
+
oncommitrename,
|
|
383
|
+
oncancelrename
|
|
384
|
+
} = $$props;
|
|
385
|
+
const canRebuild = $10.derived(() => instance.status === "running" || instance.status === "stopped" || instance.status === "error" && !!instance.container_id);
|
|
386
|
+
$$renderer2.push(`<li class="card panel svelte-13338y7"><div class="card-head svelte-13338y7">`);
|
|
387
|
+
Avatar($$renderer2, { id: instance.id, name: instance.name, interactive: true });
|
|
388
|
+
$$renderer2.push(`<!----> `);
|
|
389
|
+
if (editing) {
|
|
390
|
+
$$renderer2.push("<!--[0-->");
|
|
391
|
+
$$renderer2.push(`<input class="name-edit svelte-13338y7"${$10.attr("value", editingName)} autofocus=""/>`);
|
|
392
|
+
} else {
|
|
393
|
+
$$renderer2.push("<!--[-1-->");
|
|
394
|
+
$$renderer2.push(`<button class="name svelte-13338y7" title="Click to rename">${$10.escape(instance.name)}</button>`);
|
|
395
|
+
}
|
|
396
|
+
$$renderer2.push(`<!--]--> `);
|
|
397
|
+
if (instance.attention) {
|
|
398
|
+
$$renderer2.push("<!--[0-->");
|
|
399
|
+
$$renderer2.push(`<span${$10.attr_class("attn svelte-13338y7", undefined, {
|
|
400
|
+
"attn-done": instance.attention === "done",
|
|
401
|
+
"attn-waiting": instance.attention === "waiting"
|
|
402
|
+
})}${$10.attr("title", instance.attention === "waiting" ? "Claude is waiting for input" : "Claude finished")}${$10.attr("aria-label", instance.attention === "waiting" ? "Claude is waiting for input" : "Claude finished")}></span>`);
|
|
403
|
+
} else {
|
|
404
|
+
$$renderer2.push("<!--[-1-->");
|
|
405
|
+
}
|
|
406
|
+
$$renderer2.push(`<!--]--> `);
|
|
407
|
+
StatusBadge($$renderer2, { status: instance.status });
|
|
408
|
+
$$renderer2.push(`<!----></div> <div class="path svelte-13338y7"${$10.attr("title", instance.source_path)}>${$10.escape(instance.source_path)}</div> `);
|
|
409
|
+
if (instance.status === "running") {
|
|
410
|
+
$$renderer2.push("<!--[0-->");
|
|
411
|
+
PortsBox($$renderer2, { ports: instance.forwarded_ports });
|
|
412
|
+
} else {
|
|
413
|
+
$$renderer2.push("<!--[-1-->");
|
|
414
|
+
}
|
|
415
|
+
$$renderer2.push(`<!--]--> `);
|
|
416
|
+
if (instance.git_branch) {
|
|
417
|
+
$$renderer2.push("<!--[0-->");
|
|
418
|
+
BranchBox($$renderer2, { branch: instance.git_branch });
|
|
419
|
+
} else {
|
|
420
|
+
$$renderer2.push("<!--[-1-->");
|
|
421
|
+
}
|
|
422
|
+
$$renderer2.push(`<!--]--> `);
|
|
423
|
+
if (instance.status === "error" && instance.error) {
|
|
424
|
+
$$renderer2.push("<!--[0-->");
|
|
425
|
+
$$renderer2.push(`<div class="card-error svelte-13338y7">${$10.escape(instance.error)}</div>`);
|
|
426
|
+
} else {
|
|
427
|
+
$$renderer2.push("<!--[-1-->");
|
|
428
|
+
}
|
|
429
|
+
$$renderer2.push(`<!--]--> <div class="actions svelte-13338y7">`);
|
|
430
|
+
if (instance.status === "running") {
|
|
431
|
+
$$renderer2.push("<!--[0-->");
|
|
432
|
+
Button($$renderer2, {
|
|
433
|
+
variant: "primary",
|
|
434
|
+
size: "sm",
|
|
435
|
+
href: `/ide/${instance.id}`,
|
|
436
|
+
children: ($$renderer3) => {
|
|
437
|
+
$$renderer3.push(`<!---->Open IDE`);
|
|
438
|
+
},
|
|
439
|
+
$$slots: { default: true }
|
|
440
|
+
});
|
|
441
|
+
$$renderer2.push(`<!----> `);
|
|
442
|
+
Button($$renderer2, {
|
|
443
|
+
size: "sm",
|
|
444
|
+
onclick: () => onact("stop"),
|
|
445
|
+
children: ($$renderer3) => {
|
|
446
|
+
$$renderer3.push(`<!---->Stop`);
|
|
447
|
+
},
|
|
448
|
+
$$slots: { default: true }
|
|
449
|
+
});
|
|
450
|
+
$$renderer2.push(`<!---->`);
|
|
451
|
+
} else if (instance.status === "stopped" || instance.status === "error" && instance.container_id) {
|
|
452
|
+
$$renderer2.push("<!--[1-->");
|
|
453
|
+
Button($$renderer2, {
|
|
454
|
+
size: "sm",
|
|
455
|
+
onclick: () => onact("start"),
|
|
456
|
+
children: ($$renderer3) => {
|
|
457
|
+
$$renderer3.push(`<!---->Start`);
|
|
458
|
+
},
|
|
459
|
+
$$slots: { default: true }
|
|
460
|
+
});
|
|
461
|
+
} else if (instance.status === "creating") {
|
|
462
|
+
$$renderer2.push("<!--[2-->");
|
|
463
|
+
Button($$renderer2, {
|
|
464
|
+
size: "sm",
|
|
465
|
+
href: `/instances/${instance.id}`,
|
|
466
|
+
target: "_blank",
|
|
467
|
+
rel: "noopener noreferrer",
|
|
468
|
+
children: ($$renderer3) => {
|
|
469
|
+
$$renderer3.push(`<!---->View logs`);
|
|
470
|
+
},
|
|
471
|
+
$$slots: { default: true }
|
|
472
|
+
});
|
|
473
|
+
} else {
|
|
474
|
+
$$renderer2.push("<!--[-1-->");
|
|
475
|
+
}
|
|
476
|
+
$$renderer2.push(`<!--]--> `);
|
|
477
|
+
if (canRebuild()) {
|
|
478
|
+
$$renderer2.push("<!--[0-->");
|
|
479
|
+
Button($$renderer2, {
|
|
480
|
+
size: "sm",
|
|
481
|
+
title: "Recreate the container and re-run setup (credentials, hooks, port forwards)",
|
|
482
|
+
onclick: () => onact("rebuild"),
|
|
483
|
+
children: ($$renderer3) => {
|
|
484
|
+
$$renderer3.push(`<!---->Rebuild`);
|
|
485
|
+
},
|
|
486
|
+
$$slots: { default: true }
|
|
487
|
+
});
|
|
488
|
+
} else {
|
|
489
|
+
$$renderer2.push("<!--[-1-->");
|
|
490
|
+
}
|
|
491
|
+
$$renderer2.push(`<!--]--> `);
|
|
492
|
+
Button($$renderer2, {
|
|
493
|
+
size: "sm",
|
|
494
|
+
ghost: true,
|
|
495
|
+
href: `/instances/${instance.id}`,
|
|
496
|
+
target: "_blank",
|
|
497
|
+
rel: "noopener noreferrer",
|
|
498
|
+
children: ($$renderer3) => {
|
|
499
|
+
$$renderer3.push(`<!---->Details`);
|
|
500
|
+
},
|
|
501
|
+
$$slots: { default: true }
|
|
502
|
+
});
|
|
503
|
+
$$renderer2.push(`<!----> `);
|
|
504
|
+
Button($$renderer2, {
|
|
505
|
+
variant: "danger",
|
|
506
|
+
size: "sm",
|
|
507
|
+
onclick: () => onact("delete"),
|
|
508
|
+
children: ($$renderer3) => {
|
|
509
|
+
$$renderer3.push(`<!---->Delete`);
|
|
510
|
+
},
|
|
511
|
+
$$slots: { default: true }
|
|
512
|
+
});
|
|
513
|
+
$$renderer2.push(`<!----></div></li>`);
|
|
514
|
+
$10.bind_props($$props, { editingName });
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
// src/components/TopBar.svelte
|
|
519
|
+
import"svelte/internal/flags/async";
|
|
520
|
+
import * as $18 from "svelte/internal/server";
|
|
521
|
+
|
|
522
|
+
// node_modules/@lucide/svelte/dist/icons/component.svelte
|
|
523
|
+
import"svelte/internal/flags/async";
|
|
524
|
+
import * as $11 from "svelte/internal/server";
|
|
525
|
+
function Component($$renderer, $$props) {
|
|
526
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
527
|
+
const iconNode = [
|
|
528
|
+
[
|
|
529
|
+
"path",
|
|
530
|
+
{
|
|
531
|
+
d: "M15.536 11.293a1 1 0 0 0 0 1.414l2.376 2.377a1 1 0 0 0 1.414 0l2.377-2.377a1 1 0 0 0 0-1.414l-2.377-2.377a1 1 0 0 0-1.414 0z"
|
|
532
|
+
}
|
|
533
|
+
],
|
|
534
|
+
[
|
|
535
|
+
"path",
|
|
536
|
+
{
|
|
537
|
+
d: "M2.297 11.293a1 1 0 0 0 0 1.414l2.377 2.377a1 1 0 0 0 1.414 0l2.377-2.377a1 1 0 0 0 0-1.414L6.088 8.916a1 1 0 0 0-1.414 0z"
|
|
538
|
+
}
|
|
539
|
+
],
|
|
540
|
+
[
|
|
541
|
+
"path",
|
|
542
|
+
{
|
|
543
|
+
d: "M8.916 17.912a1 1 0 0 0 0 1.415l2.377 2.376a1 1 0 0 0 1.414 0l2.377-2.376a1 1 0 0 0 0-1.415l-2.377-2.376a1 1 0 0 0-1.414 0z"
|
|
544
|
+
}
|
|
545
|
+
],
|
|
546
|
+
[
|
|
547
|
+
"path",
|
|
548
|
+
{
|
|
549
|
+
d: "M8.916 4.674a1 1 0 0 0 0 1.414l2.377 2.376a1 1 0 0 0 1.414 0l2.377-2.376a1 1 0 0 0 0-1.414l-2.377-2.377a1 1 0 0 0-1.414 0z"
|
|
550
|
+
}
|
|
551
|
+
]
|
|
552
|
+
];
|
|
553
|
+
Icon($$renderer, $11.spread_props([{ name: "component" }, props, { iconNode }]));
|
|
554
|
+
}
|
|
555
|
+
// src/components/Brand.svelte
|
|
556
|
+
import"svelte/internal/flags/async";
|
|
557
|
+
import * as $13 from "svelte/internal/server";
|
|
558
|
+
|
|
559
|
+
// node_modules/@lucide/svelte/dist/icons/package.svelte
|
|
560
|
+
import"svelte/internal/flags/async";
|
|
561
|
+
import * as $12 from "svelte/internal/server";
|
|
562
|
+
function Package($$renderer, $$props) {
|
|
563
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
564
|
+
const iconNode = [
|
|
565
|
+
[
|
|
566
|
+
"path",
|
|
567
|
+
{
|
|
568
|
+
d: "M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z"
|
|
569
|
+
}
|
|
570
|
+
],
|
|
571
|
+
["path", { d: "M12 22V12" }],
|
|
572
|
+
["polyline", { points: "3.29 7 12 12 20.71 7" }],
|
|
573
|
+
["path", { d: "m7.5 4.27 9 5.15" }]
|
|
574
|
+
];
|
|
575
|
+
Icon($$renderer, $12.spread_props([{ name: "package" }, props, { iconNode }]));
|
|
576
|
+
}
|
|
577
|
+
// src/components/Brand.svelte
|
|
578
|
+
function Brand($$renderer) {
|
|
579
|
+
$$renderer.push(`<a class="brand svelte-94cd8h" href="/"><span class="logo svelte-94cd8h">`);
|
|
580
|
+
Package($$renderer, { size: 22 });
|
|
581
|
+
$$renderer.push(`<!----></span><span>Codebay</span><span class="tagline svelte-94cd8h">devcontainer manager</span></a>`);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
// src/components/SettingsCog.svelte
|
|
585
|
+
import"svelte/internal/flags/async";
|
|
586
|
+
import * as $15 from "svelte/internal/server";
|
|
587
|
+
|
|
588
|
+
// node_modules/@lucide/svelte/dist/icons/settings.svelte
|
|
589
|
+
import"svelte/internal/flags/async";
|
|
590
|
+
import * as $14 from "svelte/internal/server";
|
|
591
|
+
function Settings($$renderer, $$props) {
|
|
592
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
593
|
+
const iconNode = [
|
|
594
|
+
[
|
|
595
|
+
"path",
|
|
596
|
+
{
|
|
597
|
+
d: "M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"
|
|
598
|
+
}
|
|
599
|
+
],
|
|
600
|
+
["circle", { cx: "12", cy: "12", r: "3" }]
|
|
601
|
+
];
|
|
602
|
+
Icon($$renderer, $14.spread_props([{ name: "settings" }, props, { iconNode }]));
|
|
603
|
+
}
|
|
604
|
+
// src/components/SettingsCog.svelte
|
|
605
|
+
function SettingsCog($$renderer) {
|
|
606
|
+
$$renderer.push(`<a class="cog svelte-1e745g8" href="/settings" aria-label="Settings" title="Settings">`);
|
|
607
|
+
Settings($$renderer, { size: 16 });
|
|
608
|
+
$$renderer.push(`<!----></a>`);
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
// src/components/CredMenu.svelte
|
|
612
|
+
import"svelte/internal/flags/async";
|
|
613
|
+
import * as $17 from "svelte/internal/server";
|
|
614
|
+
|
|
615
|
+
// node_modules/@lucide/svelte/dist/icons/link.svelte
|
|
616
|
+
import"svelte/internal/flags/async";
|
|
617
|
+
import * as $16 from "svelte/internal/server";
|
|
618
|
+
function Link($$renderer, $$props) {
|
|
619
|
+
let { $$slots, $$events, ...props } = $$props;
|
|
620
|
+
const iconNode = [
|
|
621
|
+
[
|
|
622
|
+
"path",
|
|
623
|
+
{
|
|
624
|
+
d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"
|
|
625
|
+
}
|
|
626
|
+
],
|
|
627
|
+
[
|
|
628
|
+
"path",
|
|
629
|
+
{
|
|
630
|
+
d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"
|
|
631
|
+
}
|
|
632
|
+
]
|
|
633
|
+
];
|
|
634
|
+
Icon($$renderer, $16.spread_props([{ name: "link" }, props, { iconNode }]));
|
|
635
|
+
}
|
|
636
|
+
// src/components/CredMenu.svelte
|
|
637
|
+
function CredMenu($$renderer, $$props) {
|
|
638
|
+
$$renderer.component(($$renderer2) => {
|
|
639
|
+
let { auth } = $$props;
|
|
640
|
+
let credOpen = false;
|
|
641
|
+
const authedCount = $17.derived(() => auth.filter((a) => a.available).length);
|
|
642
|
+
const credState = $17.derived(() => authedCount() === auth.length ? "ok" : authedCount() === 0 ? "error" : "warn");
|
|
643
|
+
const credIcon = { ok: Link, warn: Triangle_alert, error: X };
|
|
644
|
+
const CredIcon = $17.derived(() => credIcon[credState()]);
|
|
645
|
+
function explainProvider(provider) {
|
|
646
|
+
if (provider.available) {
|
|
647
|
+
dist_default.success(`${provider.label} credentials come from ${provider.source}.`);
|
|
648
|
+
} else {
|
|
649
|
+
const hint = provider.hint ? ` \u2014 ${provider.hint}` : "";
|
|
650
|
+
dist_default.error(`No ${provider.label} credentials found${hint}.`);
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
$$renderer2.push(`<div class="cred-menu svelte-vongf9"><button${$17.attr_class(`cred ${credState()}`, "svelte-vongf9")}${$17.attr("aria-expanded", credOpen)} aria-haspopup="menu" aria-label="Credentials" title="Credentials">`);
|
|
654
|
+
if (CredIcon()) {
|
|
655
|
+
$$renderer2.push("<!--[-->");
|
|
656
|
+
CredIcon()($$renderer2, { size: 16 });
|
|
657
|
+
$$renderer2.push("<!--]-->");
|
|
658
|
+
} else {
|
|
659
|
+
$$renderer2.push("<!--[!-->");
|
|
660
|
+
$$renderer2.push("<!--]-->");
|
|
661
|
+
}
|
|
662
|
+
$$renderer2.push(`</button> `);
|
|
663
|
+
if (credOpen) {
|
|
664
|
+
$$renderer2.push("<!--[0-->");
|
|
665
|
+
$$renderer2.push(`<div class="cred-dropdown panel svelte-vongf9" role="menu"><!--[-->`);
|
|
666
|
+
const each_array = $17.ensure_array_like(auth);
|
|
667
|
+
for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
|
|
668
|
+
let provider = each_array[$$index];
|
|
669
|
+
$$renderer2.push(`<button type="button" class="cred-row svelte-vongf9" role="menuitem"${$17.attr("title", provider.available ? `Credentials from ${provider.source}, copied into each new instance.` : `No credentials found on this computer${provider.hint ? ` \u2014 ${provider.hint}` : ""}.`)}><span${$17.attr_class(`dot ${provider.available ? "on" : "off"}`, "svelte-vongf9")}></span> <span class="cred-label">${$17.escape(provider.label)}</span> <span class="cred-state svelte-vongf9">${$17.escape(provider.available ? "Authorized" : "Not found")}</span></button>`);
|
|
670
|
+
}
|
|
671
|
+
$$renderer2.push(`<!--]--></div>`);
|
|
672
|
+
} else {
|
|
673
|
+
$$renderer2.push("<!--[-1-->");
|
|
674
|
+
}
|
|
675
|
+
$$renderer2.push(`<!--]--></div>`);
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
// src/components/TopBar.svelte
|
|
680
|
+
function TopBar($$renderer, $$props) {
|
|
681
|
+
let {
|
|
682
|
+
auth,
|
|
683
|
+
canDelete = false,
|
|
684
|
+
ready = true,
|
|
685
|
+
creating = false,
|
|
686
|
+
onNew,
|
|
687
|
+
onDeleteAll
|
|
688
|
+
} = $$props;
|
|
689
|
+
$$renderer.push(`<header class="topbar svelte-1h259us">`);
|
|
690
|
+
Brand($$renderer, {});
|
|
691
|
+
$$renderer.push(`<!----> <div class="topbar-actions svelte-1h259us">`);
|
|
692
|
+
if (isDev) {
|
|
693
|
+
$$renderer.push("<!--[0-->");
|
|
694
|
+
Button($$renderer, {
|
|
695
|
+
variant: "default",
|
|
696
|
+
size: "sm",
|
|
697
|
+
icon: Component,
|
|
698
|
+
href: "/debug",
|
|
699
|
+
children: ($$renderer2) => {
|
|
700
|
+
$$renderer2.push(`<!---->Debug`);
|
|
701
|
+
},
|
|
702
|
+
$$slots: { default: true }
|
|
703
|
+
});
|
|
704
|
+
} else {
|
|
705
|
+
$$renderer.push("<!--[-1-->");
|
|
706
|
+
}
|
|
707
|
+
$$renderer.push(`<!--]--> `);
|
|
708
|
+
SettingsCog($$renderer, {});
|
|
709
|
+
$$renderer.push(`<!----> `);
|
|
710
|
+
CredMenu($$renderer, { auth });
|
|
711
|
+
$$renderer.push(`<!----> `);
|
|
712
|
+
Button($$renderer, {
|
|
713
|
+
variant: "danger",
|
|
714
|
+
size: "sm",
|
|
715
|
+
onclick: onDeleteAll,
|
|
716
|
+
disabled: !canDelete,
|
|
717
|
+
children: ($$renderer2) => {
|
|
718
|
+
$$renderer2.push(`<!---->Delete all`);
|
|
719
|
+
},
|
|
720
|
+
$$slots: { default: true }
|
|
721
|
+
});
|
|
722
|
+
$$renderer.push(`<!----> `);
|
|
723
|
+
Button($$renderer, {
|
|
724
|
+
variant: "primary",
|
|
725
|
+
icon: creating ? undefined : Plus,
|
|
726
|
+
onclick: onNew,
|
|
727
|
+
disabled: !ready || creating,
|
|
728
|
+
children: ($$renderer2) => {
|
|
729
|
+
$$renderer2.push(`<!---->${$18.escape(creating ? "Creating\u2026" : "New instance")}`);
|
|
730
|
+
},
|
|
731
|
+
$$slots: { default: true }
|
|
732
|
+
});
|
|
733
|
+
$$renderer.push(`<!----></div></header>`);
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
// src/components/DashboardView.svelte
|
|
737
|
+
function DashboardView($$renderer, $$props) {
|
|
738
|
+
$$renderer.component(($$renderer2) => {
|
|
739
|
+
let { preflight, instances, loaded } = $$props;
|
|
740
|
+
let browserOpen = false;
|
|
741
|
+
let creating = false;
|
|
742
|
+
let actionError = null;
|
|
743
|
+
let editingId = null;
|
|
744
|
+
let editingName = "";
|
|
745
|
+
const ready = $19.derived(() => preflight.docker && preflight.cli);
|
|
746
|
+
async function createFrom(sourcePath, opts) {
|
|
747
|
+
browserOpen = false;
|
|
748
|
+
creating = true;
|
|
749
|
+
actionError = null;
|
|
750
|
+
try {
|
|
751
|
+
await apiPost("/api/instances", { sourcePath, branch: opts?.branch }, "Failed to create instance");
|
|
752
|
+
} catch (err) {
|
|
753
|
+
actionError = err.message;
|
|
754
|
+
} finally {
|
|
755
|
+
creating = false;
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
async function act(id, action) {
|
|
759
|
+
actionError = null;
|
|
760
|
+
if (action === "delete" && !confirm("Delete this instance and its copied files?"))
|
|
761
|
+
return;
|
|
762
|
+
if (action === "rebuild" && !confirm("Recreate this container and re-run setup? The workspace is kept."))
|
|
763
|
+
return;
|
|
764
|
+
try {
|
|
765
|
+
await apiPost(`/api/instances/${id}/${action}`, undefined, `Failed to ${action}`);
|
|
766
|
+
} catch (err) {
|
|
767
|
+
actionError = err.message;
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
function startRename(instance) {
|
|
771
|
+
editingId = instance.id;
|
|
772
|
+
editingName = instance.name;
|
|
773
|
+
}
|
|
774
|
+
function cancelRename() {
|
|
775
|
+
editingId = null;
|
|
776
|
+
editingName = "";
|
|
777
|
+
}
|
|
778
|
+
async function commitRename(id) {
|
|
779
|
+
const name = editingName.trim();
|
|
780
|
+
const original = instances.find((i) => i.id === id)?.name;
|
|
781
|
+
if (!name || name === original) {
|
|
782
|
+
cancelRename();
|
|
783
|
+
return;
|
|
784
|
+
}
|
|
785
|
+
cancelRename();
|
|
786
|
+
actionError = null;
|
|
787
|
+
try {
|
|
788
|
+
await apiPost(`/api/instances/${id}/rename`, { name }, "Failed to rename");
|
|
789
|
+
} catch (err) {
|
|
790
|
+
actionError = err.message;
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
async function deleteAll() {
|
|
794
|
+
actionError = null;
|
|
795
|
+
if (!confirm(`Delete all ${instances.length} instances and their copied files?`))
|
|
796
|
+
return;
|
|
797
|
+
try {
|
|
798
|
+
await apiPost("/api/instances/delete-all", undefined, "Failed to delete all");
|
|
799
|
+
} catch (err) {
|
|
800
|
+
actionError = err.message;
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
let $$settled = true;
|
|
804
|
+
let $$inner_renderer;
|
|
805
|
+
function $$render_inner($$renderer3) {
|
|
806
|
+
TopBar($$renderer3, {
|
|
807
|
+
auth: preflight.auth,
|
|
808
|
+
canDelete: instances.length > 0,
|
|
809
|
+
ready: ready(),
|
|
810
|
+
creating,
|
|
811
|
+
onNew: () => browserOpen = true,
|
|
812
|
+
onDeleteAll: deleteAll
|
|
813
|
+
});
|
|
814
|
+
$$renderer3.push(`<!----> <main class="stage svelte-146pixd">`);
|
|
815
|
+
if (!ready()) {
|
|
816
|
+
$$renderer3.push("<!--[0-->");
|
|
817
|
+
$$renderer3.push(`<div class="banner error svelte-146pixd"><strong>Setup needed.</strong> `);
|
|
818
|
+
if (!preflight.docker) {
|
|
819
|
+
$$renderer3.push("<!--[0-->");
|
|
820
|
+
$$renderer3.push(`<span>Docker daemon is not reachable.</span>`);
|
|
821
|
+
} else {
|
|
822
|
+
$$renderer3.push("<!--[-1-->");
|
|
823
|
+
}
|
|
824
|
+
$$renderer3.push(`<!--]--> `);
|
|
825
|
+
if (!preflight.cli) {
|
|
826
|
+
$$renderer3.push("<!--[0-->");
|
|
827
|
+
$$renderer3.push(`<span>The devcontainer CLI is not available.</span>`);
|
|
828
|
+
} else {
|
|
829
|
+
$$renderer3.push("<!--[-1-->");
|
|
830
|
+
}
|
|
831
|
+
$$renderer3.push(`<!--]--></div>`);
|
|
832
|
+
} else {
|
|
833
|
+
$$renderer3.push("<!--[-1-->");
|
|
834
|
+
}
|
|
835
|
+
$$renderer3.push(`<!--]--> `);
|
|
836
|
+
if (actionError) {
|
|
837
|
+
$$renderer3.push("<!--[0-->");
|
|
838
|
+
$$renderer3.push(`<div class="banner error svelte-146pixd"><strong>Error.</strong> <span>${$19.escape(actionError)}</span></div>`);
|
|
839
|
+
} else {
|
|
840
|
+
$$renderer3.push("<!--[-1-->");
|
|
841
|
+
}
|
|
842
|
+
$$renderer3.push(`<!--]--> `);
|
|
843
|
+
if (!loaded) {
|
|
844
|
+
$$renderer3.push("<!--[0-->");
|
|
845
|
+
$$renderer3.push(`<div class="empty svelte-146pixd"><p class="empty-sub svelte-146pixd">Loading\u2026</p></div>`);
|
|
846
|
+
} else if (instances.length === 0) {
|
|
847
|
+
$$renderer3.push("<!--[1-->");
|
|
848
|
+
$$renderer3.push(`<div class="empty svelte-146pixd"><p class="empty-title svelte-146pixd">No instances yet</p> <p class="empty-sub svelte-146pixd">Pick a project folder to spin up an isolated devcontainer.</p> `);
|
|
849
|
+
Button($$renderer3, {
|
|
850
|
+
variant: "primary",
|
|
851
|
+
icon: Plus,
|
|
852
|
+
onclick: () => browserOpen = true,
|
|
853
|
+
disabled: !ready(),
|
|
854
|
+
children: ($$renderer4) => {
|
|
855
|
+
$$renderer4.push(`<!---->New instance`);
|
|
856
|
+
},
|
|
857
|
+
$$slots: { default: true }
|
|
858
|
+
});
|
|
859
|
+
$$renderer3.push(`<!----></div>`);
|
|
860
|
+
} else {
|
|
861
|
+
$$renderer3.push("<!--[-1-->");
|
|
862
|
+
$$renderer3.push(`<ul class="grid svelte-146pixd"><!--[-->`);
|
|
863
|
+
const each_array = $19.ensure_array_like(instances);
|
|
864
|
+
for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
|
|
865
|
+
let instance = each_array[$$index];
|
|
866
|
+
InstanceCard($$renderer3, {
|
|
867
|
+
instance,
|
|
868
|
+
editing: editingId === instance.id,
|
|
869
|
+
onact: (action) => act(instance.id, action),
|
|
870
|
+
onstartrename: () => startRename(instance),
|
|
871
|
+
oncommitrename: () => commitRename(instance.id),
|
|
872
|
+
oncancelrename: cancelRename,
|
|
873
|
+
get editingName() {
|
|
874
|
+
return editingName;
|
|
875
|
+
},
|
|
876
|
+
set editingName($$value) {
|
|
877
|
+
editingName = $$value;
|
|
878
|
+
$$settled = false;
|
|
879
|
+
}
|
|
880
|
+
});
|
|
881
|
+
}
|
|
882
|
+
$$renderer3.push(`<!--]--></ul>`);
|
|
883
|
+
}
|
|
884
|
+
$$renderer3.push(`<!--]--></main> `);
|
|
885
|
+
if (browserOpen) {
|
|
886
|
+
$$renderer3.push("<!--[0-->");
|
|
887
|
+
FolderBrowser($$renderer3, { onpick: createFrom, onclose: () => browserOpen = false });
|
|
888
|
+
} else {
|
|
889
|
+
$$renderer3.push("<!--[-1-->");
|
|
890
|
+
}
|
|
891
|
+
$$renderer3.push(`<!--]-->`);
|
|
892
|
+
}
|
|
893
|
+
do {
|
|
894
|
+
$$settled = true;
|
|
895
|
+
$$inner_renderer = $$renderer2.copy();
|
|
896
|
+
$$render_inner($$inner_renderer);
|
|
897
|
+
} while (!$$settled);
|
|
898
|
+
$$renderer2.subsume($$inner_renderer);
|
|
899
|
+
});
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
// src/components/IdeBar.svelte
|
|
903
|
+
import"svelte/internal/flags/async";
|
|
904
|
+
import * as $20 from "svelte/internal/server";
|
|
905
|
+
function IdeBar($$renderer, $$props) {
|
|
906
|
+
$$renderer.component(($$renderer2) => {
|
|
907
|
+
let {
|
|
908
|
+
running,
|
|
909
|
+
active,
|
|
910
|
+
attention,
|
|
911
|
+
editingId,
|
|
912
|
+
editingName = undefined,
|
|
913
|
+
onselect,
|
|
914
|
+
onstartrename,
|
|
915
|
+
oncommitrename,
|
|
916
|
+
oncancelrename
|
|
917
|
+
} = $$props;
|
|
918
|
+
AppBar($$renderer2, {
|
|
919
|
+
children: ($$renderer3) => {
|
|
920
|
+
if (running.length > 0) {
|
|
921
|
+
$$renderer3.push("<!--[0-->");
|
|
922
|
+
$$renderer3.push(`<nav class="tabs svelte-r39acv"><!--[-->`);
|
|
923
|
+
const each_array = $20.ensure_array_like(running);
|
|
924
|
+
for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
|
|
925
|
+
let inst = each_array[$$index];
|
|
926
|
+
$$renderer3.push(`<div${$20.attr_class("tab svelte-r39acv", undefined, {
|
|
927
|
+
active: inst.id === active,
|
|
928
|
+
"attn-done": inst.id !== active && attention[inst.id] === "done",
|
|
929
|
+
"attn-waiting": inst.id !== active && attention[inst.id] === "waiting"
|
|
930
|
+
})}>`);
|
|
931
|
+
if (editingId === inst.id) {
|
|
932
|
+
$$renderer3.push("<!--[0-->");
|
|
933
|
+
$$renderer3.push(`<div class="tab-label editing svelte-r39acv">`);
|
|
934
|
+
Avatar($$renderer3, { id: inst.id, name: inst.name, scale: 4 });
|
|
935
|
+
$$renderer3.push(`<!----> <input class="tab-name-edit svelte-r39acv"${$20.attr("value", editingName)} autofocus=""/></div>`);
|
|
936
|
+
} else {
|
|
937
|
+
$$renderer3.push("<!--[-1-->");
|
|
938
|
+
$$renderer3.push(`<button type="button" class="tab-label svelte-r39acv"${$20.attr("title", inst.name)}>`);
|
|
939
|
+
Avatar($$renderer3, { id: inst.id, name: inst.name, scale: 4 });
|
|
940
|
+
$$renderer3.push(`<!----> <span class="tab-name svelte-r39acv">${$20.escape(inst.name)}</span></button>`);
|
|
941
|
+
}
|
|
942
|
+
$$renderer3.push(`<!--]--></div>`);
|
|
943
|
+
}
|
|
944
|
+
$$renderer3.push(`<!--]--></nav>`);
|
|
945
|
+
} else {
|
|
946
|
+
$$renderer3.push("<!--[-1-->");
|
|
947
|
+
}
|
|
948
|
+
$$renderer3.push(`<!--]--> <a class="cog svelte-r39acv" href="/settings" title="Settings" aria-label="Settings">`);
|
|
949
|
+
Settings($$renderer3, { size: 18 });
|
|
950
|
+
$$renderer3.push(`<!----></a>`);
|
|
951
|
+
},
|
|
952
|
+
$$slots: { default: true }
|
|
953
|
+
});
|
|
954
|
+
$20.bind_props($$props, { editingName });
|
|
955
|
+
});
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
// src/components/IdeLoader.svelte
|
|
959
|
+
import"svelte/internal/flags/async";
|
|
960
|
+
import * as $21 from "svelte/internal/server";
|
|
961
|
+
function IdeLoader($$renderer, $$props) {
|
|
962
|
+
$$renderer.component(($$renderer2) => {
|
|
963
|
+
let { speed = 1, stalledAfterMs, onoverride } = $$props;
|
|
964
|
+
let stalled = false;
|
|
965
|
+
const ROWS = 3;
|
|
966
|
+
const COLS = 22;
|
|
967
|
+
const BASE_TICK_MS = 140;
|
|
968
|
+
const FLIPS_PER_TICK = 7;
|
|
969
|
+
const tickMs = $21.derived(() => Math.max(20, BASE_TICK_MS / speed));
|
|
970
|
+
const seed = () => Array.from({ length: ROWS }, () => Array.from({ length: COLS }, () => Math.random() < 0.5 ? 0 : 1));
|
|
971
|
+
let grid = seed();
|
|
972
|
+
$$renderer2.push(`<div class="loader svelte-w5e143"><div class="grid svelte-w5e143" aria-hidden="true"><!--[-->`);
|
|
973
|
+
const each_array = $21.ensure_array_like(grid);
|
|
974
|
+
for (let i = 0, $$length = each_array.length;i < $$length; i++) {
|
|
975
|
+
let row = each_array[i];
|
|
976
|
+
$$renderer2.push(`<div class="row svelte-w5e143">${$21.escape(row.join(""))}</div>`);
|
|
977
|
+
}
|
|
978
|
+
$$renderer2.push(`<!--]--></div> <div class="label svelte-w5e143">Loading editor<span class="dot svelte-w5e143">.</span><span class="dot svelte-w5e143">.</span><span class="dot svelte-w5e143">.</span></div> `);
|
|
979
|
+
if (stalled) {
|
|
980
|
+
$$renderer2.push("<!--[0-->");
|
|
981
|
+
$$renderer2.push(`<div class="stalled svelte-w5e143"><p class="svelte-w5e143">Waiting for code-server to answer inside the container.</p> `);
|
|
982
|
+
if (onoverride) {
|
|
983
|
+
$$renderer2.push("<!--[0-->");
|
|
984
|
+
Button($$renderer2, {
|
|
985
|
+
size: "sm",
|
|
986
|
+
onclick: onoverride,
|
|
987
|
+
children: ($$renderer3) => {
|
|
988
|
+
$$renderer3.push(`<!---->Open anyway`);
|
|
989
|
+
},
|
|
990
|
+
$$slots: { default: true }
|
|
991
|
+
});
|
|
992
|
+
} else {
|
|
993
|
+
$$renderer2.push("<!--[-1-->");
|
|
994
|
+
}
|
|
995
|
+
$$renderer2.push(`<!--]--></div>`);
|
|
996
|
+
} else {
|
|
997
|
+
$$renderer2.push("<!--[-1-->");
|
|
998
|
+
}
|
|
999
|
+
$$renderer2.push(`<!--]--></div>`);
|
|
1000
|
+
});
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
// src/components/AppShell.svelte
|
|
1004
|
+
function AppShell($$renderer, $$props) {
|
|
1005
|
+
$$renderer.component(($$renderer2) => {
|
|
1006
|
+
let { preflight, initialPath, snapshot } = $$props;
|
|
1007
|
+
let instances = snapshot;
|
|
1008
|
+
let livePreflight = preflight;
|
|
1009
|
+
let loaded = snapshot.length > 0;
|
|
1010
|
+
const running = $22.derived(() => instances.filter((i) => i.status === "running"));
|
|
1011
|
+
let attention = Object.fromEntries(snapshot.map((i) => [i.id, i.attention]));
|
|
1012
|
+
let editingId = null;
|
|
1013
|
+
let editingName = "";
|
|
1014
|
+
function startRename(instance) {
|
|
1015
|
+
editingId = instance.id;
|
|
1016
|
+
editingName = instance.name;
|
|
1017
|
+
}
|
|
1018
|
+
function cancelRename() {
|
|
1019
|
+
editingId = null;
|
|
1020
|
+
editingName = "";
|
|
1021
|
+
}
|
|
1022
|
+
async function commitRename(id) {
|
|
1023
|
+
const name = editingName.trim();
|
|
1024
|
+
const original = instances.find((i) => i.id === id)?.name;
|
|
1025
|
+
if (!name || name === original) {
|
|
1026
|
+
cancelRename();
|
|
1027
|
+
return;
|
|
1028
|
+
}
|
|
1029
|
+
cancelRename();
|
|
1030
|
+
try {
|
|
1031
|
+
await apiPost(`/api/instances/${id}/rename`, { name }, "Failed to rename");
|
|
1032
|
+
} catch (err) {
|
|
1033
|
+
dist_default.error(err.message);
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
let path = initialPath;
|
|
1037
|
+
const onIde = $22.derived(() => path.startsWith("/ide"));
|
|
1038
|
+
const requestedId = $22.derived(() => path.startsWith("/ide/") ? path.slice("/ide/".length) : "");
|
|
1039
|
+
const active = $22.derived(() => onIde() ? running().some((i) => i.id === requestedId()) ? requestedId() : running()[0]?.id ?? "" : "");
|
|
1040
|
+
function navigate(to) {
|
|
1041
|
+
if (to === path)
|
|
1042
|
+
return;
|
|
1043
|
+
history.pushState({}, "", to);
|
|
1044
|
+
path = to;
|
|
1045
|
+
}
|
|
1046
|
+
const visited = new SvelteSet;
|
|
1047
|
+
const loadedFrames = new SvelteSet;
|
|
1048
|
+
const everReady = new SvelteSet;
|
|
1049
|
+
const forced = new SvelteSet;
|
|
1050
|
+
const mountable = (id) => everReady.has(id) || forced.has(id);
|
|
1051
|
+
const STALLED_AFTER_MS = 1e4;
|
|
1052
|
+
let $$settled = true;
|
|
1053
|
+
let $$inner_renderer;
|
|
1054
|
+
function $$render_inner($$renderer3) {
|
|
1055
|
+
$$renderer3.push(`<div${$22.attr_class("app svelte-1duc7gd", undefined, { ide: onIde() })}>`);
|
|
1056
|
+
if (onIde()) {
|
|
1057
|
+
$$renderer3.push("<!--[0-->");
|
|
1058
|
+
IdeBar($$renderer3, {
|
|
1059
|
+
running: running(),
|
|
1060
|
+
active: active(),
|
|
1061
|
+
attention,
|
|
1062
|
+
editingId,
|
|
1063
|
+
onselect: (id) => navigate(`/ide/${id}`),
|
|
1064
|
+
onstartrename: startRename,
|
|
1065
|
+
oncommitrename: commitRename,
|
|
1066
|
+
oncancelrename: cancelRename,
|
|
1067
|
+
get editingName() {
|
|
1068
|
+
return editingName;
|
|
1069
|
+
},
|
|
1070
|
+
set editingName($$value) {
|
|
1071
|
+
editingName = $$value;
|
|
1072
|
+
$$settled = false;
|
|
1073
|
+
}
|
|
1074
|
+
});
|
|
1075
|
+
} else {
|
|
1076
|
+
$$renderer3.push("<!--[-1-->");
|
|
1077
|
+
DashboardView($$renderer3, { preflight: livePreflight, instances, loaded });
|
|
1078
|
+
}
|
|
1079
|
+
$$renderer3.push(`<!--]--> <div${$22.attr_class("panes svelte-1duc7gd", undefined, { hidden: !onIde() })}><!--[-->`);
|
|
1080
|
+
const each_array = $22.ensure_array_like(running());
|
|
1081
|
+
for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
|
|
1082
|
+
let inst = each_array[$$index];
|
|
1083
|
+
if (visited.has(inst.id)) {
|
|
1084
|
+
$$renderer3.push("<!--[0-->");
|
|
1085
|
+
$$renderer3.push(`<div${$22.attr_class("pane svelte-1duc7gd", undefined, { active: inst.id === active() })}>`);
|
|
1086
|
+
if (mountable(inst.id)) {
|
|
1087
|
+
$$renderer3.push("<!--[0-->");
|
|
1088
|
+
$$renderer3.push(`<iframe${$22.attr("src", ideUrl(inst))}${$22.attr("title", inst.name)} class="svelte-1duc7gd" onload="this.__e=event"></iframe>`);
|
|
1089
|
+
} else {
|
|
1090
|
+
$$renderer3.push("<!--[-1-->");
|
|
1091
|
+
}
|
|
1092
|
+
$$renderer3.push(`<!--]--> `);
|
|
1093
|
+
if (!mountable(inst.id)) {
|
|
1094
|
+
$$renderer3.push("<!--[0-->");
|
|
1095
|
+
IdeLoader($$renderer3, {
|
|
1096
|
+
stalledAfterMs: STALLED_AFTER_MS,
|
|
1097
|
+
onoverride: () => forced.add(inst.id)
|
|
1098
|
+
});
|
|
1099
|
+
} else if (!loadedFrames.has(inst.id)) {
|
|
1100
|
+
$$renderer3.push("<!--[1-->");
|
|
1101
|
+
IdeLoader($$renderer3, {});
|
|
1102
|
+
} else {
|
|
1103
|
+
$$renderer3.push("<!--[-1-->");
|
|
1104
|
+
}
|
|
1105
|
+
$$renderer3.push(`<!--]--></div>`);
|
|
1106
|
+
} else {
|
|
1107
|
+
$$renderer3.push("<!--[-1-->");
|
|
1108
|
+
}
|
|
1109
|
+
$$renderer3.push(`<!--]-->`);
|
|
1110
|
+
}
|
|
1111
|
+
$$renderer3.push(`<!--]--> `);
|
|
1112
|
+
if (onIde() && running().length === 0) {
|
|
1113
|
+
$$renderer3.push("<!--[0-->");
|
|
1114
|
+
$$renderer3.push(`<div class="empty svelte-1duc7gd">No running instances.</div>`);
|
|
1115
|
+
} else {
|
|
1116
|
+
$$renderer3.push("<!--[-1-->");
|
|
1117
|
+
}
|
|
1118
|
+
$$renderer3.push(`<!--]--></div></div> `);
|
|
1119
|
+
Toaster($$renderer3, {
|
|
1120
|
+
toastOptions: {
|
|
1121
|
+
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;"
|
|
1122
|
+
}
|
|
1123
|
+
});
|
|
1124
|
+
$$renderer3.push(`<!---->`);
|
|
1125
|
+
}
|
|
1126
|
+
do {
|
|
1127
|
+
$$settled = true;
|
|
1128
|
+
$$inner_renderer = $$renderer2.copy();
|
|
1129
|
+
$$render_inner($$inner_renderer);
|
|
1130
|
+
} while (!$$settled);
|
|
1131
|
+
$$renderer2.subsume($$inner_renderer);
|
|
1132
|
+
});
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
// src/pages/App.svelte
|
|
1136
|
+
function App($$renderer, $$props) {
|
|
1137
|
+
$$renderer.component(($$renderer2) => {
|
|
1138
|
+
let { preflight, initialPath, snapshot } = $$props;
|
|
1139
|
+
if (true) {
|
|
1140
|
+
let failed = function($$renderer3, error) {
|
|
1141
|
+
$$renderer3.push(`<mochi-island-failure data-component="AppShell"${$23.attr("data-message", error.message)}></mochi-island-failure>`);
|
|
1142
|
+
};
|
|
1143
|
+
$$renderer2.push("<!--[0-->");
|
|
1144
|
+
$$renderer2.boundary({ failed }, ($$renderer3) => {
|
|
1145
|
+
$$renderer3.push(`<!--[-->`);
|
|
1146
|
+
{
|
|
1147
|
+
HydratableBoundary($$renderer3, {
|
|
1148
|
+
children: ($$renderer4) => {
|
|
1149
|
+
$$renderer4.push(`<mochi-hydratable-island component-name="AppShell_2rtnxn6pgp2rh" component-url="__MOCHI_COMPONENT_URL__AppShell_2rtnxn6pgp2rh__"${$23.attr("props-ref", emitIslandProps({ preflight, initialPath, snapshot }))}>`);
|
|
1150
|
+
$$renderer4.push(`<!--[-->`);
|
|
1151
|
+
{
|
|
1152
|
+
AppShell($$renderer4, { preflight, initialPath, snapshot });
|
|
1153
|
+
}
|
|
1154
|
+
$$renderer4.push(`<!--]-->`);
|
|
1155
|
+
$$renderer4.push(`</mochi-hydratable-island>`);
|
|
1156
|
+
},
|
|
1157
|
+
$$slots: { default: true }
|
|
1158
|
+
});
|
|
1159
|
+
}
|
|
1160
|
+
$$renderer3.push(`<!--]-->`);
|
|
1161
|
+
});
|
|
1162
|
+
}
|
|
1163
|
+
$$renderer2.push(`<!--]-->`);
|
|
1164
|
+
});
|
|
1165
|
+
}
|
|
1166
|
+
export {
|
|
1167
|
+
App as default
|
|
1168
|
+
};
|