codebay 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.mochi/manifest.json +778 -646
- package/.mochi/svelte-client/HydratableIsland-6y9p903x.js +1 -0
- package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-nv6yzk0x.js +2 -0
- package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-ry83ck8a.js +14 -0
- package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-vjt4jscf.js +3 -0
- package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-1jdrk8x6.js +48 -0
- package/.mochi/svelte-client/{chunk-spk1b2r4.js → chunk-0vqvn81s.js} +1 -1
- package/.mochi/svelte-client/chunk-2dc6352a.js +1 -0
- package/.mochi/svelte-client/chunk-3cxaw5hr.js +2 -0
- package/.mochi/svelte-client/chunk-3jqc40sp.js +2 -0
- package/.mochi/svelte-client/chunk-3pgw6t5j.js +4 -0
- package/.mochi/svelte-client/chunk-7g3xt6ez.js +2 -0
- package/.mochi/svelte-client/chunk-b5s3mpg0.js +1 -0
- package/.mochi/svelte-client/chunk-bhseezf3.js +2 -0
- package/.mochi/svelte-client/chunk-bhwkq8er.js +1 -0
- package/.mochi/svelte-client/chunk-jm3ge348.js +1 -0
- package/.mochi/svelte-client/{chunk-0mc09cyb.js → chunk-sxcr9gzp.js} +1 -1
- package/.mochi/svelte-client/{chunk-ccfh8hxz.js → chunk-tss2473w.js} +1 -1
- package/.mochi/svelte-compile/{App-94xsdn0w.server.js → App-8mpgrxza.server.js} +470 -271
- package/.mochi/svelte-compile/{Avatars-fnccw47h.server.js → Avatars-y5nf6q25.server.js} +111 -110
- package/.mochi/svelte-compile/{DefaultError-je52k17d.server.js → DefaultError-rrjye0s2.server.js} +1 -2
- package/.mochi/svelte-compile/Instance-3sbzyp0g.server.js +695 -0
- package/.mochi/svelte-compile/{Settings-a7b11v90.server.js → Settings-ysvh5vhh.server.js} +838 -607
- package/.mochi/svelte-compile/chunk-7zaw9t5a.js +25 -0
- package/.mochi/svelte-compile/chunk-878xcmp4.js +65 -0
- package/.mochi/svelte-compile/chunk-d2z3qxxe.js +28 -0
- package/.mochi/svelte-compile/{chunk-60mpagr9.js → chunk-gnf5cnct.js} +661 -22
- package/.mochi/svelte-compile/{chunk-w0hca7va.js → chunk-jq7jj8jd.js} +18 -2
- package/.mochi/svelte-compile/chunk-vr0e32mv.js +24 -0
- package/.mochi/svelte-compile/{chunk-apdte4nh.js → chunk-xmygdsj4.js} +35 -612
- package/.mochi/svelte-compile/{chunk-pqb403fh.js → chunk-zk4a9zms.js} +28 -31
- package/.mochi/svelte-css/AgentLogBox-38adby5iygny7.css +1 -0
- package/.mochi/svelte-css/DropZone-1zeitd761uwyd.css +1 -0
- package/.mochi/svelte-css/IdeBar-d3un7kuigxc5.css +1 -0
- package/.mochi/svelte-css/{InstanceCard-25z7nas7y98zk.css → InstanceCard-3vxozrp9uoads.css} +1 -1
- package/.mochi/svelte-css/InstanceView-3ucotech5097w.css +1 -0
- package/.mochi/svelte-css/{SettingsView-bccw34agd2bj.css → SettingsView-2400myxb9ot56.css} +1 -1
- package/README.md +43 -3
- package/migrations/0009_agent_runs.sql +24 -0
- package/migrations/0010_agent_run_model.sql +2 -0
- package/migrations/0011_agent_run_rejected_structured_output.sql +2 -0
- package/package.json +13 -9
- package/src/__fixtures__/IdeBarStrip.svelte +41 -0
- package/src/avatars/dog.ts +1 -1
- package/src/avatars/lightning.ts +8 -9
- package/src/avatars/rocket.ts +4 -5
- package/src/components/AgentLogBox.svelte +458 -0
- package/src/components/AppShell.svelte +112 -1
- package/src/components/DropZone.svelte +77 -0
- package/src/components/FolderBrowser.svelte +13 -5
- package/src/components/HealthBox.svelte +6 -5
- package/src/components/IdeBar.svelte +222 -76
- package/src/components/InstanceCard.svelte +38 -0
- package/src/components/InstanceView.svelte +83 -2
- package/src/components/SettingsView.svelte +273 -0
- package/src/components/TerminalPane.svelte +54 -0
- package/src/components/UiShowcase.svelte +23 -3
- package/src/container-injections/claude-code-install.ts +1 -1
- package/src/container-injections/claude-history.ts +52 -0
- package/src/container-injections/claude-statusline.ts +4 -1
- package/src/container-injections/github-credentials.ts +12 -1
- package/src/container-injections/tmux.ts +6 -2
- package/src/index.ts +35 -7
- package/src/lib/agent-run-stream.ts +286 -0
- package/src/lib/agent-runs.server.ts +735 -0
- package/src/lib/auth.server.ts +11 -2
- package/src/lib/build-freshness.server.ts +71 -0
- package/src/lib/config.server.ts +36 -7
- package/src/lib/container-files.server.ts +1 -1
- package/src/lib/data-dir-lock.server.ts +78 -0
- package/src/lib/db.server.ts +124 -1
- package/src/lib/devcontainer.server.ts +93 -16
- package/src/lib/docker-client.server.ts +11 -5
- package/src/lib/drives.ts +11 -0
- package/src/lib/exec.server.ts +66 -5
- package/src/lib/injections.server.ts +5 -1
- package/src/lib/instances.server.ts +66 -7
- package/src/lib/log-capture.server.ts +63 -23
- package/src/lib/mcp-auth.server.ts +52 -0
- package/src/lib/osc52.ts +18 -0
- package/src/lib/picker.server.ts +23 -2
- package/src/lib/sandbox-ops.server.ts +263 -0
- package/src/lib/upload.ts +32 -0
- package/src/lib/uploads.server.ts +164 -0
- package/src/mcp/routes.server.ts +25 -0
- package/src/mcp/server.server.ts +55 -0
- package/src/mcp/tools.server.ts +660 -0
- package/src/pages/Instance.svelte +6 -2
- package/src/pages/Settings.svelte +15 -0
- package/src/routes.ts +79 -3
- package/src/types.ts +17 -0
- package/.mochi/svelte-client/HydratableIsland-zrdsrsmg.js +0 -1
- package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-v7y7dh53.js +0 -2
- package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-tmwd6fpb.js +0 -14
- package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-m7t64dbh.js +0 -1
- package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-4a7ann1f.js +0 -40
- package/.mochi/svelte-client/chunk-5jwfs4p9.js +0 -2
- package/.mochi/svelte-client/chunk-6qg4q98a.js +0 -2
- package/.mochi/svelte-client/chunk-phf7v5jj.js +0 -4
- package/.mochi/svelte-client/chunk-tmeh70wg.js +0 -2
- package/.mochi/svelte-client/chunk-vs1yjbqt.js +0 -2
- package/.mochi/svelte-client/chunk-x0m3k0rn.js +0 -1
- package/.mochi/svelte-client/chunk-y7f4jbdm.js +0 -2
- package/.mochi/svelte-compile/Instance-knnkcn2p.server.js +0 -377
- package/.mochi/svelte-compile/chunk-ed46m58e.js +0 -22
- package/.mochi/svelte-compile/chunk-jx6h1xzp.js +0 -20
- package/.mochi/svelte-css/IdeBar-1mtgemqfuvqzi.css +0 -1
- package/.mochi/svelte-css/InstanceView-32j12hyg8v9u0.css +0 -1
|
@@ -1,377 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import {
|
|
3
|
-
StatusBadge,
|
|
4
|
-
forwardedPortUrl
|
|
5
|
-
} from "./chunk-ed46m58e.js";
|
|
6
|
-
import {
|
|
7
|
-
apiDelete,
|
|
8
|
-
apiPost,
|
|
9
|
-
ideUrl
|
|
10
|
-
} from "./chunk-w0hca7va.js";
|
|
11
|
-
import {
|
|
12
|
-
HydratableBoundary,
|
|
13
|
-
Icon,
|
|
14
|
-
X,
|
|
15
|
-
emitIslandProps
|
|
16
|
-
} from "./chunk-60mpagr9.js";
|
|
17
|
-
import"./chunk-xpt1a7jm.js";
|
|
18
|
-
|
|
19
|
-
// src/pages/Instance.svelte
|
|
20
|
-
import"svelte/internal/flags/async";
|
|
21
|
-
import * as $7 from "svelte/internal/server";
|
|
22
|
-
|
|
23
|
-
// src/components/InstanceView.svelte
|
|
24
|
-
import"svelte/internal/flags/async";
|
|
25
|
-
import * as $6 from "svelte/internal/server";
|
|
26
|
-
|
|
27
|
-
// node_modules/@lucide/svelte/dist/icons/arrow-left.svelte
|
|
28
|
-
import"svelte/internal/flags/async";
|
|
29
|
-
import * as $ from "svelte/internal/server";
|
|
30
|
-
function Arrow_left($$renderer, $$props) {
|
|
31
|
-
let { $$slots, $$events, ...props } = $$props;
|
|
32
|
-
const iconNode = [
|
|
33
|
-
["path", { d: "m12 19-7-7 7-7" }],
|
|
34
|
-
["path", { d: "M19 12H5" }]
|
|
35
|
-
];
|
|
36
|
-
Icon($$renderer, $.spread_props([{ name: "arrow-left" }, props, { iconNode }]));
|
|
37
|
-
}
|
|
38
|
-
// node_modules/@lucide/svelte/dist/icons/arrow-up-right.svelte
|
|
39
|
-
import"svelte/internal/flags/async";
|
|
40
|
-
import * as $2 from "svelte/internal/server";
|
|
41
|
-
function Arrow_up_right($$renderer, $$props) {
|
|
42
|
-
let { $$slots, $$events, ...props } = $$props;
|
|
43
|
-
const iconNode = [["path", { d: "M7 7h10v10" }], ["path", { d: "M7 17 17 7" }]];
|
|
44
|
-
Icon($$renderer, $2.spread_props([{ name: "arrow-up-right" }, props, { iconNode }]));
|
|
45
|
-
}
|
|
46
|
-
// src/components/HealthBox.svelte
|
|
47
|
-
import"svelte/internal/flags/async";
|
|
48
|
-
import * as $5 from "svelte/internal/server";
|
|
49
|
-
|
|
50
|
-
// node_modules/@lucide/svelte/dist/icons/check.svelte
|
|
51
|
-
import"svelte/internal/flags/async";
|
|
52
|
-
import * as $3 from "svelte/internal/server";
|
|
53
|
-
function Check($$renderer, $$props) {
|
|
54
|
-
let { $$slots, $$events, ...props } = $$props;
|
|
55
|
-
const iconNode = [["path", { d: "M20 6 9 17l-5-5" }]];
|
|
56
|
-
Icon($$renderer, $3.spread_props([{ name: "check" }, props, { iconNode }]));
|
|
57
|
-
}
|
|
58
|
-
// src/components/Skeleton.svelte
|
|
59
|
-
import"svelte/internal/flags/async";
|
|
60
|
-
import * as $4 from "svelte/internal/server";
|
|
61
|
-
function Skeleton($$renderer, $$props) {
|
|
62
|
-
let { variant = "text", width } = $$props;
|
|
63
|
-
$$renderer.push(`<span${$4.attr_class(`skel ${$4.stringify(variant)}`, "svelte-tl058d")}${$4.attr_style("", { width })}></span>`);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// src/components/HealthBox.svelte
|
|
67
|
-
function HealthBox($$renderer, $$props) {
|
|
68
|
-
$$renderer.component(($$renderer2) => {
|
|
69
|
-
let {
|
|
70
|
-
health = null,
|
|
71
|
-
lastFetchedAt = null,
|
|
72
|
-
active = true,
|
|
73
|
-
injectionChecks = 0,
|
|
74
|
-
mode = "ide"
|
|
75
|
-
} = $$props;
|
|
76
|
-
const FIXED_CHECKS = $5.derived(() => [
|
|
77
|
-
"Container running",
|
|
78
|
-
mode === "terminal" ? "Terminal reachable" : "Code-server reachable"
|
|
79
|
-
]);
|
|
80
|
-
const checks = $5.derived(() => {
|
|
81
|
-
if (!health)
|
|
82
|
-
return [];
|
|
83
|
-
const v = (ok) => ({ ok, value: ok ? "OK" : "\u2014" });
|
|
84
|
-
return [
|
|
85
|
-
{ label: FIXED_CHECKS()[0], ...v(health.containerRunning) },
|
|
86
|
-
{ label: FIXED_CHECKS()[1], ...v(health.codeServerAccessible) },
|
|
87
|
-
...health.injections.map((i) => ({ label: i.label, ...v(i.ok) }))
|
|
88
|
-
];
|
|
89
|
-
});
|
|
90
|
-
function getNumberOfChecks() {
|
|
91
|
-
return health ? checks().length : FIXED_CHECKS().length + injectionChecks;
|
|
92
|
-
}
|
|
93
|
-
let now = Date.now();
|
|
94
|
-
const agoLabel = $5.derived(() => {
|
|
95
|
-
if (!active && !health)
|
|
96
|
-
return "Container not running";
|
|
97
|
-
if (!lastFetchedAt)
|
|
98
|
-
return "Waiting for first check\u2026";
|
|
99
|
-
const secs = Math.max(0, Math.round((now - lastFetchedAt) / 1000));
|
|
100
|
-
return `Updated ${secs}s ago`;
|
|
101
|
-
});
|
|
102
|
-
$$renderer2.push(`<div${$5.attr_class("healthwrap panel svelte-1hnopyv", undefined, { dim: !active && !health })}><div class="panel-bar">Health</div> <div class="health svelte-1hnopyv">`);
|
|
103
|
-
if (health) {
|
|
104
|
-
$$renderer2.push("<!--[0-->");
|
|
105
|
-
$$renderer2.push(`<!--[-->`);
|
|
106
|
-
const each_array = $5.ensure_array_like(checks());
|
|
107
|
-
for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
|
|
108
|
-
let check = each_array[$$index];
|
|
109
|
-
$$renderer2.push(`<div class="hrow svelte-1hnopyv"><span${$5.attr_class(`box ${check.ok ? "ok" : "bad"}`, "svelte-1hnopyv")}>`);
|
|
110
|
-
if (check.ok) {
|
|
111
|
-
$$renderer2.push("<!--[0-->");
|
|
112
|
-
Check($$renderer2, { size: 12, strokeWidth: 3 });
|
|
113
|
-
} else {
|
|
114
|
-
$$renderer2.push("<!--[-1-->");
|
|
115
|
-
X($$renderer2, { size: 12, strokeWidth: 3 });
|
|
116
|
-
}
|
|
117
|
-
$$renderer2.push(`<!--]--></span> <span class="hlabel svelte-1hnopyv">${$5.escape(check.label)}</span> <span class="hvalue svelte-1hnopyv">${$5.escape(check.value)}</span></div>`);
|
|
118
|
-
}
|
|
119
|
-
$$renderer2.push(`<!--]-->`);
|
|
120
|
-
} else if (active) {
|
|
121
|
-
$$renderer2.push("<!--[1-->");
|
|
122
|
-
$$renderer2.push(`<!--[-->`);
|
|
123
|
-
const each_array_1 = $5.ensure_array_like(Array(getNumberOfChecks()));
|
|
124
|
-
for (let i = 0, $$length = each_array_1.length;i < $$length; i++) {
|
|
125
|
-
let _ = each_array_1[i];
|
|
126
|
-
$$renderer2.push(`<div class="hrow svelte-1hnopyv"><span class="box idle svelte-1hnopyv"></span> `);
|
|
127
|
-
Skeleton($$renderer2, { width: "120px" });
|
|
128
|
-
$$renderer2.push(`<!----> `);
|
|
129
|
-
Skeleton($$renderer2, { variant: "pill" });
|
|
130
|
-
$$renderer2.push(`<!----></div>`);
|
|
131
|
-
}
|
|
132
|
-
$$renderer2.push(`<!--]-->`);
|
|
133
|
-
} else {
|
|
134
|
-
$$renderer2.push("<!--[-1-->");
|
|
135
|
-
$$renderer2.push(`<!--[-->`);
|
|
136
|
-
const each_array_2 = $5.ensure_array_like(FIXED_CHECKS());
|
|
137
|
-
for (let $$index_2 = 0, $$length = each_array_2.length;$$index_2 < $$length; $$index_2++) {
|
|
138
|
-
let label = each_array_2[$$index_2];
|
|
139
|
-
$$renderer2.push(`<div class="hrow svelte-1hnopyv"><span class="box idle svelte-1hnopyv"></span> <span class="hlabel svelte-1hnopyv">${$5.escape(label)}</span> <span class="hvalue svelte-1hnopyv">\u2014</span></div>`);
|
|
140
|
-
}
|
|
141
|
-
$$renderer2.push(`<!--]-->`);
|
|
142
|
-
}
|
|
143
|
-
$$renderer2.push(`<!--]--></div> <div class="hfoot svelte-1hnopyv">${$5.escape(agoLabel())}</div></div>`);
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// src/components/InstanceView.svelte
|
|
148
|
-
import { tick } from "svelte";
|
|
149
|
-
function InstanceView($$renderer, $$props) {
|
|
150
|
-
$$renderer.component(($$renderer2) => {
|
|
151
|
-
let { id, injectionChecks = 0 } = $$props;
|
|
152
|
-
let instance = null;
|
|
153
|
-
let health = null;
|
|
154
|
-
let lastFetchedAt = null;
|
|
155
|
-
let logs = "";
|
|
156
|
-
let logEl = null;
|
|
157
|
-
let following = true;
|
|
158
|
-
async function scrollToBottom() {
|
|
159
|
-
await tick();
|
|
160
|
-
logEl?.scrollTo(0, logEl.scrollHeight);
|
|
161
|
-
}
|
|
162
|
-
function toggleFollow() {
|
|
163
|
-
following = !following;
|
|
164
|
-
if (following)
|
|
165
|
-
scrollToBottom();
|
|
166
|
-
}
|
|
167
|
-
const url = $6.derived(() => instance ? ideUrl(instance) : "#");
|
|
168
|
-
let newPort = "";
|
|
169
|
-
let portError = null;
|
|
170
|
-
let pendingRebuild = false;
|
|
171
|
-
const forwards = $6.derived(() => instance?.forwarded_ports ?? []);
|
|
172
|
-
const building = $6.derived(() => instance?.status === "creating");
|
|
173
|
-
async function portAction(run) {
|
|
174
|
-
portError = null;
|
|
175
|
-
try {
|
|
176
|
-
await run();
|
|
177
|
-
return true;
|
|
178
|
-
} catch (err) {
|
|
179
|
-
portError = err.message;
|
|
180
|
-
return false;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
async function addPort(e) {
|
|
184
|
-
e.preventDefault();
|
|
185
|
-
const port = Number.parseInt(newPort, 10);
|
|
186
|
-
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
187
|
-
portError = "Enter a port number between 1 and 65535";
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
const ok = await portAction(() => apiPost(`/api/instances/${id}/ports`, { port }));
|
|
191
|
-
if (ok) {
|
|
192
|
-
newPort = "";
|
|
193
|
-
pendingRebuild = true;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
async function removePort(port) {
|
|
197
|
-
const ok = await portAction(() => apiDelete(`/api/instances/${id}/ports/${port}`));
|
|
198
|
-
if (ok)
|
|
199
|
-
pendingRebuild = true;
|
|
200
|
-
}
|
|
201
|
-
async function restart() {
|
|
202
|
-
const ok = await portAction(() => apiPost(`/api/instances/${id}/rebuild`));
|
|
203
|
-
if (ok)
|
|
204
|
-
pendingRebuild = false;
|
|
205
|
-
}
|
|
206
|
-
let restartError = null;
|
|
207
|
-
let restarting = false;
|
|
208
|
-
const restartOpts = {
|
|
209
|
-
onPending: (v) => restarting = v,
|
|
210
|
-
submit: () => {
|
|
211
|
-
restartError = null;
|
|
212
|
-
return ({ result }) => {
|
|
213
|
-
if (result.type === "failure") {
|
|
214
|
-
restartError = result.data?.error ?? "Restart failed";
|
|
215
|
-
} else if (result.type === "error") {
|
|
216
|
-
restartError = "Network error. Try again.";
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
};
|
|
221
|
-
let copied = false;
|
|
222
|
-
let copyTimer;
|
|
223
|
-
async function copyLogs() {
|
|
224
|
-
await navigator.clipboard.writeText(logs);
|
|
225
|
-
copied = true;
|
|
226
|
-
clearTimeout(copyTimer);
|
|
227
|
-
copyTimer = setTimeout(() => copied = false, 2000);
|
|
228
|
-
}
|
|
229
|
-
$$renderer2.push(`<header class="topbar svelte-15fxkvm"><a class="back svelte-15fxkvm" href="/">`);
|
|
230
|
-
Arrow_left($$renderer2, { size: 15 });
|
|
231
|
-
$$renderer2.push(`<!----> All instances</a> <div class="title svelte-15fxkvm"><span class="name svelte-15fxkvm">${$6.escape(instance?.name ?? "Instance")}</span> `);
|
|
232
|
-
if (instance) {
|
|
233
|
-
$$renderer2.push("<!--[0-->");
|
|
234
|
-
StatusBadge($$renderer2, { status: instance.status });
|
|
235
|
-
} else {
|
|
236
|
-
$$renderer2.push("<!--[-1-->");
|
|
237
|
-
Skeleton($$renderer2, { variant: "pill" });
|
|
238
|
-
}
|
|
239
|
-
$$renderer2.push(`<!--]--></div> `);
|
|
240
|
-
if (instance?.status === "running") {
|
|
241
|
-
$$renderer2.push("<!--[0-->");
|
|
242
|
-
$$renderer2.push(`<form method="POST" action="?/restart" class="svelte-15fxkvm"><button class="restart svelte-15fxkvm" type="submit"${$6.attr("disabled", restarting || building(), true)}>${$6.escape(restarting || building() ? "Restarting\u2026" : "Restart container")}</button></form> <a class="open svelte-15fxkvm"${$6.attr("href", url())} target="_blank" rel="noopener">Open in new tab `);
|
|
243
|
-
Arrow_up_right($$renderer2, { size: 15 });
|
|
244
|
-
$$renderer2.push(`<!----></a>`);
|
|
245
|
-
} else {
|
|
246
|
-
$$renderer2.push("<!--[-1-->");
|
|
247
|
-
}
|
|
248
|
-
$$renderer2.push(`<!--]--></header> `);
|
|
249
|
-
if (restartError) {
|
|
250
|
-
$$renderer2.push("<!--[0-->");
|
|
251
|
-
$$renderer2.push(`<p class="restart-err svelte-15fxkvm">${$6.escape(restartError)}</p>`);
|
|
252
|
-
} else {
|
|
253
|
-
$$renderer2.push("<!--[-1-->");
|
|
254
|
-
}
|
|
255
|
-
$$renderer2.push(`<!--]--> <main class="stage svelte-15fxkvm"><div class="meta svelte-15fxkvm"><span class="k svelte-15fxkvm">Source</span> `);
|
|
256
|
-
if (instance) {
|
|
257
|
-
$$renderer2.push("<!--[0-->");
|
|
258
|
-
$$renderer2.push(`<code class="svelte-15fxkvm">${$6.escape(instance.source_path)}</code>`);
|
|
259
|
-
} else {
|
|
260
|
-
$$renderer2.push("<!--[-1-->");
|
|
261
|
-
Skeleton($$renderer2, { variant: "wide" });
|
|
262
|
-
}
|
|
263
|
-
$$renderer2.push(`<!--]--> <span class="k svelte-15fxkvm">Image</span> `);
|
|
264
|
-
if (instance) {
|
|
265
|
-
$$renderer2.push("<!--[0-->");
|
|
266
|
-
if (instance.image_source === "local") {
|
|
267
|
-
$$renderer2.push("<!--[0-->");
|
|
268
|
-
$$renderer2.push(`<code class="svelte-15fxkvm">local (project devcontainer.json)</code>`);
|
|
269
|
-
} else if (instance.image_source) {
|
|
270
|
-
$$renderer2.push("<!--[1-->");
|
|
271
|
-
$$renderer2.push(`<code class="svelte-15fxkvm">${$6.escape(instance.image_source)}</code>`);
|
|
272
|
-
} else {
|
|
273
|
-
$$renderer2.push("<!--[-1-->");
|
|
274
|
-
$$renderer2.push(`<code class="muted svelte-15fxkvm">\u2014</code>`);
|
|
275
|
-
}
|
|
276
|
-
$$renderer2.push(`<!--]-->`);
|
|
277
|
-
} else {
|
|
278
|
-
$$renderer2.push("<!--[-1-->");
|
|
279
|
-
Skeleton($$renderer2, { variant: "wide" });
|
|
280
|
-
}
|
|
281
|
-
$$renderer2.push(`<!--]--></div> <div class="healthslot svelte-15fxkvm">`);
|
|
282
|
-
HealthBox($$renderer2, {
|
|
283
|
-
health,
|
|
284
|
-
lastFetchedAt,
|
|
285
|
-
injectionChecks,
|
|
286
|
-
active: !instance || instance.status === "running",
|
|
287
|
-
mode: instance?.mode ?? "ide"
|
|
288
|
-
});
|
|
289
|
-
$$renderer2.push(`<!----></div> <section class="ports panel svelte-15fxkvm"><div class="ports-bar panel-bar svelte-15fxkvm"><span class="svelte-15fxkvm">Forwarded ports</span> `);
|
|
290
|
-
if (pendingRebuild) {
|
|
291
|
-
$$renderer2.push("<!--[0-->");
|
|
292
|
-
$$renderer2.push(`<button class="rebuild svelte-15fxkvm"${$6.attr("disabled", building(), true)}>${$6.escape(building() ? "Restarting\u2026" : "Restart to apply")}</button>`);
|
|
293
|
-
} else {
|
|
294
|
-
$$renderer2.push("<!--[-1-->");
|
|
295
|
-
}
|
|
296
|
-
$$renderer2.push(`<!--]--></div> <div class="ports-body svelte-15fxkvm">`);
|
|
297
|
-
if (forwards().length) {
|
|
298
|
-
$$renderer2.push("<!--[0-->");
|
|
299
|
-
$$renderer2.push(`<ul class="port-list svelte-15fxkvm"><!--[-->`);
|
|
300
|
-
const each_array = $6.ensure_array_like(forwards());
|
|
301
|
-
for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
|
|
302
|
-
let f = each_array[$$index];
|
|
303
|
-
$$renderer2.push(`<li class="svelte-15fxkvm"><span class="cp svelte-15fxkvm">:${$6.escape(f.container_port)}</span> <span class="arr svelte-15fxkvm">\u2192</span> <a${$6.attr("href", forwardedPortUrl(f.host_port))} target="_blank" rel="noopener" class="svelte-15fxkvm">${$6.escape(forwardedPortUrl(f.host_port).replace("http://", ""))} `);
|
|
304
|
-
Arrow_up_right($$renderer2, { size: 12 });
|
|
305
|
-
$$renderer2.push(`<!----></a> <button class="rm svelte-15fxkvm" title="Remove">\xD7</button></li>`);
|
|
306
|
-
}
|
|
307
|
-
$$renderer2.push(`<!--]--></ul>`);
|
|
308
|
-
} else {
|
|
309
|
-
$$renderer2.push("<!--[-1-->");
|
|
310
|
-
$$renderer2.push(`<p class="empty svelte-15fxkvm">No ports forwarded yet.</p>`);
|
|
311
|
-
}
|
|
312
|
-
$$renderer2.push(`<!--]--> <form class="add svelte-15fxkvm"><input type="number" min="1" max="65535" placeholder="container port (e.g. 3000)"${$6.attr("value", newPort)} spellcheck="false" class="svelte-15fxkvm"/> <button type="submit" class="svelte-15fxkvm">Add</button></form> `);
|
|
313
|
-
if (portError) {
|
|
314
|
-
$$renderer2.push("<!--[0-->");
|
|
315
|
-
$$renderer2.push(`<p class="port-err svelte-15fxkvm">${$6.escape(portError)}</p>`);
|
|
316
|
-
} else {
|
|
317
|
-
$$renderer2.push("<!--[-1-->");
|
|
318
|
-
}
|
|
319
|
-
$$renderer2.push(`<!--]--> `);
|
|
320
|
-
if (pendingRebuild) {
|
|
321
|
-
$$renderer2.push("<!--[0-->");
|
|
322
|
-
$$renderer2.push(`<p class="hint pending svelte-15fxkvm">Port changes apply when you <strong class="svelte-15fxkvm">Restart</strong> (recreates the container).</p>`);
|
|
323
|
-
} else {
|
|
324
|
-
$$renderer2.push("<!--[-1-->");
|
|
325
|
-
}
|
|
326
|
-
$$renderer2.push(`<!--]--> <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> <div class="log-actions svelte-15fxkvm"><button${$6.attr_class("copy svelte-15fxkvm", undefined, { active: following })}${$6.attr("aria-pressed", following)}${$6.attr("title", following ? "Following \u2014 click to pause" : "Paused \u2014 click to follow new output")}>`);
|
|
327
|
-
if (following) {
|
|
328
|
-
$$renderer2.push("<!--[0-->");
|
|
329
|
-
$$renderer2.push(`<span class="dot svelte-15fxkvm"></span>`);
|
|
330
|
-
} else {
|
|
331
|
-
$$renderer2.push("<!--[-1-->");
|
|
332
|
-
}
|
|
333
|
-
$$renderer2.push(`<!--]--> ${$6.escape(following ? "Following" : "Follow log")}</button> <button class="copy svelte-15fxkvm"${$6.attr("disabled", !logs, true)}>${$6.escape(copied ? "Copied!" : "Copy logs")}</button></div></div> <div class="logs svelte-15fxkvm"><pre class="svelte-15fxkvm">${$6.escape(logs || "Waiting for output\u2026")}<span class="caret svelte-15fxkvm"></span></pre></div> `);
|
|
334
|
-
if (instance?.status === "error" && instance.error) {
|
|
335
|
-
$$renderer2.push("<!--[0-->");
|
|
336
|
-
$$renderer2.push(`<div class="err svelte-15fxkvm">${$6.escape(instance.error)}</div>`);
|
|
337
|
-
} else {
|
|
338
|
-
$$renderer2.push("<!--[-1-->");
|
|
339
|
-
}
|
|
340
|
-
$$renderer2.push(`<!--]--></div></main>`);
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
// src/pages/Instance.svelte
|
|
345
|
-
function Instance($$renderer, $$props) {
|
|
346
|
-
$$renderer.component(($$renderer2) => {
|
|
347
|
-
let { id, injectionChecks } = $$props;
|
|
348
|
-
if (true) {
|
|
349
|
-
let failed = function($$renderer3, error) {
|
|
350
|
-
$$renderer3.push(`<mochi-island-failure data-component="InstanceView"${$7.attr("data-message", error.message)}></mochi-island-failure>`);
|
|
351
|
-
};
|
|
352
|
-
$$renderer2.push("<!--[0-->");
|
|
353
|
-
$$renderer2.boundary({ failed }, ($$renderer3) => {
|
|
354
|
-
$$renderer3.push(`<!--[-->`);
|
|
355
|
-
{
|
|
356
|
-
HydratableBoundary($$renderer3, {
|
|
357
|
-
children: ($$renderer4) => {
|
|
358
|
-
$$renderer4.push(`<mochi-hydratable-island component-name="InstanceView_2ma45l9bybfhl" component-url="__MOCHI_COMPONENT_URL__InstanceView_2ma45l9bybfhl__"${$7.attr("props-ref", emitIslandProps({ id, injectionChecks }))}>`);
|
|
359
|
-
$$renderer4.push(`<!--[-->`);
|
|
360
|
-
{
|
|
361
|
-
InstanceView($$renderer4, { id, injectionChecks });
|
|
362
|
-
}
|
|
363
|
-
$$renderer4.push(`<!--]-->`);
|
|
364
|
-
$$renderer4.push(`</mochi-hydratable-island>`);
|
|
365
|
-
},
|
|
366
|
-
$$slots: { default: true }
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
$$renderer3.push(`<!--]-->`);
|
|
370
|
-
});
|
|
371
|
-
}
|
|
372
|
-
$$renderer2.push(`<!--]-->`);
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
export {
|
|
376
|
-
Instance as default
|
|
377
|
-
};
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
// src/lib/links.ts
|
|
3
|
-
function forwardedPortUrl(hostPort) {
|
|
4
|
-
const host = typeof window === "undefined" ? "localhost" : window.location.hostname;
|
|
5
|
-
return `http://${host}:${hostPort}`;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
// src/components/StatusBadge.svelte
|
|
9
|
-
import"svelte/internal/flags/async";
|
|
10
|
-
import * as $ from "svelte/internal/server";
|
|
11
|
-
function StatusBadge($$renderer, $$props) {
|
|
12
|
-
let { status } = $$props;
|
|
13
|
-
const label = {
|
|
14
|
-
creating: "Booting\u2026",
|
|
15
|
-
running: "Running",
|
|
16
|
-
stopped: "Stopped",
|
|
17
|
-
error: "Error"
|
|
18
|
-
};
|
|
19
|
-
$$renderer.push(`<span${$.attr_class(`status ${$.stringify(status)}`, "svelte-1hqr9xd")}>${$.escape(label[status])}</span>`);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export { forwardedPortUrl, StatusBadge };
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import {
|
|
3
|
-
Icon
|
|
4
|
-
} from "./chunk-60mpagr9.js";
|
|
5
|
-
|
|
6
|
-
// node_modules/@lucide/svelte/dist/icons/rotate-ccw.svelte
|
|
7
|
-
import"svelte/internal/flags/async";
|
|
8
|
-
import * as $ from "svelte/internal/server";
|
|
9
|
-
function Rotate_ccw($$renderer, $$props) {
|
|
10
|
-
let { $$slots, $$events, ...props } = $$props;
|
|
11
|
-
const iconNode = [
|
|
12
|
-
[
|
|
13
|
-
"path",
|
|
14
|
-
{ d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8" }
|
|
15
|
-
],
|
|
16
|
-
["path", { d: "M3 3v5h5" }]
|
|
17
|
-
];
|
|
18
|
-
Icon($$renderer, $.spread_props([{ name: "rotate-ccw" }, props, { iconNode }]));
|
|
19
|
-
}
|
|
20
|
-
export { Rotate_ccw };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.right.svelte-r39acv{display:flex;align-items:stretch;margin-left:auto}.cog.svelte-r39acv,.reload.svelte-r39acv{display:inline-flex;color:var(--ink);border-left:1px solid var(--rule);flex:none;justify-content:center;align-items: center;width:48px}.reload.svelte-r39acv{appearance:none;cursor:pointer;background:0 0;border-top:0;border-bottom:0;border-right:0;padding:0}.cog.svelte-r39acv:hover,.reload.svelte-r39acv:hover{background:var(--fill);color:var(--fill-ink)}.strip.svelte-r39acv{display:flex;align-items:stretch;min-width:0}.viewport.svelte-r39acv{display:flex;overflow-x:auto;scroll-behavior:smooth;scrollbar-width:none;min-width:0}.viewport.svelte-r39acv::-webkit-scrollbar{display:none}@media (prefers-reduced-motion:reduce){.viewport.svelte-r39acv{scroll-behavior:auto}}.tabs.svelte-r39acv{display:flex;flex:none;align-items:stretch}.page.svelte-r39acv{display:inline-flex;appearance:none;border:0;border-right:1px solid var(--rule);background:var(--bg-card);color:var(--ink);cursor:pointer;flex:none;justify-content:center;align-items: center;width:28px;margin:0;padding:0}.page.trailing.svelte-r39acv{border-right:0;border-left:1px solid var(--rule)}.page.svelte-r39acv:hover:not(:disabled){background:var(--fill);color:var(--fill-ink)}.page.svelte-r39acv:disabled{opacity:var(--dim);cursor:default}.page.svelte-r39acv:focus-visible{outline:2px solid var(--ink);outline-offset:-2px}.tab.svelte-r39acv{display:inline-flex;appearance:none;border:0;border-right:1px solid var(--rule);color:var(--ink-soft);font-family:var(--font-display);text-transform:uppercase;letter-spacing:.06em;cursor:pointer;background:0 0;flex:none;align-items: center;gap:10px;max-width:240px;margin:0;padding:0 12px;transition:background 80ms steps(2,end);font-size:13px;font-weight:700}.tab.svelte-r39acv:not(.active):hover{background:color-mix(in srgb,var(--ink)12%,transparent);color:var(--ink)}.tab.active.svelte-r39acv{background:var(--fill);color:var(--fill-ink);cursor:default;box-shadow:inset 0 3px 0 var(--bg)}.tab.svelte-r39acv:focus-visible{outline:2px solid var(--ink);outline-offset:-2px}.tab.active.svelte-r39acv:focus-visible{outline-color:var(--fill-ink)}.tab-name.svelte-r39acv{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tab-mode.svelte-r39acv{display:inline-flex;opacity:.7;border:1px solid;flex:none;justify-content:center;align-items: center;width:18px;height:18px}.attn.svelte-r39acv{border:1px solid var(--edge);animation:svelte-r39acv-tab-attn-pulse 1.4s ease-in-out infinite;flex:none;width:10px;height:10px}.attn.done.svelte-r39acv{background:var(--attn-done);color:var(--attn-done)}.attn.waiting.svelte-r39acv{background:var(--attn-waiting);color:var(--attn-waiting)}@keyframes svelte-r39acv-tab-attn-pulse{0%,to{box-shadow:0 0 #0000;filter:brightness(.85)}50%{box-shadow:0 0 6px 2px color-mix(in srgb,currentColor 60%,transparent);filter:brightness(1.15)}}@media (prefers-reduced-motion:reduce){.attn.svelte-r39acv{animation:none;filter:none}}.tab.editing.svelte-r39acv{cursor:default}.tab-name-edit.svelte-r39acv{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;border:1px solid var(--ink);background:var(--bg);color:var(--ink);width:148px;margin:0;padding:3px 6px;font-size:12px}.tab-name-edit.svelte-r39acv:focus-visible{outline:2px solid var(--ink);outline-offset:-2px}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.topbar.svelte-15fxkvm{display:flex;border-bottom:1px solid var(--rule);align-items: center;gap:18px;padding:16px 24px}.back.svelte-15fxkvm{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;color:var(--ink-soft);text-decoration:none;align-items: center;gap:5px;font-size:12px}.back.svelte-15fxkvm:hover{color:var(--ink)}.title.svelte-15fxkvm{display:flex;flex:1;align-items: center;gap:12px}.name.svelte-15fxkvm{font-family:var(--font-display);text-transform:uppercase;letter-spacing:.03em;font-size:20px;font-weight:700}.open.svelte-15fxkvm{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;color:var(--ink);text-decoration:none;border:1px solid var(--edge);align-items: center;gap:6px;padding:7px 12px;font-size:12px;font-weight:600}.open.svelte-15fxkvm:hover{background:var(--fill);border-color:var(--fill);color:var(--fill-ink)}.restart.svelte-15fxkvm{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;color:var(--ink);background:var(--bg);border:1px solid var(--edge);cursor:pointer;align-items: center;gap:6px;padding:7px 12px;font-size:12px;font-weight:600}.restart.svelte-15fxkvm:hover:not(:disabled){background:var(--fill);border-color:var(--fill);color:var(--fill-ink)}.restart.svelte-15fxkvm:disabled{opacity:var(--dim-panel);cursor:not-allowed}.restart-err.svelte-15fxkvm{font-family:var(--font-mono);color:var(--danger);margin:0;padding:8px 24px 0;font-size:12px}.stage.svelte-15fxkvm{max-width:1200px;margin:0 auto;padding:20px 24px 40px}.meta.svelte-15fxkvm{display:grid;grid-template-columns:max-content 1fr;align-items: center;gap:6px 14px;margin-bottom:18px}.meta.svelte-15fxkvm .k:where(.svelte-15fxkvm){font-family:var(--font-display);letter-spacing:.14em;text-transform:uppercase;color:var(--ink-faint);font-size:12px;font-weight:700}.meta.svelte-15fxkvm code:where(.svelte-15fxkvm){font-family:var(--font-mono);color:var(--ink-soft);font-size:13px}.meta.svelte-15fxkvm code.muted:where(.svelte-15fxkvm){color:var(--ink-faint)}.healthslot.svelte-15fxkvm,.ports.svelte-15fxkvm{margin-bottom:18px}.ports-bar.svelte-15fxkvm{display:flex;justify-content:space-between;align-items: center}.rebuild.svelte-15fxkvm{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;background:var(--fill-ink);color:var(--fill);border:1px solid var(--fill-ink);cursor:pointer;padding:4px 9px;font-size:10px;font-weight:600}.rebuild.svelte-15fxkvm:hover:not(:disabled){color:var(--fill-ink);background:0 0}.rebuild.svelte-15fxkvm:disabled{opacity:var(--dim-panel);cursor:not-allowed}.ports-body.svelte-15fxkvm{background:var(--bg-card);padding:12px 14px 14px}.port-list.svelte-15fxkvm{list-style:none;display:flex;flex-direction:column;gap:6px;margin:0 0 12px;padding:0}.port-list.svelte-15fxkvm li:where(.svelte-15fxkvm){display:flex;font-family:var(--font-mono);align-items: center;gap:8px;font-size:13px}.port-list.svelte-15fxkvm .cp:where(.svelte-15fxkvm){color:var(--ink);font-weight:600}.port-list.svelte-15fxkvm .arr:where(.svelte-15fxkvm){color:var(--ink-faint)}.port-list.svelte-15fxkvm a:where(.svelte-15fxkvm){display:inline-flex;color:var(--ink);text-decoration:none;border-bottom:1px solid var(--ink-faint);align-items: center;gap:4px}.port-list.svelte-15fxkvm a:where(.svelte-15fxkvm):hover{border-bottom-color:var(--ink)}.rm.svelte-15fxkvm{border:1px solid var(--ink-faint);color:var(--ink-soft);cursor:pointer;background:0 0;width:20px;height:20px;margin-left:auto;font-size:15px;line-height:1}.rm.svelte-15fxkvm:hover{border-color:var(--danger);color:var(--danger)}.empty.svelte-15fxkvm{font-family:var(--font-mono);color:var(--ink-faint);margin:0 0 12px;font-size:12px}.add.svelte-15fxkvm{display:flex;gap:8px}.add.svelte-15fxkvm input:where(.svelte-15fxkvm){font-family:var(--font-mono);border:1px solid var(--ink);background:var(--bg);color:var(--ink);outline:none;flex:1;min-width:0;padding:6px 9px;font-size:13px}.add.svelte-15fxkvm button:where(.svelte-15fxkvm){font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;border:1px solid var(--edge);background:var(--bg-card);color:var(--ink);cursor:pointer;padding:6px 14px;font-size:12px;font-weight:600}.add.svelte-15fxkvm button:where(.svelte-15fxkvm):hover{background:var(--fill);border-color:var(--fill);color:var(--fill-ink)}.port-err.svelte-15fxkvm{font-family:var(--font-mono);color:var(--danger);margin:10px 0 0;font-size:12px}.hint.svelte-15fxkvm{font-family:var(--font-mono);color:var(--ink-faint);margin:10px 0 0;font-size:11px}.hint.pending.svelte-15fxkvm{color:var(--ink-soft)}.hint.svelte-15fxkvm code:where(.svelte-15fxkvm){color:var(--ink)}.logwrap.svelte-15fxkvm{overflow:hidden}.log-bar.svelte-15fxkvm{display:flex;justify-content:space-between;align-items: center}.log-actions.svelte-15fxkvm{display:flex;align-items: center;gap:6px}.copy.svelte-15fxkvm{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;background:var(--fill-ink);color:var(--fill);border:1px solid var(--fill-ink);cursor:pointer;align-items: center;gap:5px;padding:4px 9px;font-size:10px;font-weight:600}.copy.svelte-15fxkvm:hover:not(:disabled),.copy.active.svelte-15fxkvm{color:var(--fill-ink);background:0 0}.dot.svelte-15fxkvm{background:var(--live-dot);border-radius:50%;flex:none;width:6px;height:6px}.copy.svelte-15fxkvm:disabled{opacity:var(--dim-panel);cursor:not-allowed}.logs.svelte-15fxkvm{position:relative;background:repeating-linear-gradient(0deg,var(--screen-line)0 1px,transparent 1px 3px),var(--screen-bg);color:var(--screen-ink);overflow:auto;overflow-anchor:none;height:calc(100vh - 320px);min-height:360px;padding:14px}.logs.svelte-15fxkvm pre:where(.svelte-15fxkvm){font-family:var(--font-mono);white-space:pre-wrap;word-break:break-word;margin:0;font-size:12.5px;line-height:1.5}@keyframes svelte-15fxkvm-lcd-blink{50%{background:0 0}}.caret.svelte-15fxkvm{display:inline-block;background:var(--screen-ink);vertical-align:text-bottom;animation:svelte-15fxkvm-lcd-blink 1.05s steps(1)infinite;width:.6em;height:1.05em;margin-left:2px}.err.svelte-15fxkvm{background:var(--bg-card);color:var(--ink);border-top:2px solid var(--ink);font-family:var(--font-mono);padding:12px 14px;font-size:13px}
|