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.
Files changed (108) hide show
  1. package/.mochi/manifest.json +778 -646
  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-spk1b2r4.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-0mc09cyb.js → chunk-sxcr9gzp.js} +1 -1
  18. package/.mochi/svelte-client/{chunk-ccfh8hxz.js → chunk-tss2473w.js} +1 -1
  19. package/.mochi/svelte-compile/{App-94xsdn0w.server.js → App-8mpgrxza.server.js} +470 -271
  20. package/.mochi/svelte-compile/{Avatars-fnccw47h.server.js → Avatars-y5nf6q25.server.js} +111 -110
  21. package/.mochi/svelte-compile/{DefaultError-je52k17d.server.js → DefaultError-rrjye0s2.server.js} +1 -2
  22. package/.mochi/svelte-compile/Instance-3sbzyp0g.server.js +695 -0
  23. package/.mochi/svelte-compile/{Settings-a7b11v90.server.js → Settings-ysvh5vhh.server.js} +838 -607
  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-w0hca7va.js → chunk-jq7jj8jd.js} +18 -2
  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-pqb403fh.js → chunk-zk4a9zms.js} +28 -31
  32. package/.mochi/svelte-css/AgentLogBox-38adby5iygny7.css +1 -0
  33. package/.mochi/svelte-css/DropZone-1zeitd761uwyd.css +1 -0
  34. package/.mochi/svelte-css/IdeBar-d3un7kuigxc5.css +1 -0
  35. package/.mochi/svelte-css/{InstanceCard-25z7nas7y98zk.css → InstanceCard-3vxozrp9uoads.css} +1 -1
  36. package/.mochi/svelte-css/InstanceView-3ucotech5097w.css +1 -0
  37. package/.mochi/svelte-css/{SettingsView-bccw34agd2bj.css → SettingsView-2400myxb9ot56.css} +1 -1
  38. package/README.md +43 -3
  39. package/migrations/0009_agent_runs.sql +24 -0
  40. package/migrations/0010_agent_run_model.sql +2 -0
  41. package/migrations/0011_agent_run_rejected_structured_output.sql +2 -0
  42. package/package.json +13 -9
  43. package/src/__fixtures__/IdeBarStrip.svelte +41 -0
  44. package/src/avatars/dog.ts +1 -1
  45. package/src/avatars/lightning.ts +8 -9
  46. package/src/avatars/rocket.ts +4 -5
  47. package/src/components/AgentLogBox.svelte +458 -0
  48. package/src/components/AppShell.svelte +112 -1
  49. package/src/components/DropZone.svelte +77 -0
  50. package/src/components/FolderBrowser.svelte +13 -5
  51. package/src/components/HealthBox.svelte +6 -5
  52. package/src/components/IdeBar.svelte +222 -76
  53. package/src/components/InstanceCard.svelte +38 -0
  54. package/src/components/InstanceView.svelte +83 -2
  55. package/src/components/SettingsView.svelte +273 -0
  56. package/src/components/TerminalPane.svelte +54 -0
  57. package/src/components/UiShowcase.svelte +23 -3
  58. package/src/container-injections/claude-code-install.ts +1 -1
  59. package/src/container-injections/claude-history.ts +52 -0
  60. package/src/container-injections/claude-statusline.ts +4 -1
  61. package/src/container-injections/github-credentials.ts +12 -1
  62. package/src/container-injections/tmux.ts +6 -2
  63. package/src/index.ts +35 -7
  64. package/src/lib/agent-run-stream.ts +286 -0
  65. package/src/lib/agent-runs.server.ts +735 -0
  66. package/src/lib/auth.server.ts +11 -2
  67. package/src/lib/build-freshness.server.ts +71 -0
  68. package/src/lib/config.server.ts +36 -7
  69. package/src/lib/container-files.server.ts +1 -1
  70. package/src/lib/data-dir-lock.server.ts +78 -0
  71. package/src/lib/db.server.ts +124 -1
  72. package/src/lib/devcontainer.server.ts +93 -16
  73. package/src/lib/docker-client.server.ts +11 -5
  74. package/src/lib/drives.ts +11 -0
  75. package/src/lib/exec.server.ts +66 -5
  76. package/src/lib/injections.server.ts +5 -1
  77. package/src/lib/instances.server.ts +66 -7
  78. package/src/lib/log-capture.server.ts +63 -23
  79. package/src/lib/mcp-auth.server.ts +52 -0
  80. package/src/lib/osc52.ts +18 -0
  81. package/src/lib/picker.server.ts +23 -2
  82. package/src/lib/sandbox-ops.server.ts +263 -0
  83. package/src/lib/upload.ts +32 -0
  84. package/src/lib/uploads.server.ts +164 -0
  85. package/src/mcp/routes.server.ts +25 -0
  86. package/src/mcp/server.server.ts +55 -0
  87. package/src/mcp/tools.server.ts +660 -0
  88. package/src/pages/Instance.svelte +6 -2
  89. package/src/pages/Settings.svelte +15 -0
  90. package/src/routes.ts +79 -3
  91. package/src/types.ts +17 -0
  92. package/.mochi/svelte-client/HydratableIsland-zrdsrsmg.js +0 -1
  93. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-v7y7dh53.js +0 -2
  94. package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-tmwd6fpb.js +0 -14
  95. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-m7t64dbh.js +0 -1
  96. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-4a7ann1f.js +0 -40
  97. package/.mochi/svelte-client/chunk-5jwfs4p9.js +0 -2
  98. package/.mochi/svelte-client/chunk-6qg4q98a.js +0 -2
  99. package/.mochi/svelte-client/chunk-phf7v5jj.js +0 -4
  100. package/.mochi/svelte-client/chunk-tmeh70wg.js +0 -2
  101. package/.mochi/svelte-client/chunk-vs1yjbqt.js +0 -2
  102. package/.mochi/svelte-client/chunk-x0m3k0rn.js +0 -1
  103. package/.mochi/svelte-client/chunk-y7f4jbdm.js +0 -2
  104. package/.mochi/svelte-compile/Instance-knnkcn2p.server.js +0 -377
  105. package/.mochi/svelte-compile/chunk-ed46m58e.js +0 -22
  106. package/.mochi/svelte-compile/chunk-jx6h1xzp.js +0 -20
  107. package/.mochi/svelte-css/IdeBar-1mtgemqfuvqzi.css +0 -1
  108. package/.mochi/svelte-css/InstanceView-32j12hyg8v9u0.css +0 -1
@@ -1,37 +1,41 @@
1
1
  // @bun
2
2
  import {
3
+ Chevron_right,
4
+ DropZone,
3
5
  StatusBadge,
4
- forwardedPortUrl
5
- } from "./chunk-ed46m58e.js";
6
+ filesFrom,
7
+ forwardedPortUrl,
8
+ uploadFile
9
+ } from "./chunk-878xcmp4.js";
6
10
  import {
7
11
  Layout_template,
8
12
  Plus,
9
- Terminal,
10
13
  tabShortcutsEnabled
11
- } from "./chunk-pqb403fh.js";
14
+ } from "./chunk-zk4a9zms.js";
12
15
  import {
16
+ Terminal,
13
17
  apiDelete,
14
18
  apiFetch,
15
19
  apiPost,
16
20
  ideUrl
17
- } from "./chunk-w0hca7va.js";
21
+ } from "./chunk-jq7jj8jd.js";
18
22
  import {
19
23
  AppBar,
20
24
  Avatar,
21
25
  Button,
22
- TOAST_OPTIONS,
23
- Toaster,
24
- dist_default,
25
26
  findAvatar
26
- } from "./chunk-apdte4nh.js";
27
+ } from "./chunk-xmygdsj4.js";
27
28
  import {
28
29
  HydratableBoundary,
29
30
  Icon,
31
+ TOAST_OPTIONS,
32
+ Toaster,
30
33
  X,
34
+ dist_default,
31
35
  emitIslandProps,
32
36
  isDev,
33
37
  withPopupMarker
34
- } from "./chunk-60mpagr9.js";
38
+ } from "./chunk-gnf5cnct.js";
35
39
  import {
36
40
  __require
37
41
  } from "./chunk-xpt1a7jm.js";
@@ -124,77 +128,102 @@ function isRepoUrl(input) {
124
128
  return parseRepoUrl(input) !== null;
125
129
  }
126
130
 
131
+ // src/lib/drives.ts
132
+ var DRIVES_ROOT = "::drives";
133
+ var DRIVES_ROOT_LABEL = "This PC";
134
+
127
135
  // node_modules/@lucide/svelte/dist/icons/folder-clock.svelte
128
136
  import"svelte/internal/flags/async";
129
137
  import * as $ from "svelte/internal/server";
