codebay 0.2.0 → 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/manifest.json +122 -118
- 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-kgn1b2t1.js → chunk-qxwt25hn.js} +1 -1
- package/.mochi/svelte-client/chunk-sjmcgh7f.js +2 -0
- package/.mochi/svelte-client/{chunk-x843txjc.js → chunk-tr67wtwn.js} +2 -2
- package/.mochi/svelte-compile/{App-8k1gyxdc.server.js → App-f0q5n4rk.server.js} +3 -2
- package/.mochi/svelte-compile/{Avatars-f7c6rp96.server.js → Avatars-p8gfef7x.server.js} +35 -54
- package/.mochi/svelte-compile/{Instance-yvps12zg.server.js → Instance-atjwsczx.server.js} +3 -2
- package/.mochi/svelte-compile/{Settings-jwg3httb.server.js → Settings-q88xw6h8.server.js} +9 -5
- package/.mochi/svelte-compile/{chunk-dqgstte4.js → chunk-btmcxhqy.js} +7 -1
- package/.mochi/svelte-css/SettingsView-1nfdwnm16cpp2.css +1 -0
- package/README.md +1 -0
- package/package.json +1 -1
- package/src/avatars/name-prompts.ts +30 -0
- package/src/components/AvatarEditor.svelte +3 -27
- package/src/components/AvatarsView.svelte +3 -1
- package/src/components/InstanceView.svelte +4 -2
- package/src/components/PortsBox.svelte +3 -2
- package/src/components/SettingsView.svelte +11 -1
- package/src/lib/config.server.ts +18 -0
- package/src/lib/devcontainer.server.ts +10 -2
- package/src/lib/links.ts +9 -0
- package/src/pages/Avatars.svelte +3 -1
- package/src/pages/Settings.svelte +4 -1
- package/src/routes.ts +9 -5
- package/.mochi/svelte-client/HydratableIsland-ps09gjy2.js +0 -1
- package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-62w5zwww.js +0 -2
- package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-jmm501zf.js +0 -13
- package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-ewk4n2c0.js +0 -1
- package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-e7e89md0.js +0 -23
- package/.mochi/svelte-client/chunk-jx5cekhh.js +0 -2
- package/.mochi/svelte-client/chunk-k3my1snp.js +0 -2
- package/.mochi/svelte-client/chunk-ry7q5zk5.js +0 -1
- package/.mochi/svelte-client/chunk-zjcg8kw5.js +0 -2
- package/.mochi/svelte-css/SettingsView-3bbkzsvnrth3v.css +0 -1
|
@@ -367,7 +367,8 @@ function SettingsView($$renderer, $$props) {
|
|
|
367
367
|
customEndpointModel,
|
|
368
368
|
hostEnvVarsEnabled,
|
|
369
369
|
hostEnvVarNames,
|
|
370
|
-
hostEnvVarPresence
|
|
370
|
+
hostEnvVarPresence,
|
|
371
|
+
version
|
|
371
372
|
} = $$props;
|
|
372
373
|
let sound = soundEnabled();
|
|
373
374
|
let shuttingDown = false;
|
|
@@ -1060,7 +1061,7 @@ function SettingsView($$renderer, $$props) {
|
|
|
1060
1061
|
}
|
|
1061
1062
|
$$renderer2.push(`<!--]--></form></section> `);
|
|
1062
1063
|
CoinButton($$renderer2, {});
|
|
1063
|
-
$$renderer2.push(
|
|
1064
|
+
$$renderer2.push(`<!----> <div class="version svelte-1n6ht58">Codebay v${$17.escape(version)}</div></main></div> `);
|
|
1064
1065
|
Toaster($$renderer2, {
|
|
1065
1066
|
toastOptions: {
|
|
1066
1067
|
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;"
|
|
@@ -1093,7 +1094,8 @@ function Settings($$renderer, $$props) {
|
|
|
1093
1094
|
customEndpointModel,
|
|
1094
1095
|
hostEnvVarsEnabled,
|
|
1095
1096
|
hostEnvVarNames,
|
|
1096
|
-
hostEnvVarPresence
|
|
1097
|
+
hostEnvVarPresence,
|
|
1098
|
+
version
|
|
1097
1099
|
} = $$props;
|
|
1098
1100
|
if (true) {
|
|
1099
1101
|
let failed = function($$renderer3, error) {
|
|
@@ -1125,7 +1127,8 @@ function Settings($$renderer, $$props) {
|
|
|
1125
1127
|
customEndpointModel,
|
|
1126
1128
|
hostEnvVarsEnabled,
|
|
1127
1129
|
hostEnvVarNames,
|
|
1128
|
-
hostEnvVarPresence
|
|
1130
|
+
hostEnvVarPresence,
|
|
1131
|
+
version
|
|
1129
1132
|
}))}>`);
|
|
1130
1133
|
$$renderer4.push(`<!--[-->`);
|
|
1131
1134
|
{
|
|
@@ -1149,7 +1152,8 @@ function Settings($$renderer, $$props) {
|
|
|
1149
1152
|
customEndpointModel,
|
|
1150
1153
|
hostEnvVarsEnabled,
|
|
1151
1154
|
hostEnvVarNames,
|
|
1152
|
-
hostEnvVarPresence
|
|
1155
|
+
hostEnvVarPresence,
|
|
1156
|
+
version
|
|
1153
1157
|
});
|
|
1154
1158
|
}
|
|
1155
1159
|
$$renderer4.push(`<!--]-->`);
|
|
@@ -35,6 +35,12 @@ function apiJson(method, url, body, fallbackMessage) {
|
|
|
35
35
|
}, fallbackMessage);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
// src/lib/links.ts
|
|
39
|
+
function forwardedPortUrl(hostPort) {
|
|
40
|
+
const host = typeof window === "undefined" ? "localhost" : window.location.hostname;
|
|
41
|
+
return `http://${host}:${hostPort}`;
|
|
42
|
+
}
|
|
43
|
+
|
|
38
44
|
// src/components/StatusBadge.svelte
|
|
39
45
|
import"svelte/internal/flags/async";
|
|
40
46
|
import * as $ from "svelte/internal/server";
|
|
@@ -49,4 +55,4 @@ function StatusBadge($$renderer, $$props) {
|
|
|
49
55
|
$$renderer.push(`<span${$.attr_class(`status ${$.stringify(status)}`, "svelte-1hqr9xd")}>${$.escape(label[status])}</span>`);
|
|
50
56
|
}
|
|
51
57
|
|
|
52
|
-
export { ideUrl, apiFetch, apiPost, apiDelete, StatusBadge };
|
|
58
|
+
export { ideUrl, apiFetch, apiPost, apiDelete, forwardedPortUrl, StatusBadge };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.page.svelte-1n6ht58{display:flex;flex-direction:column;min-height:100vh}.title.svelte-1n6ht58{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;color:var(--ink-soft);align-items: center;padding:0 14px;font-size:12px}.content.svelte-1n6ht58{display:flex;flex-direction:column;flex:1;align-items: center;gap:16px;padding:32px 20px}.card.svelte-1n6ht58{background:var(--bg-card);border:1px solid var(--rule);width:100%;max-width:560px;height:max-content}.danger-card.svelte-1n6ht58{border-color:var(--danger)}.disabled-card.svelte-1n6ht58{opacity:.55;pointer-events:none}.danger-card.svelte-1n6ht58 .btn{white-space:nowrap;flex:none}.version.svelte-1n6ht58{font-family:var(--font-mono);letter-spacing:.08em;color:var(--ink-soft);font-size:11px}.shutting.svelte-1n6ht58{font-family:var(--font-mono);color:var(--danger);text-align:right;flex:none;max-width:200px;font-size:12px;line-height:1.4}.row.svelte-1n6ht58{display:flex;justify-content:space-between;align-items: center;gap:16px;padding:18px}.row.divided.svelte-1n6ht58{border-top:1px solid var(--rule);align-items: flex-start}.row.divided.svelte-1n6ht58 .btn{white-space:nowrap;flex:none}.sub.svelte-1n6ht58{padding:0 18px 14px}code.svelte-1n6ht58{font-family:var(--font-mono);background:var(--bg);border:1px solid var(--rule);border-radius:3px;padding:1px 4px;font-size:.92em}.label.svelte-1n6ht58{display:flex;color:var(--ink);align-items: flex-start;gap:12px;min-width:0}.text.svelte-1n6ht58{min-width:0}.name.svelte-1n6ht58{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;font-size:13px}.arch.svelte-1n6ht58{letter-spacing:.04em;color:var(--ink-soft);border:1px solid var(--rule);vertical-align:middle;border-radius:3px;margin-left:8px;padding:2px 6px;font-size:11px}.tip.svelte-1n6ht58{color:var(--ink-soft);background:color-mix(in srgb,var(--info)10%,transparent);border:1px solid color-mix(in srgb,var(--info)35%,transparent);border-radius:4px;width:100%;margin-top:4px;padding:8px 10px}.desc.svelte-1n6ht58{font-family:var(--font-mono);color:var(--ink-faint);margin-top:4px;font-size:12px;line-height:1.4}.image-row.svelte-1n6ht58,.token-row.svelte-1n6ht58{flex-wrap:wrap}.image-controls.svelte-1n6ht58{display:flex;flex:1;justify-content:flex-end;align-items: center;gap:8px;min-width:220px}.image-input.svelte-1n6ht58{font-family:var(--font-mono);color:var(--ink);background:var(--bg);border:1px solid var(--rule);flex:1;min-width:0;padding:8px 10px;font-size:12px}.image-input.svelte-1n6ht58:focus-visible{outline:2px solid var(--ink);outline-offset:1px}.image-controls.svelte-1n6ht58 .btn{flex:none}.msg.svelte-1n6ht58{font-family:var(--font-mono);width:100%;margin-top:2px;font-size:12px;line-height:1.4}.msg.error.svelte-1n6ht58{color:var(--danger)}.msg.ok.svelte-1n6ht58{color:var(--ink-soft)}.switch.svelte-1n6ht58{position:relative;cursor:pointer;flex:none}.switch.svelte-1n6ht58 input:where(.svelte-1n6ht58){position:absolute;opacity:0;cursor:pointer;margin:0;inset:0}.track.svelte-1n6ht58{display:block;border:1px solid var(--rule);background:var(--bg);border-radius:999px;width:44px;height:24px;transition:background .15s}.thumb.svelte-1n6ht58{display:block;background:var(--ink-faint);border-radius:999px;width:18px;height:18px;margin:2px;transition:transform .15s,background .15s}.switch.svelte-1n6ht58 input:where(.svelte-1n6ht58):checked+.track:where(.svelte-1n6ht58){background:var(--switch-on-bg)}.switch.svelte-1n6ht58 input:where(.svelte-1n6ht58):checked+.track:where(.svelte-1n6ht58) .thumb:where(.svelte-1n6ht58){background:var(--ink);transform:translate(20px)}.switch.svelte-1n6ht58 input:where(.svelte-1n6ht58):focus-visible+.track:where(.svelte-1n6ht58){outline:2px solid var(--ink);outline-offset:2px}.model-fields.svelte-1n6ht58{display:flex;flex-direction:column;flex:1;gap:6px;min-width:220px}.model-row.svelte-1n6ht58{display:flex;align-items: center;gap:8px}.model-label.svelte-1n6ht58{font-family:var(--font-mono);color:var(--ink-soft);text-align:right;flex:none;width:72px;font-size:11px}.model-row.svelte-1n6ht58 .image-input:where(.svelte-1n6ht58){flex:1}.model-save-row.svelte-1n6ht58{display:flex;justify-content:flex-end;margin-top:4px}.var-row.svelte-1n6ht58{flex-direction:column;align-items:stretch;gap:10px}.var-list.svelte-1n6ht58{display:flex;flex-direction:column;gap:6px}.var-item.svelte-1n6ht58{display:flex;background:var(--bg);border:1px solid var(--rule);align-items: center;gap:8px;padding:6px 8px}.var-name.svelte-1n6ht58{font-family:var(--font-mono);color:var(--ink);word-break:break-all;flex:1;min-width:0;font-size:12px}.var-status.svelte-1n6ht58{font-family:var(--font-mono);letter-spacing:.04em;color:var(--danger);flex:none;font-size:11px}.var-status.present.svelte-1n6ht58{color:var(--ink-soft)}.var-remove.svelte-1n6ht58{display:inline-flex;color:var(--ink-soft);border:1px solid var(--rule);cursor:pointer;background:0 0;flex:none;justify-content:center;align-items: center;width:22px;height:22px;padding:0}.var-remove.svelte-1n6ht58:hover:not(:disabled){color:var(--danger);border-color:var(--danger)}.var-remove.svelte-1n6ht58:disabled{opacity:.4;cursor:not-allowed}.var-empty.svelte-1n6ht58{font-family:var(--font-mono);color:var(--ink-faint);font-size:12px}.var-add.svelte-1n6ht58{display:flex;gap:8px}.var-add.svelte-1n6ht58 .btn{flex:none}
|
package/README.md
CHANGED
|
@@ -17,6 +17,7 @@ The UI opens at `http://localhost:6969`. State (SQLite DB + per-instance workspa
|
|
|
17
17
|
- `PORT` — server port (default `6969`)
|
|
18
18
|
- `DATA_DIR` — where state lives (default `~/.codebay`)
|
|
19
19
|
- `DOCKER_HOST` — Docker socket/URL (defaults to your active Docker context)
|
|
20
|
+
- `HOST` — bind address (default `127.0.0.1`). Set `0.0.0.0` to reach codebay from other machines; your instances' forwarded app ports are then published on all interfaces too. Each container's code-server port stays loopback-only regardless — it runs without a password of its own and is reached through the Basic-Auth-gated `/p/:id/` proxy instead. Existing instances need a **Restart** to pick up the new binding.
|
|
20
21
|
- `BASIC_AUTH_PASSWORD` — enables HTTP Basic Auth over the whole UI (disabled when unset); required if you bind beyond loopback with `HOST=0.0.0.0`
|
|
21
22
|
- `CODEBAY_CLAUDE_CODE_TOKEN` — Claude Code token to inject into every container (e.g. from `claude setup-token`) instead of discovering the host's credentials
|
|
22
23
|
- `CODEBAY_GITHUB_TOKEN` — GitHub token to inject instead of reading `gh auth token` from the host
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codebay",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Web UI for spinning up isolated devcontainer instances from any local folder, each with a browser-based VS Code (code-server) — built for parallel Claude Code workflows.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Lives outside the editor component so the route can roll the hint server-side —
|
|
2
|
+
// rolling it during component init would re-roll it again at hydration.
|
|
3
|
+
export const NAME_PROMPTS = [
|
|
4
|
+
'dragon',
|
|
5
|
+
'unicorn',
|
|
6
|
+
'cactus',
|
|
7
|
+
'comet',
|
|
8
|
+
'pretzel',
|
|
9
|
+
'volcano',
|
|
10
|
+
'narwhal',
|
|
11
|
+
'waffle',
|
|
12
|
+
'satellite',
|
|
13
|
+
'pineapple',
|
|
14
|
+
'kraken',
|
|
15
|
+
'yeti',
|
|
16
|
+
'moose',
|
|
17
|
+
'lighthouse',
|
|
18
|
+
'toaster',
|
|
19
|
+
'hedgehog',
|
|
20
|
+
'walrus',
|
|
21
|
+
'pumpkin',
|
|
22
|
+
'jellyfish',
|
|
23
|
+
'tornado',
|
|
24
|
+
'igloo',
|
|
25
|
+
'boomerang'
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
export function pickNamePrompt(): string {
|
|
29
|
+
return NAME_PROMPTS[Math.floor(Math.random() * NAME_PROMPTS.length)]!;
|
|
30
|
+
}
|
|
@@ -14,32 +14,8 @@
|
|
|
14
14
|
import Avatar from './Avatar.svelte';
|
|
15
15
|
import Button from './Button.svelte';
|
|
16
16
|
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
'dragon',
|
|
20
|
-
'unicorn',
|
|
21
|
-
'cactus',
|
|
22
|
-
'comet',
|
|
23
|
-
'pretzel',
|
|
24
|
-
'volcano',
|
|
25
|
-
'narwhal',
|
|
26
|
-
'waffle',
|
|
27
|
-
'satellite',
|
|
28
|
-
'pineapple',
|
|
29
|
-
'kraken',
|
|
30
|
-
'yeti',
|
|
31
|
-
'moose',
|
|
32
|
-
'lighthouse',
|
|
33
|
-
'toaster',
|
|
34
|
-
'hedgehog',
|
|
35
|
-
'walrus',
|
|
36
|
-
'pumpkin',
|
|
37
|
-
'jellyfish',
|
|
38
|
-
'tornado',
|
|
39
|
-
'igloo',
|
|
40
|
-
'boomerang'
|
|
41
|
-
];
|
|
42
|
-
const namePlaceholder = NAME_PROMPTS[Math.floor(Math.random() * NAME_PROMPTS.length)];
|
|
17
|
+
// Rolled by the route, not here, so hydration doesn't pick a different word.
|
|
18
|
+
let { namePlaceholder }: { namePlaceholder: string } = $props();
|
|
43
19
|
|
|
44
20
|
// Same shape `decode()` produces, so the two round-trip.
|
|
45
21
|
let cells = $state<number[]>(Array(ROWS * COLS).fill(OFF));
|
|
@@ -109,7 +85,7 @@
|
|
|
109
85
|
|
|
110
86
|
<section class="editor">
|
|
111
87
|
<div class="head">
|
|
112
|
-
<h2>Draw your avatar</h2>
|
|
88
|
+
<h2>Draw your own avatar</h2>
|
|
113
89
|
</div>
|
|
114
90
|
|
|
115
91
|
<div class="body">
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
import Avatar from './Avatar.svelte';
|
|
5
5
|
import AvatarEditor from './AvatarEditor.svelte';
|
|
6
6
|
import { avatars } from '../avatars/index.ts';
|
|
7
|
+
|
|
8
|
+
let { namePlaceholder }: { namePlaceholder: string } = $props();
|
|
7
9
|
</script>
|
|
8
10
|
|
|
9
11
|
<div class="page">
|
|
@@ -12,7 +14,7 @@
|
|
|
12
14
|
</AppBar>
|
|
13
15
|
|
|
14
16
|
<main class="content">
|
|
15
|
-
<AvatarEditor />
|
|
17
|
+
<AvatarEditor {namePlaceholder} />
|
|
16
18
|
|
|
17
19
|
<section class="catalog">
|
|
18
20
|
<header>
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import HealthBox from './HealthBox.svelte';
|
|
6
6
|
import StatusBadge from './StatusBadge.svelte';
|
|
7
7
|
import Skeleton from './Skeleton.svelte';
|
|
8
|
+
import { forwardedPortUrl } from '../lib/links.ts';
|
|
8
9
|
import { liveSocket, liveStream } from '../live.ts';
|
|
9
10
|
import { apiPost, apiDelete } from '../api.ts';
|
|
10
11
|
import { enhance } from 'mochi-framework';
|
|
@@ -189,8 +190,9 @@
|
|
|
189
190
|
<li>
|
|
190
191
|
<span class="cp">:{f.container_port}</span>
|
|
191
192
|
<span class="arr">→</span>
|
|
192
|
-
<a href={
|
|
193
|
-
>
|
|
193
|
+
<a href={forwardedPortUrl(f.host_port)} target="_blank" rel="noopener"
|
|
194
|
+
>{forwardedPortUrl(f.host_port).replace('http://', '')}
|
|
195
|
+
<ArrowUpRight size={12} /></a
|
|
194
196
|
>
|
|
195
197
|
<button class="rm" title="Remove" onclick={() => removePort(f.container_port)}
|
|
196
198
|
>×</button
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import Cable from '@lucide/svelte/icons/cable';
|
|
3
|
+
import { forwardedPortUrl } from '../lib/links.ts';
|
|
3
4
|
import type { PortForward } from '../types.ts';
|
|
4
5
|
|
|
5
6
|
let { ports }: { ports: PortForward[] } = $props();
|
|
@@ -13,10 +14,10 @@
|
|
|
13
14
|
<a
|
|
14
15
|
class="fport"
|
|
15
16
|
class:open={f.open}
|
|
16
|
-
href={
|
|
17
|
+
href={forwardedPortUrl(f.host_port)}
|
|
17
18
|
target="_blank"
|
|
18
19
|
rel="noopener"
|
|
19
|
-
title={`container :${f.container_port} →
|
|
20
|
+
title={`container :${f.container_port} → ${forwardedPortUrl(f.host_port)} ${f.open ? '(open)' : '(not published yet)'}`}
|
|
20
21
|
>{f.container_port}</a
|
|
21
22
|
>
|
|
22
23
|
{/each}
|
|
@@ -46,7 +46,8 @@
|
|
|
46
46
|
customEndpointModel,
|
|
47
47
|
hostEnvVarsEnabled,
|
|
48
48
|
hostEnvVarNames,
|
|
49
|
-
hostEnvVarPresence
|
|
49
|
+
hostEnvVarPresence,
|
|
50
|
+
version
|
|
50
51
|
}: {
|
|
51
52
|
defaultImage: string;
|
|
52
53
|
builtinImage: string;
|
|
@@ -68,6 +69,7 @@
|
|
|
68
69
|
hostEnvVarsEnabled: boolean;
|
|
69
70
|
hostEnvVarNames: string[];
|
|
70
71
|
hostEnvVarPresence: Record<string, boolean>;
|
|
72
|
+
version: string;
|
|
71
73
|
} = $props();
|
|
72
74
|
|
|
73
75
|
// Defaults to on during SSR, where localStorage doesn't exist.
|
|
@@ -1164,6 +1166,8 @@
|
|
|
1164
1166
|
</section>
|
|
1165
1167
|
|
|
1166
1168
|
<CoinButton />
|
|
1169
|
+
|
|
1170
|
+
<div class="version">Codebay v{version}</div>
|
|
1167
1171
|
</main>
|
|
1168
1172
|
</div>
|
|
1169
1173
|
|
|
@@ -1218,6 +1222,12 @@
|
|
|
1218
1222
|
flex: none;
|
|
1219
1223
|
white-space: nowrap;
|
|
1220
1224
|
}
|
|
1225
|
+
.version {
|
|
1226
|
+
font-family: var(--font-mono);
|
|
1227
|
+
font-size: 11px;
|
|
1228
|
+
letter-spacing: 0.08em;
|
|
1229
|
+
color: var(--ink-soft);
|
|
1230
|
+
}
|
|
1221
1231
|
.shutting {
|
|
1222
1232
|
flex: none;
|
|
1223
1233
|
max-width: 200px;
|
package/src/lib/config.server.ts
CHANGED
|
@@ -37,6 +37,17 @@ export function ensureMochiKey(): void {
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
/** Read relative to this module, not cwd, because under `bunx codebay` cwd is the user's folder. */
|
|
41
|
+
export const APP_VERSION: string = (() => {
|
|
42
|
+
try {
|
|
43
|
+
const path = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'package.json');
|
|
44
|
+
const version = JSON.parse(readFileSync(path, 'utf8')).version;
|
|
45
|
+
return typeof version === 'string' ? version : 'unknown';
|
|
46
|
+
} catch {
|
|
47
|
+
return 'unknown';
|
|
48
|
+
}
|
|
49
|
+
})();
|
|
50
|
+
|
|
40
51
|
/** Per-instance working copies live here: <INSTANCES_DIR>/<id>/workspace. */
|
|
41
52
|
export const INSTANCES_DIR = join(DATA_DIR, 'instances');
|
|
42
53
|
|
|
@@ -58,6 +69,13 @@ export const BASIC_AUTH_PASSWORD = process.env.BASIC_AUTH_PASSWORD || '';
|
|
|
58
69
|
/** Loopback by default so an instance with no password isn't exposed to the LAN. */
|
|
59
70
|
export const HOST = process.env.HOST || '127.0.0.1';
|
|
60
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Forwarded app ports follow the server's bind; code-server's own port never does
|
|
74
|
+
* (it runs with auth disabled). Anything but `0.0.0.0` degrades to loopback rather
|
|
75
|
+
* than risking an appPort string Docker rejects.
|
|
76
|
+
*/
|
|
77
|
+
export const PUBLISH_HOST = HOST === '0.0.0.0' ? '0.0.0.0' : '127.0.0.1';
|
|
78
|
+
|
|
61
79
|
export const PORT = Number(process.env.PORT) || 6969;
|
|
62
80
|
|
|
63
81
|
/** Mochi's CSRF origin check compares against these; override when behind a proxy. */
|
|
@@ -3,7 +3,13 @@ import { existsSync, statSync } from 'node:fs';
|
|
|
3
3
|
import { basename, dirname, join, relative } from 'node:path';
|
|
4
4
|
import { homedir } from 'node:os';
|
|
5
5
|
import { INSTALL_SCRIPT as TMUX_INSTALL_SCRIPT } from '../container-injections/tmux.ts';
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
CODE_SERVER_PORT,
|
|
8
|
+
DEFAULT_IMAGE,
|
|
9
|
+
PUBLISH_HOST,
|
|
10
|
+
devcontainerBin,
|
|
11
|
+
dockerEnv
|
|
12
|
+
} from './config.server.ts';
|
|
7
13
|
import { spawnCapture } from './spawn.server.ts';
|
|
8
14
|
import type { PortForward } from '../types.ts';
|
|
9
15
|
|
|
@@ -294,9 +300,11 @@ export async function writeOverrideConfig(
|
|
|
294
300
|
};
|
|
295
301
|
|
|
296
302
|
// Rendered from scratch rather than merged, so removing a forward actually drops its mapping.
|
|
303
|
+
// code-server stays loopback even under HOST=0.0.0.0 — it has no auth of its own, so the LAN
|
|
304
|
+
// reaches it only through the Basic-Auth-gated /p/:id/ proxy.
|
|
297
305
|
config.appPort = [
|
|
298
306
|
`127.0.0.1:${hostPort}:${CODE_SERVER_PORT}`,
|
|
299
|
-
...forwards.map((f) =>
|
|
307
|
+
...forwards.map((f) => `${PUBLISH_HOST}:${f.host_port}:${f.container_port}`)
|
|
300
308
|
];
|
|
301
309
|
|
|
302
310
|
// host.docker.internal isn't automatic on Colima/Linux Docker.
|
package/src/lib/links.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forwarded ports are published on the machine running codebay, which is only
|
|
3
|
+
* `localhost` when the browser is on that same machine — under HOST=0.0.0.0 it
|
|
4
|
+
* isn't. SSR has no `window`, so the first paint falls back to localhost.
|
|
5
|
+
*/
|
|
6
|
+
export function forwardedPortUrl(hostPort: number): string {
|
|
7
|
+
const host = typeof window === 'undefined' ? 'localhost' : window.location.hostname;
|
|
8
|
+
return `http://${host}:${hostPort}`;
|
|
9
|
+
}
|
package/src/pages/Avatars.svelte
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import '@fontsource-variable/doto';
|
|
3
3
|
import '@fontsource-variable/jetbrains-mono';
|
|
4
4
|
import AvatarsView from '../components/AvatarsView.svelte';
|
|
5
|
+
|
|
6
|
+
let { namePlaceholder }: { namePlaceholder: string } = $props();
|
|
5
7
|
</script>
|
|
6
8
|
|
|
7
|
-
<AvatarsView mochi:hydrate />
|
|
9
|
+
<AvatarsView {namePlaceholder} mochi:hydrate />
|
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
customEndpointModel,
|
|
24
24
|
hostEnvVarsEnabled,
|
|
25
25
|
hostEnvVarNames,
|
|
26
|
-
hostEnvVarPresence
|
|
26
|
+
hostEnvVarPresence,
|
|
27
|
+
version
|
|
27
28
|
}: {
|
|
28
29
|
defaultImage: string;
|
|
29
30
|
builtinImage: string;
|
|
@@ -45,6 +46,7 @@
|
|
|
45
46
|
hostEnvVarsEnabled: boolean;
|
|
46
47
|
hostEnvVarNames: string[];
|
|
47
48
|
hostEnvVarPresence: Record<string, boolean>;
|
|
49
|
+
version: string;
|
|
48
50
|
} = $props();
|
|
49
51
|
</script>
|
|
50
52
|
|
|
@@ -69,5 +71,6 @@
|
|
|
69
71
|
{hostEnvVarsEnabled}
|
|
70
72
|
{hostEnvVarNames}
|
|
71
73
|
{hostEnvVarPresence}
|
|
74
|
+
{version}
|
|
72
75
|
mochi:hydrate
|
|
73
76
|
/>
|
package/src/routes.ts
CHANGED
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
} from './container-injections/claude-code-custom.ts';
|
|
21
21
|
import { hostEnvVarPresence, parseHostEnvVarNames } from './container-injections/host-env-vars.ts';
|
|
22
22
|
import { browse } from './lib/picker.server.ts';
|
|
23
|
+
import { pickNamePrompt } from './avatars/name-prompts.ts';
|
|
23
24
|
import {
|
|
24
25
|
addForwardedPort,
|
|
25
26
|
createInstance,
|
|
@@ -45,7 +46,7 @@ import {
|
|
|
45
46
|
listFolderHistory,
|
|
46
47
|
setOption
|
|
47
48
|
} from './lib/db.server.ts';
|
|
48
|
-
import { DEFAULT_COPY_IGNORE, DEFAULT_IMAGE } from './lib/config.server.ts';
|
|
49
|
+
import { APP_VERSION, DEFAULT_COPY_IGNORE, DEFAULT_IMAGE } from './lib/config.server.ts';
|
|
49
50
|
import { wsUpgradeAllowed } from './lib/auth.server.ts';
|
|
50
51
|
import { clearAttention, setAttention } from './lib/bridge.server.ts';
|
|
51
52
|
import { timingSafeEqualStr } from './lib/crypto.server.ts';
|
|
@@ -144,9 +145,11 @@ export const routes: Record<string, MochiRouteValue> = {
|
|
|
144
145
|
}
|
|
145
146
|
}),
|
|
146
147
|
|
|
147
|
-
// Reached from the settings page's coin
|
|
148
|
-
//
|
|
149
|
-
'/avatars': Mochi.page('./src/pages/Avatars.svelte'
|
|
148
|
+
// Reached from the settings page's coin. The name hint is rolled here rather than in
|
|
149
|
+
// the editor so hydration can't re-roll it and swap the word out mid-load.
|
|
150
|
+
'/avatars': Mochi.page('./src/pages/Avatars.svelte', {
|
|
151
|
+
serverProps: () => ({ namePlaceholder: pickNamePrompt() })
|
|
152
|
+
}),
|
|
150
153
|
|
|
151
154
|
// Settings mutations are Form actions rather than JSON routes, so each control
|
|
152
155
|
// still works without JS and `enhance` only upgrades it.
|
|
@@ -181,7 +184,8 @@ export const routes: Record<string, MochiRouteValue> = {
|
|
|
181
184
|
customEndpointModel: getOption('custom_endpoint_model') ?? DEFAULT_MODEL,
|
|
182
185
|
hostEnvVarsEnabled: getOption('host_env_vars_enabled') === '1',
|
|
183
186
|
hostEnvVarNames,
|
|
184
|
-
hostEnvVarPresence: hostEnvVarPresence(hostEnvVarNames)
|
|
187
|
+
hostEnvVarPresence: hostEnvVarPresence(hostEnvVarNames),
|
|
188
|
+
version: APP_VERSION
|
|
185
189
|
};
|
|
186
190
|
},
|
|
187
191
|
actions: {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Ta as a}from"/_mochi/client/chunk-kgn1b2t1.js";export{a as registerComponent};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as Ue,b as Ie,c as zt,d as Ze,e as He,g as ti}from"/_mochi/client/chunk-k3my1snp.js";import{h as $e,k as Ut,l as qe}from"/_mochi/client/chunk-x843txjc.js";import{m as Yt}from"/_mochi/client/chunk-ry7q5zk5.js";import{s as Gt,t as ft,u as je,v as Xt,w as Ye}from"/_mochi/client/chunk-jx5cekhh.js";import{x as q}from"/_mochi/client/chunk-zjcg8kw5.js";import{A as l,Aa as gt,B as X,Da as Tt,F as dt,G as ot,Ga as rt,Ia as Pt,Ja as Qe,La as U,M as se,Ma as j,N as Se,Na as Et,O as L,Q as ee,R as h,Ra as Oe,T as n,Ta as ei,U as lt,V as Lt,W as d,X as xt,Y as s,Z as $t,aa as A,ba as he,ca as ue,da as Wt,ea as Ke,fa as t,ia as Xe,ja as Dt,ka as Q,la as Bt,ma as c,oa as st,pa as oe,qa as o,ra as Z,sa as N,ta as Ge,ua as mt,xa as Je}from"/_mochi/client/chunk-kgn1b2t1.js";var Ve=!1;class xe extends Date{#t=h(super.getTime());#e=new Map;#i=he;constructor(...i){super(...i);if(!Ve)this.#a()}#a(){Ve=!0;var i=xe.prototype,e=Date.prototype,a=Object.getOwnPropertyNames(e);for(let r of a){if(r.startsWith("get")||r.startsWith("to")||r==="valueOf")i[r]=function(...v){if(v.length>0)return t(this.#t),e[r].apply(this,v);var p=this.#e.get(r);if(p===void 0){let S=he;ue(this.#i),p=L(()=>{return t(this.#t),e[r].apply(this,v)}),this.#e.set(r,p),ue(S)}return t(p)};if(r.startsWith("set"))i[r]=function(...v){var p=e[r].apply(this,v);return n(this.#t,e.getTime.call(this)),p}}}}var ai=["forEach","isDisjointFrom","isSubsetOf","isSupersetOf"],ri=["difference","intersection","symmetricDifference","union"],Fe=!1;class Mt extends Set{#t=new Map;#e=h(0);#i=h(0);#a=Wt||-1;constructor(i){super();if(i){for(var e of i)super.add(e);this.#i.v=super.size}if(!Fe)this.#n()}#r(i){return Wt===this.#a?h(i):ee(i)}#n(){Fe=!0;var i=Mt.prototype,e=Set.prototype;for(let a of ai)i[a]=function(...r){return t(this.#e),e[a].apply(this,r)};for(let a of ri)i[a]=function(...r){t(this.#e);var v=e[a].apply(this,r);return new Mt(v)}}has(i){var e=super.has(i),a=this.#t,r=a.get(i);if(r===void 0){if(!e)return t(this.#e),!1;r=this.#r(!0),a.set(i,r)}return t(r),e}add(i){if(!super.has(i))super.add(i),n(this.#i,super.size),lt(this.#e);return this}delete(i){var e=super.delete(i),a=this.#t,r=a.get(i);if(r!==void 0)a.delete(i),n(r,!1);if(e)n(this.#i,super.size),lt(this.#e);return e}clear(){if(super.size===0)return;super.clear();var i=this.#t;for(var e of i.values())n(e,!1);i.clear(),n(this.#i,0),lt(this.#e)}keys(){return this.values()}values(){return t(this.#e),super.values()}entries(){return t(this.#e),super.entries()}[Symbol.iterator](){return this.keys()}get size(){return t(this.#i)}}class ke extends Map{#t=new Map;#e=h(0);#i=h(0);#a=Wt||-1;constructor(i){super();if(i){for(var[e,a]of i)super.set(e,a);this.#i.v=super.size}}#r(i){return Wt===this.#a?h(i):ee(i)}has(i){var e=this.#t,a=e.get(i);if(a===void 0)if(super.has(i))a=this.#r(0),e.set(i,a);else return t(this.#e),!1;return t(a),!0}forEach(i,e){this.#n(),super.forEach(i,e)}get(i){var e=this.#t,a=e.get(i);if(a===void 0)if(super.has(i))a=this.#r(0),e.set(i,a);else{t(this.#e);return}return t(a),super.get(i)}set(i,e){var a=this.#t,r=a.get(i),v=super.get(i),p=super.set(i,e),S=this.#e;if(r===void 0)r=this.#r(0),a.set(i,r),n(this.#i,super.size),lt(S);else if(v!==e){lt(r);var C=S.reactions===null?null:new Set(S.reactions),w=C===null||!r.reactions?.every((R)=>C.has(R));if(w)lt(S)}return p}delete(i){var e=this.#t,a=e.get(i),r=super.delete(i);if(a!==void 0)e.delete(i),n(a,-1);if(r)n(this.#i,super.size),lt(this.#e);return r}clear(){if(super.size===0)return;super.clear();var i=this.#t;n(this.#i,0);for(var e of i.values())n(e,-1);lt(this.#e),i.clear()}#n(){t(this.#e);var i=this.#t;if(this.#i.v!==i.size){for(var e of super.keys())if(!i.has(e)){var a=this.#r(0);i.set(e,a)}}for([,a]of this.#t)t(a)}keys(){return t(this.#e),super.keys()}values(){return this.#n(),super.values()}entries(){return this.#n(),super.entries()}[Symbol.iterator](){return this.entries()}get size(){return t(this.#i),super.size}}var ie=Symbol("replace");class ae extends URLSearchParams{#t=h(0);#e=Re();#i=!1;#a(){if(!this.#e||this.#i)return;this.#i=!0;let i=this.toString();this.#e.search=i&&`?${i}`,this.#i=!1}[ie](i){if(this.#i)return;if(i.toString()===super.toString())return;this.#i=!0;for(let e of[...super.keys()])super.delete(e);for(let[e,a]of i)super.append(e,a);lt(this.#t),this.#i=!1}append(i,e){super.append(i,e),this.#a(),lt(this.#t)}delete(i,e){var a=super.has(i,e);if(super.delete(i,e),a)this.#a(),lt(this.#t)}get(i){return t(this.#t),super.get(i)}getAll(i){return t(this.#t),super.getAll(i)}has(i,e){return t(this.#t),super.has(i,e)}keys(){return t(this.#t),super.keys()}forEach(i,e){t(this.#t),super.forEach(i,e)}set(i,e){var a=super.getAll(i);super.set(i,e);var r=super.getAll(i);if(a.length!==r.length||a.some((v,p)=>v!==r[p]))this.#a(),lt(this.#t)}sort(){super.sort(),this.#a(),lt(this.#t)}toString(){return t(this.#t),super.toString()}values(){return t(this.#t),super.values()}entries(){return t(this.#t),super.entries()}[Symbol.iterator](){return this.entries()}get size(){return t(this.#t),super.size}}var be=null;function Re(){return be}class _e extends URL{#t=h(super.protocol);#e=h(super.username);#i=h(super.password);#a=h(super.hostname);#r=h(super.port);#n=h(super.pathname);#l=h(super.hash);#d=h(super.search);#o;constructor(i,e){i=new URL(i,e);super(i);be=this,this.#o=new ae(i.searchParams),be=null}get hash(){return t(this.#l)}set hash(i){super.hash=i,n(this.#l,super.hash)}get host(){return t(this.#a),t(this.#r),super.host}set host(i){super.host=i,n(this.#a,super.hostname),n(this.#r,super.port)}get hostname(){return t(this.#a)}set hostname(i){super.hostname=i,n(this.#a,super.hostname)}get href(){return t(this.#t),t(this.#e),t(this.#i),t(this.#a),t(this.#r),t(this.#n),t(this.#l),t(this.#d),super.href}set href(i){super.href=i,n(this.#t,super.protocol),n(this.#e,super.username),n(this.#i,super.password),n(this.#a,super.hostname),n(this.#r,super.port),n(this.#n,super.pathname),n(this.#l,super.hash),n(this.#d,super.search),this.#o[ie](super.searchParams)}get password(){return t(this.#i)}set password(i){super.password=i,n(this.#i,super.password)}get pathname(){return t(this.#n)}set pathname(i){super.pathname=i,n(this.#n,super.pathname)}get port(){return t(this.#r)}set port(i){super.port=i,n(this.#r,super.port)}get protocol(){return t(this.#t)}set protocol(i){super.protocol=i,n(this.#t,super.protocol)}get search(){return t(this.#d)}set search(i){super.search=i,n(this.#d,super.search),this.#o[ie](super.searchParams)}get username(){return t(this.#e)}set username(i){super.username=i,n(this.#e,super.username)}get origin(){return t(this.#t),t(this.#a),t(this.#r),super.origin}get searchParams(){return this.#o}toString(){return this.href}toJSON(){return this.href}}class ye{#t;#e;constructor(i,e){this.#t=i,this.#e=Se(e)}get current(){return this.#e(),this.#t()}}var We=/^[A-Za-z0-9._-]+$/;function li(i){let e=i.trim();if(!e)return null;let a,r,v=e.match(/^[A-Za-z0-9._-]+@([A-Za-z0-9.-]+):(.+)$/);if(v)a=v[1],r=v[2];else if(/^[a-z][a-z0-9+.-]*:\/\//i.test(e)){let w;try{w=new URL(e)}catch{return null}if(w.protocol!=="http:"&&w.protocol!=="https:"&&w.protocol!=="ssh:")return null;a=w.hostname,r=w.pathname}else{let w=e.match(/^([A-Za-z0-9-]+\.[A-Za-z0-9.-]+)\/(.+)$/);if(!w)return null;a=w[1],r=w[2]}if(!a||!r)return null;let p=r.replace(/\.git$/i,"").split("/").filter(Boolean),[S,C]=p;if(!S||!C||!We.test(S)||!We.test(C))return null;return{host:a,owner:S,repo:C,cloneUrl:`https://${a}/${S}/${C}.git`}}function we(i){return li(i)!==null}var di=new Set(["$$slots","$$events","$$legacy"]);function re(i,e){let a=U(e,di),r=[["path",{d:"M16 14v2.2l1.6 1"}],["path",{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"}],["circle",{cx:"16",cy:"16",r:"6"}]];q(i,j({name:"folder-clock"},()=>a,{get iconNode(){return r}}))}var oi=new Set(["$$slots","$$events","$$legacy"]);function Kt(i,e){let a=U(e,oi),r=[["path",{d:"M15 6a9 9 0 0 0-9 9V3"}],["circle",{cx:"18",cy:"6",r:"3"}],["circle",{cx:"6",cy:"18",r:"3"}]];q(i,j({name:"git-branch"},()=>a,{get iconNode(){return r}}))}var si=new Set(["$$slots","$$events","$$legacy"]);function ne(i,e){let a=U(e,si),r=[["path",{d:"m5 12 7-7 7 7"}],["path",{d:"M12 19V5"}]];q(i,j({name:"arrow-up"},()=>a,{get iconNode(){return r}}))}var fi=new Set(["$$slots","$$events","$$legacy"]);function le(i,e){let a=U(e,fi),r=[["path",{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"}]];q(i,j({name:"folder"},()=>a,{get iconNode(){return r}}))}var ci=new Set(["$$slots","$$events","$$legacy"]);function Qt(i,e){let a=U(e,ci),r=[["path",{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"}],["path",{d:"M12 9v4"}],["path",{d:"M12 17h.01"}]];q(i,j({name:"triangle-alert"},()=>a,{get iconNode(){return r}}))}var mi=c('<div class="recent-row svelte-oq97c4"><button class="recent-pick svelte-oq97c4"><span class="icon svelte-oq97c4"><!></span> <span class="recent-text svelte-oq97c4"><span class="recent-name svelte-oq97c4"> </span> <span class="recent-path svelte-oq97c4"> </span></span></button> <button class="recent-x svelte-oq97c4" title="Remove from history"><!></button></div>'),$i=c('<button class="recent-toggle svelte-oq97c4"> </button>'),gi=c('<div class="recent svelte-oq97c4"><div class="recent-label svelte-oq97c4">Recent</div> <!> <!></div>'),vi=c('<div class="muted svelte-oq97c4">Loading…</div>'),pi=c('<div class="muted err svelte-oq97c4"> </div>'),hi=c('<div class="row svelte-oq97c4"><button class="nav svelte-oq97c4"><span class="icon svelte-oq97c4"><!></span> <span class="ename svelte-oq97c4">..</span></button></div>'),ui=c('<div class="muted svelte-oq97c4"> </div>'),xi=c('<span class="badge svelte-oq97c4">devcontainer</span>'),bi=c('<div><button class="nav svelte-oq97c4"><span class="icon svelte-oq97c4"><!></span> <span class="ename svelte-oq97c4"> </span> <!></button> <button class="pick-inline svelte-oq97c4">Select</button></div>'),Si=c("<!> <!> <!>",1),wi=c(`<div class="warn svelte-oq97c4"><!> <span>No <code class="svelte-oq97c4">devcontainer.json</code> in this folder — a default image will be used if you select
|
|
2
|
-
it.</span></div>`),Ii=c('<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"><!></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" spellcheck="false" autocomplete="off"/> <input class="clone-branch svelte-oq97c4" type="text" placeholder="branch (optional)" spellcheck="false" autocomplete="off"/> <button class="clone-btn svelte-oq97c4">Clone</button></div></div> <div class="crumbs svelte-oq97c4"><code class="svelte-oq97c4"> </code></div> <!> <div class="search svelte-oq97c4"><input type="text" placeholder="Filter folders…" spellcheck="false" autocomplete="off" class="svelte-oq97c4"/></div> <div class="list svelte-oq97c4"><!></div> <!> <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">Select this folder</button></div></div></div>');function Ne(i,e){dt(e,!0);let a=h(null),r=h(!0),v=h(null),p=h(""),S=h(null),C=h(Lt([])),w=h(!1),R=h(""),z=h(""),V=L(()=>we(t(R)));function F(){if(!t(V))return;e.onpick(t(R).trim(),{branch:t(z).trim()||void 0})}let $=L(()=>t(a)?t(a).entries.filter((g)=>g.name.toLowerCase().includes(t(p).trim().toLowerCase())):[]),T=L(()=>t(w)?t(C):t(C).slice(0,5));async function b(){try{let g=await Ie("/api/history");n(C,g.history??[],!0)}catch{}}async function D(g){let K=t(C);n(C,t(C).filter((ut)=>ut.source_path!==g),!0);try{await Ze("/api/history",{sourcePath:g})}catch{n(C,K,!0)}}async function E(g=null){n(r,!0),n(v,null),n(p,"");try{let K=g?`/api/browse?path=${encodeURIComponent(g)}`:"/api/browse";n(a,await Ie(K,void 0,"Could not list folder"),!0)}catch(K){n(v,K.message,!0)}finally{n(r,!1)}await Ke(),t(S)?.focus()}$t(()=>{E(),b()});var k=Ii(),P=d(k),W=d(P),Y=s(d(W),2),O=d(Y);Yt(O,{size:16}),l(Y),l(W);var et=s(W,2),St=s(d(et),2),wt=d(St);Tt(wt);var bt=s(wt,2);Tt(bt);var I=s(bt,2);l(St),l(et);var M=s(et,2),H=d(M),f=d(H,!0);l(H),l(M);var u=s(M,2);{var B=(g)=>{var K=gi(),ut=s(d(K),2);mt(ut,17,()=>t(T),(It)=>It.source_path,(It,ct)=>{var tt=mi(),y=d(tt),at=d(y),Nt=d(at);{var Rt=(Ct)=>{Kt(Ct,{size:16})},_t=L(()=>we(t(ct).source_path)),Ot=(Ct)=>{re(Ct,{size:16})};N(Nt,(Ct)=>{if(t(_t))Ct(Rt);else Ct(Ot,-1)})}l(at);var jt=s(at,2),Vt=d(jt),ve=d(Vt,!0);l(Vt);var qt=s(Vt,2),pe=d(qt,!0);l(qt),l(jt),l(y);var yt=s(y,2),Ft=d(yt);Yt(Ft,{size:14}),l(yt),l(tt),A(()=>{Z(ve,t(ct).name),Z(pe,t(ct).source_path),rt(yt,"aria-label",`Remove ${t(ct).name??""} from history`)}),Q("click",y,()=>e.onpick(t(ct).source_path)),Q("click",yt,(Ct)=>{Ct.stopPropagation(),D(t(ct).source_path)}),o(It,tt)});var Jt=s(ut,2);{var kt=(It)=>{var ct=$i(),tt=d(ct,!0);l(ct),A(()=>Z(tt,t(w)?"Show fewer":`Show all (${t(C).length})`)),Q("click",ct,()=>n(w,!t(w))),o(It,ct)};N(Jt,(It)=>{if(t(C).length>5)It(kt)})}l(K),o(g,K)};N(u,(g)=>{if(t(C).length>0)g(B)})}var J=s(u,2),nt=d(J);Tt(nt),Qe(nt,(g)=>n(S,g),()=>t(S)),l(J);var m=s(J,2),x=d(m);{var it=(g)=>{var K=vi();o(g,K)},vt=(g)=>{var K=pi(),ut=d(K,!0);l(K),A(()=>Z(ut,t(v))),o(g,K)},pt=(g)=>{var K=Si(),ut=xt(K);{var Jt=(tt)=>{var y=hi(),at=d(y),Nt=d(at),Rt=d(Nt);ne(Rt,{size:16}),l(Nt),X(2),l(at),l(y),Q("click",at,()=>E(t(a)?.parent??null)),o(tt,y)};N(ut,(tt)=>{if(t(a).parent&&!t(p))tt(Jt)})}var kt=s(ut,2);{var It=(tt)=>{var y=ui(),at=d(y,!0);l(y),A(()=>Z(at,t(p)?"No folders match.":"No subfolders here.")),o(tt,y)};N(kt,(tt)=>{if(t($).length===0)tt(It)})}var ct=s(kt,2);mt(ct,19,()=>t($),(tt)=>tt.path,(tt,y,at)=>{var Nt=bi();let Rt;var _t=d(Nt),Ot=d(_t),jt=d(Ot);le(jt,{size:16}),l(Ot);var Vt=s(Ot,2),ve=d(Vt,!0);l(Vt);var qt=s(Vt,2);{var pe=(Ft)=>{var Ct=xi();o(Ft,Ct)};N(qt,(Ft)=>{if(t(y).hasDevcontainer)Ft(pe)})}l(_t);var yt=s(_t,2);l(Nt),A((Ft)=>{Rt=gt(Nt,1,"row svelte-oq97c4",null,Rt,Ft),Z(ve,t(y).name)},[()=>({"first-match":t(p).trim()&&t(at)===0})]),Q("click",_t,()=>E(t(y).path)),Q("click",yt,()=>e.onpick(t(y).path)),o(tt,Nt)}),o(g,K)};N(x,(g)=>{if(t(r))g(it);else if(t(v))g(vt,1);else if(t(a))g(pt,2)})}l(m);var _=s(m,2);{var ht=(g)=>{var K=wi(),ut=d(K);Qt(ut,{size:15}),X(2),l(K),o(g,K)};N(_,(g)=>{if(t(a)&&!t(a).hasDevcontainer)g(ht)})}var At=s(_,2),Ht=s(d(At),2);l(At),l(P),l(k),A(()=>{I.disabled=!t(V),Z(f,t(a)?.path??"…"),Ht.disabled=!t(a)}),Q("click",k,function(...g){e.onclose?.apply(this,g)}),Q("keydown",k,(g)=>g.key==="Escape"&&e.onclose()),Q("click",P,(g)=>g.stopPropagation()),Q("keydown",P,()=>{}),Q("click",Y,function(...g){e.onclose?.apply(this,g)}),Q("keydown",wt,(g)=>{if(g.key==="Enter")g.preventDefault(),F()}),Pt(wt,()=>t(R),(g)=>n(R,g)),Q("keydown",bt,(g)=>{if(g.key==="Enter")g.preventDefault(),F()}),Pt(bt,()=>t(z),(g)=>n(z,g)),Q("click",I,F),Q("keydown",nt,(g)=>{let K=t($)[0];if(g.key==="Enter"&&K)g.preventDefault(),E(K.path)}),Pt(nt,()=>t(p),(g)=>n(p,g)),Q("click",Ht,()=>t(a)&&e.onpick(t(a).path)),o(i,k),ot()}Bt(["click","keydown"]);var Ni=c('<div class="branch svelte-jv8lut" title="Branch checked out in the container"><!><span class="svelte-jv8lut"> </span></div>');function Ce(i,e){var a=Ni(),r=d(a);Kt(r,{size:12});var v=s(r),p=d(v,!0);l(v),l(a),A(()=>Z(p,e.branch)),o(i,a)}var Ci=new Set(["$$slots","$$events","$$legacy"]);function de(i,e){let a=U(e,Ci),r=[["path",{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"}],["path",{d:"M17 21v-2"}],["path",{d:"M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10"}],["path",{d:"M21 21v-2"}],["path",{d:"M3 5V3"}],["path",{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"}],["path",{d:"M7 5V3"}]];q(i,j({name:"cable"},()=>a,{get iconNode(){return r}}))}var Ei=c('<a target="_blank" rel="noopener"> </a>'),Mi=c('<div class="fports svelte-1uaz383" title="Forwarded ports — click to open"><!> <span class="list svelte-1uaz383"></span></div>');function Ee(i,e){dt(e,!0);var a=oe(),r=xt(a);{var v=(p)=>{var S=Mi(),C=d(S);de(C,{size:12});var w=s(C,2);mt(w,21,()=>e.ports,(R)=>R.container_port,(R,z)=>{var V=Ei();let F;var $=d(V,!0);l(V),A(()=>{F=gt(V,1,"fport svelte-1uaz383",null,F,{open:t(z).open}),rt(V,"href",`http://localhost:${t(z).host_port}`),rt(V,"title",`container :${t(z).container_port} → http://localhost:${t(z).host_port} ${t(z).open?"(open)":"(not published yet)"}`),Z($,t(z).container_port)}),o(R,V)}),l(w),l(S),o(p,S)};N(r,(p)=>{if(e.ports.length)p(v)})}o(i,a),ot()}var Li=c('<input class="name-edit svelte-13338y7"/>'),Ti=c('<button class="name svelte-13338y7" title="Click to rename"> </button>'),Pi=c("<span></span>"),Bi=c('<div class="card-error svelte-13338y7"> </div>'),Di=c("<!> <!>",1),zi=c('<li class="card panel svelte-13338y7"><div class="card-head svelte-13338y7"><!> <!> <!> <!></div> <div class="path svelte-13338y7"> </div> <!> <!> <!> <div class="actions svelte-13338y7"><!> <!> <!> <!></div></li>');function Me(i,e){dt(e,!0);let a=Et(e,"editingName",15),r=L(()=>e.instance.status==="running"||e.instance.status==="stopped"||e.instance.status==="error"&&!!e.instance.container_id);var v=zi(),p=d(v),S=d(p);Gt(S,{get id(){return e.instance.id},get name(){return e.instance.name},interactive:!0});var C=s(S,2);{var w=(f)=>{var u=Li();Tt(u),se(u,!0),Dt("focus",u,(B)=>B.currentTarget.select()),Dt("blur",u,function(...B){e.oncommitrename?.apply(this,B)}),Q("keydown",u,(B)=>{if(B.key==="Enter")B.currentTarget.blur();else if(B.key==="Escape")e.oncancelrename()}),Pt(u,a),o(f,u)},R=(f)=>{var u=Ti(),B=d(u,!0);l(u),A(()=>Z(B,e.instance.name)),Q("click",u,function(...J){e.onstartrename?.apply(this,J)}),o(f,u)};N(C,(f)=>{if(e.editing)f(w);else f(R,-1)})}var z=s(C,2);{var V=(f)=>{var u=Pi();let B;A(()=>{B=gt(u,1,"attn svelte-13338y7",null,B,{"attn-done":e.instance.attention==="done","attn-waiting":e.instance.attention==="waiting"}),rt(u,"title",e.instance.attention==="waiting"?"Claude is waiting for input":"Claude finished"),rt(u,"aria-label",e.instance.attention==="waiting"?"Claude is waiting for input":"Claude finished")}),o(f,u)};N(z,(f)=>{if(e.instance.attention)f(V)})}var F=s(z,2);He(F,{get status(){return e.instance.status}}),l(p);var $=s(p,2),T=d($,!0);l($);var b=s($,2);{var D=(f)=>{Ee(f,{get ports(){return e.instance.forwarded_ports}})};N(b,(f)=>{if(e.instance.status==="running")f(D)})}var E=s(b,2);{var k=(f)=>{Ce(f,{get branch(){return e.instance.git_branch}})};N(E,(f)=>{if(e.instance.git_branch)f(k)})}var P=s(E,2);{var W=(f)=>{var u=Bi(),B=d(u,!0);l(u),A(()=>Z(B,e.instance.error)),o(f,u)};N(P,(f)=>{if(e.instance.status==="error"&&e.instance.error)f(W)})}var Y=s(P,2),O=d(Y);{var et=(f)=>{var u=Di(),B=xt(u);{let nt=L(()=>`/ide/${e.instance.id}`);ft(B,{variant:"primary",size:"sm",get href(){return t(nt)},children:(m,x)=>{X();var it=st("Open IDE");o(m,it)},$$slots:{default:!0}})}var J=s(B,2);ft(J,{size:"sm",onclick:()=>e.onact("stop"),children:(nt,m)=>{X();var x=st("Stop");o(nt,x)},$$slots:{default:!0}}),o(f,u)},St=(f)=>{ft(f,{size:"sm",onclick:()=>e.onact("start"),children:(u,B)=>{X();var J=st("Start");o(u,J)},$$slots:{default:!0}})},wt=(f)=>{{let u=L(()=>`/instances/${e.instance.id}`);ft(f,{size:"sm",get href(){return t(u)},target:"_blank",rel:"noopener noreferrer",children:(B,J)=>{X();var nt=st("View logs");o(B,nt)},$$slots:{default:!0}})}};N(O,(f)=>{if(e.instance.status==="running")f(et);else if(e.instance.status==="stopped"||e.instance.status==="error"&&e.instance.container_id)f(St,1);else if(e.instance.status==="creating")f(wt,2)})}var bt=s(O,2);{var I=(f)=>{ft(f,{size:"sm",title:"Recreate the container and re-run setup (credentials, hooks, port forwards)",onclick:()=>e.onact("rebuild"),children:(u,B)=>{X();var J=st("Rebuild");o(u,J)},$$slots:{default:!0}})};N(bt,(f)=>{if(t(r))f(I)})}var M=s(bt,2);{let f=L(()=>`/instances/${e.instance.id}`);ft(M,{size:"sm",ghost:!0,get href(){return t(f)},target:"_blank",rel:"noopener noreferrer",children:(u,B)=>{X();var J=st("Details");o(u,J)},$$slots:{default:!0}})}var H=s(M,2);ft(H,{variant:"danger",size:"sm",onclick:()=>e.onact("delete"),children:(f,u)=>{X();var B=st("Delete");o(f,B)},$$slots:{default:!0}}),l(Y),l(v),A(()=>{rt($,"title",e.instance.source_path),Z(T,e.instance.source_path)}),o(i,v),ot()}Bt(["keydown","click"]);var Ai=new Set(["$$slots","$$events","$$legacy"]);function fe(i,e){let a=U(e,Ai),r=[["path",{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"}],["path",{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"}],["path",{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"}],["path",{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"}]];q(i,j({name:"component"},()=>a,{get iconNode(){return r}}))}var Vi=new Set(["$$slots","$$events","$$legacy"]);function ce(i,e){let a=U(e,Vi),r=[["path",{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"}],["path",{d:"M12 22V12"}],["polyline",{points:"3.29 7 12 12 20.71 7"}],["path",{d:"m7.5 4.27 9 5.15"}]];q(i,j({name:"package"},()=>a,{get iconNode(){return r}}))}var Fi=c('<a class="brand svelte-94cd8h" href="/"><span class="logo svelte-94cd8h"><!></span><span>Codebay</span><span class="tagline svelte-94cd8h">devcontainer manager</span></a>');function Le(i){var e=Fi(),a=d(e),r=d(a);ce(r,{size:22}),l(a),X(2),l(e),o(i,e)}var ki=new Set(["$$slots","$$events","$$legacy"]);function Zt(i,e){let a=U(e,ki),r=[["path",{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"}],["circle",{cx:"12",cy:"12",r:"3"}]];q(i,j({name:"settings"},()=>a,{get iconNode(){return r}}))}var Ri=c('<a class="cog svelte-1e745g8" href="/settings" aria-label="Settings" title="Settings"><!></a>');function Te(i){var e=Ri(),a=d(e);Zt(a,{size:16}),l(e),o(i,e)}var _i=new Set(["$$slots","$$events","$$legacy"]);function me(i,e){let a=U(e,_i),r=[["path",{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"}],["path",{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"}]];q(i,j({name:"link"},()=>a,{get iconNode(){return r}}))}var yi=c('<button type="button" class="cred-row svelte-vongf9" role="menuitem"><span></span> <span class="cred-label"> </span> <span class="cred-state svelte-vongf9"> </span></button>'),Wi=c('<div class="cred-dropdown panel svelte-vongf9" role="menu"></div>'),Ki=c('<div class="cred-menu svelte-vongf9"><button aria-haspopup="menu" aria-label="Credentials" title="Credentials"><!></button> <!></div>');function Pe(i,e){dt(e,!0);let a=h(!1),r=L(()=>e.auth.filter(($)=>$.available).length),v=L(()=>t(r)===e.auth.length?"ok":t(r)===0?"error":"warn"),p={ok:me,warn:Qt,error:Yt},S=L(()=>p[t(v)]);function C($){if($.available)Xt.success(`${$.label} credentials come from ${$.source}.`);else{let T=$.hint?` — ${$.hint}`:"";Xt.error(`No ${$.label} credentials found${T}.`)}}$t(()=>{if(!t(a))return;let $=(b)=>{if(!b.target?.closest(".cred-menu"))n(a,!1)},T=(b)=>{if(b.key==="Escape")n(a,!1)};return window.addEventListener("click",$),window.addEventListener("keydown",T),()=>{window.removeEventListener("click",$),window.removeEventListener("keydown",T)}});var w=Ki(),R=d(w),z=d(R);Je(z,()=>t(S),($,T)=>{T($,{size:16})}),l(R);var V=s(R,2);{var F=($)=>{var T=Wi();mt(T,21,()=>e.auth,(b)=>b.id,(b,D)=>{var E=yi(),k=d(E),P=s(k,2),W=d(P,!0);l(P);var Y=s(P,2),O=d(Y,!0);l(Y),l(E),A(()=>{rt(E,"title",t(D).available?`Credentials from ${t(D).source}, copied into each new instance.`:`No credentials found on this computer${t(D).hint?` — ${t(D).hint}`:""}.`),gt(k,1,`dot ${t(D).available?"on":"off"}`,"svelte-vongf9"),Z(W,t(D).label),Z(O,t(D).available?"Authorized":"Not found")}),Q("click",E,()=>C(t(D))),o(b,E)}),l(T),o($,T)};N(V,($)=>{if(t(a))$(F)})}l(w),A(()=>{gt(R,1,`cred ${t(v)??""}`,"svelte-vongf9"),rt(R,"aria-expanded",t(a))}),Q("click",R,()=>n(a,!t(a))),o(i,w),ot()}Bt(["click"]);var Qi=c('<header class="topbar svelte-1h259us"><!> <div class="topbar-actions svelte-1h259us"><!> <!> <!> <!> <!></div></header>');function Be(i,e){let a=Et(e,"canDelete",3,!1),r=Et(e,"ready",3,!0),v=Et(e,"creating",3,!1);var p=Qi(),S=d(p);Le(S,{});var C=s(S,2),w=d(C);{var R=(T)=>{ft(T,{variant:"default",size:"sm",get icon(){return fe},href:"/debug",children:(b,D)=>{X();var E=st("Debug");o(b,E)},$$slots:{default:!0}})};N(w,(T)=>{if(Oe)T(R)})}var z=s(w,2);Te(z,{});var V=s(z,2);Pe(V,{get auth(){return e.auth}});var F=s(V,2);{let T=L(()=>!a());ft(F,{variant:"danger",size:"sm",get onclick(){return e.onDeleteAll},get disabled(){return t(T)},children:(b,D)=>{X();var E=st("Delete all");o(b,E)},$$slots:{default:!0}})}var $=s(F,2);{let T=L(()=>v()?void 0:$e),b=L(()=>!r()||v());ft($,{variant:"primary",get icon(){return t(T)},get onclick(){return e.onNew},get disabled(){return t(b)},children:(D,E)=>{X();var k=st();A(()=>Z(k,v()?"Creating…":"New instance")),o(D,k)},$$slots:{default:!0}})}l(C),l(p),o(i,p)}var Zi=c("<span>Docker daemon is not reachable.</span>"),Hi=c("<span>The devcontainer CLI is not available.</span>"),Ji=c('<div class="banner error svelte-146pixd"><strong>Setup needed.</strong> <!> <!></div>'),Oi=c('<div class="banner error svelte-146pixd"><strong>Error.</strong> <span> </span></div>'),Yi=c('<div class="empty svelte-146pixd"><p class="empty-sub svelte-146pixd">Loading…</p></div>'),Gi=c('<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> <!></div>'),Xi=c('<ul class="grid svelte-146pixd"></ul>'),Ui=c('<!> <main class="stage svelte-146pixd"><!> <!> <!></main> <!>',1);function De(i,e){dt(e,!0);let a=h(!1),r=h(!1),v=h(null),p=h(null),S=h(""),C=L(()=>e.preflight.docker&&e.preflight.cli);async function w(I,M){n(a,!1),n(r,!0),n(v,null);try{await zt("/api/instances",{sourcePath:I,branch:M?.branch},"Failed to create instance")}catch(H){n(v,H.message,!0)}finally{n(r,!1)}}async function R(I,M){if(n(v,null),M==="delete"&&!confirm("Delete this instance and its copied files?"))return;if(M==="rebuild"&&!confirm("Recreate this container and re-run setup? The workspace is kept."))return;try{await zt(`/api/instances/${I}/${M}`,void 0,`Failed to ${M}`)}catch(H){n(v,H.message,!0)}}function z(I){n(p,I.id,!0),n(S,I.name,!0)}function V(){n(p,null),n(S,"")}async function F(I){let M=t(S).trim(),H=e.instances.find((f)=>f.id===I)?.name;if(!M||M===H){V();return}V(),n(v,null);try{await zt(`/api/instances/${I}/rename`,{name:M},"Failed to rename")}catch(f){n(v,f.message,!0)}}async function $(){if(n(v,null),!confirm(`Delete all ${e.instances.length} instances and their copied files?`))return;try{await zt("/api/instances/delete-all",void 0,"Failed to delete all")}catch(I){n(v,I.message,!0)}}var T=Ui(),b=xt(T);{let I=L(()=>e.instances.length>0);Be(b,{get auth(){return e.preflight.auth},get canDelete(){return t(I)},get ready(){return t(C)},get creating(){return t(r)},onNew:()=>n(a,!0),onDeleteAll:$})}var D=s(b,2),E=d(D);{var k=(I)=>{var M=Ji(),H=s(d(M),2);{var f=(J)=>{var nt=Zi();o(J,nt)};N(H,(J)=>{if(!e.preflight.docker)J(f)})}var u=s(H,2);{var B=(J)=>{var nt=Hi();o(J,nt)};N(u,(J)=>{if(!e.preflight.cli)J(B)})}l(M),o(I,M)};N(E,(I)=>{if(!t(C))I(k)})}var P=s(E,2);{var W=(I)=>{var M=Oi(),H=s(d(M),2),f=d(H,!0);l(H),l(M),A(()=>Z(f,t(v))),o(I,M)};N(P,(I)=>{if(t(v))I(W)})}var Y=s(P,2);{var O=(I)=>{var M=Yi();o(I,M)},et=(I)=>{var M=Gi(),H=s(d(M),4);{let f=L(()=>!t(C));ft(H,{variant:"primary",get icon(){return $e},onclick:()=>n(a,!0),get disabled(){return t(f)},children:(u,B)=>{X();var J=st("New instance");o(u,J)},$$slots:{default:!0}})}l(M),o(I,M)},St=(I)=>{var M=Xi();mt(M,21,()=>e.instances,(H)=>H.id,(H,f)=>{{let u=L(()=>t(p)===t(f).id);Me(H,{get instance(){return t(f)},get editing(){return t(u)},onact:(B)=>R(t(f).id,B),onstartrename:()=>z(t(f)),oncommitrename:()=>F(t(f).id),oncancelrename:V,get editingName(){return t(S)},set editingName(B){n(S,B,!0)}})}}),l(M),o(I,M)};N(Y,(I)=>{if(!e.loaded)I(O);else if(e.instances.length===0)I(et,1);else I(St,-1)})}l(D);var wt=s(D,2);{var bt=(I)=>{Ne(I,{onpick:w,onclose:()=>n(a,!1)})};N(wt,(I)=>{if(t(a))I(bt)})}o(i,T),ot()}var ji=c('<div class="tab-label editing svelte-r39acv"><!> <input class="tab-name-edit svelte-r39acv"/></div>'),qi=c('<button type="button" class="tab-label svelte-r39acv"><!> <span class="tab-name svelte-r39acv"> </span></button>'),ta=c("<div><!></div>"),ea=c('<nav class="tabs svelte-r39acv"></nav>'),ia=c('<!> <a class="cog svelte-r39acv" href="/settings" title="Settings" aria-label="Settings"><!></a>',1);function ze(i,e){dt(e,!0);let a=Et(e,"editingName",15);Ye(i,{children:(r,v)=>{var p=ia(),S=xt(p);{var C=(z)=>{var V=ea();mt(V,21,()=>e.running,(F)=>F.id,(F,$)=>{var T=ta();let b;var D=d(T);{var E=(P)=>{var W=ji(),Y=d(W);Gt(Y,{get id(){return t($).id},get name(){return t($).name},scale:4});var O=s(Y,2);Tt(O),se(O,!0),l(W),Dt("focus",O,(et)=>et.currentTarget.select()),Dt("blur",O,()=>e.oncommitrename(t($).id)),Q("keydown",O,(et)=>{if(et.key==="Enter")et.currentTarget.blur();else if(et.key==="Escape")e.oncancelrename()}),Pt(O,a),o(P,W)},k=(P)=>{var W=qi(),Y=d(W);Gt(Y,{get id(){return t($).id},get name(){return t($).name},scale:4});var O=s(Y,2),et=d(O,!0);l(O),l(W),A(()=>{rt(W,"title",t($).name),Z(et,t($).name)}),Q("click",W,()=>e.onselect(t($).id)),Q("dblclick",W,()=>e.onstartrename(t($))),o(P,W)};N(D,(P)=>{if(e.editingId===t($).id)P(E);else P(k,-1)})}l(T),A(()=>b=gt(T,1,"tab svelte-r39acv",null,b,{active:t($).id===e.active,"attn-done":t($).id!==e.active&&e.attention[t($).id]==="done","attn-waiting":t($).id!==e.active&&e.attention[t($).id]==="waiting"})),o(F,T)}),l(V),o(z,V)};N(S,(z)=>{if(e.running.length>0)z(C)})}var w=s(S,2),R=d(w);Zt(R,{size:18}),l(w),o(r,p)},$$slots:{default:!0}}),ot()}Bt(["keydown","click","dblclick"]);var aa=c('<div class="row svelte-w5e143"> </div>'),ra=c('<div class="stalled svelte-w5e143"><p class="svelte-w5e143">Waiting for code-server to answer inside the container.</p> <!></div>'),na=c('<div class="loader svelte-w5e143"><div class="grid svelte-w5e143" aria-hidden="true"></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> <!></div>');function ge(i,e){dt(e,!0);let a=Et(e,"speed",3,1),r=h(!1);$t(()=>{if(e.stalledAfterMs===void 0)return;let b=setTimeout(()=>n(r,!0),e.stalledAfterMs);return()=>clearTimeout(b)});let v=3,p=22,S=140,C=7,w=L(()=>Math.max(20,S/a())),z=h(Lt((()=>Array.from({length:v},()=>Array.from({length:p},()=>Math.random()<0.5?0:1)))()));$t(()=>{if(window.matchMedia?.("(prefers-reduced-motion: reduce)").matches)return;let b=setInterval(()=>{let D=t(z).map((E)=>E.slice());for(let E=0;E<C;E++){let k=D[Math.floor(Math.random()*v)],P=Math.floor(Math.random()*p);k[P]=k[P]?0:1}n(z,D,!0)},t(w));return()=>clearInterval(b)});var V=na(),F=d(V);mt(F,21,()=>t(z),Ge,(b,D)=>{var E=aa(),k=d(E,!0);l(E),A((P)=>Z(k,P),[()=>t(D).join("")]),o(b,E)}),l(F);var $=s(F,4);{var T=(b)=>{var D=ra(),E=s(d(D),2);{var k=(P)=>{ft(P,{size:"sm",get onclick(){return e.onoverride},children:(W,Y)=>{X();var O=st("Open anyway");o(W,O)},$$slots:{default:!0}})};N(E,(P)=>{if(e.onoverride)P(k)})}l(D),o(b,D)};N($,(b)=>{if(t(r))b(T)})}l(V),o(i,V),ot()}var la=c('<iframe class="svelte-1duc7gd"></iframe>'),da=c("<div><!> <!></div>"),oa=c('<div class="empty svelte-1duc7gd">No running instances.</div>'),sa=c("<div><!> <div><!> <!></div></div> <!>",1);function Ae(i,e){dt(e,!0);let a=h(Lt(e.snapshot)),r=h(Lt(e.preflight)),v=h(e.snapshot.length>0),p=L(()=>t(a).filter((m)=>m.status==="running")),S=h(Lt(Object.fromEntries(e.snapshot.map((m)=>[m.id,m.attention])))),C=h(null),w=h("");function R(m){n(C,m.id,!0),n(w,m.name,!0)}function z(){n(C,null),n(w,"")}async function V(m){let x=t(w).trim(),it=t(a).find((vt)=>vt.id===m)?.name;if(!x||x===it){z();return}z();try{await zt(`/api/instances/${m}/rename`,{name:x},"Failed to rename")}catch(vt){Xt.error(vt.message)}}let F=h(Lt(e.initialPath)),$=L(()=>t(F).startsWith("/ide")),T=L(()=>t(F).startsWith("/ide/")?t(F).slice(5):""),b=L(()=>t($)?t(p).some((m)=>m.id===t(T))?t(T):t(p)[0]?.id??"":"");function D(m){if(m===t(F))return;history.pushState({},"",m),n(F,m,!0)}$t(()=>{function m(x){if(x.defaultPrevented||x.button!==0||x.metaKey||x.ctrlKey||x.shiftKey||x.altKey)return;let it=x.target?.closest?.("a");if(!it)return;let vt=it.getAttribute("href");if(!vt||it.target==="_blank"||it.hasAttribute("download"))return;let pt=new URL(vt,location.href);if(pt.origin!==location.origin)return;if(pt.pathname==="/"||pt.pathname.startsWith("/ide/"))x.preventDefault(),D(pt.pathname)}return document.addEventListener("click",m),()=>document.removeEventListener("click",m)}),$t(()=>{function m(){n(F,location.pathname,!0)}return window.addEventListener("popstate",m),()=>window.removeEventListener("popstate",m)});let E=new Mt;$t(()=>{if(t(b))E.add(t(b))});let k=new Mt,P=new Mt,W=new Mt,Y=(m)=>P.has(m)||W.has(m),O=1e4;$t(()=>{let m=t(p).find((x)=>x.id===t(b));document.title=t($)&&m?`${m.name} — Codebay`:"Codebay"}),$t(()=>{return window.addEventListener("pointerdown",Ut),window.addEventListener("keydown",Ut),()=>{window.removeEventListener("pointerdown",Ut),window.removeEventListener("keydown",Ut)}}),$t(()=>{let m=!1;return ti((x)=>{if(x.type==="preflight"){n(r,{...t(r),docker:x.data.docker,cli:x.data.cli},!0);return}if(x.type==="health"){let _=t(a).find((ht)=>ht.id===x.data.id);if(x.data.health.codeServerAccessible&&_?.status==="running")P.add(x.data.id);return}if(x.type!=="instances")return;let it=x.data,vt=new Set(it.filter((_)=>_.status==="running").map((_)=>_.id));for(let _ of[...P])if(!vt.has(_))P.delete(_);for(let _ of[...W])if(!vt.has(_))W.delete(_);for(let _ of[...k])if(!vt.has(_))k.delete(_);let pt={};for(let _ of it)pt[_.id]=_.attention;if(m)for(let _ in pt){let ht=pt[_];if(ht&&ht!==t(S)[_])if(_===t(b))console.log(`[chime] attention id=${_} state=${ht} — skipped (tab is active/focused)`);else console.log(`[chime] attention id=${_} state=${ht} → playChime`),qe(ht)}else console.log("[chime] first frame after (re)connect — baselining, no chimes");m=!0,n(a,it,!0),n(S,pt,!0),n(v,!0)},()=>{m=!1})}),$t(()=>{if(!t(b)||!t(S)[t(b)])return;let m=()=>{if(document.visibilityState==="visible")zt(`/api/instances/${t(b)}/attention/clear`).catch(()=>{})};return m(),document.addEventListener("visibilitychange",m),()=>document.removeEventListener("visibilitychange",m)});var et=sa(),St=xt(et);let wt;var bt=d(St);{var I=(m)=>{ze(m,{get running(){return t(p)},get active(){return t(b)},get attention(){return t(S)},get editingId(){return t(C)},onselect:(x)=>D(`/ide/${x}`),onstartrename:R,oncommitrename:V,oncancelrename:z,get editingName(){return t(w)},set editingName(x){n(w,x,!0)}})},M=(m)=>{De(m,{get preflight(){return t(r)},get instances(){return t(a)},get loaded(){return t(v)}})};N(bt,(m)=>{if(t($))m(I);else m(M,-1)})}var H=s(bt,2);let f;var u=d(H);mt(u,17,()=>t(p),(m)=>m.id,(m,x)=>{var it=oe(),vt=xt(it);{var pt=(ht)=>{var At=da();let Ht;var g=d(At);{var K=(y)=>{var at=la();A((Nt)=>{rt(at,"src",Nt),rt(at,"title",t(x).name)},[()=>Ue(t(x))]),Dt("load",at,()=>k.add(t(x).id)),Xe(at),o(y,at)},ut=L(()=>Y(t(x).id));N(g,(y)=>{if(t(ut))y(K)})}var Jt=s(g,2);{var kt=(y)=>{ge(y,{stalledAfterMs:O,onoverride:()=>W.add(t(x).id)})},It=L(()=>!Y(t(x).id)),ct=(y)=>{ge(y,{})},tt=L(()=>!k.has(t(x).id));N(Jt,(y)=>{if(t(It))y(kt);else if(t(tt))y(ct,1)})}l(At),A(()=>Ht=gt(At,1,"pane svelte-1duc7gd",null,Ht,{active:t(x).id===t(b)})),o(ht,At)},_=L(()=>E.has(t(x).id));N(vt,(ht)=>{if(t(_))ht(pt)})}o(m,it)});var B=s(u,2);{var J=(m)=>{var x=oa();o(m,x)};N(B,(m)=>{if(t($)&&t(p).length===0)m(J)})}l(H),l(St);var nt=s(St,2);je(nt,{toastOptions:{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;"}}),A(()=>{wt=gt(St,1,"app svelte-1duc7gd",null,wt,{ide:t($)}),f=gt(H,1,"panes svelte-1duc7gd",null,f,{hidden:!t($)})}),o(i,et),ot()}ei("AppShell_2rtnxn6pgp2rh",Ae);
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import{n as G,o as $,p as b,q as u,r as de,s as N,t as M,u as Ye,v as he,w as Ze}from"/_mochi/client/chunk-jx5cekhh.js";import{x as g}from"/_mochi/client/chunk-zjcg8kw5.js";import{A as f,Aa as Ee,B as X,Ba as je,Da as ze,F as R,G as _,Ga as De,Ia as Je,Ja as Ke,Ka as Xe,La as I,Ma as k,O as H,R as w,T as Y,Ta as Ge,V as Te,W as i,X as Qe,Y as p,aa as T,fa as s,ja as le,ka as P,la as Ce,ma as q,oa as Z,qa as n,ra as ne,ta as me,ua as V}from"/_mochi/client/chunk-kgn1b2t1.js";var Ae=new Set(["$$slots","$$events","$$legacy"]);function B(t,l){let o=I(l,Ae),m=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"}]];g(t,k({name:"copy"},()=>o,{get iconNode(){return m}}))}var Be=new Set(["$$slots","$$events","$$legacy"]);function W(t,l){let o=I(l,Be),m=[["path",{d:"M21 21H8a2 2 0 0 1-1.42-.587l-3.994-3.999a2 2 0 0 1 0-2.828l10-10a2 2 0 0 1 2.829 0l5.999 6a2 2 0 0 1 0 2.828L12.834 21"}],["path",{d:"m5.082 11.09 8.828 8.828"}]];g(t,k({name:"eraser"},()=>o,{get iconNode(){return m}}))}var We=new Set(["$$slots","$$events","$$legacy"]);function L(t,l){let o=I(l,We),m=[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 18a6 6 0 0 0 0-12v12z"}]];g(t,k({name:"contrast"},()=>o,{get iconNode(){return m}}))}var Le=new Set(["$$slots","$$events","$$legacy"]);function F(t,l){let o=I(l,Le),m=[["path",{d:"M15 3h6v6"}],["path",{d:"M10 14 21 3"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}]];g(t,k({name:"external-link"},()=>o,{get iconNode(){return m}}))}var Fe="https://github.com/khromov/codebay";function Se(t){return t.trim().toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/^-+|-+$/g,"")}function be(t){let l=[];for(let o=0;o<b;o++){let m="";for(let h=0;h<u;h++)m+=t[o*u+h]===$?"#":".";l.push(m)}return l}function ie(t){let l=t.pixels.map((o)=>` '${o}'`).join(`,
|
|
2
|
-
`);return`import type { AvatarArt } from './types.ts';
|
|
3
|
-
|
|
4
|
-
const art: AvatarArt = {
|
|
5
|
-
name: '${t.name}',
|
|
6
|
-
pixels: [
|
|
7
|
-
${l}
|
|
8
|
-
]
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export default art;
|
|
12
|
-
`}function He(t){let l=`Avatar contribution: ${t.name}`,o=["Hi! I drew this avatar in the editor easter egg and I'd love to see it in the official set.","","```",...t.pixels,"```","",`Ready-to-paste module (\`src/avatars/${t.name}.ts\`, plus a line in \`src/avatars/index.ts\`):`,"","```ts",ie(t).trimEnd(),"```","","_It should satisfy `src/avatars/avatars.test.ts`: exactly 8×8, only `#`/`.` pixels, unique name._"].join(`
|
|
13
|
-
`),m=new URLSearchParams({title:l,body:o});return`${Fe}/issues/new?${m}`}var we=q('<span class="ring-cell svelte-qu6vp4" aria-hidden="true"></span>'),Pe=q("<span></span>"),Re=q('<section class="editor svelte-qu6vp4"><div class="head svelte-qu6vp4"><h2 class="svelte-qu6vp4">Draw your avatar</h2></div> <div class="body svelte-qu6vp4"><div class="grid-frame svelte-qu6vp4"><!> <div class="grid svelte-qu6vp4" role="img" aria-label="8 by 8 pixel drawing canvas"></div></div> <div class="side svelte-qu6vp4"><div class="preview"><div class="preview-label svelte-qu6vp4">Preview</div> <div class="preview-row svelte-qu6vp4"><!> <!></div></div> <label class="name-field svelte-qu6vp4"><span class="preview-label svelte-qu6vp4">Name</span> <input type="text" spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" maxlength="24" class="svelte-qu6vp4"/></label> <div class="tools svelte-qu6vp4"><!> <!></div></div></div> <div class="foot svelte-qu6vp4"><span class="hint svelte-qu6vp4">Draw something, then open an issue to get it into the official set.</span> <div class="actions svelte-qu6vp4"><!> <!></div></div></section>');function ce(t,l){R(l,!0);let o=["dragon","unicorn","cactus","comet","pretzel","volcano","narwhal","waffle","satellite","pineapple","kraken","yeti","moose","lighthouse","toaster","hedgehog","walrus","pumpkin","jellyfish","tornado","igloo","boomerang"],m=o[Math.floor(Math.random()*o.length)],h=w(Te(Array(b*u).fill(G))),C=w(""),J=H(()=>Se(s(C))),a=H(()=>({name:s(J)||"my-avatar",pixels:be(s(h))})),E=H(()=>s(J).length>0&&s(h).some((e)=>e===$)),y=w(null),K=!1,j=$,O=Array.from({length:100},(e,r)=>({r:Math.floor(r/10),c:r%10})).filter(({r:e,c:r})=>e===0||e===9||r===0||r===9);function x(e){if(!s(y))return null;let r=s(y).getBoundingClientRect(),c=Math.floor((e.clientX-r.left)/r.width*u),d=Math.floor((e.clientY-r.top)/r.height*b);if(d<0||d>=b||c<0||c>=u)return null;return d*u+c}function z(e){let r=x(e);if(r==null)return;e.currentTarget.setPointerCapture?.(e.pointerId),K=!0,j=s(h)[r]===$?G:$,s(h)[r]=j}function S(e){if(!K)return;let r=x(e);if(r!=null)s(h)[r]=j}function D(){K=!1}function U(){Y(h,Array(b*u).fill(G),!0)}function ee(){Y(h,s(h).map((e)=>e===$?G:$),!0)}async function Me(){try{await navigator.clipboard.writeText(ie(s(a))),he("Copied — paste it into the GitHub issue")}catch(e){he.error(`Copy failed: ${e.message}`)}}var se=Re(),re=p(i(se),2),te=i(re),ae=i(te);V(ae,17,()=>O,me,(e,r)=>{let c=()=>s(r).r,d=()=>s(r).c;var A=we();T(()=>je(A,`grid-row:${c()+1};grid-column:${d()+1}`)),n(e,A)});var v=p(ae,2);V(v,21,()=>s(h),me,(e,r)=>{var c=Pe();let d;T(()=>d=Ee(c,1,"cell svelte-qu6vp4",null,d,{on:s(r)===$})),n(e,c)}),f(v),Ke(v,(e)=>Y(y,e),()=>s(y)),f(te);var ue=p(te,2),oe=i(ue),xe=p(i(oe),2),ve=i(xe);N(ve,{get art(){return s(a)},get name(){return s(a).name},scale:6});var Ve=p(ve,2);N(Ve,{get art(){return s(a)},get name(){return s(a).name},scale:3}),f(xe),f(oe);var fe=p(oe,2),pe=p(i(fe),2);ze(pe),f(fe);var Ie=p(fe,2),ke=i(Ie);M(ke,{size:"sm",get icon(){return W},onclick:U,children:(e,r)=>{X();var c=Z("Clear");n(e,c)},$$slots:{default:!0}});var Ne=p(ke,2);M(Ne,{size:"sm",get icon(){return L},onclick:ee,children:(e,r)=>{X();var c=Z("Invert");n(e,c)},$$slots:{default:!0}}),f(Ie),f(ue),f(re);var ge=p(re,2),qe=p(i(ge),2),ye=i(qe);{let e=H(()=>!s(E));M(ye,{size:"sm",get icon(){return B},get disabled(){return s(e)},onclick:Me,children:(r,c)=>{X();var d=Z("Copy");n(r,d)},$$slots:{default:!0}})}var Ue=p(ye,2);{let e=H(()=>!s(E)),r=H(()=>He(s(a)));M(Ue,{size:"sm",variant:"primary",get icon(){return F},get disabled(){return s(e)},get href(){return s(r)},target:"_blank",rel:"noopener",children:(c,d)=>{X();var A=Z("Open GitHub issue");n(c,A)},$$slots:{default:!0}})}f(qe),f(ge),f(se),T(()=>De(pe,"placeholder",m)),P("pointerdown",v,z),P("pointermove",v,S),P("pointerup",v,D),le("pointercancel",v,D),le("lostpointercapture",v,D),Je(pe,()=>s(C),(e)=>Y(C,e)),n(t,se),_()}Ce(["pointerdown","pointermove","pointerup"]);var _e=q('<span class="title svelte-fkq7sr">Avatars</span>'),Oe=q('<li class="svelte-fkq7sr"><!> <span class="label svelte-fkq7sr"> </span></li>'),es=q('<div class="page svelte-fkq7sr"><!> <main class="content svelte-fkq7sr"><!> <section class="catalog svelte-fkq7sr"><header class="svelte-fkq7sr"><h2 class="svelte-fkq7sr">The set</h2> <p class="svelte-fkq7sr"> </p></header> <ul class="svelte-fkq7sr"></ul></section></main></div> <!>',1);function $e(t,l){R(l,!1),Xe();var o=es(),m=Qe(o),h=i(m);Ze(h,{children:(x,z)=>{var S=_e();n(x,S)},$$slots:{default:!0}});var C=p(h,2),J=i(C);ce(J,{});var a=p(J,2),E=i(a),y=p(i(E),2),K=i(y);f(y),f(E);var j=p(E,2);V(j,5,()=>de,(x)=>x.name,(x,z)=>{var S=Oe(),D=i(S);N(D,{get art(){return s(z)},get name(){return s(z).name},scale:8,interactive:!0});var U=p(D,2),ee=i(U,!0);f(U),f(S),T(()=>ne(ee,s(z).name)),n(x,S)}),f(j),f(a),f(C),f(m);var O=p(m,2);Ye(O,{toastOptions:{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;"}}),T(()=>ne(K,`${de.length??""} hand-crafted 8×8 sprites`)),n(t,o),_()}Ge("AvatarsView_257s9yq1wwr4f",$e);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as _l,c as Gl,d as nl,e as lv,f as vv,g as sv}from"/_mochi/client/chunk-k3my1snp.js";import{m as Pl}from"/_mochi/client/chunk-ry7q5zk5.js";import{x as d}from"/_mochi/client/chunk-zjcg8kw5.js";import{A as i,Aa as fl,B as g,Ba as cl,Da as ol,F as Il,G as Sl,Ga as Tl,Ia as rl,La as P,Ma as u,Na as O,O as E,Qa as $l,R as j,T as m,Ta as iv,V as gl,W as f,X as A,Y as t,Z as el,aa as S,fa as v,ja as dl,ka as Nl,la as ql,ma as y,pa as q,qa as h,ra as I,sa as M,ta as Rl,ua as o,za as Ol}from"/_mochi/client/chunk-kgn1b2t1.js";var Kv=new Set(["$$slots","$$events","$$legacy"]);function Cl(D,a){let k=P(a,Kv),e=[["path",{d:"m12 19-7-7 7-7"}],["path",{d:"M19 12H5"}]];d(D,u({name:"arrow-left"},()=>k,{get iconNode(){return e}}))}var Lv=new Set(["$$slots","$$events","$$legacy"]);function il(D,a){let k=P(a,Lv),e=[["path",{d:"M7 7h10v10"}],["path",{d:"M7 17 17 7"}]];d(D,u({name:"arrow-up-right"},()=>k,{get iconNode(){return e}}))}var Xv=new Set(["$$slots","$$events","$$legacy"]);function xl(D,a){let k=P(a,Xv),e=[["path",{d:"M20 6 9 17l-5-5"}]];d(D,u({name:"check"},()=>k,{get iconNode(){return e}}))}var Fv=y("<span></span>");function b(D,a){let k=O(a,"variant",3,"text");var e=Fv();let T;S(()=>{fl(e,1,`skel ${k()??""}`,"svelte-tl058d"),T=cl(e,"",T,{width:a.width})}),h(D,e)}var Ov=y('<div class="hrow svelte-1hnopyv"><span><!></span> <span class="hlabel svelte-1hnopyv"> </span> <span class="hvalue svelte-1hnopyv"> </span></div>'),Tv=y('<div class="hrow svelte-1hnopyv"><span class="box idle svelte-1hnopyv"></span> <!> <!></div>'),Gv=y('<div class="hrow svelte-1hnopyv"><span class="box idle svelte-1hnopyv"></span> <span class="hlabel svelte-1hnopyv"> </span> <span class="hvalue svelte-1hnopyv">—</span></div>'),Jv=y('<div><div class="panel-bar">Health</div> <div class="health svelte-1hnopyv"><!></div> <div class="hfoot svelte-1hnopyv"> </div></div>');function Fl(D,a){Il(a,!0);let k=["Container running","Code-server reachable"],e=O(a,"health",3,null),T=O(a,"lastFetchedAt",3,null),R=O(a,"active",3,!0),G=O(a,"injectionChecks",3,0),tl=E(()=>{if(!e())return[];let C=(x)=>({ok:x,value:x?"OK":"—"});return[{label:k[0],...C(e().containerRunning)},{label:k[1],...C(e().codeServerAccessible)},...e().injections.map((x)=>({label:x.label,...C(x.ok)}))]});function Ml(){return e()?v(tl).length:k.length+G()}let U=j(gl(Date.now()));el(()=>{let C=setInterval(()=>m(U,Date.now(),!0),1000);return()=>clearInterval(C)});let V=E(()=>{if(!R()&&!e())return"Container not running";if(!T())return"Waiting for first check…";return`Updated ${Math.max(0,Math.round((v(U)-T())/1000))}s ago`});var K=Jv();let r;var J=t(f(K),2),$=f(J);{var kl=(C)=>{var x=q(),Y=A(x);o(Y,17,()=>v(tl),(H)=>H.label,(H,L)=>{var N=Ov(),w=f(N),B=f(w);{var n=(Z)=>{xl(Z,{size:12,strokeWidth:3})},ll=(Z)=>{Pl(Z,{size:12,strokeWidth:3})};M(B,(Z)=>{if(v(L).ok)Z(n);else Z(ll,-1)})}i(w);var vl=t(w,2),jl=f(vl,!0);i(vl);var hl=t(vl,2),zl=f(hl,!0);i(hl),i(N),S(()=>{fl(w,1,`box ${v(L).ok?"ok":"bad"}`,"svelte-1hnopyv"),I(jl,v(L).label),I(zl,v(L).value)}),h(H,N)}),h(C,x)},wl=(C)=>{var x=q(),Y=A(x);o(Y,17,()=>Array(Ml()),Rl,(H,L)=>{var N=Tv(),w=t(f(N),2);b(w,{width:"120px"});var B=t(w,2);b(B,{variant:"pill"}),i(N),h(H,N)}),h(C,x)},Wl=(C)=>{var x=q(),Y=A(x);o(Y,16,()=>k,(H)=>H,(H,L)=>{var N=Gv(),w=t(f(N),2),B=f(w,!0);i(w),g(2),i(N),S(()=>I(B,L)),h(H,N)}),h(C,x)};M($,(C)=>{if(e())C(kl);else if(R())C(wl,1);else C(Wl,-1)})}i(J);var Q=t(J,2),_=f(Q,!0);i(Q),i(K),S(()=>{r=fl(K,1,"healthwrap panel svelte-1hnopyv",null,r,{dim:!R()&&!e()}),I(_,v(V))}),h(D,K),Sl()}var Qv=y('<form method="POST" action="?/restart" class="svelte-15fxkvm"><button class="restart svelte-15fxkvm" type="submit"> </button></form> <a class="open svelte-15fxkvm" target="_blank" rel="noopener">Open in new tab <!></a>',1),Yv=y('<p class="restart-err svelte-15fxkvm"> </p>'),ul=y('<code class="svelte-15fxkvm"> </code>'),Zv=y('<code class="svelte-15fxkvm">local (project devcontainer.json)</code>'),bv=y('<code class="muted svelte-15fxkvm">—</code>'),Av=y('<button class="rebuild svelte-15fxkvm"> </button>'),Ev=y('<li class="svelte-15fxkvm"><span class="cp svelte-15fxkvm"> </span> <span class="arr svelte-15fxkvm">→</span> <a target="_blank" rel="noopener" class="svelte-15fxkvm"> <!></a> <button class="rm svelte-15fxkvm" title="Remove">×</button></li>'),Uv=y('<ul class="port-list svelte-15fxkvm"></ul>'),Vv=y('<p class="empty svelte-15fxkvm">No ports forwarded yet.</p>'),Bv=y('<p class="port-err svelte-15fxkvm"> </p>'),cv=y('<p class="hint pending svelte-15fxkvm">Port changes apply when you <strong class="svelte-15fxkvm">Restart</strong> (recreates the container).</p>'),gv=y('<div class="err svelte-15fxkvm"> </div>'),Rv=y('<header class="topbar svelte-15fxkvm"><a class="back svelte-15fxkvm" href="/"><!> All instances</a> <div class="title svelte-15fxkvm"><span class="name svelte-15fxkvm"> </span> <!></div> <!></header> <!> <main class="stage svelte-15fxkvm"><div class="meta svelte-15fxkvm"><span class="k svelte-15fxkvm">Source</span> <!> <span class="k svelte-15fxkvm">Image</span> <!></div> <div class="healthslot svelte-15fxkvm"><!></div> <section class="ports panel svelte-15fxkvm"><div class="ports-bar panel-bar svelte-15fxkvm"><span class="svelte-15fxkvm">Forwarded ports</span> <!></div> <div class="ports-body svelte-15fxkvm"><!> <form class="add svelte-15fxkvm"><input type="number" min="1" max="65535" placeholder="container port (e.g. 3000)" spellcheck="false" class="svelte-15fxkvm"/> <button type="submit" class="svelte-15fxkvm">Add</button></form> <!> <!> <p class="hint svelte-15fxkvm">Your app must bind to <code class="svelte-15fxkvm">0.0.0.0</code> inside the container to be reachable.</p></div></section> <div class="logwrap panel svelte-15fxkvm"><div class="log-bar panel-bar svelte-15fxkvm"><span class="svelte-15fxkvm">Boot log</span> <button class="copy svelte-15fxkvm"> </button></div> <div class="logs svelte-15fxkvm"><pre class="svelte-15fxkvm"> <span class="caret svelte-15fxkvm"></span></pre></div> <!></div></main>',1);function Jl(D,a){Il(a,!0);let k=O(a,"injectionChecks",3,0),e=j(null),T=j(null),R=j(null),G=j("");function tl(l){l.scrollTop=l.scrollHeight}el(()=>vv(`/api/instances/${a.id}/logs`,(l)=>m(G,v(G)+l),()=>m(G,""))),el(()=>sv((l)=>{if(l.type==="instances"){let s=l.data.find((p)=>p.id===a.id);if(s)m(e,s,!0)}else if(l.type==="health"&&l.data.id===a.id)m(T,l.data.health,!0),m(R,Date.now(),!0)}));let Ml=E(()=>v(e)?_l(v(e)):"#"),U=j(""),V=j(null),K=j(!1),r=E(()=>v(e)?.forwarded_ports??[]),J=E(()=>v(e)?.status==="creating");async function $(l){m(V,null);try{return await l(),!0}catch(s){return m(V,s.message,!0),!1}}async function kl(l){l.preventDefault();let s=Number.parseInt(v(U),10);if(!Number.isInteger(s)||s<1||s>65535){m(V,"Enter a port number between 1 and 65535");return}if(await $(()=>Gl(`/api/instances/${a.id}/ports`,{port:s})))m(U,""),m(K,!0)}async function wl(l){if(await $(()=>nl(`/api/instances/${a.id}/ports/${l}`)))m(K,!0)}async function Wl(){if(await $(()=>Gl(`/api/instances/${a.id}/rebuild`)))m(K,!1)}let Q=j(null),_=j(!1),C={onPending:(l)=>m(_,l,!0),submit:()=>{return m(Q,null),({result:l})=>{if(l.type==="failure")m(Q,l.data?.error??"Restart failed",!0);else if(l.type==="error")m(Q,"Network error. Try again.")}}},x=j(!1),Y;async function H(){await navigator.clipboard.writeText(v(G)),m(x,!0),clearTimeout(Y),Y=setTimeout(()=>m(x,!1),2000)}var L=Rv(),N=A(L),w=f(N),B=f(w);Cl(B,{size:15}),g(),i(w);var n=t(w,2),ll=f(n),vl=f(ll,!0);i(ll);var jl=t(ll,2);{var hl=(l)=>{lv(l,{get status(){return v(e).status}})},zl=(l)=>{b(l,{variant:"pill"})};M(jl,(l)=>{if(v(e))l(hl);else l(zl,-1)})}i(n);var Z=t(n,2);{var fv=(l)=>{var s=Qv(),p=A(s),X=f(p),c=f(X,!0);i(X),i(p),Ol(p,()=>$l(C));var F=t(p,2),W=t(f(F));il(W,{size:15}),i(F),S(()=>{X.disabled=v(_)||v(J),I(c,v(_)||v(J)?"Restarting…":"Restart container"),Tl(F,"href",v(Ml))}),h(l,s)};M(Z,(l)=>{if(v(e)?.status==="running")l(fv)})}i(N);var Ql=t(N,2);{var ev=(l)=>{var s=Yv(),p=f(s,!0);i(s),S(()=>I(p,v(Q))),h(l,s)};M(Ql,(l)=>{if(v(Q))l(ev)})}var Yl=t(Ql,2),Dl=f(Yl),Zl=t(f(Dl),2);{var tv=(l)=>{var s=ul(),p=f(s,!0);i(s),S(()=>I(p,v(e).source_path)),h(l,s)},hv=(l)=>{b(l,{variant:"wide"})};M(Zl,(l)=>{if(v(e))l(tv);else l(hv,-1)})}var av=t(Zl,4);{var pv=(l)=>{var s=q(),p=A(s);{var X=(W)=>{var z=Zv();h(W,z)},c=(W)=>{var z=ul(),yl=f(z,!0);i(z),S(()=>I(yl,v(e).image_source)),h(W,z)},F=(W)=>{var z=bv();h(W,z)};M(p,(W)=>{if(v(e).image_source==="local")W(X);else if(v(e).image_source)W(c,1);else W(F,-1)})}h(l,s)},mv=(l)=>{b(l,{variant:"wide"})};M(av,(l)=>{if(v(e))l(pv);else l(mv,-1)})}i(Dl);var Hl=t(Dl,2),yv=f(Hl);{let l=E(()=>!v(e)||v(e).status==="running");Fl(yv,{get health(){return v(T)},get lastFetchedAt(){return v(R)},get injectionChecks(){return k()},get active(){return v(l)}})}i(Hl);var Kl=t(Hl,2),Ll=f(Kl),Cv=t(f(Ll),2);{var xv=(l)=>{var s=Av(),p=f(s,!0);i(s),S(()=>{s.disabled=v(J),I(p,v(J)?"Restarting…":"Restart to apply")}),Nl("click",s,Wl),h(l,s)};M(Cv,(l)=>{if(v(K))l(xv)})}i(Ll);var bl=t(Ll,2),Al=f(bl);{var Iv=(l)=>{var s=Uv();o(s,21,()=>v(r),(p)=>p.container_port,(p,X)=>{var c=Ev(),F=f(c),W=f(F);i(F);var z=t(F,4),yl=f(z),Dv=t(yl);il(Dv,{size:12}),i(z);var Hv=t(z,2);i(c),S(()=>{I(W,`:${v(X).container_port??""}`),Tl(z,"href",`http://localhost:${v(X).host_port}`),I(yl,`localhost:${v(X).host_port??""} `)}),Nl("click",Hv,()=>wl(v(X).container_port)),h(p,c)}),i(s),h(l,s)},Sv=(l)=>{var s=Vv();h(l,s)};M(Al,(l)=>{if(v(r).length)l(Iv);else l(Sv,-1)})}var al=t(Al,2),El=f(al);ol(El),g(2),i(al);var Ul=t(al,2);{var Nv=(l)=>{var s=Bv(),p=f(s,!0);i(s),S(()=>I(p,v(V))),h(l,s)};M(Ul,(l)=>{if(v(V))l(Nv)})}var Mv=t(Ul,2);{var kv=(l)=>{var s=cv();h(l,s)};M(Mv,(l)=>{if(v(K))l(kv)})}g(2),i(bl),i(Kl);var Vl=t(Kl,2),Xl=f(Vl),pl=t(f(Xl),2),wv=f(pl,!0);i(pl),i(Xl);var ml=t(Xl,2),Bl=f(ml),Wv=f(Bl,!0);g(),i(Bl),i(ml),Ol(ml,()=>tl);var jv=t(ml,2);{var zv=(l)=>{var s=gv(),p=f(s,!0);i(s),S(()=>I(p,v(e).error)),h(l,s)};M(jv,(l)=>{if(v(e)?.status==="error"&&v(e).error)l(zv)})}i(Vl),i(Yl),S(()=>{I(vl,v(e)?.name??"Instance"),pl.disabled=!v(G),I(wv,v(x)?"Copied!":"Copy logs"),I(Wv,v(G)||"Waiting for output…")}),dl("submit",al,kl),rl(El,()=>v(U),(l)=>m(U,l)),Nl("click",pl,H),h(D,L),Sl()}ql(["click"]);iv("InstanceView_2ma45l9bybfhl",Jl);
|