codebay 0.15.0 → 0.16.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.
Files changed (91) hide show
  1. package/.mochi/manifest.json +490 -429
  2. package/.mochi/svelte-client/HydratableIsland-6y9p903x.js +1 -0
  3. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-nv6yzk0x.js +2 -0
  4. package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-ry83ck8a.js +14 -0
  5. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-vjt4jscf.js +3 -0
  6. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-1jdrk8x6.js +48 -0
  7. package/.mochi/svelte-client/{chunk-5pg0be5f.js → chunk-0vqvn81s.js} +1 -1
  8. package/.mochi/svelte-client/chunk-2dc6352a.js +1 -0
  9. package/.mochi/svelte-client/chunk-3cxaw5hr.js +2 -0
  10. package/.mochi/svelte-client/chunk-3jqc40sp.js +2 -0
  11. package/.mochi/svelte-client/chunk-3pgw6t5j.js +4 -0
  12. package/.mochi/svelte-client/chunk-7g3xt6ez.js +2 -0
  13. package/.mochi/svelte-client/chunk-b5s3mpg0.js +1 -0
  14. package/.mochi/svelte-client/chunk-bhseezf3.js +2 -0
  15. package/.mochi/svelte-client/chunk-bhwkq8er.js +1 -0
  16. package/.mochi/svelte-client/chunk-jm3ge348.js +1 -0
  17. package/.mochi/svelte-client/{chunk-ds9yn9cq.js → chunk-sxcr9gzp.js} +1 -1
  18. package/.mochi/svelte-client/{chunk-a2hty99b.js → chunk-tss2473w.js} +1 -1
  19. package/.mochi/svelte-compile/{App-68f9a9fq.server.js → App-8mpgrxza.server.js} +489 -295
  20. package/.mochi/svelte-compile/{Avatars-vyh3rwxx.server.js → Avatars-y5nf6q25.server.js} +102 -86
  21. package/.mochi/svelte-compile/{DefaultError-je52k17d.server.js → DefaultError-rrjye0s2.server.js} +1 -2
  22. package/.mochi/svelte-compile/{Instance-yfw7s5mp.server.js → Instance-3sbzyp0g.server.js} +186 -118
  23. package/.mochi/svelte-compile/{Settings-0b5t9kw9.server.js → Settings-ysvh5vhh.server.js} +739 -628
  24. package/.mochi/svelte-compile/chunk-7zaw9t5a.js +25 -0
  25. package/.mochi/svelte-compile/chunk-878xcmp4.js +65 -0
  26. package/.mochi/svelte-compile/chunk-d2z3qxxe.js +28 -0
  27. package/.mochi/svelte-compile/{chunk-60mpagr9.js → chunk-gnf5cnct.js} +661 -22
  28. package/.mochi/svelte-compile/{chunk-0y3wrae9.js → chunk-jq7jj8jd.js} +10 -6
  29. package/.mochi/svelte-compile/chunk-vr0e32mv.js +24 -0
  30. package/.mochi/svelte-compile/{chunk-apdte4nh.js → chunk-xmygdsj4.js} +35 -612
  31. package/.mochi/svelte-compile/{chunk-g0eravvj.js → chunk-zk4a9zms.js} +25 -17
  32. package/.mochi/svelte-css/DropZone-1zeitd761uwyd.css +1 -0
  33. package/.mochi/svelte-css/IdeBar-d3un7kuigxc5.css +1 -0
  34. package/.mochi/svelte-css/InstanceView-3ucotech5097w.css +1 -0
  35. package/README.md +13 -4
  36. package/migrations/0011_agent_run_rejected_structured_output.sql +2 -0
  37. package/package.json +9 -9
  38. package/src/__fixtures__/IdeBarStrip.svelte +41 -0
  39. package/src/avatars/dog.ts +1 -1
  40. package/src/avatars/lightning.ts +8 -9
  41. package/src/avatars/rocket.ts +4 -5
  42. package/src/components/AppShell.svelte +101 -1
  43. package/src/components/DropZone.svelte +77 -0
  44. package/src/components/HealthBox.svelte +6 -5
  45. package/src/components/IdeBar.svelte +222 -76
  46. package/src/components/InstanceView.svelte +75 -2
  47. package/src/components/SettingsView.svelte +87 -0
  48. package/src/components/TerminalPane.svelte +54 -0
  49. package/src/components/UiShowcase.svelte +19 -1
  50. package/src/container-injections/claude-code-install.ts +1 -1
  51. package/src/container-injections/claude-history.ts +52 -0
  52. package/src/container-injections/tmux.ts +6 -2
  53. package/src/index.ts +3 -0
  54. package/src/lib/agent-run-stream.ts +41 -1
  55. package/src/lib/agent-runs.server.ts +14 -3
  56. package/src/lib/config.server.ts +16 -1
  57. package/src/lib/db.server.ts +6 -2
  58. package/src/lib/devcontainer.server.ts +37 -4
  59. package/src/lib/injections.server.ts +5 -1
  60. package/src/lib/instances.server.ts +21 -4
  61. package/src/lib/log-capture.server.ts +46 -18
  62. package/src/lib/osc52.ts +18 -0
  63. package/src/lib/spawn.server.ts +7 -2
  64. package/src/lib/upload.ts +32 -0
  65. package/src/lib/uploads.server.ts +164 -0
  66. package/src/mcp/server.server.ts +4 -1
  67. package/src/mcp/tools.server.ts +178 -12
  68. package/src/pages/Instance.svelte +6 -2
  69. package/src/pages/Settings.svelte +3 -0
  70. package/src/routes.ts +16 -2
  71. package/src/types.ts +2 -0
  72. package/.mochi/svelte-client/HydratableIsland-smgsf0ma.js +0 -1
  73. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-9vc087ep.js +0 -2
  74. package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-a48xq47a.js +0 -14
  75. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-d4zehrqz.js +0 -3
  76. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-t5175pf5.js +0 -44
  77. package/.mochi/svelte-client/chunk-0mstgbtr.js +0 -2
  78. package/.mochi/svelte-client/chunk-0q9g0kpg.js +0 -1
  79. package/.mochi/svelte-client/chunk-3fwjzw1r.js +0 -1
  80. package/.mochi/svelte-client/chunk-fn03gxer.js +0 -4
  81. package/.mochi/svelte-client/chunk-jhgq7f65.js +0 -2
  82. package/.mochi/svelte-client/chunk-p5a07kx1.js +0 -1
  83. package/.mochi/svelte-client/chunk-p5wpyhsf.js +0 -2
  84. package/.mochi/svelte-client/chunk-t2kfvtb6.js +0 -2
  85. package/.mochi/svelte-client/chunk-v3wg9mdy.js +0 -1
  86. package/.mochi/svelte-compile/chunk-2qzc07gt.js +0 -34
  87. package/.mochi/svelte-compile/chunk-ef3hvegw.js +0 -21
  88. package/.mochi/svelte-compile/chunk-f9td8ej2.js +0 -24
  89. package/.mochi/svelte-compile/chunk-jx6h1xzp.js +0 -20
  90. package/.mochi/svelte-css/IdeBar-1mtgemqfuvqzi.css +0 -1
  91. package/.mochi/svelte-css/InstanceView-32j12hyg8v9u0.css +0 -1