130
138
  function Folder_clock($$renderer, $$props) {
131
139
  let { $$slots, $$events, ...props } = $$props;
132
- const iconNode = [
133
- ["path", { d: "M16 14v2.2l1.6 1" }],
134
- [
135
- "path",
136
- {
137
- 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"
138
- }
139
- ],
140
- ["circle", { cx: "16", cy: "16", r: "6" }]
141
- ];
142
- Icon($$renderer, $.spread_props([{ name: "folder-clock" }, props, { iconNode }]));
140
+ const iconData = {
141
+ name: "folder-clock",
142
+ size: 24,
143
+ node: [
144
+ ["path", { d: "M16 14v2.2l1.6 1" }],
145
+ [
146
+ "path",
147
+ {
148
+ 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"
149
+ }
150
+ ],
151
+ ["circle", { cx: "16", cy: "16", r: "6" }]
152
+ ]
153
+ };
154
+ Icon($$renderer, $.spread_props([props, { icon: iconData }]));
143
155
  }
144
156
  // node_modules/@lucide/svelte/dist/icons/git-branch.svelte
145
157
  import"svelte/internal/flags/async";
146
158
  import * as $2 from "svelte/internal/server";
147
159
  function Git_branch($$renderer, $$props) {
148
160
  let { $$slots, $$events, ...props } = $$props;
149
- const iconNode = [
150
- ["path", { d: "M15 6a9 9 0 0 0-9 9V3" }],
151
- ["circle", { cx: "18", cy: "6", r: "3" }],
152
- ["circle", { cx: "6", cy: "18", r: "3" }]
153
- ];
154
- Icon($$renderer, $2.spread_props([{ name: "git-branch" }, props, { iconNode }]));
161
+ const iconData = {
162
+ name: "git-branch",
163
+ size: 24,
164
+ node: [
165
+ ["path", { d: "M15 6a9 9 0 0 0-9 9V3" }],
166
+ ["circle", { cx: "18", cy: "6", r: "3" }],
167
+ ["circle", { cx: "6", cy: "18", r: "3" }]
168
+ ]
169
+ };
170
+ Icon($$renderer, $2.spread_props([props, { icon: iconData }]));
155
171
  }
156
172
  // node_modules/@lucide/svelte/dist/icons/arrow-up.svelte
157
173
  import"svelte/internal/flags/async";
158
174
  import * as $3 from "svelte/internal/server";
159
175
  function Arrow_up($$renderer, $$props) {
160
176
  let { $$slots, $$events, ...props } = $$props;
161
- const iconNode = [
162
- ["path", { d: "m5 12 7-7 7 7" }],
163
- ["path", { d: "M12 19V5" }]
164
- ];
165
- Icon($$renderer, $3.spread_props([{ name: "arrow-up" }, props, { iconNode }]));
177
+ const iconData = {
178
+ name: "arrow-up",
179
+ size: 24,
180
+ node: [
181
+ ["path", { d: "m5 12 7-7 7 7" }],
182
+ ["path", { d: "M12 19V5" }]
183
+ ]
184
+ };
185
+ Icon($$renderer, $3.spread_props([props, { icon: iconData }]));
166
186
  }
167
187
  // node_modules/@lucide/svelte/dist/icons/folder.svelte
168
188
  import"svelte/internal/flags/async";
169
189
  import * as $4 from "svelte/internal/server";
170
190
  function Folder($$renderer, $$props) {
171
191
  let { $$slots, $$events, ...props } = $$props;
172
- const iconNode = [
173
- [
174
- "path",
175
- {
176
- 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"
177
- }
192
+ const iconData = {
193
+ name: "folder",
194
+ size: 24,
195
+ node: [
196
+ [
197
+ "path",
198
+ {
199
+ 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"
200
+ }
201
+ ]
178
202
  ]
179
- ];
180
- Icon($$renderer, $4.spread_props([{ name: "folder" }, props, { iconNode }]));
203
+ };
204
+ Icon($$renderer, $4.spread_props([props, { icon: iconData }]));
181
205
  }
182
206
  // node_modules/@lucide/svelte/dist/icons/triangle-alert.svelte
183
207
  import"svelte/internal/flags/async";
184
208
  import * as $5 from "svelte/internal/server";
185
209
  function Triangle_alert($$renderer, $$props) {
186
210
  let { $$slots, $$events, ...props } = $$props;
187
- const iconNode = [
188
- [
189
- "path",
190
- {
191
- 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"
192
- }
211
+ const iconData = {
212
+ name: "triangle-alert",
213
+ size: 24,
214
+ node: [
215
+ [
216
+ "path",
217
+ {
218
+ 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"
219
+ }
220
+ ],
221
+ ["path", { d: "M12 9v4" }],
222
+ ["path", { d: "M12 17h.01" }]
193
223
  ],
194
- ["path", { d: "M12 9v4" }],
195
- ["path", { d: "M12 17h.01" }]
196
- ];
197
- Icon($$renderer, $5.spread_props([{ name: "triangle-alert" }, props, { iconNode }]));
224
+ aliases: ["alert-triangle"]
225
+ };
226
+ Icon($$renderer, $5.spread_props([props, { icon: iconData }]));
198
227
  }
199
228
  // src/components/FolderBrowser.svelte
200
229
  function FolderBrowser($$renderer, $$props) {
@@ -218,6 +247,7 @@ function FolderBrowser($$renderer, $$props) {
218
247
  onpick(repoUrl.trim(), { branch: repoBranch.trim() || undefined, mode: mode() });
219
248
  }
220
249
  const filtered = $6.derived(() => result ? result.entries.filter((e) => e.name.toLowerCase().includes(query.trim().toLowerCase())) : []);
250
+ const atDrivesRoot = $6.derived(() => result?.path === DRIVES_ROOT);
221
251
  const shownHistory = $6.derived(() => showAll ? history2 : history2.slice(0, 5));
222
252
  async function loadHistory() {
223
253
  try {
@@ -255,10 +285,9 @@ function FolderBrowser($$renderer, $$props) {
255
285
  Layout_template($$renderer2, { size: 15 });
256
286
  $$renderer2.push(`<!----> Full IDE</button> <button type="button"${$6.attr_class("mode-btn svelte-oq97c4", undefined, { active: mode() === "terminal" })}${$6.attr("aria-pressed", mode() === "terminal")}>`);
257
287
  Terminal($$renderer2, { size: 15 });
258
- $$renderer2.push(`<!----> Terminal</button></div></div> <div class="clone svelte-oq97c4"><div class="clone-label svelte-oq97c4">Clone a Git repository</div> <div class="clone-row svelte-oq97c4"><input class="clone-url svelte-oq97c4" type="text" placeholder="https://github.com/owner/repo"${$6.attr("value", repoUrl)} spellcheck="false" autocomplete="off"/> <input class="clone-branch svelte-oq97c4" type="text" placeholder="branch (optional)"${$6.attr("value", repoBranch)} spellcheck="false" autocomplete="off"/> <button class="clone-btn svelte-oq97c4"${$6.attr("disabled", !repoValid(), true)}>Clone</button></div></div> <div class="crumbs svelte-oq97c4"><code class="svelte-oq97c4">${$6.escape(result?.path ?? "\u2026")}</code></div> `);
288
+ $$renderer2.push(`<!----> Terminal</button></div></div> <div class="clone svelte-oq97c4"><div class="clone-label svelte-oq97c4">Clone a Git repository</div> <div class="clone-row svelte-oq97c4"><input class="clone-url svelte-oq97c4" type="text" placeholder="https://github.com/owner/repo"${$6.attr("value", repoUrl)} spellcheck="false" autocomplete="off"/> <input class="clone-branch svelte-oq97c4" type="text" placeholder="branch (optional)"${$6.attr("value", repoBranch)} spellcheck="false" autocomplete="off"/> <button class="clone-btn svelte-oq97c4"${$6.attr("disabled", !repoValid(), true)}>Clone</button></div></div> <div class="crumbs svelte-oq97c4"><code class="svelte-oq97c4">${$6.escape(atDrivesRoot() ? DRIVES_ROOT_LABEL : result?.path ?? "\u2026")}</code></div> `);
259
289
  if (history2.length > 0) {
260
- $$renderer2.push("<!--[0-->");
261
- $$renderer2.push(`<div class="recent svelte-oq97c4"><div class="recent-label svelte-oq97c4">Recent</div> <!--[-->`);
290
+ $$renderer2.push(`<!--[0--><div class="recent svelte-oq97c4"><div class="recent-label svelte-oq97c4">Recent</div> <!--[-->`);
262
291
  const each_array = $6.ensure_array_like(shownHistory());
263
292
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
264
293
  let entry = each_array[$$index];
@@ -276,8 +305,7 @@ function FolderBrowser($$renderer, $$props) {
276
305
  }
277
306
  $$renderer2.push(`<!--]--> `);
278
307
  if (history2.length > 5) {
279
- $$renderer2.push("<!--[0-->");
280
- $$renderer2.push(`<button class="recent-toggle svelte-oq97c4">${$6.escape(showAll ? "Show fewer" : `Show all (${history2.length})`)}</button>`);
308
+ $$renderer2.push(`<!--[0--><button class="recent-toggle svelte-oq97c4">${$6.escape(showAll ? "Show fewer" : `Show all (${history2.length})`)}</button>`);
281
309
  } else {
282
310
  $$renderer2.push("<!--[-1-->");
283
311
  }
@@ -287,16 +315,13 @@ function FolderBrowser($$renderer, $$props) {
287
315
  }
288
316
  $$renderer2.push(`<!--]--> <div class="search svelte-oq97c4"><input type="text" placeholder="Filter folders\u2026"${$6.attr("value", query)} spellcheck="false" autocomplete="off" class="svelte-oq97c4"/></div> <div class="list svelte-oq97c4">`);
289
317
  if (loading) {
290
- $$renderer2.push("<!--[0-->");
291
- $$renderer2.push(`<div class="muted svelte-oq97c4">Loading\u2026</div>`);
318
+ $$renderer2.push(`<!--[0--><div class="muted svelte-oq97c4">Loading\u2026</div>`);
292
319
  } else if (errorMsg) {
293
- $$renderer2.push("<!--[1-->");
294
- $$renderer2.push(`<div class="muted err svelte-oq97c4">${$6.escape(errorMsg)}</div>`);
320
+ $$renderer2.push(`<!--[1--><div class="muted err svelte-oq97c4">${$6.escape(errorMsg)}</div>`);
295
321
  } else if (result) {
296
322
  $$renderer2.push("<!--[2-->");
297
323
  if (result.parent && !query) {
298
- $$renderer2.push("<!--[0-->");
299
- $$renderer2.push(`<div class="row svelte-oq97c4"><button class="nav svelte-oq97c4"><span class="icon svelte-oq97c4">`);
324
+ $$renderer2.push(`<!--[0--><div class="row svelte-oq97c4"><button class="nav svelte-oq97c4"><span class="icon svelte-oq97c4">`);
300
325
  Arrow_up($$renderer2, { size: 16 });
301
326
  $$renderer2.push(`<!----></span> <span class="ename svelte-oq97c4">..</span></button></div>`);
302
327
  } else {
@@ -304,8 +329,7 @@ function FolderBrowser($$renderer, $$props) {
304
329
  }
305
330
  $$renderer2.push(`<!--]--> `);
306
331
  if (filtered().length === 0) {
307
- $$renderer2.push("<!--[0-->");
308
- $$renderer2.push(`<div class="muted svelte-oq97c4">${$6.escape(query ? "No folders match." : "No subfolders here.")}</div>`);
332
+ $$renderer2.push(`<!--[0--><div class="muted svelte-oq97c4">${$6.escape(query ? "No folders match." : "No subfolders here.")}</div>`);
309
333
  } else {
310
334
  $$renderer2.push("<!--[-1-->");
311
335
  }
@@ -317,8 +341,7 @@ function FolderBrowser($$renderer, $$props) {
317
341
  Folder($$renderer2, { size: 16 });
318
342
  $$renderer2.push(`<!----></span> <span class="ename svelte-oq97c4">${$6.escape(entry.name)}</span> `);
319
343
  if (entry.hasDevcontainer) {
320
- $$renderer2.push("<!--[0-->");
321
- $$renderer2.push(`<span class="badge svelte-oq97c4">devcontainer</span>`);
344
+ $$renderer2.push(`<!--[0--><span class="badge svelte-oq97c4">devcontainer</span>`);
322
345
  } else {
323
346
  $$renderer2.push("<!--[-1-->");
324
347
  }
@@ -329,16 +352,15 @@ function FolderBrowser($$renderer, $$props) {
329
352
  $$renderer2.push("<!--[-1-->");
330
353
  }
331
354
  $$renderer2.push(`<!--]--></div> `);
332
- if (result && !result.hasDevcontainer) {
333
- $$renderer2.push("<!--[0-->");
334
- $$renderer2.push(`<div class="warn svelte-oq97c4">`);
355
+ if (result && !result.hasDevcontainer && !atDrivesRoot()) {
356
+ $$renderer2.push(`<!--[0--><div class="warn svelte-oq97c4">`);
335
357
  Triangle_alert($$renderer2, { size: 15 });
336
358
  $$renderer2.push(`<!----> <span>No <code class="svelte-oq97c4">devcontainer.json</code> in this folder \u2014 a default image will be used if you select
337
359
  it.</span></div>`);
338
360
  } else {
339
361
  $$renderer2.push("<!--[-1-->");
340
362
  }
341
- $$renderer2.push(`<!--]--> <div class="foot svelte-oq97c4"><span class="hint svelte-oq97c4">Browse to a folder, then select this folder or any subfolder.</span> <button class="primary svelte-oq97c4"${$6.attr("disabled", !result, true)}>Select this folder</button></div></div></div>`);
363
+ $$renderer2.push(`<!--]--> <div class="foot svelte-oq97c4"><span class="hint svelte-oq97c4">${$6.escape(atDrivesRoot() ? "Pick a drive to browse." : "Browse to a folder, then select this folder or any subfolder.")}</span> <button class="primary svelte-oq97c4"${$6.attr("disabled", !result || atDrivesRoot(), true)}>Select this folder</button></div></div></div>`);
342
364
  });
343
365
  }
344
366
 
@@ -365,37 +387,40 @@ import"svelte/internal/flags/async";
365
387
  import * as $8 from "svelte/internal/server";
366
388
  function Cable($$renderer, $$props) {
367
389
  let { $$slots, $$events, ...props } = $$props;
368
- const iconNode = [
369
- [
370
- "path",
371
- {
372
- 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"
373
- }
374
- ],
375
- ["path", { d: "M17 21v-2" }],
376
- [
377
- "path",
378
- { d: "M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10" }
379
- ],
380
- ["path", { d: "M21 21v-2" }],
381
- ["path", { d: "M3 5V3" }],
382
- [
383
- "path",
384
- {
385
- 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"
386
- }
387
- ],
388
- ["path", { d: "M7 5V3" }]
389
- ];
390
- Icon($$renderer, $8.spread_props([{ name: "cable" }, props, { iconNode }]));
390
+ const iconData = {
391
+ name: "cable",
392
+ size: 24,
393
+ node: [
394
+ [
395
+ "path",
396
+ {
397
+ 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"
398
+ }
399
+ ],
400
+ ["path", { d: "M17 21v-2" }],
401
+ [
402
+ "path",
403
+ { d: "M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10" }
404
+ ],
405
+ ["path", { d: "M21 21v-2" }],
406
+ ["path", { d: "M3 5V3" }],
407
+ [
408
+ "path",
409
+ {
410
+ 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"
411
+ }
412
+ ],
413
+ ["path", { d: "M7 5V3" }]
414
+ ]
415
+ };
416
+ Icon($$renderer, $8.spread_props([props, { icon: iconData }]));
391
417
  }
392
418
  // src/components/PortsBox.svelte
393
419
  function PortsBox($$renderer, $$props) {
394
420
  $$renderer.component(($$renderer2) => {
395
421
  let { ports } = $$props;
396
422
  if (ports.length) {
397
- $$renderer2.push("<!--[0-->");
398
- $$renderer2.push(`<div class="fports svelte-1uaz383" title="Forwarded ports \u2014 click to open">`);
423
+ $$renderer2.push(`<!--[0--><div class="fports svelte-1uaz383" title="Forwarded ports \u2014 click to open">`);
399
424
  Cable($$renderer2, { size: 12 });
400
425
  $$renderer2.push(`<!----> <span class="list svelte-1uaz383"><!--[-->`);
401
426
  const each_array = $9.ensure_array_like(ports);
@@ -433,8 +458,7 @@ function InstanceCard($$renderer, $$props) {
433
458
  };
434
459
  $$renderer2.push(`<li${$10.attr_class("card panel svelte-13338y7", undefined, { busy: !!pending })}${$10.attr("aria-busy", !!pending || undefined)}>`);
435
460
  if (pending) {
436
- $$renderer2.push("<!--[0-->");
437
- $$renderer2.push(`<div class="busy-overlay svelte-13338y7" aria-live="polite"><span class="busy-label svelte-13338y7">${$10.escape(BUSY_LABEL[pending])}</span></div>`);
461
+ $$renderer2.push(`<!--[0--><div class="busy-overlay svelte-13338y7" aria-live="polite"><span class="busy-label svelte-13338y7">${$10.escape(BUSY_LABEL[pending])}</span></div>`);
438
462
  } else {
439
463
  $$renderer2.push("<!--[-1-->");
440
464
  }
@@ -446,16 +470,13 @@ function InstanceCard($$renderer, $$props) {
446
470
  });
447
471
  $$renderer2.push(`<!----> `);
448
472
  if (editing) {
449
- $$renderer2.push("<!--[0-->");
450
- $$renderer2.push(`<input class="name-edit svelte-13338y7"${$10.attr("value", editingName)} autofocus=""/>`);
473
+ $$renderer2.push(`<!--[0--><input class="name-edit svelte-13338y7"${$10.attr("value", editingName)} autofocus=""/>`);
451
474
  } else {
452
- $$renderer2.push("<!--[-1-->");
453
- $$renderer2.push(`<button class="name svelte-13338y7" title="Click to rename">${$10.escape(instance.name)}</button>`);
475
+ $$renderer2.push(`<!--[-1--><button class="name svelte-13338y7" title="Click to rename">${$10.escape(instance.name)}</button>`);
454
476
  }
455
477
  $$renderer2.push(`<!--]--> `);
456
478
  if (instance.attention) {
457
- $$renderer2.push("<!--[0-->");
458
- $$renderer2.push(`<span${$10.attr_class("attn svelte-13338y7", undefined, {
479
+ $$renderer2.push(`<!--[0--><span${$10.attr_class("attn svelte-13338y7", undefined, {
459
480
  "attn-done": instance.attention === "done",
460
481
  "attn-waiting": instance.attention === "waiting"
461
482
  })}${$10.attr("title", instance.attention === "waiting" ? "Claude is waiting for input" : "Claude finished")}${$10.attr("aria-label", instance.attention === "waiting" ? "Claude is waiting for input" : "Claude finished")}></span>`);
@@ -479,9 +500,14 @@ function InstanceCard($$renderer, $$props) {
479
500
  $$renderer2.push("<!--[-1-->");
480
501
  }
481
502
  $$renderer2.push(`<!--]--> `);
503
+ if (instance.active_run) {
504
+ $$renderer2.push(`<!--[0--><div class="agent-run svelte-13338y7" title="An MCP client is driving Claude in this sandbox"><span class="agent-dot svelte-13338y7"></span> <span class="agent-text svelte-13338y7">${$10.escape(instance.active_run.status === "queued" ? "Agent run queued" : instance.active_run.last_activity ?? "Agent running")}</span></div>`);
505
+ } else {
506
+ $$renderer2.push("<!--[-1-->");
507
+ }
508
+ $$renderer2.push(`<!--]--> `);
482
509
  if (instance.status === "error" && instance.error) {
483
- $$renderer2.push("<!--[0-->");
484
- $$renderer2.push(`<div class="card-error svelte-13338y7">${$10.escape(instance.error)}</div>`);
510
+ $$renderer2.push(`<!--[0--><div class="card-error svelte-13338y7">${$10.escape(instance.error)}</div>`);
485
511
  } else {
486
512
  $$renderer2.push("<!--[-1-->");
487
513
  }
@@ -583,33 +609,37 @@ import"svelte/internal/flags/async";
583
609
  import * as $11 from "svelte/internal/server";
584
610
  function Component($$renderer, $$props) {
585
611
  let { $$slots, $$events, ...props } = $$props;
586
- const iconNode = [
587
- [
588
- "path",
589
- {
590
- 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"
591
- }
592
- ],
593
- [
594
- "path",
595
- {
596
- 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"
597
- }
598
- ],
599
- [
600
- "path",
601
- {
602
- 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"
603
- }
604
- ],
605
- [
606
- "path",
607
- {
608
- 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"
609
- }
612
+ const iconData = {
613
+ name: "component",
614
+ size: 24,
615
+ node: [
616
+ [
617
+ "path",
618
+ {
619
+ 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"
620
+ }
621
+ ],
622
+ [
623
+ "path",
624
+ {
625
+ 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"
626
+ }
627
+ ],
628
+ [
629
+ "path",
630
+ {
631
+ 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"
632
+ }
633
+ ],
634
+ [
635
+ "path",
636
+ {
637
+ 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"
638
+ }
639
+ ]
610
640
  ]
611
- ];
612
- Icon($$renderer, $11.spread_props([{ name: "component" }, props, { iconNode }]));
641
+ };
642
+ Icon($$renderer, $11.spread_props([props, { icon: iconData }]));
613
643
  }
614
644
  // src/components/Brand.svelte
615
645
  import"svelte/internal/flags/async";
@@ -620,18 +650,22 @@ import"svelte/internal/flags/async";
620
650
  import * as $12 from "svelte/internal/server";
621
651
  function Package($$renderer, $$props) {
622
652
  let { $$slots, $$events, ...props } = $$props;
623
- const iconNode = [
624
- [
625
- "path",
626
- {
627
- 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"
628
- }
629
- ],
630
- ["path", { d: "M12 22V12" }],
631
- ["polyline", { points: "3.29 7 12 12 20.71 7" }],
632
- ["path", { d: "m7.5 4.27 9 5.15" }]
633
- ];
634
- Icon($$renderer, $12.spread_props([{ name: "package" }, props, { iconNode }]));
653
+ const iconData = {
654
+ name: "package",
655
+ size: 24,
656
+ node: [
657
+ [
658
+ "path",
659
+ {
660
+ 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"
661
+ }
662
+ ],
663
+ ["path", { d: "M12 22V12" }],
664
+ ["polyline", { points: "3.29 7 12 12 20.71 7" }],
665
+ ["path", { d: "m7.5 4.27 9 5.15" }]
666
+ ]
667
+ };
668
+ Icon($$renderer, $12.spread_props([props, { icon: iconData }]));
635
669
  }
636
670
  // src/components/Brand.svelte
637
671
  function Brand($$renderer, $$props) {
@@ -679,16 +713,20 @@ import"svelte/internal/flags/async";
679
713
  import * as $15 from "svelte/internal/server";
680
714
  function Settings($$renderer, $$props) {
681
715
  let { $$slots, $$events, ...props } = $$props;
682
- const iconNode = [
683
- [
684
- "path",
685
- {
686
- 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"
687
- }
688
- ],
689
- ["circle", { cx: "12", cy: "12", r: "3" }]
690
- ];
691
- Icon($$renderer, $15.spread_props([{ name: "settings" }, props, { iconNode }]));
716
+ const iconData = {
717
+ name: "settings",
718
+ size: 24,
719
+ node: [
720
+ [
721
+ "path",
722
+ {
723
+ 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"
724
+ }
725
+ ],
726
+ ["circle", { cx: "12", cy: "12", r: "3" }]
727
+ ]
728
+ };
729
+ Icon($$renderer, $15.spread_props([props, { icon: iconData }]));
692
730
  }
693
731
  // src/components/SettingsCog.svelte
694
732
  function SettingsCog($$renderer, $$props) {
@@ -708,21 +746,25 @@ import"svelte/internal/flags/async";
708
746
  import * as $17 from "svelte/internal/server";
709
747
  function Link($$renderer, $$props) {
710
748
  let { $$slots, $$events, ...props } = $$props;
711
- const iconNode = [
712
- [
713
- "path",
714
- {
715
- d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"
716
- }
717
- ],
718
- [
719
- "path",
720
- {
721
- d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"
722
- }
749
+ const iconData = {
750
+ name: "link",
751
+ size: 24,
752
+ node: [
753
+ [
754
+ "path",
755
+ {
756
+ d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"
757
+ }
758
+ ],
759
+ [
760
+ "path",
761
+ {
762
+ d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"
763
+ }
764
+ ]
723
765
  ]
724
- ];
725
- Icon($$renderer, $17.spread_props([{ name: "link" }, props, { iconNode }]));
766
+ };
767
+ Icon($$renderer, $17.spread_props([props, { icon: iconData }]));
726
768
  }
727
769
  // src/components/CredMenu.svelte
728
770
  function CredMenu($$renderer, $$props) {
@@ -752,8 +794,7 @@ function CredMenu($$renderer, $$props) {
752
794
  }
753
795
  $$renderer2.push(`</button> `);
754
796
  if (credOpen) {
755
- $$renderer2.push("<!--[0-->");
756
- $$renderer2.push(`<div class="cred-dropdown panel svelte-vongf9" role="menu"><!--[-->`);
797
+ $$renderer2.push(`<!--[0--><div class="cred-dropdown panel svelte-vongf9" role="menu"><!--[-->`);
757
798
  const each_array = $18.ensure_array_like(auth);
758
799
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
759
800
  let provider = each_array[$$index];
@@ -955,18 +996,15 @@ function DashboardView($$renderer, $$props) {
955
996
  });
956
997
  $$renderer3.push(`<!----> <main class="stage svelte-146pixd">`);
957
998
  if (!ready()) {
958
- $$renderer3.push("<!--[0-->");
959
- $$renderer3.push(`<div class="banner error svelte-146pixd"><strong>Setup needed.</strong> `);
999
+ $$renderer3.push(`<!--[0--><div class="banner error svelte-146pixd"><strong>Setup needed.</strong> `);
960
1000
  if (!preflight.docker) {
961
- $$renderer3.push("<!--[0-->");
962
- $$renderer3.push(`<span>Docker daemon is not reachable.</span>`);
1001
+ $$renderer3.push(`<!--[0--><span>Docker daemon is not reachable.</span>`);
963
1002
  } else {
964
1003
  $$renderer3.push("<!--[-1-->");
965
1004
  }
966
1005
  $$renderer3.push(`<!--]--> `);
967
1006
  if (!preflight.cli) {
968
- $$renderer3.push("<!--[0-->");
969
- $$renderer3.push(`<span>The devcontainer CLI is not available.</span>`);
1007
+ $$renderer3.push(`<!--[0--><span>The devcontainer CLI is not available.</span>`);
970
1008
  } else {
971
1009
  $$renderer3.push("<!--[-1-->");
972
1010
  }
@@ -976,18 +1014,15 @@ function DashboardView($$renderer, $$props) {
976
1014
  }
977
1015
  $$renderer3.push(`<!--]--> `);
978
1016
  if (actionError) {
979
- $$renderer3.push("<!--[0-->");
980
- $$renderer3.push(`<div class="banner error svelte-146pixd"><strong>Error.</strong> <span>${$20.escape(actionError)}</span></div>`);
1017
+ $$renderer3.push(`<!--[0--><div class="banner error svelte-146pixd"><strong>Error.</strong> <span>${$20.escape(actionError)}</span></div>`);
981
1018
  } else {
982
1019
  $$renderer3.push("<!--[-1-->");
983
1020
  }
984
1021
  $$renderer3.push(`<!--]--> `);
985
1022
  if (!loaded) {
986
- $$renderer3.push("<!--[0-->");
987
- $$renderer3.push(`<div class="empty svelte-146pixd"><p class="empty-sub svelte-146pixd">Loading\u2026</p></div>`);
1023
+ $$renderer3.push(`<!--[0--><div class="empty svelte-146pixd"><p class="empty-sub svelte-146pixd">Loading\u2026</p></div>`);
988
1024
  } else if (instances.length === 0) {
989
- $$renderer3.push("<!--[1-->");
990
- $$renderer3.push(`<div class="empty svelte-146pixd"><p class="empty-title svelte-146pixd">No instances yet</p> <p class="empty-sub svelte-146pixd">Pick a project folder to spin up an isolated devcontainer.</p> `);
1025
+ $$renderer3.push(`<!--[1--><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> `);
991
1026
  Button($$renderer3, {
992
1027
  variant: "primary",
993
1028
  icon: Plus,
@@ -1000,11 +1035,9 @@ function DashboardView($$renderer, $$props) {
1000
1035
  });
1001
1036
  $$renderer3.push(`<!----></div>`);
1002
1037
  } else if (visible().length === 0) {
1003
- $$renderer3.push("<!--[2-->");
1004
- $$renderer3.push(`<div class="empty svelte-146pixd"><p class="empty-sub svelte-146pixd">No ${$20.escape(filter)} instances.</p></div>`);
1038
+ $$renderer3.push(`<!--[2--><div class="empty svelte-146pixd"><p class="empty-sub svelte-146pixd">No ${$20.escape(filter)} instances.</p></div>`);
1005
1039
  } else {
1006
- $$renderer3.push("<!--[-1-->");
1007
- $$renderer3.push(`<ul class="grid svelte-146pixd"><!--[-->`);
1040
+ $$renderer3.push(`<!--[-1--><ul class="grid svelte-146pixd"><!--[-->`);
1008
1041
  const each_array = $20.ensure_array_like(visible());
1009
1042
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
1010
1043
  let instance = each_array[$$index];
@@ -1059,30 +1092,46 @@ import"svelte/internal/flags/async";
1059
1092
  import * as $21 from "svelte/internal/server";
1060
1093
  function Rotate_cw($$renderer, $$props) {
1061
1094
  let { $$slots, $$events, ...props } = $$props;
1062
- const iconNode = [
1063
- [
1064
- "path",
1065
- { d: "M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8" }
1066
- ],
1067
- ["path", { d: "M21 3v5h-5" }]
1068
- ];
1069
- Icon($$renderer, $21.spread_props([{ name: "rotate-cw" }, props, { iconNode }]));
1095
+ const iconData = {
1096
+ name: "rotate-cw",
1097
+ size: 24,
1098
+ node: [
1099
+ [
1100
+ "path",
1101
+ { d: "M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8" }
1102
+ ],
1103
+ ["path", { d: "M21 3v5h-5" }]
1104
+ ]
1105
+ };
1106
+ Icon($$renderer, $21.spread_props([props, { icon: iconData }]));
1070
1107
  }
1071
1108
  // node_modules/@lucide/svelte/dist/icons/chevron-left.svelte
1072
1109
  import"svelte/internal/flags/async";
1073
1110
  import * as $22 from "svelte/internal/server";
1074
1111
  function Chevron_left($$renderer, $$props) {
1075
1112
  let { $$slots, $$events, ...props } = $$props;
1076
- const iconNode = [["path", { d: "m15 18-6-6 6-6" }]];
1077
- Icon($$renderer, $22.spread_props([{ name: "chevron-left" }, props, { iconNode }]));
1113
+ const iconData = {
1114
+ name: "chevron-left",
1115
+ size: 24,
1116
+ node: [["path", { d: "m15 18-6-6 6-6" }]]
1117
+ };
1118
+ Icon($$renderer, $22.spread_props([props, { icon: iconData }]));
1078
1119
  }
1079
- // node_modules/@lucide/svelte/dist/icons/chevron-right.svelte
1120
+ // node_modules/@lucide/svelte/dist/icons/circle-stop.svelte
1080
1121
  import"svelte/internal/flags/async";
1081
1122
  import * as $23 from "svelte/internal/server";
1082
- function Chevron_right($$renderer, $$props) {
1123
+ function Circle_stop($$renderer, $$props) {
1083
1124
  let { $$slots, $$events, ...props } = $$props;
1084
- const iconNode = [["path", { d: "m9 18 6-6-6-6" }]];
1085
- Icon($$renderer, $23.spread_props([{ name: "chevron-right" }, props, { iconNode }]));
1125
+ const iconData = {
1126
+ name: "circle-stop",
1127
+ size: 24,
1128
+ node: [
1129
+ ["circle", { cx: "12", cy: "12", r: "10" }],
1130
+ ["rect", { x: "9", y: "9", width: "6", height: "6", rx: "1" }]
1131
+ ],
1132
+ aliases: ["stop-circle"]
1133
+ };
1134
+ Icon($$renderer, $23.spread_props([props, { icon: iconData }]));
1086
1135
  }
1087
1136
  // src/components/IdeBar.svelte
1088
1137
  function IdeBar($$renderer, $$props) {
@@ -1093,14 +1142,46 @@ function IdeBar($$renderer, $$props) {
1093
1142
  attention,
1094
1143
  editingId,
1095
1144
  editingName = undefined,
1145
+ stopping = [],
1096
1146
  onreload,
1097
1147
  onselect,
1148
+ onstop,
1149
+ ondropfiles,
1098
1150
  onstartrename,
1099
1151
  oncommitrename,
1100
1152
  oncancelrename
1101
1153
  } = $$props;
1102
- const activeIndex = $24.derived(() => running.findIndex((i) => i.id === active));
1103
- const focusIndex = $24.derived(() => activeIndex() >= 0 ? activeIndex() : 0);
1154
+ const isStopping = (id) => stopping.includes(id);
1155
+ let dropTarget = null;
1156
+ let tipWidth = 0;
1157
+ const tipLeft = $24.derived(() => dropTarget ? Math.max(8, Math.min(dropTarget.x - tipWidth / 2, dropTarget.maxX - tipWidth)) : 0);
1158
+ function onSlotDrag(e, id) {
1159
+ if (!ondropfiles || !e.dataTransfer?.types.includes("Files"))
1160
+ return;
1161
+ e.preventDefault();
1162
+ e.dataTransfer.dropEffect = "copy";
1163
+ if (dropTarget?.id === id)
1164
+ return;
1165
+ const r = e.currentTarget.getBoundingClientRect();
1166
+ dropTarget = {
1167
+ id,
1168
+ x: r.left + r.width / 2,
1169
+ y: r.bottom,
1170
+ maxX: document.documentElement.clientWidth - 8
1171
+ };
1172
+ }
1173
+ function onSlotLeave(e) {
1174
+ if (e.currentTarget.contains(e.relatedTarget))
1175
+ return;
1176
+ dropTarget = null;
1177
+ }
1178
+ function onSlotDrop(e, id) {
1179
+ if (!ondropfiles)
1180
+ return;
1181
+ e.preventDefault();
1182
+ dropTarget = null;
1183
+ ondropfiles(id, filesFrom(e.dataTransfer));
1184
+ }
1104
1185
  let viewport = null;
1105
1186
  let content = null;
1106
1187
  let atStart = true;
@@ -1120,8 +1201,8 @@ function IdeBar($$renderer, $$props) {
1120
1201
  onselect(inst.id);
1121
1202
  tabEls[inst.id]?.focus();
1122
1203
  }
1123
- function onTabKeydown(e) {
1124
- const next = nextTabIndex(activeIndex(), e.key, running.length);
1204
+ function onTabKeydown(e, index) {
1205
+ const next = nextTabIndex(index, e.key, running.length);
1125
1206
  if (next === null)
1126
1207
  return;
1127
1208
  e.preventDefault();
@@ -1135,23 +1216,24 @@ function IdeBar($$renderer, $$props) {
1135
1216
  AppBar($$renderer2, {
1136
1217
  children: ($$renderer3) => {
1137
1218
  if (running.length > 0) {
1138
- $$renderer3.push("<!--[0-->");
1139
- $$renderer3.push(`<div class="strip svelte-r39acv">`);
1219
+ $$renderer3.push(`<!--[0--><div class="strip svelte-r39acv">`);
1140
1220
  if (overflowing()) {
1141
- $$renderer3.push("<!--[0-->");
1142
- $$renderer3.push(`<button type="button" class="page svelte-r39acv"${$24.attr("disabled", atStart, true)} aria-label="Scroll tabs left">`);
1221
+ $$renderer3.push(`<!--[0--><button type="button" class="page svelte-r39acv"${$24.attr("disabled", atStart, true)} aria-label="Scroll tabs left">`);
1143
1222
  Chevron_left($$renderer3, { size: 16 });
1144
1223
  $$renderer3.push(`<!----></button>`);
1145
1224
  } else {
1146
1225
  $$renderer3.push("<!--[-1-->");
1147
1226
  }
1148
- $$renderer3.push(`<!--]--> <div class="viewport svelte-r39acv"><div class="tabs svelte-r39acv" role="tablist" aria-label="Instances"><!--[-->`);
1227
+ $$renderer3.push(`<!--]--> <div class="viewport svelte-r39acv"><nav class="tabs svelte-r39acv" aria-label="Instances"><!--[-->`);
1149
1228
  const each_array = $24.ensure_array_like(running);
1150
1229
  for (let i = 0, $$length = each_array.length;i < $$length; i++) {
1151
1230
  let inst = each_array[i];
1231
+ $$renderer3.push(`<div${$24.attr_class("tab-slot svelte-r39acv", undefined, {
1232
+ active: inst.id === active,
1233
+ "drop-target": dropTarget?.id === inst.id
1234
+ })} role="presentation">`);
1152
1235
  if (editingId === inst.id) {
1153
- $$renderer3.push("<!--[0-->");
1154
- $$renderer3.push(`<div class="tab editing svelte-r39acv">`);
1236
+ $$renderer3.push(`<!--[0--><div class="tab editing svelte-r39acv">`);
1155
1237
  Avatar($$renderer3, {
1156
1238
  name: inst.name,
1157
1239
  art: findAvatar(inst.avatar ?? undefined) ?? null,
@@ -1159,8 +1241,7 @@ function IdeBar($$renderer, $$props) {
1159
1241
  });
1160
1242
  $$renderer3.push(`<!----> <input class="tab-name-edit svelte-r39acv"${$24.attr("value", editingName)} autofocus=""/></div>`);
1161
1243
  } else {
1162
- $$renderer3.push("<!--[-1-->");
1163
- $$renderer3.push(`<button type="button"${$24.attr_class("tab svelte-r39acv", undefined, { active: inst.id === active })}${$24.attr("id", `tab-${$24.stringify(inst.id)}`)} role="tab"${$24.attr("aria-selected", inst.id === active)}${$24.attr("tabindex", i === focusIndex() ? 0 : -1)}${$24.attr("title", inst.name)}>`);
1244
+ $$renderer3.push(`<!--[-1--><button type="button"${$24.attr_class("tab svelte-r39acv", undefined, { active: inst.id === active })}${$24.attr("id", `tab-${$24.stringify(inst.id)}`)}${$24.attr("aria-current", inst.id === active ? "page" : undefined)}${$24.attr("title", inst.name)}>`);
1164
1245
  Avatar($$renderer3, {
1165
1246
  name: inst.name,
1166
1247
  art: findAvatar(inst.avatar ?? undefined) ?? null,
@@ -1176,19 +1257,25 @@ function IdeBar($$renderer, $$props) {
1176
1257
  }
1177
1258
  $$renderer3.push(`<!--]--></span> `);
1178
1259
  if (inst.id !== active && attention[inst.id]) {
1179
- $$renderer3.push("<!--[0-->");
1180
- $$renderer3.push(`<span${$24.attr_class(`attn ${$24.stringify(attention[inst.id])}`, "svelte-r39acv")}${$24.attr("aria-label", attention[inst.id] === "waiting" ? "Claude is waiting for input" : "Claude finished")}></span>`);
1260
+ $$renderer3.push(`<!--[0--><span${$24.attr_class(`attn ${$24.stringify(attention[inst.id])}`, "svelte-r39acv")}${$24.attr("aria-label", attention[inst.id] === "waiting" ? "Claude is waiting for input" : "Claude finished")}></span>`);
1261
+ } else {
1262
+ $$renderer3.push("<!--[-1-->");
1263
+ }
1264
+ $$renderer3.push(`<!--]--></button> `);
1265
+ if (onstop) {
1266
+ $$renderer3.push(`<!--[0--><button type="button" class="tab-stop svelte-r39acv"${$24.attr("disabled", isStopping(inst.id), true)}${$24.attr("title", isStopping(inst.id) ? "Stopping\u2026" : `Stop ${inst.name}`)}${$24.attr("aria-label", isStopping(inst.id) ? "Stopping\u2026" : `Stop ${inst.name}`)}>`);
1267
+ Circle_stop($$renderer3, { size: 20 });
1268
+ $$renderer3.push(`<!----></button>`);
1181
1269
  } else {
1182
1270
  $$renderer3.push("<!--[-1-->");
1183
1271
  }
1184
- $$renderer3.push(`<!--]--></button>`);
1272
+ $$renderer3.push(`<!--]-->`);
1185
1273
  }
1186
- $$renderer3.push(`<!--]-->`);
1274
+ $$renderer3.push(`<!--]--></div>`);
1187
1275
  }
1188
- $$renderer3.push(`<!--]--></div></div> `);
1276
+ $$renderer3.push(`<!--]--></nav></div> `);
1189
1277
  if (overflowing()) {
1190
- $$renderer3.push("<!--[0-->");
1191
- $$renderer3.push(`<button type="button" class="page trailing svelte-r39acv"${$24.attr("disabled", atEnd, true)} aria-label="Scroll tabs right">`);
1278
+ $$renderer3.push(`<!--[0--><button type="button" class="page trailing svelte-r39acv"${$24.attr("disabled", atEnd, true)} aria-label="Scroll tabs right">`);
1192
1279
  Chevron_right($$renderer3, { size: 16 });
1193
1280
  $$renderer3.push(`<!----></button>`);
1194
1281
  } else {
@@ -1200,8 +1287,7 @@ function IdeBar($$renderer, $$props) {
1200
1287
  }
1201
1288
  $$renderer3.push(`<!--]--> <div class="right svelte-r39acv">`);
1202
1289
  if (onreload) {
1203
- $$renderer3.push("<!--[0-->");
1204
- $$renderer3.push(`<button type="button" class="reload svelte-r39acv" title="Reload editor" aria-label="Reload editor">`);
1290
+ $$renderer3.push(`<!--[0--><button type="button" class="reload svelte-r39acv" title="Reload editor" aria-label="Reload editor">`);
1205
1291
  Rotate_cw($$renderer3, { size: 18 });
1206
1292
  $$renderer3.push(`<!----></button>`);
1207
1293
  } else {
@@ -1213,6 +1299,16 @@ function IdeBar($$renderer, $$props) {
1213
1299
  },
1214
1300
  $$slots: { default: true }
1215
1301
  });
1302
+ $$renderer2.push(`<!----> `);
1303
+ if (dropTarget) {
1304
+ $$renderer2.push(`<!--[0--><div class="drop-tip panel svelte-r39acv"${$24.attr_style("", {
1305
+ left: `${$24.stringify(tipLeft())}px`,
1306
+ top: `${$24.stringify(dropTarget.y)}px`
1307
+ })}>Drop to save into codebay-inbox/</div>`);
1308
+ } else {
1309
+ $$renderer2.push("<!--[-1-->");
1310
+ }
1311
+ $$renderer2.push(`<!--]-->`);
1216
1312
  $24.bind_props($$props, { editingName });
1217
1313
  });
1218
1314
  }
@@ -1240,8 +1336,7 @@ function IdeLoader($$renderer, $$props) {
1240
1336
  }
1241
1337
  $$renderer2.push(`<!--]--></div> <div class="label svelte-w5e143">Loading ${$25.escape(isTerminal() ? "terminal" : "editor")}<span class="dot svelte-w5e143">.</span><span class="dot svelte-w5e143">.</span><span class="dot svelte-w5e143">.</span></div> `);
1242
1338
  if (stalled) {
1243
- $$renderer2.push("<!--[0-->");
1244
- $$renderer2.push(`<div class="stalled svelte-w5e143"><p class="svelte-w5e143">Waiting for ${$25.escape(isTerminal() ? "the terminal" : "code-server")} to answer inside the container.</p> `);
1339
+ $$renderer2.push(`<!--[0--><div class="stalled svelte-w5e143"><p class="svelte-w5e143">Waiting for ${$25.escape(isTerminal() ? "the terminal" : "code-server")} to answer inside the container.</p> `);
1245
1340
  if (onoverride) {
1246
1341
  $$renderer2.push("<!--[0-->");
1247
1342
  Button($$renderer2, {
@@ -1272,35 +1367,60 @@ import"svelte/internal/flags/async";
1272
1367
  import * as $26 from "svelte/internal/server";
1273
1368
  function Panel_right_open($$renderer, $$props) {
1274
1369
  let { $$slots, $$events, ...props } = $$props;
1275
- const iconNode = [
1276
- [
1277
- "rect",
1278
- { width: "18", height: "18", x: "3", y: "3", rx: "2" }
1279
- ],
1280
- ["path", { d: "M15 3v18" }],
1281
- ["path", { d: "m10 15-3-3 3-3" }]
1282
- ];
1283
- Icon($$renderer, $26.spread_props([{ name: "panel-right-open" }, props, { iconNode }]));
1370
+ const iconData = {
1371
+ name: "panel-right-open",
1372
+ size: 24,
1373
+ node: [
1374
+ [
1375
+ "rect",
1376
+ { width: "18", height: "18", x: "3", y: "3", rx: "2" }
1377
+ ],
1378
+ ["path", { d: "M15 3v18" }],
1379
+ ["path", { d: "m10 15-3-3 3-3" }]
1380
+ ]
1381
+ };
1382
+ Icon($$renderer, $26.spread_props([props, { icon: iconData }]));
1284
1383
  }
1285
1384
  // node_modules/@lucide/svelte/dist/icons/panel-right-close.svelte
1286
1385
  import"svelte/internal/flags/async";
1287
1386
  import * as $27 from "svelte/internal/server";
1288
1387
  function Panel_right_close($$renderer, $$props) {
1289
1388
  let { $$slots, $$events, ...props } = $$props;
1290
- const iconNode = [
1291
- [
1292
- "rect",
1293
- { width: "18", height: "18", x: "3", y: "3", rx: "2" }
1294
- ],
1295
- ["path", { d: "M15 3v18" }],
1296
- ["path", { d: "m8 9 3 3-3 3" }]
1297
- ];
1298
- Icon($$renderer, $27.spread_props([{ name: "panel-right-close" }, props, { iconNode }]));
1389
+ const iconData = {
1390
+ name: "panel-right-close",
1391
+ size: 24,
1392
+ node: [
1393
+ [
1394
+ "rect",
1395
+ { width: "18", height: "18", x: "3", y: "3", rx: "2" }
1396
+ ],
1397
+ ["path", { d: "M15 3v18" }],
1398
+ ["path", { d: "m8 9 3 3-3 3" }]
1399
+ ]
1400
+ };
1401
+ Icon($$renderer, $27.spread_props([props, { icon: iconData }]));
1299
1402
  }
1300
1403
  // src/components/TerminalPane.svelte
1301
1404
  import"svelte/internal/flags/async";
1302
1405
  import * as $28 from "svelte/internal/server";
1303
1406
  import { onMount } from "svelte";
1407
+ // src/lib/osc52.ts
1408
+ function decodeOsc52(data) {
1409
+ const sep = data.indexOf(";");
1410
+ if (sep === -1)
1411
+ return null;
1412
+ const payload = data.slice(sep + 1).replace(/\s+/g, "");
1413
+ if (payload === "" || payload === "?")
1414
+ return null;
1415
+ try {
1416
+ const bytes = Uint8Array.from(atob(payload), (c) => c.charCodeAt(0));
1417
+ return new TextDecoder().decode(bytes);
1418
+ } catch {
1419
+ return null;
1420
+ }
1421
+ }
1422
+
1423
+ // src/components/TerminalPane.svelte
1304
1424
  function TerminalPane($$renderer, $$props) {
1305
1425
  $$renderer.component(($$renderer2) => {
1306
1426
  let { id, active, arg, focus = true, actions } = $$props;
@@ -1388,6 +1508,32 @@ function TerminalPane($$renderer, $$props) {
1388
1508
  start();
1389
1509
  }
1390
1510
  }
1511
+ async function toClipboard(text) {
1512
+ if (!text)
1513
+ return;
1514
+ try {
1515
+ await navigator.clipboard.writeText(text);
1516
+ return;
1517
+ } catch {}
1518
+ const ta = document.createElement("textarea");
1519
+ ta.value = text;
1520
+ ta.setAttribute("aria-hidden", "true");
1521
+ ta.style.position = "fixed";
1522
+ ta.style.opacity = "0";
1523
+ document.body.appendChild(ta);
1524
+ ta.select();
1525
+ try {
1526
+ document.execCommand("copy");
1527
+ } catch {}
1528
+ ta.remove();
1529
+ if (active && focus)
1530
+ term?.focus();
1531
+ }
1532
+ function copySelection() {
1533
+ const sel = term?.getSelection();
1534
+ if (sel)
1535
+ toClipboard(sel);
1536
+ }
1391
1537
  function fitSafe() {
1392
1538
  if (el?.clientWidth > 0 && el?.clientHeight > 0) {
1393
1539
  try {
@@ -1424,6 +1570,21 @@ function TerminalPane($$renderer, $$props) {
1424
1570
  term.open(el);
1425
1571
  applyTheme();
1426
1572
  fitSafe();
1573
+ term.parser.registerOscHandler(52, (data) => {
1574
+ const text = decodeOsc52(data);
1575
+ if (text !== null)
1576
+ toClipboard(text);
1577
+ return true;
1578
+ });
1579
+ term.attachCustomKeyEventHandler((e) => {
1580
+ if (e.type !== "keydown" || !term?.hasSelection())
1581
+ return true;
1582
+ const isCopy = e.ctrlKey && (e.key === "Insert" || e.altKey && e.key.toLowerCase() === "c");
1583
+ if (!isCopy)
1584
+ return true;
1585
+ copySelection();
1586
+ return false;
1587
+ });
1427
1588
  term.onData((d) => send(CMD_INPUT + d));
1428
1589
  term.onResize(({ cols, rows }) => send(CMD_RESIZE + JSON.stringify({ columns: cols, rows })));
1429
1590
  themeObs = new MutationObserver(applyTheme);
@@ -1434,8 +1595,10 @@ function TerminalPane($$renderer, $$props) {
1434
1595
  })();
1435
1596
  const sizeObs = new ResizeObserver(() => fitSafe());
1436
1597
  sizeObs.observe(el);
1598
+ el.addEventListener("mouseup", copySelection);
1437
1599
  return () => {
1438
1600
  disposed = true;
1601
+ el.removeEventListener("mouseup", copySelection);
1439
1602
  sizeObs.disconnect();
1440
1603
  themeObs?.disconnect();
1441
1604
  scheme.removeEventListener("change", onScheme);
@@ -1449,8 +1612,7 @@ function TerminalPane($$renderer, $$props) {
1449
1612
  });
1450
1613
  $$renderer2.push(`<div class="term svelte-ui3nvu"></div> <div class="overlay svelte-ui3nvu">`);
1451
1614
  if (!connected) {
1452
- $$renderer2.push("<!--[0-->");
1453
- $$renderer2.push(`<span class="status svelte-ui3nvu">connecting\u2026</span>`);
1615
+ $$renderer2.push(`<!--[0--><span class="status svelte-ui3nvu">connecting\u2026</span>`);
1454
1616
  } else {
1455
1617
  $$renderer2.push("<!--[-1-->");
1456
1618
  }
@@ -1523,8 +1685,7 @@ function TerminalSplit($$renderer, $$props) {
1523
1685
  });
1524
1686
  $$renderer2.push(`<!----></div> `);
1525
1687
  if (mounted) {
1526
- $$renderer2.push("<!--[0-->");
1527
- $$renderer2.push(`<div${$29.attr_class("divider svelte-1ysvu88", undefined, { hidden: !open })} role="separator" aria-orientation="vertical" aria-label="Resize terminal panes"${$29.attr("aria-valuenow", Math.round(ratio))}${$29.attr("aria-valuemin", 20)}${$29.attr("aria-valuemax", 80)} tabindex="0"></div> <div${$29.attr_class("side svelte-1ysvu88", undefined, { hidden: !open })}${$29.attr_style("", { "flex-basis": `${$29.stringify(100 - ratio)}%` })}>`);
1688
+ $$renderer2.push(`<!--[0--><div${$29.attr_class("divider svelte-1ysvu88", undefined, { hidden: !open })} role="separator" aria-orientation="vertical" aria-label="Resize terminal panes"${$29.attr("aria-valuenow", Math.round(ratio))}${$29.attr("aria-valuemin", 20)}${$29.attr("aria-valuemax", 80)} tabindex="0"></div> <div${$29.attr_class("side svelte-1ysvu88", undefined, { hidden: !open })}${$29.attr_style("", { "flex-basis": `${$29.stringify(100 - ratio)}%` })}>`);
1528
1689
  TerminalPane($$renderer2, {
1529
1690
  id,
1530
1691
  arg: "shell",
@@ -1553,6 +1714,18 @@ function AppShell($$renderer, $$props) {
1553
1714
  let attention = Object.fromEntries(snapshot.map((i) => [i.id, i.attention]));
1554
1715
  let editingId = null;
1555
1716
  let editingName = "";
1717
+ const stopping = new SvelteSet;
1718
+ async function stopTab(id) {
1719
+ if (stopping.has(id))
1720
+ return;
1721
+ stopping.add(id);
1722
+ try {
1723
+ await apiPost(`/api/instances/${id}/stop`, undefined, "Failed to stop instance");
1724
+ } catch (err) {
1725
+ dist_default.error(err.message);
1726
+ stopping.delete(id);
1727
+ }
1728
+ }
1556
1729
  function startRename(instance) {
1557
1730
  editingId = instance.id;
1558
1731
  editingName = instance.name;
@@ -1621,6 +1794,23 @@ function AppShell($$renderer, $$props) {
1621
1794
  tick2().then(() => frames[target.id]?.contentWindow?.focus());
1622
1795
  }
1623
1796
  const framedTabIds = $30.derived(() => running().filter((i) => i.mode !== "terminal" && loadedFrames.has(i.id)).map((i) => i.id).join(" "));
1797
+ async function handleUpload(id, files) {
1798
+ for (const file of files) {
1799
+ try {
1800
+ const saved = await uploadFile(id, file);
1801
+ dist_default.success(`Saved ${saved.containerPath}`);
1802
+ navigator.clipboard.writeText(saved.containerPath).catch(() => {});
1803
+ } catch (err) {
1804
+ dist_default.error(err.message);
1805
+ }
1806
+ }
1807
+ }
1808
+ let dropping = false;
1809
+ function onDrop(e) {
1810
+ e.preventDefault();
1811
+ dropping = false;
1812
+ handleUpload(active(), filesFrom(e.dataTransfer));
1813
+ }
1624
1814
  let $$settled = true;
1625
1815
  let $$inner_renderer;
1626
1816
  function $$render_inner($$renderer3) {
@@ -1632,8 +1822,11 @@ function AppShell($$renderer, $$props) {
1632
1822
  active: active(),
1633
1823
  attention,
1634
1824
  editingId,
1825
+ stopping: [...stopping],
1635
1826
  onreload: activeInstance() && activeInstance().mode !== "terminal" && mountable(active()) ? reloadActive : undefined,
1636
1827
  onselect: (id) => navigate(`/ide/${id}`),
1828
+ onstop: stopTab,
1829
+ ondropfiles: livePreflight.uploadEnabled ? (id, files) => void handleUpload(id, files) : undefined,
1637
1830
  onstartrename: startRename,
1638
1831
  oncommitrename: commitRename,
1639
1832
  oncancelrename: cancelRename,
@@ -1661,8 +1854,7 @@ function AppShell($$renderer, $$props) {
1661
1854
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
1662
1855
  let inst = each_array[$$index];
1663
1856
  if (visited.has(inst.id)) {
1664
- $$renderer3.push("<!--[0-->");
1665
- $$renderer3.push(`<div${$30.attr_class("pane svelte-1duc7gd", undefined, { active: inst.id === active() })} role="tabpanel"${$30.attr("aria-labelledby", `tab-${$30.stringify(inst.id)}`)}>`);
1857
+ $$renderer3.push(`<!--[0--><div${$30.attr_class("pane svelte-1duc7gd", undefined, { active: inst.id === active() })} role="region"${$30.attr("aria-labelledby", `tab-${$30.stringify(inst.id)}`)}>`);
1666
1858
  if (mountable(inst.id)) {
1667
1859
  $$renderer3.push("<!--[0-->");
1668
1860
  if (inst.mode === "terminal") {
@@ -1673,8 +1865,7 @@ function AppShell($$renderer, $$props) {
1673
1865
  initialOpen: inst.terminal_split === 1
1674
1866
  });
1675
1867
  } else {
1676
- $$renderer3.push("<!--[-1-->");
1677
- $$renderer3.push(`<iframe${$30.attr("src", ideUrl(inst))}${$30.attr("title", inst.name)} class="svelte-1duc7gd" onload="this.__e=event"></iframe>`);
1868
+ $$renderer3.push(`<!--[-1--><iframe${$30.attr("src", ideUrl(inst))}${$30.attr("title", inst.name)} allow="clipboard-read; clipboard-write" class="svelte-1duc7gd" onload="this.__e=event"></iframe>`);
1678
1869
  }
1679
1870
  $$renderer3.push(`<!--]-->`);
1680
1871
  } else {
@@ -1694,6 +1885,13 @@ function AppShell($$renderer, $$props) {
1694
1885
  } else {
1695
1886
  $$renderer3.push("<!--[-1-->");
1696
1887
  }
1888
+ $$renderer3.push(`<!--]--> `);
1889
+ if (dropping && inst.id === active() && inst.mode === "terminal") {
1890
+ $$renderer3.push("<!--[0-->");
1891
+ DropZone($$renderer3, { ondrop: onDrop });
1892
+ } else {
1893
+ $$renderer3.push("<!--[-1-->");
1894
+ }
1697
1895
  $$renderer3.push(`<!--]--></div>`);
1698
1896
  } else {
1699
1897
  $$renderer3.push("<!--[-1-->");
@@ -1702,8 +1900,7 @@ function AppShell($$renderer, $$props) {
1702
1900
  }
1703
1901
  $$renderer3.push(`<!--]--> `);
1704
1902
  if (onIde() && running().length === 0) {
1705
- $$renderer3.push("<!--[0-->");
1706
- $$renderer3.push(`<div class="empty svelte-1duc7gd">No running instances.</div>`);
1903
+ $$renderer3.push(`<!--[0--><div class="empty svelte-1duc7gd">No running instances.</div>`);
1707
1904
  } else {
1708
1905
  $$renderer3.push("<!--[-1-->");
1709
1906
  }
@@ -1725,28 +1922,30 @@ function App($$renderer, $$props) {
1725
1922
  $$renderer.component(($$renderer2) => {
1726
1923
  let { preflight, initialPath, snapshot, pet, filter } = $$props;
1727
1924
  if (true) {
1728
- let failed = function($$renderer3, error) {
1729
- $$renderer3.push(`<mochi-island-failure data-component="AppShell"${$31.attr("data-message", error.message)}></mochi-island-failure>`);
1730
- };
1731
1925
  $$renderer2.push("<!--[0-->");
1732
- $$renderer2.boundary({ failed }, ($$renderer3) => {
1733
- $$renderer3.push(`<!--[-->`);
1734
- {
1735
- HydratableBoundary($$renderer3, {
1736
- children: ($$renderer4) => {
1737
- $$renderer4.push(`<mochi-hydratable-island component-name="AppShell_2rtnxn6pgp2rh" component-url="__MOCHI_COMPONENT_URL__AppShell_2rtnxn6pgp2rh__"${$31.attr("props-ref", emitIslandProps({ preflight, initialPath, snapshot, pet, filter }))}>`);
1738
- $$renderer4.push(`<!--[-->`);
1739
- {
1740
- AppShell($$renderer4, { preflight, initialPath, snapshot, pet, filter });
1741
- }
1742
- $$renderer4.push(`<!--]-->`);
1743
- $$renderer4.push(`</mochi-hydratable-island>`);
1744
- },
1745
- $$slots: { default: true }
1746
- });
1747
- }
1748
- $$renderer3.push(`<!--]-->`);
1749
- });
1926
+ {
1927
+ let failed = function($$renderer3, error) {
1928
+ $$renderer3.push(`<mochi-island-failure data-component="AppShell"${$31.attr("data-message", error.message)}></mochi-island-failure>`);
1929
+ };
1930
+ $$renderer2.boundary({ failed }, ($$renderer3) => {
1931
+ $$renderer3.push(`<!--[-->`);
1932
+ {
1933
+ HydratableBoundary($$renderer3, {
1934
+ children: ($$renderer4) => {
1935
+ $$renderer4.push(`<mochi-hydratable-island component-name="AppShell_2rtnxn6pgp2rh" component-url="__MOCHI_COMPONENT_URL__AppShell_2rtnxn6pgp2rh__"${$31.attr("props-ref", emitIslandProps({ preflight, initialPath, snapshot, pet, filter }))}>`);
1936
+ $$renderer4.push(`<!--[-->`);
1937
+ {
1938
+ AppShell($$renderer4, { preflight, initialPath, snapshot, pet, filter });
1939
+ }
1940
+ $$renderer4.push(`<!--]-->`);
1941
+ $$renderer4.push(`</mochi-hydratable-island>`);
1942
+ },
1943
+ $$slots: { default: true }
1944
+ });
1945
+ }
1946
+ $$renderer3.push(`<!--]-->`);
1947
+ });
1948
+ }
1750
1949
  }
1751
1950
  $$renderer2.push(`<!--]-->`);
1752
1951
  });