@@ -1,28 +1,34 @@
1
1
  // @bun
2
2
  import {
3
3
  Chevron_right,
4
+ DropZone,
4
5
  StatusBadge,
5
- forwardedPortUrl
6
- } from "./chunk-2qzc07gt.js";
6
+ filesFrom,
7
+ forwardedPortUrl,
8
+ uploadFile
9
+ } from "./chunk-878xcmp4.js";
7
10
  import {
8
11
  Bot
9
- } from "./chunk-f9td8ej2.js";
12
+ } from "./chunk-d2z3qxxe.js";
10
13
  import {
11
14
  Message_square
12
- } from "./chunk-ef3hvegw.js";
15
+ } from "./chunk-7zaw9t5a.js";
13
16
  import {
14
17
  Terminal,
15
18
  apiDelete,
16
19
  apiFetch,
17
20
  apiPost,
18
21
  ideUrl
19
- } from "./chunk-0y3wrae9.js";
22
+ } from "./chunk-jq7jj8jd.js";
20
23
  import {
21
24
  HydratableBoundary,
22
25
  Icon,
26
+ TOAST_OPTIONS,
27
+ Toaster,
23
28
  X,
29
+ dist_default,
24
30
  emitIslandProps
25
- } from "./chunk-60mpagr9.js";
31
+ } from "./chunk-gnf5cnct.js";
26
32
  import"./chunk-xpt1a7jm.js";
27
33
 
28
34
  // src/pages/Instance.svelte
@@ -38,19 +44,27 @@ import"svelte/internal/flags/async";
38
44
  import * as $ from "svelte/internal/server";
39
45
  function Arrow_left($$renderer, $$props) {
40
46
  let { $$slots, $$events, ...props } = $$props;
41
- const iconNode = [
42
- ["path", { d: "m12 19-7-7 7-7" }],
43
- ["path", { d: "M19 12H5" }]
44
- ];
45
- Icon($$renderer, $.spread_props([{ name: "arrow-left" }, props, { iconNode }]));
47
+ const iconData = {
48
+ name: "arrow-left",
49
+ size: 24,
50
+ node: [
51
+ ["path", { d: "m12 19-7-7 7-7" }],
52
+ ["path", { d: "M19 12H5" }]
53
+ ]
54
+ };
55
+ Icon($$renderer, $.spread_props([props, { icon: iconData }]));
46
56
  }
47
57
  // node_modules/@lucide/svelte/dist/icons/arrow-up-right.svelte
48
58
  import"svelte/internal/flags/async";
49
59
  import * as $2 from "svelte/internal/server";
50
60
  function Arrow_up_right($$renderer, $$props) {
51
61
  let { $$slots, $$events, ...props } = $$props;
52
- const iconNode = [["path", { d: "M7 7h10v10" }], ["path", { d: "M7 17 17 7" }]];
53
- Icon($$renderer, $2.spread_props([{ name: "arrow-up-right" }, props, { iconNode }]));
62
+ const iconData = {
63
+ name: "arrow-up-right",
64
+ size: 24,
65
+ node: [["path", { d: "M7 7h10v10" }], ["path", { d: "M7 17 17 7" }]]
66
+ };
67
+ Icon($$renderer, $2.spread_props([props, { icon: iconData }]));
54
68
  }
55
69
  // src/components/HealthBox.svelte
56
70
  import"svelte/internal/flags/async";
@@ -61,8 +75,12 @@ import"svelte/internal/flags/async";
61
75
  import * as $3 from "svelte/internal/server";
62
76
  function Check($$renderer, $$props) {
63
77
  let { $$slots, $$events, ...props } = $$props;
64
- const iconNode = [["path", { d: "M20 6 9 17l-5-5" }]];
65
- Icon($$renderer, $3.spread_props([{ name: "check" }, props, { iconNode }]));
78
+ const iconData = {
79
+ name: "check",
80
+ size: 24,
81
+ node: [["path", { d: "M20 6 9 17l-5-5" }]]
82
+ };
83
+ Icon($$renderer, $3.spread_props([props, { icon: iconData }]));
66
84
  }
67
85
  // src/components/Skeleton.svelte
68
86
  import"svelte/internal/flags/async";
@@ -91,9 +109,17 @@ function HealthBox($$renderer, $$props) {
91
109
  return [];
92
110
  const v = (ok) => ({ ok, value: ok ? "OK" : "\u2014" });
93
111
  return [
94
- { label: FIXED_CHECKS()[0], ...v(health.containerRunning) },
95
- { label: FIXED_CHECKS()[1], ...v(health.codeServerAccessible) },
96
- ...health.injections.map((i) => ({ label: i.label, ...v(i.ok) }))
112
+ {
113
+ key: "container",
114
+ label: FIXED_CHECKS()[0],
115
+ ...v(health.containerRunning)
116
+ },
117
+ {
118
+ key: "surface",
119
+ label: FIXED_CHECKS()[1],
120
+ ...v(health.codeServerAccessible)
121
+ },
122
+ ...health.injections.map((i) => ({ key: i.id, label: i.label, ...v(i.ok) }))
97
123
  ];
98
124
  });
99
125
  function getNumberOfChecks() {
@@ -110,8 +136,7 @@ function HealthBox($$renderer, $$props) {
110
136
  });
111
137
  $$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">`);
112
138
  if (health) {
113
- $$renderer2.push("<!--[0-->");
114
- $$renderer2.push(`<!--[-->`);
139
+ $$renderer2.push(`<!--[0--><!--[-->`);
115
140
  const each_array = $5.ensure_array_like(checks());
116
141
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
117
142
  let check = each_array[$$index];
@@ -127,8 +152,7 @@ function HealthBox($$renderer, $$props) {
127
152
  }
128
153
  $$renderer2.push(`<!--]-->`);
129
154
  } else if (active) {
130
- $$renderer2.push("<!--[1-->");
131
- $$renderer2.push(`<!--[-->`);
155
+ $$renderer2.push(`<!--[1--><!--[-->`);
132
156
  const each_array_1 = $5.ensure_array_like(Array(getNumberOfChecks()));
133
157
  for (let i = 0, $$length = each_array_1.length;i < $$length; i++) {
134
158
  let _ = each_array_1[i];
@@ -140,8 +164,7 @@ function HealthBox($$renderer, $$props) {
140
164
  }
141
165
  $$renderer2.push(`<!--]-->`);
142
166
  } else {
143
- $$renderer2.push("<!--[-1-->");
144
- $$renderer2.push(`<!--[-->`);
167
+ $$renderer2.push(`<!--[-1--><!--[-->`);
145
168
  const each_array_2 = $5.ensure_array_like(FIXED_CHECKS());
146
169
  for (let $$index_2 = 0, $$length = each_array_2.length;$$index_2 < $$length; $$index_2++) {
147
170
  let label = each_array_2[$$index_2];
@@ -162,42 +185,56 @@ import"svelte/internal/flags/async";
162
185
  import * as $6 from "svelte/internal/server";
163
186
  function Refresh_cw($$renderer, $$props) {
164
187
  let { $$slots, $$events, ...props } = $$props;
165
- const iconNode = [
166
- [
167
- "path",
168
- { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8" }
169
- ],
170
- ["path", { d: "M21 3v5h-5" }],
171
- [
172
- "path",
173
- { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" }
174
- ],
175
- ["path", { d: "M8 16H3v5" }]
176
- ];
177
- Icon($$renderer, $6.spread_props([{ name: "refresh-cw" }, props, { iconNode }]));
188
+ const iconData = {
189
+ name: "refresh-cw",
190
+ size: 24,
191
+ node: [
192
+ [
193
+ "path",
194
+ { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8" }
195
+ ],
196
+ ["path", { d: "M21 3v5h-5" }],
197
+ [
198
+ "path",
199
+ { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" }
200
+ ],
201
+ ["path", { d: "M8 16H3v5" }]
202
+ ]
203
+ };
204
+ Icon($$renderer, $6.spread_props([props, { icon: iconData }]));
178
205
  }
179
206
  // node_modules/@lucide/svelte/dist/icons/circle-check.svelte
180
207
  import"svelte/internal/flags/async";
181
208
  import * as $7 from "svelte/internal/server";
182
209
  function Circle_check($$renderer, $$props) {
183
210
  let { $$slots, $$events, ...props } = $$props;
184
- const iconNode = [
185
- ["circle", { cx: "12", cy: "12", r: "10" }],
186
- ["path", { d: "m9 12 2 2 4-4" }]
187
- ];
188
- Icon($$renderer, $7.spread_props([{ name: "circle-check" }, props, { iconNode }]));
211
+ const iconData = {
212
+ name: "circle-check",
213
+ size: 24,
214
+ node: [
215
+ ["circle", { cx: "12", cy: "12", r: "10" }],
216
+ ["path", { d: "m16 9-5.5 5.5L8 12" }]
217
+ ],
218
+ aliases: ["check-circle-2"]
219
+ };
220
+ Icon($$renderer, $7.spread_props([props, { icon: iconData }]));
189
221
  }
190
222
  // node_modules/@lucide/svelte/dist/icons/circle-x.svelte
191
223
  import"svelte/internal/flags/async";
192
224
  import * as $8 from "svelte/internal/server";
193
225
  function Circle_x($$renderer, $$props) {
194
226
  let { $$slots, $$events, ...props } = $$props;
195
- const iconNode = [
196
- ["circle", { cx: "12", cy: "12", r: "10" }],
197
- ["path", { d: "m15 9-6 6" }],
198
- ["path", { d: "m9 9 6 6" }]
199
- ];
200
- Icon($$renderer, $8.spread_props([{ name: "circle-x" }, props, { iconNode }]));
227
+ const iconData = {
228
+ name: "circle-x",
229
+ size: 24,
230
+ node: [
231
+ ["circle", { cx: "12", cy: "12", r: "10" }],
232
+ ["path", { d: "m15 9-6 6" }],
233
+ ["path", { d: "m9 9 6 6" }]
234
+ ],
235
+ aliases: ["x-circle"]
236
+ };
237
+ Icon($$renderer, $8.spread_props([props, { icon: iconData }]));
201
238
  }
202
239
  // src/components/AgentLogBox.svelte
203
240
  import { untrack } from "svelte";
@@ -281,8 +318,7 @@ Session ${sid}${run.session_id ? "" : " (requested; not started yet)"}`;
281
318
  return (run.error ?? run.result ?? run.prompt).replace(/\s+/g, " ").trim();
282
319
  }
283
320
  if (loaded && runs.length > 0) {
284
- $$renderer2.push("<!--[0-->");
285
- $$renderer2.push(`<section class="agentwrap panel svelte-rfwj7e"><div class="agent-bar panel-bar svelte-rfwj7e"><span class="svelte-rfwj7e">`);
321
+ $$renderer2.push(`<!--[0--><section class="agentwrap panel svelte-rfwj7e"><div class="agent-bar panel-bar svelte-rfwj7e"><span class="svelte-rfwj7e">`);
286
322
  Bot($$renderer2, { size: 14 });
287
323
  $$renderer2.push(`<!----> Agent log</span> <span class="count svelte-rfwj7e">${$9.escape(runs.length)} run${$9.escape(runs.length === 1 ? "" : "s")}</span></div> <!--[-->`);
288
324
  const each_array = $9.ensure_array_like(runs);
@@ -293,15 +329,13 @@ Session ${sid}${run.session_id ? "" : " (requested; not started yet)"}`;
293
329
  Chevron_right($$renderer2, { size: 14 });
294
330
  $$renderer2.push(`<!----></span> <span class="when svelte-rfwj7e">${$9.escape(when(run))}</span> <span${$9.attr_class("status svelte-rfwj7e", undefined, { bad: run.is_error, live: isLive(run) })}>`);
295
331
  if (isLive(run)) {
296
- $$renderer2.push("<!--[0-->");
297
- $$renderer2.push(`<span class="pulse svelte-rfwj7e"></span>`);
332
+ $$renderer2.push(`<!--[0--><span class="pulse svelte-rfwj7e"></span>`);
298
333
  } else {
299
334
  $$renderer2.push("<!--[-1-->");
300
335
  }
301
336
  $$renderer2.push(`<!--]--> ${$9.escape(run.status)}</span> `);
302
337
  if (modelOf(run)) {
303
- $$renderer2.push("<!--[0-->");
304
- $$renderer2.push(`<span class="model svelte-rfwj7e"${$9.attr("title", modelTitle(run))}>${$9.escape(modelOf(run))}</span>`);
338
+ $$renderer2.push(`<!--[0--><span class="model svelte-rfwj7e"${$9.attr("title", modelTitle(run))}>${$9.escape(modelOf(run))}</span>`);
305
339
  } else {
306
340
  $$renderer2.push("<!--[-1-->");
307
341
  }
@@ -316,21 +350,17 @@ Session ${sid}${run.session_id ? "" : " (requested; not started yet)"}`;
316
350
  }
317
351
  $$renderer2.push(`<!--]--> `);
318
352
  if (!expanded) {
319
- $$renderer2.push("<!--[0-->");
320
- $$renderer2.push(`<span class="peek svelte-rfwj7e">${$9.escape(peek(run))}</span>`);
353
+ $$renderer2.push(`<!--[0--><span class="peek svelte-rfwj7e">${$9.escape(peek(run))}</span>`);
321
354
  } else {
322
355
  $$renderer2.push("<!--[-1-->");
323
356
  }
324
357
  $$renderer2.push(`<!--]--> <span class="run-meta svelte-rfwj7e">${$9.escape(meta(run))}</span></button> `);
325
358
  if (expanded) {
326
- $$renderer2.push("<!--[0-->");
327
- $$renderer2.push(`<div class="prompt svelte-rfwj7e"><div class="ptitle svelte-rfwj7e">Initial prompt</div> <div class="ptext svelte-rfwj7e">${$9.escape(run.prompt)}</div></div> <ol class="steps svelte-rfwj7e">`);
359
+ $$renderer2.push(`<!--[0--><div class="prompt svelte-rfwj7e"><div class="ptitle svelte-rfwj7e">Initial prompt</div> <div class="ptext svelte-rfwj7e">${$9.escape(run.prompt)}</div></div> <ol class="steps svelte-rfwj7e">`);
328
360
  if (isLive(run)) {
329
- $$renderer2.push("<!--[0-->");
330
- $$renderer2.push(`<li class="step svelte-rfwj7e"><span class="ico svelte-rfwj7e"><span class="pulse svelte-rfwj7e"></span></span> <span class="body svelte-rfwj7e"><span class="text svelte-rfwj7e">${$9.escape(run.status === "queued" ? "Queued \u2014 waiting for the sandbox" : "Working\u2026")}</span></span></li>`);
361
+ $$renderer2.push(`<!--[0--><li class="step svelte-rfwj7e"><span class="ico svelte-rfwj7e"><span class="pulse svelte-rfwj7e"></span></span> <span class="body svelte-rfwj7e"><span class="text svelte-rfwj7e">${$9.escape(run.status === "queued" ? "Queued \u2014 waiting for the sandbox" : "Working\u2026")}</span></span></li>`);
331
362
  } else if ((timelines[run.id] ?? []).length === 0) {
332
- $$renderer2.push("<!--[1-->");
333
- $$renderer2.push(`<li class="step svelte-rfwj7e"><span class="body svelte-rfwj7e"><span class="text svelte-rfwj7e">No steps recorded.</span></span></li>`);
363
+ $$renderer2.push(`<!--[1--><li class="step svelte-rfwj7e"><span class="body svelte-rfwj7e"><span class="text svelte-rfwj7e">No steps recorded.</span></span></li>`);
334
364
  } else {
335
365
  $$renderer2.push("<!--[-1-->");
336
366
  }
@@ -356,8 +386,7 @@ Session ${sid}${run.session_id ? "" : " (requested; not started yet)"}`;
356
386
  }
357
387
  $$renderer2.push(`<!--]--></span> <span class="body svelte-rfwj7e">`);
358
388
  if (entry.name) {
359
- $$renderer2.push("<!--[0-->");
360
- $$renderer2.push(`<span class="tool svelte-rfwj7e">${$9.escape(entry.name)}</span>`);
389
+ $$renderer2.push(`<!--[0--><span class="tool svelte-rfwj7e">${$9.escape(entry.name)}</span>`);
361
390
  } else {
362
391
  $$renderer2.push("<!--[-1-->");
363
392
  }
@@ -365,8 +394,7 @@ Session ${sid}${run.session_id ? "" : " (requested; not started yet)"}`;
365
394
  }
366
395
  $$renderer2.push(`<!--]--></ol> `);
367
396
  if (run.error && !isLive(run)) {
368
- $$renderer2.push("<!--[0-->");
369
- $$renderer2.push(`<div class="err svelte-rfwj7e">${$9.escape(run.error)}</div>`);
397
+ $$renderer2.push(`<!--[0--><div class="err svelte-rfwj7e">${$9.escape(run.error)}</div>`);
370
398
  } else {
371
399
  $$renderer2.push("<!--[-1-->");
372
400
  }
@@ -378,8 +406,7 @@ Session ${sid}${run.session_id ? "" : " (requested; not started yet)"}`;
378
406
  }
379
407
  $$renderer2.push(`<!--]--> `);
380
408
  if (error) {
381
- $$renderer2.push("<!--[0-->");
382
- $$renderer2.push(`<div class="err svelte-rfwj7e">${$9.escape(error)}</div>`);
409
+ $$renderer2.push(`<!--[0--><div class="err svelte-rfwj7e">${$9.escape(error)}</div>`);
383
410
  } else {
384
411
  $$renderer2.push("<!--[-1-->");
385
412
  }
@@ -395,7 +422,8 @@ Session ${sid}${run.session_id ? "" : " (requested; not started yet)"}`;
395
422
  import { tick } from "svelte";
396
423
  function InstanceView($$renderer, $$props) {
397
424
  $$renderer.component(($$renderer2) => {
398
- let { id, injectionChecks = 0 } = $$props;
425
+ let { id, injectionChecks = 0, uploadEnabled = false } = $$props;
426
+ let uploadArmed = uploadEnabled;
399
427
  let instance = null;
400
428
  let health = null;
401
429
  let lastFetchedAt = null;
@@ -474,7 +502,51 @@ function InstanceView($$renderer, $$props) {
474
502
  clearTimeout(copyTimer);
475
503
  copyTimer = setTimeout(() => copied = false, 2000);
476
504
  }
477
- $$renderer2.push(`<header class="topbar svelte-15fxkvm"><a class="back svelte-15fxkvm" href="/">`);
505
+ async function handleUpload(files) {
506
+ for (const file of files) {
507
+ try {
508
+ const saved = await uploadFile(id, file);
509
+ dist_default.success(`Saved ${saved.containerPath}`);
510
+ navigator.clipboard.writeText(saved.containerPath).catch(() => {});
511
+ } catch (err) {
512
+ dist_default.error(err.message);
513
+ }
514
+ }
515
+ }
516
+ let dropping = false;
517
+ function onDragEnter(e) {
518
+ if (!uploadArmed || !e.dataTransfer?.types.includes("Files"))
519
+ return;
520
+ e.preventDefault();
521
+ dropping = true;
522
+ }
523
+ function onDragOver(e) {
524
+ if (dropping)
525
+ e.preventDefault();
526
+ }
527
+ function onDragLeave(e) {
528
+ if (e.relatedTarget === null)
529
+ dropping = false;
530
+ }
531
+ function onDrop(e) {
532
+ if (!dropping)
533
+ return;
534
+ e.preventDefault();
535
+ dropping = false;
536
+ if (uploadArmed)
537
+ handleUpload(filesFrom(e.dataTransfer));
538
+ }
539
+ function onPaste(e) {
540
+ if (!uploadArmed)
541
+ return;
542
+ const files = filesFrom(e.clipboardData);
543
+ if (!files.length)
544
+ return;
545
+ e.preventDefault();
546
+ handleUpload(files);
547
+ }
548
+ Toaster($$renderer2, { toastOptions: TOAST_OPTIONS });
549
+ $$renderer2.push(`<!----> <header class="topbar svelte-15fxkvm"><a class="back svelte-15fxkvm" href="/">`);
478
550
  Arrow_left($$renderer2, { size: 15 });
479
551
  $$renderer2.push(`<!----> All instances</a> <div class="title svelte-15fxkvm"><span class="name svelte-15fxkvm">${$10.escape(instance?.name ?? "Instance")}</span> `);
480
552
  if (instance) {
@@ -486,8 +558,7 @@ function InstanceView($$renderer, $$props) {
486
558
  }
487
559
  $$renderer2.push(`<!--]--></div> `);
488
560
  if (instance?.status === "running") {
489
- $$renderer2.push("<!--[0-->");
490
- $$renderer2.push(`<form method="POST" action="?/restart" class="svelte-15fxkvm"><button class="restart svelte-15fxkvm" type="submit"${$10.attr("disabled", restarting || building(), true)}>${$10.escape(restarting || building() ? "Restarting\u2026" : "Restart container")}</button></form> <a class="open svelte-15fxkvm"${$10.attr("href", url())} target="_blank" rel="noopener">Open in new tab `);
561
+ $$renderer2.push(`<!--[0--><form method="POST" action="?/restart" class="svelte-15fxkvm"><button class="restart svelte-15fxkvm" type="submit"${$10.attr("disabled", restarting || building(), true)}>${$10.escape(restarting || building() ? "Restarting\u2026" : "Restart container")}</button></form> <a class="open svelte-15fxkvm"${$10.attr("href", url())} target="_blank" rel="noopener">Open in new tab `);
491
562
  Arrow_up_right($$renderer2, { size: 15 });
492
563
  $$renderer2.push(`<!----></a>`);
493
564
  } else {
@@ -495,15 +566,20 @@ function InstanceView($$renderer, $$props) {
495
566
  }
496
567
  $$renderer2.push(`<!--]--></header> `);
497
568
  if (restartError) {
569
+ $$renderer2.push(`<!--[0--><p class="restart-err svelte-15fxkvm">${$10.escape(restartError)}</p>`);
570
+ } else {
571
+ $$renderer2.push("<!--[-1-->");
572
+ }
573
+ $$renderer2.push(`<!--]--> <main class="stage svelte-15fxkvm">`);
574
+ if (dropping) {
498
575
  $$renderer2.push("<!--[0-->");
499
- $$renderer2.push(`<p class="restart-err svelte-15fxkvm">${$10.escape(restartError)}</p>`);
576
+ DropZone($$renderer2, {});
500
577
  } else {
501
578
  $$renderer2.push("<!--[-1-->");
502
579
  }
503
- $$renderer2.push(`<!--]--> <main class="stage svelte-15fxkvm"><div class="meta svelte-15fxkvm"><span class="k svelte-15fxkvm">Source</span> `);
580
+ $$renderer2.push(`<!--]--> <div class="meta svelte-15fxkvm"><span class="k svelte-15fxkvm">Source</span> `);
504
581
  if (instance) {
505
- $$renderer2.push("<!--[0-->");
506
- $$renderer2.push(`<code class="svelte-15fxkvm">${$10.escape(instance.source_path)}</code>`);
582
+ $$renderer2.push(`<!--[0--><code class="svelte-15fxkvm">${$10.escape(instance.source_path)}</code>`);
507
583
  } else {
508
584
  $$renderer2.push("<!--[-1-->");
509
585
  Skeleton($$renderer2, { variant: "wide" });
@@ -512,14 +588,11 @@ function InstanceView($$renderer, $$props) {
512
588
  if (instance) {
513
589
  $$renderer2.push("<!--[0-->");
514
590
  if (instance.image_source === "local") {
515
- $$renderer2.push("<!--[0-->");
516
- $$renderer2.push(`<code class="svelte-15fxkvm">local (project devcontainer.json)</code>`);
591
+ $$renderer2.push(`<!--[0--><code class="svelte-15fxkvm">local (project devcontainer.json)</code>`);
517
592
  } else if (instance.image_source) {
518
- $$renderer2.push("<!--[1-->");
519
- $$renderer2.push(`<code class="svelte-15fxkvm">${$10.escape(instance.image_source)}</code>`);
593
+ $$renderer2.push(`<!--[1--><code class="svelte-15fxkvm">${$10.escape(instance.image_source)}</code>`);
520
594
  } else {
521
- $$renderer2.push("<!--[-1-->");
522
- $$renderer2.push(`<code class="muted svelte-15fxkvm">\u2014</code>`);
595
+ $$renderer2.push(`<!--[-1--><code class="muted svelte-15fxkvm">\u2014</code>`);
523
596
  }
524
597
  $$renderer2.push(`<!--]-->`);
525
598
  } else {
@@ -536,15 +609,13 @@ function InstanceView($$renderer, $$props) {
536
609
  });
537
610
  $$renderer2.push(`<!----></div> <section class="ports panel svelte-15fxkvm"><div class="ports-bar panel-bar svelte-15fxkvm"><span class="svelte-15fxkvm">Forwarded ports</span> `);
538
611
  if (pendingRebuild) {
539
- $$renderer2.push("<!--[0-->");
540
- $$renderer2.push(`<button class="rebuild svelte-15fxkvm"${$10.attr("disabled", building(), true)}>${$10.escape(building() ? "Restarting\u2026" : "Restart to apply")}</button>`);
612
+ $$renderer2.push(`<!--[0--><button class="rebuild svelte-15fxkvm"${$10.attr("disabled", building(), true)}>${$10.escape(building() ? "Restarting\u2026" : "Restart to apply")}</button>`);
541
613
  } else {
542
614
  $$renderer2.push("<!--[-1-->");
543
615
  }
544
616
  $$renderer2.push(`<!--]--></div> <div class="ports-body svelte-15fxkvm">`);
545
617
  if (forwards().length) {
546
- $$renderer2.push("<!--[0-->");
547
- $$renderer2.push(`<ul class="port-list svelte-15fxkvm"><!--[-->`);
618
+ $$renderer2.push(`<!--[0--><ul class="port-list svelte-15fxkvm"><!--[-->`);
548
619
  const each_array = $10.ensure_array_like(forwards());
549
620
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
550
621
  let f = each_array[$$index];
@@ -554,20 +625,17 @@ function InstanceView($$renderer, $$props) {
554
625
  }
555
626
  $$renderer2.push(`<!--]--></ul>`);
556
627
  } else {
557
- $$renderer2.push("<!--[-1-->");
558
- $$renderer2.push(`<p class="empty svelte-15fxkvm">No ports forwarded yet.</p>`);
628
+ $$renderer2.push(`<!--[-1--><p class="empty svelte-15fxkvm">No ports forwarded yet.</p>`);
559
629
  }
560
630
  $$renderer2.push(`<!--]--> <form class="add svelte-15fxkvm"><input type="number" min="1" max="65535" placeholder="container port (e.g. 3000)"${$10.attr("value", newPort)} spellcheck="false" class="svelte-15fxkvm"/> <button type="submit" class="svelte-15fxkvm">Add</button></form> `);
561
631
  if (portError) {
562
- $$renderer2.push("<!--[0-->");
563
- $$renderer2.push(`<p class="port-err svelte-15fxkvm">${$10.escape(portError)}</p>`);
632
+ $$renderer2.push(`<!--[0--><p class="port-err svelte-15fxkvm">${$10.escape(portError)}</p>`);
564
633
  } else {
565
634
  $$renderer2.push("<!--[-1-->");
566
635
  }
567
636
  $$renderer2.push(`<!--]--> `);
568
637
  if (pendingRebuild) {
569
- $$renderer2.push("<!--[0-->");
570
- $$renderer2.push(`<p class="hint pending svelte-15fxkvm">Port changes apply when you <strong class="svelte-15fxkvm">Restart</strong> (recreates the container).</p>`);
638
+ $$renderer2.push(`<!--[0--><p class="hint pending svelte-15fxkvm">Port changes apply when you <strong class="svelte-15fxkvm">Restart</strong> (recreates the container).</p>`);
571
639
  } else {
572
640
  $$renderer2.push("<!--[-1-->");
573
641
  }
@@ -575,15 +643,13 @@ function InstanceView($$renderer, $$props) {
575
643
  AgentLogBox($$renderer2, { id, bump: runBump });
576
644
  $$renderer2.push(`<!----> <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${$10.attr_class("copy svelte-15fxkvm", undefined, { active: following })}${$10.attr("aria-pressed", following)}${$10.attr("title", following ? "Following \u2014 click to pause" : "Paused \u2014 click to follow new output")}>`);
577
645
  if (following) {
578
- $$renderer2.push("<!--[0-->");
579
- $$renderer2.push(`<span class="dot svelte-15fxkvm"></span>`);
646
+ $$renderer2.push(`<!--[0--><span class="dot svelte-15fxkvm"></span>`);
580
647
  } else {
581
648
  $$renderer2.push("<!--[-1-->");
582
649
  }
583
650
  $$renderer2.push(`<!--]--> ${$10.escape(following ? "Following" : "Follow log")}</button> <button class="copy svelte-15fxkvm"${$10.attr("disabled", !logs, true)}>${$10.escape(copied ? "Copied!" : "Copy logs")}</button></div></div> <div class="logs svelte-15fxkvm"><pre class="svelte-15fxkvm">${$10.escape(logs || "Waiting for output\u2026")}<span class="caret svelte-15fxkvm"></span></pre></div> `);
584
651
  if (instance?.status === "error" && instance.error) {
585
- $$renderer2.push("<!--[0-->");
586
- $$renderer2.push(`<div class="err svelte-15fxkvm">${$10.escape(instance.error)}</div>`);
652
+ $$renderer2.push(`<!--[0--><div class="err svelte-15fxkvm">${$10.escape(instance.error)}</div>`);
587
653
  } else {
588
654
  $$renderer2.push("<!--[-1-->");
589
655
  }
@@ -594,30 +660,32 @@ function InstanceView($$renderer, $$props) {
594
660
  // src/pages/Instance.svelte
595
661
  function Instance($$renderer, $$props) {
596
662
  $$renderer.component(($$renderer2) => {
597
- let { id, injectionChecks } = $$props;
663
+ let { id, injectionChecks, uploadEnabled } = $$props;
598
664
  if (true) {
599
- let failed = function($$renderer3, error) {
600
- $$renderer3.push(`<mochi-island-failure data-component="InstanceView"${$11.attr("data-message", error.message)}></mochi-island-failure>`);
601
- };
602
665
  $$renderer2.push("<!--[0-->");
603
- $$renderer2.boundary({ failed }, ($$renderer3) => {
604
- $$renderer3.push(`<!--[-->`);
605
- {
606
- HydratableBoundary($$renderer3, {
607
- children: ($$renderer4) => {
608
- $$renderer4.push(`<mochi-hydratable-island component-name="InstanceView_2ma45l9bybfhl" component-url="__MOCHI_COMPONENT_URL__InstanceView_2ma45l9bybfhl__"${$11.attr("props-ref", emitIslandProps({ id, injectionChecks }))}>`);
609
- $$renderer4.push(`<!--[-->`);
610
- {
611
- InstanceView($$renderer4, { id, injectionChecks });
612
- }
613
- $$renderer4.push(`<!--]-->`);
614
- $$renderer4.push(`</mochi-hydratable-island>`);
615
- },
616
- $$slots: { default: true }
617
- });
618
- }
619
- $$renderer3.push(`<!--]-->`);
620
- });
666
+ {
667
+ let failed = function($$renderer3, error) {
668
+ $$renderer3.push(`<mochi-island-failure data-component="InstanceView"${$11.attr("data-message", error.message)}></mochi-island-failure>`);
669
+ };
670
+ $$renderer2.boundary({ failed }, ($$renderer3) => {
671
+ $$renderer3.push(`<!--[-->`);
672
+ {
673
+ HydratableBoundary($$renderer3, {
674
+ children: ($$renderer4) => {
675
+ $$renderer4.push(`<mochi-hydratable-island component-name="InstanceView_2ma45l9bybfhl" component-url="__MOCHI_COMPONENT_URL__InstanceView_2ma45l9bybfhl__"${$11.attr("props-ref", emitIslandProps({ id, injectionChecks, uploadEnabled }))}>`);
676
+ $$renderer4.push(`<!--[-->`);
677
+ {
678
+ InstanceView($$renderer4, { id, injectionChecks, uploadEnabled });
679
+ }
680
+ $$renderer4.push(`<!--]-->`);
681
+ $$renderer4.push(`</mochi-hydratable-island>`);
682
+ },
683
+ $$slots: { default: true }
684
+ });
685
+ }
686
+ $$renderer3.push(`<!--]-->`);
687
+ });
688
+ }
621
689
  }
622
690
  $$renderer2.push(`<!--]-->`);
623
691
  });