codebay 0.13.0 → 0.15.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 (85) hide show
  1. package/.mochi/manifest.json +522 -443
  2. package/.mochi/svelte-client/HydratableIsland-smgsf0ma.js +1 -0
  3. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-9vc087ep.js +2 -0
  4. package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-a48xq47a.js +14 -0
  5. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-d4zehrqz.js +3 -0
  6. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-t5175pf5.js +44 -0
  7. package/.mochi/svelte-client/chunk-0mstgbtr.js +2 -0
  8. package/.mochi/svelte-client/chunk-0q9g0kpg.js +1 -0
  9. package/.mochi/svelte-client/chunk-3fwjzw1r.js +1 -0
  10. package/.mochi/svelte-client/{chunk-spk1b2r4.js → chunk-5pg0be5f.js} +1 -1
  11. package/.mochi/svelte-client/{chunk-ccfh8hxz.js → chunk-a2hty99b.js} +1 -1
  12. package/.mochi/svelte-client/{chunk-0mc09cyb.js → chunk-ds9yn9cq.js} +1 -1
  13. package/.mochi/svelte-client/{chunk-phf7v5jj.js → chunk-fn03gxer.js} +1 -1
  14. package/.mochi/svelte-client/chunk-jhgq7f65.js +2 -0
  15. package/.mochi/svelte-client/chunk-p5a07kx1.js +1 -0
  16. package/.mochi/svelte-client/chunk-p5wpyhsf.js +2 -0
  17. package/.mochi/svelte-client/chunk-t2kfvtb6.js +2 -0
  18. package/.mochi/svelte-client/{chunk-x0m3k0rn.js → chunk-v3wg9mdy.js} +1 -1
  19. package/.mochi/svelte-compile/{App-94xsdn0w.server.js → App-68f9a9fq.server.js} +64 -59
  20. package/.mochi/svelte-compile/{Avatars-fnccw47h.server.js → Avatars-vyh3rwxx.server.js} +14 -29
  21. package/.mochi/svelte-compile/Instance-yfw7s5mp.server.js +627 -0
  22. package/.mochi/svelte-compile/{Settings-h7gsjyz3.server.js → Settings-0b5t9kw9.server.js} +348 -151
  23. package/.mochi/svelte-compile/{chunk-w0hca7va.js → chunk-0y3wrae9.js} +13 -1
  24. package/.mochi/svelte-compile/{chunk-ed46m58e.js → chunk-2qzc07gt.js} +13 -1
  25. package/.mochi/svelte-compile/chunk-ef3hvegw.js +21 -0
  26. package/.mochi/svelte-compile/chunk-f9td8ej2.js +24 -0
  27. package/.mochi/svelte-compile/{chunk-pqb403fh.js → chunk-g0eravvj.js} +5 -16
  28. package/.mochi/svelte-css/AgentLogBox-38adby5iygny7.css +1 -0
  29. package/.mochi/svelte-css/{InstanceCard-25z7nas7y98zk.css → InstanceCard-3vxozrp9uoads.css} +1 -1
  30. package/.mochi/svelte-css/{SettingsView-bccw34agd2bj.css → SettingsView-2400myxb9ot56.css} +1 -1
  31. package/README.md +32 -1
  32. package/migrations/0009_agent_runs.sql +24 -0
  33. package/migrations/0010_agent_run_model.sql +2 -0
  34. package/package.json +6 -2
  35. package/public/favicon.svg +9 -0
  36. package/src/components/AgentLogBox.svelte +458 -0
  37. package/src/components/AppShell.svelte +11 -0
  38. package/src/components/FolderBrowser.svelte +13 -5
  39. package/src/components/InstanceCard.svelte +38 -0
  40. package/src/components/InstanceView.svelte +8 -0
  41. package/src/components/SettingsView.svelte +260 -0
  42. package/src/components/UiShowcase.svelte +4 -2
  43. package/src/container-injections/claude-code-credentials.ts +2 -3
  44. package/src/container-injections/claude-code-skills.ts +125 -0
  45. package/src/container-injections/claude-output-style.ts +2 -3
  46. package/src/container-injections/claude-statusline.ts +9 -17
  47. package/src/container-injections/github-credentials.ts +12 -1
  48. package/src/index.ts +32 -7
  49. package/src/lib/agent-run-stream.ts +246 -0
  50. package/src/lib/agent-runs.server.ts +724 -0
  51. package/src/lib/auth.server.ts +11 -2
  52. package/src/lib/build-freshness.server.ts +71 -0
  53. package/src/lib/config.server.ts +29 -6
  54. package/src/lib/container-files.server.ts +23 -1
  55. package/src/lib/data-dir-lock.server.ts +78 -0
  56. package/src/lib/db.server.ts +120 -1
  57. package/src/lib/devcontainer.server.ts +60 -14
  58. package/src/lib/docker-client.server.ts +11 -5
  59. package/src/lib/drives.ts +11 -0
  60. package/src/lib/exec.server.ts +66 -5
  61. package/src/lib/host-claude.server.ts +31 -0
  62. package/src/lib/injections.server.ts +2 -0
  63. package/src/lib/instances.server.ts +45 -3
  64. package/src/lib/log-capture.server.ts +17 -5
  65. package/src/lib/mcp-auth.server.ts +52 -0
  66. package/src/lib/picker.server.ts +23 -2
  67. package/src/lib/sandbox-ops.server.ts +263 -0
  68. package/src/mcp/routes.server.ts +25 -0
  69. package/src/mcp/server.server.ts +52 -0
  70. package/src/mcp/tools.server.ts +494 -0
  71. package/src/pages/Settings.svelte +15 -0
  72. package/src/routes.ts +72 -1
  73. package/src/shell.html +1 -0
  74. package/src/types.ts +15 -0
  75. package/.mochi/svelte-client/HydratableIsland-zrdsrsmg.js +0 -1
  76. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-v7y7dh53.js +0 -2
  77. package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-tmwd6fpb.js +0 -14
  78. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-m7t64dbh.js +0 -1
  79. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-wedc9x9y.js +0 -39
  80. package/.mochi/svelte-client/chunk-5jwfs4p9.js +0 -2
  81. package/.mochi/svelte-client/chunk-6qg4q98a.js +0 -2
  82. package/.mochi/svelte-client/chunk-tmeh70wg.js +0 -2
  83. package/.mochi/svelte-client/chunk-vs1yjbqt.js +0 -2
  84. package/.mochi/svelte-client/chunk-y7f4jbdm.js +0 -2
  85. package/.mochi/svelte-compile/Instance-knnkcn2p.server.js +0 -377
@@ -1,20 +1,21 @@
1
1
  // @bun
2
2
  import {
3
+ Chevron_right,
3
4
  StatusBadge,
4
5
  forwardedPortUrl
5
- } from "./chunk-ed46m58e.js";
6
+ } from "./chunk-2qzc07gt.js";
6
7
  import {
7
8
  Layout_template,
8
9
  Plus,
9
- Terminal,
10
10
  tabShortcutsEnabled
11
- } from "./chunk-pqb403fh.js";
11
+ } from "./chunk-g0eravvj.js";
12
12
  import {
13
+ Terminal,
13
14
  apiDelete,
14
15
  apiFetch,
15
16
  apiPost,
16
17
  ideUrl
17
- } from "./chunk-w0hca7va.js";
18
+ } from "./chunk-0y3wrae9.js";
18
19
  import {
19
20
  AppBar,
20
21
  Avatar,
@@ -38,11 +39,11 @@ import {
38
39
 
39
40
  // src/pages/App.svelte
40
41
  import"svelte/internal/flags/async";
41
- import * as $31 from "svelte/internal/server";
42
+ import * as $30 from "svelte/internal/server";
42
43
 
43
44
  // src/components/AppShell.svelte
44
45
  import"svelte/internal/flags/async";
45
- import * as $30 from "svelte/internal/server";
46
+ import * as $29 from "svelte/internal/server";
46
47
  import { tick as tick2 } from "svelte";
47
48
  import { SvelteSet } from "svelte/reactivity";
48
49
 
@@ -124,6 +125,10 @@ function isRepoUrl(input) {
124
125
  return parseRepoUrl(input) !== null;
125
126
  }
126
127
 
128
+ // src/lib/drives.ts
129
+ var DRIVES_ROOT = "::drives";
130
+ var DRIVES_ROOT_LABEL = "This PC";
131
+
127
132
  // node_modules/@lucide/svelte/dist/icons/folder-clock.svelte
128
133
  import"svelte/internal/flags/async";
129
134
  import * as $ from "svelte/internal/server";
@@ -218,6 +223,7 @@ function FolderBrowser($$renderer, $$props) {
218
223
  onpick(repoUrl.trim(), { branch: repoBranch.trim() || undefined, mode: mode() });
219
224
  }
220
225
  const filtered = $6.derived(() => result ? result.entries.filter((e) => e.name.toLowerCase().includes(query.trim().toLowerCase())) : []);
226
+ const atDrivesRoot = $6.derived(() => result?.path === DRIVES_ROOT);
221
227
  const shownHistory = $6.derived(() => showAll ? history2 : history2.slice(0, 5));
222
228
  async function loadHistory() {
223
229
  try {
@@ -255,7 +261,7 @@ function FolderBrowser($$renderer, $$props) {
255
261
  Layout_template($$renderer2, { size: 15 });
256
262
  $$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
263
  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> `);
264
+ $$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
265
  if (history2.length > 0) {
260
266
  $$renderer2.push("<!--[0-->");
261
267
  $$renderer2.push(`<div class="recent svelte-oq97c4"><div class="recent-label svelte-oq97c4">Recent</div> <!--[-->`);
@@ -329,7 +335,7 @@ function FolderBrowser($$renderer, $$props) {
329
335
  $$renderer2.push("<!--[-1-->");
330
336
  }
331
337
  $$renderer2.push(`<!--]--></div> `);
332
- if (result && !result.hasDevcontainer) {
338
+ if (result && !result.hasDevcontainer && !atDrivesRoot()) {
333
339
  $$renderer2.push("<!--[0-->");
334
340
  $$renderer2.push(`<div class="warn svelte-oq97c4">`);
335
341
  Triangle_alert($$renderer2, { size: 15 });
@@ -338,7 +344,7 @@ function FolderBrowser($$renderer, $$props) {
338
344
  } else {
339
345
  $$renderer2.push("<!--[-1-->");
340
346
  }
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>`);
347
+ $$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
348
  });
343
349
  }
344
350
 
@@ -479,6 +485,13 @@ function InstanceCard($$renderer, $$props) {
479
485
  $$renderer2.push("<!--[-1-->");
480
486
  }
481
487
  $$renderer2.push(`<!--]--> `);
488
+ if (instance.active_run) {
489
+ $$renderer2.push("<!--[0-->");
490
+ $$renderer2.push(`<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>`);
491
+ } else {
492
+ $$renderer2.push("<!--[-1-->");
493
+ }
494
+ $$renderer2.push(`<!--]--> `);
482
495
  if (instance.status === "error" && instance.error) {
483
496
  $$renderer2.push("<!--[0-->");
484
497
  $$renderer2.push(`<div class="card-error svelte-13338y7">${$10.escape(instance.error)}</div>`);
@@ -1052,7 +1065,7 @@ function DashboardView($$renderer, $$props) {
1052
1065
 
1053
1066
  // src/components/IdeBar.svelte
1054
1067
  import"svelte/internal/flags/async";
1055
- import * as $24 from "svelte/internal/server";
1068
+ import * as $23 from "svelte/internal/server";
1056
1069
 
1057
1070
  // node_modules/@lucide/svelte/dist/icons/rotate-cw.svelte
1058
1071
  import"svelte/internal/flags/async";
@@ -1076,14 +1089,6 @@ function Chevron_left($$renderer, $$props) {
1076
1089
  const iconNode = [["path", { d: "m15 18-6-6 6-6" }]];
1077
1090
  Icon($$renderer, $22.spread_props([{ name: "chevron-left" }, props, { iconNode }]));
1078
1091
  }
1079
- // node_modules/@lucide/svelte/dist/icons/chevron-right.svelte
1080
- import"svelte/internal/flags/async";
1081
- import * as $23 from "svelte/internal/server";
1082
- function Chevron_right($$renderer, $$props) {
1083
- 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 }]));
1086
- }
1087
1092
  // src/components/IdeBar.svelte
1088
1093
  function IdeBar($$renderer, $$props) {
1089
1094
  $$renderer.component(($$renderer2) => {
@@ -1099,14 +1104,14 @@ function IdeBar($$renderer, $$props) {
1099
1104
  oncommitrename,
1100
1105
  oncancelrename
1101
1106
  } = $$props;
1102
- const activeIndex = $24.derived(() => running.findIndex((i) => i.id === active));
1103
- const focusIndex = $24.derived(() => activeIndex() >= 0 ? activeIndex() : 0);
1107
+ const activeIndex = $23.derived(() => running.findIndex((i) => i.id === active));
1108
+ const focusIndex = $23.derived(() => activeIndex() >= 0 ? activeIndex() : 0);
1104
1109
  let viewport = null;
1105
1110
  let content = null;
1106
1111
  let atStart = true;
1107
1112
  let atEnd = true;
1108
1113
  const tabEls = {};
1109
- const overflowing = $24.derived(() => !atStart || !atEnd);
1114
+ const overflowing = $23.derived(() => !atStart || !atEnd);
1110
1115
  function measure() {
1111
1116
  if (!viewport)
1112
1117
  return;
@@ -1139,14 +1144,14 @@ function IdeBar($$renderer, $$props) {
1139
1144
  $$renderer3.push(`<div class="strip svelte-r39acv">`);
1140
1145
  if (overflowing()) {
1141
1146
  $$renderer3.push("<!--[0-->");
1142
- $$renderer3.push(`<button type="button" class="page svelte-r39acv"${$24.attr("disabled", atStart, true)} aria-label="Scroll tabs left">`);
1147
+ $$renderer3.push(`<button type="button" class="page svelte-r39acv"${$23.attr("disabled", atStart, true)} aria-label="Scroll tabs left">`);
1143
1148
  Chevron_left($$renderer3, { size: 16 });
1144
1149
  $$renderer3.push(`<!----></button>`);
1145
1150
  } else {
1146
1151
  $$renderer3.push("<!--[-1-->");
1147
1152
  }
1148
1153
  $$renderer3.push(`<!--]--> <div class="viewport svelte-r39acv"><div class="tabs svelte-r39acv" role="tablist" aria-label="Instances"><!--[-->`);
1149
- const each_array = $24.ensure_array_like(running);
1154
+ const each_array = $23.ensure_array_like(running);
1150
1155
  for (let i = 0, $$length = each_array.length;i < $$length; i++) {
1151
1156
  let inst = each_array[i];
1152
1157
  if (editingId === inst.id) {
@@ -1157,16 +1162,16 @@ function IdeBar($$renderer, $$props) {
1157
1162
  art: findAvatar(inst.avatar ?? undefined) ?? null,
1158
1163
  scale: 3
1159
1164
  });
1160
- $$renderer3.push(`<!----> <input class="tab-name-edit svelte-r39acv"${$24.attr("value", editingName)} autofocus=""/></div>`);
1165
+ $$renderer3.push(`<!----> <input class="tab-name-edit svelte-r39acv"${$23.attr("value", editingName)} autofocus=""/></div>`);
1161
1166
  } else {
1162
1167
  $$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)}>`);
1168
+ $$renderer3.push(`<button type="button"${$23.attr_class("tab svelte-r39acv", undefined, { active: inst.id === active })}${$23.attr("id", `tab-${$23.stringify(inst.id)}`)} role="tab"${$23.attr("aria-selected", inst.id === active)}${$23.attr("tabindex", i === focusIndex() ? 0 : -1)}${$23.attr("title", inst.name)}>`);
1164
1169
  Avatar($$renderer3, {
1165
1170
  name: inst.name,
1166
1171
  art: findAvatar(inst.avatar ?? undefined) ?? null,
1167
1172
  scale: 3
1168
1173
  });
1169
- $$renderer3.push(`<!----> <span class="tab-name svelte-r39acv">${$24.escape(inst.name)}</span> <span class="tab-mode svelte-r39acv"${$24.attr("aria-label", inst.mode === "terminal" ? "Terminal-only instance" : "Full IDE instance")}>`);
1174
+ $$renderer3.push(`<!----> <span class="tab-name svelte-r39acv">${$23.escape(inst.name)}</span> <span class="tab-mode svelte-r39acv"${$23.attr("aria-label", inst.mode === "terminal" ? "Terminal-only instance" : "Full IDE instance")}>`);
1170
1175
  if (inst.mode === "terminal") {
1171
1176
  $$renderer3.push("<!--[0-->");
1172
1177
  Terminal($$renderer3, { size: 11 });
@@ -1177,7 +1182,7 @@ function IdeBar($$renderer, $$props) {
1177
1182
  $$renderer3.push(`<!--]--></span> `);
1178
1183
  if (inst.id !== active && attention[inst.id]) {
1179
1184
  $$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>`);
1185
+ $$renderer3.push(`<span${$23.attr_class(`attn ${$23.stringify(attention[inst.id])}`, "svelte-r39acv")}${$23.attr("aria-label", attention[inst.id] === "waiting" ? "Claude is waiting for input" : "Claude finished")}></span>`);
1181
1186
  } else {
1182
1187
  $$renderer3.push("<!--[-1-->");
1183
1188
  }
@@ -1188,7 +1193,7 @@ function IdeBar($$renderer, $$props) {
1188
1193
  $$renderer3.push(`<!--]--></div></div> `);
1189
1194
  if (overflowing()) {
1190
1195
  $$renderer3.push("<!--[0-->");
1191
- $$renderer3.push(`<button type="button" class="page trailing svelte-r39acv"${$24.attr("disabled", atEnd, true)} aria-label="Scroll tabs right">`);
1196
+ $$renderer3.push(`<button type="button" class="page trailing svelte-r39acv"${$23.attr("disabled", atEnd, true)} aria-label="Scroll tabs right">`);
1192
1197
  Chevron_right($$renderer3, { size: 16 });
1193
1198
  $$renderer3.push(`<!----></button>`);
1194
1199
  } else {
@@ -1207,41 +1212,41 @@ function IdeBar($$renderer, $$props) {
1207
1212
  } else {
1208
1213
  $$renderer3.push("<!--[-1-->");
1209
1214
  }
1210
- $$renderer3.push(`<!--]--> <a class="cog svelte-r39acv"${$24.attr("href", withPopupMarker("/settings"))} target="_blank" rel="noopener noreferrer" title="Settings" aria-label="Settings">`);
1215
+ $$renderer3.push(`<!--]--> <a class="cog svelte-r39acv"${$23.attr("href", withPopupMarker("/settings"))} target="_blank" rel="noopener noreferrer" title="Settings" aria-label="Settings">`);
1211
1216
  Settings($$renderer3, { size: 18 });
1212
1217
  $$renderer3.push(`<!----></a></div>`);
1213
1218
  },
1214
1219
  $$slots: { default: true }
1215
1220
  });
1216
- $24.bind_props($$props, { editingName });
1221
+ $23.bind_props($$props, { editingName });
1217
1222
  });
1218
1223
  }
1219
1224
 
1220
1225
  // src/components/IdeLoader.svelte
1221
1226
  import"svelte/internal/flags/async";
1222
- import * as $25 from "svelte/internal/server";
1227
+ import * as $24 from "svelte/internal/server";
1223
1228
  function IdeLoader($$renderer, $$props) {
1224
1229
  $$renderer.component(($$renderer2) => {
1225
1230
  let { speed = 1, mode = "ide", stalledAfterMs, onoverride } = $$props;
1226
- const isTerminal = $25.derived(() => mode === "terminal");
1231
+ const isTerminal = $24.derived(() => mode === "terminal");
1227
1232
  let stalled = false;
1228
1233
  const ROWS = 3;
1229
1234
  const COLS = 22;
1230
1235
  const BASE_TICK_MS = 140;
1231
1236
  const FLIPS_PER_TICK = 7;
1232
- const tickMs = $25.derived(() => Math.max(20, BASE_TICK_MS / speed));
1237
+ const tickMs = $24.derived(() => Math.max(20, BASE_TICK_MS / speed));
1233
1238
  const seed = () => Array.from({ length: ROWS }, () => Array.from({ length: COLS }, () => Math.random() < 0.5 ? 0 : 1));
1234
1239
  let grid = seed();
1235
1240
  $$renderer2.push(`<div class="loader svelte-w5e143"><div class="grid svelte-w5e143" aria-hidden="true"><!--[-->`);
1236
- const each_array = $25.ensure_array_like(grid);
1241
+ const each_array = $24.ensure_array_like(grid);
1237
1242
  for (let i = 0, $$length = each_array.length;i < $$length; i++) {
1238
1243
  let row = each_array[i];
1239
- $$renderer2.push(`<div class="row svelte-w5e143">${$25.escape(row.join(""))}</div>`);
1244
+ $$renderer2.push(`<div class="row svelte-w5e143">${$24.escape(row.join(""))}</div>`);
1240
1245
  }
1241
- $$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> `);
1246
+ $$renderer2.push(`<!--]--></div> <div class="label svelte-w5e143">Loading ${$24.escape(isTerminal() ? "terminal" : "editor")}<span class="dot svelte-w5e143">.</span><span class="dot svelte-w5e143">.</span><span class="dot svelte-w5e143">.</span></div> `);
1242
1247
  if (stalled) {
1243
1248
  $$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> `);
1249
+ $$renderer2.push(`<div class="stalled svelte-w5e143"><p class="svelte-w5e143">Waiting for ${$24.escape(isTerminal() ? "the terminal" : "code-server")} to answer inside the container.</p> `);
1245
1250
  if (onoverride) {
1246
1251
  $$renderer2.push("<!--[0-->");
1247
1252
  Button($$renderer2, {
@@ -1265,11 +1270,11 @@ function IdeLoader($$renderer, $$props) {
1265
1270
 
1266
1271
  // src/components/TerminalSplit.svelte
1267
1272
  import"svelte/internal/flags/async";
1268
- import * as $29 from "svelte/internal/server";
1273
+ import * as $28 from "svelte/internal/server";
1269
1274
 
1270
1275
  // node_modules/@lucide/svelte/dist/icons/panel-right-open.svelte
1271
1276
  import"svelte/internal/flags/async";
1272
- import * as $26 from "svelte/internal/server";
1277
+ import * as $25 from "svelte/internal/server";
1273
1278
  function Panel_right_open($$renderer, $$props) {
1274
1279
  let { $$slots, $$events, ...props } = $$props;
1275
1280
  const iconNode = [
@@ -1280,11 +1285,11 @@ function Panel_right_open($$renderer, $$props) {
1280
1285
  ["path", { d: "M15 3v18" }],
1281
1286
  ["path", { d: "m10 15-3-3 3-3" }]
1282
1287
  ];
1283
- Icon($$renderer, $26.spread_props([{ name: "panel-right-open" }, props, { iconNode }]));
1288
+ Icon($$renderer, $25.spread_props([{ name: "panel-right-open" }, props, { iconNode }]));
1284
1289
  }
1285
1290
  // node_modules/@lucide/svelte/dist/icons/panel-right-close.svelte
1286
1291
  import"svelte/internal/flags/async";
1287
- import * as $27 from "svelte/internal/server";
1292
+ import * as $26 from "svelte/internal/server";
1288
1293
  function Panel_right_close($$renderer, $$props) {
1289
1294
  let { $$slots, $$events, ...props } = $$props;
1290
1295
  const iconNode = [
@@ -1295,11 +1300,11 @@ function Panel_right_close($$renderer, $$props) {
1295
1300
  ["path", { d: "M15 3v18" }],
1296
1301
  ["path", { d: "m8 9 3 3-3 3" }]
1297
1302
  ];
1298
- Icon($$renderer, $27.spread_props([{ name: "panel-right-close" }, props, { iconNode }]));
1303
+ Icon($$renderer, $26.spread_props([{ name: "panel-right-close" }, props, { iconNode }]));
1299
1304
  }
1300
1305
  // src/components/TerminalPane.svelte
1301
1306
  import"svelte/internal/flags/async";
1302
- import * as $28 from "svelte/internal/server";
1307
+ import * as $27 from "svelte/internal/server";
1303
1308
  import { onMount } from "svelte";
1304
1309
  function TerminalPane($$renderer, $$props) {
1305
1310
  $$renderer.component(($$renderer2) => {
@@ -1504,7 +1509,7 @@ function TerminalSplit($$renderer, $$props) {
1504
1509
  e.preventDefault();
1505
1510
  }
1506
1511
  function splitToggle($$renderer3) {
1507
- $$renderer3.push(`<button type="button"${$29.attr("aria-pressed", open)}${$29.attr("title", open ? "Hide the shell pane" : "Open a shell alongside Claude")}${$29.attr("aria-label", open ? "Hide the shell pane" : "Open a shell alongside Claude")}>`);
1512
+ $$renderer3.push(`<button type="button"${$28.attr("aria-pressed", open)}${$28.attr("title", open ? "Hide the shell pane" : "Open a shell alongside Claude")}${$28.attr("aria-label", open ? "Hide the shell pane" : "Open a shell alongside Claude")}>`);
1508
1513
  if (open) {
1509
1514
  $$renderer3.push("<!--[0-->");
1510
1515
  Panel_right_close($$renderer3, { size: 14 });
@@ -1514,7 +1519,7 @@ function TerminalSplit($$renderer, $$props) {
1514
1519
  }
1515
1520
  $$renderer3.push(`<!--]--></button>`);
1516
1521
  }
1517
- $$renderer2.push(`<div class="split svelte-1ysvu88"><div class="side svelte-1ysvu88"${$29.attr_style("", { "flex-basis": open ? `${ratio}%` : "100%" })}>`);
1522
+ $$renderer2.push(`<div class="split svelte-1ysvu88"><div class="side svelte-1ysvu88"${$28.attr_style("", { "flex-basis": open ? `${ratio}%` : "100%" })}>`);
1518
1523
  TerminalPane($$renderer2, {
1519
1524
  id,
1520
1525
  active,
@@ -1524,7 +1529,7 @@ function TerminalSplit($$renderer, $$props) {
1524
1529
  $$renderer2.push(`<!----></div> `);
1525
1530
  if (mounted) {
1526
1531
  $$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)}%` })}>`);
1532
+ $$renderer2.push(`<div${$28.attr_class("divider svelte-1ysvu88", undefined, { hidden: !open })} role="separator" aria-orientation="vertical" aria-label="Resize terminal panes"${$28.attr("aria-valuenow", Math.round(ratio))}${$28.attr("aria-valuemin", 20)}${$28.attr("aria-valuemax", 80)} tabindex="0"></div> <div${$28.attr_class("side svelte-1ysvu88", undefined, { hidden: !open })}${$28.attr_style("", { "flex-basis": `${$28.stringify(100 - ratio)}%` })}>`);
1528
1533
  TerminalPane($$renderer2, {
1529
1534
  id,
1530
1535
  arg: "shell",
@@ -1549,7 +1554,7 @@ function AppShell($$renderer, $$props) {
1549
1554
  let livePet = pet;
1550
1555
  let liveFilter = filter;
1551
1556
  let loaded = snapshot.length > 0;
1552
- const running = $30.derived(() => instances.filter((i) => i.status === "running"));
1557
+ const running = $29.derived(() => instances.filter((i) => i.status === "running"));
1553
1558
  let attention = Object.fromEntries(snapshot.map((i) => [i.id, i.attention]));
1554
1559
  let editingId = null;
1555
1560
  let editingName = "";
@@ -1580,9 +1585,9 @@ function AppShell($$renderer, $$props) {
1580
1585
  apiPost("/api/settings/filter", { value: v }).catch(() => {});
1581
1586
  }
1582
1587
  let path = initialPath;
1583
- const onIde = $30.derived(() => path.startsWith("/ide"));
1584
- const requestedId = $30.derived(() => path.startsWith("/ide/") ? path.slice("/ide/".length) : "");
1585
- const active = $30.derived(() => onIde() ? running().some((i) => i.id === requestedId()) ? requestedId() : running()[0]?.id ?? "" : "");
1588
+ const onIde = $29.derived(() => path.startsWith("/ide"));
1589
+ const requestedId = $29.derived(() => path.startsWith("/ide/") ? path.slice("/ide/".length) : "");
1590
+ const active = $29.derived(() => onIde() ? running().some((i) => i.id === requestedId()) ? requestedId() : running()[0]?.id ?? "" : "");
1586
1591
  function navigate(to) {
1587
1592
  if (to === path)
1588
1593
  return;
@@ -1595,7 +1600,7 @@ function AppShell($$renderer, $$props) {
1595
1600
  const forced = new SvelteSet;
1596
1601
  const mountable = (id) => everReady.has(id) || forced.has(id);
1597
1602
  const STALLED_AFTER_MS = 1e4;
1598
- const activeInstance = $30.derived(() => running().find((i) => i.id === active()));
1603
+ const activeInstance = $29.derived(() => running().find((i) => i.id === active()));
1599
1604
  const frames = {};
1600
1605
  function reloadActive() {
1601
1606
  const inst = activeInstance();
@@ -1620,11 +1625,11 @@ function AppShell($$renderer, $$props) {
1620
1625
  if (fromFrame)
1621
1626
  tick2().then(() => frames[target.id]?.contentWindow?.focus());
1622
1627
  }
1623
- const framedTabIds = $30.derived(() => running().filter((i) => i.mode !== "terminal" && loadedFrames.has(i.id)).map((i) => i.id).join(" "));
1628
+ const framedTabIds = $29.derived(() => running().filter((i) => i.mode !== "terminal" && loadedFrames.has(i.id)).map((i) => i.id).join(" "));
1624
1629
  let $$settled = true;
1625
1630
  let $$inner_renderer;
1626
1631
  function $$render_inner($$renderer3) {
1627
- $$renderer3.push(`<div${$30.attr_class("app svelte-1duc7gd", undefined, { ide: onIde() })}>`);
1632
+ $$renderer3.push(`<div${$29.attr_class("app svelte-1duc7gd", undefined, { ide: onIde() })}>`);
1628
1633
  if (onIde()) {
1629
1634
  $$renderer3.push("<!--[0-->");
1630
1635
  IdeBar($$renderer3, {
@@ -1656,13 +1661,13 @@ function AppShell($$renderer, $$props) {
1656
1661
  onFilter: setFilter
1657
1662
  });
1658
1663
  }
1659
- $$renderer3.push(`<!--]--> <div${$30.attr_class("panes svelte-1duc7gd", undefined, { hidden: !onIde() })}><!--[-->`);
1660
- const each_array = $30.ensure_array_like(running());
1664
+ $$renderer3.push(`<!--]--> <div${$29.attr_class("panes svelte-1duc7gd", undefined, { hidden: !onIde() })}><!--[-->`);
1665
+ const each_array = $29.ensure_array_like(running());
1661
1666
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
1662
1667
  let inst = each_array[$$index];
1663
1668
  if (visited.has(inst.id)) {
1664
1669
  $$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)}`)}>`);
1670
+ $$renderer3.push(`<div${$29.attr_class("pane svelte-1duc7gd", undefined, { active: inst.id === active() })} role="tabpanel"${$29.attr("aria-labelledby", `tab-${$29.stringify(inst.id)}`)}>`);
1666
1671
  if (mountable(inst.id)) {
1667
1672
  $$renderer3.push("<!--[0-->");
1668
1673
  if (inst.mode === "terminal") {
@@ -1674,7 +1679,7 @@ function AppShell($$renderer, $$props) {
1674
1679
  });
1675
1680
  } else {
1676
1681
  $$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>`);
1682
+ $$renderer3.push(`<iframe${$29.attr("src", ideUrl(inst))}${$29.attr("title", inst.name)} class="svelte-1duc7gd" onload="this.__e=event"></iframe>`);
1678
1683
  }
1679
1684
  $$renderer3.push(`<!--]-->`);
1680
1685
  } else {
@@ -1726,7 +1731,7 @@ function App($$renderer, $$props) {
1726
1731
  let { preflight, initialPath, snapshot, pet, filter } = $$props;
1727
1732
  if (true) {
1728
1733
  let failed = function($$renderer3, error) {
1729
- $$renderer3.push(`<mochi-island-failure data-component="AppShell"${$31.attr("data-message", error.message)}></mochi-island-failure>`);
1734
+ $$renderer3.push(`<mochi-island-failure data-component="AppShell"${$30.attr("data-message", error.message)}></mochi-island-failure>`);
1730
1735
  };
1731
1736
  $$renderer2.push("<!--[0-->");
1732
1737
  $$renderer2.boundary({ failed }, ($$renderer3) => {
@@ -1734,7 +1739,7 @@ function App($$renderer, $$props) {
1734
1739
  {
1735
1740
  HydratableBoundary($$renderer3, {
1736
1741
  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 }))}>`);
1742
+ $$renderer4.push(`<mochi-hydratable-island component-name="AppShell_2rtnxn6pgp2rh" component-url="__MOCHI_COMPONENT_URL__AppShell_2rtnxn6pgp2rh__"${$30.attr("props-ref", emitIslandProps({ preflight, initialPath, snapshot, pet, filter }))}>`);
1738
1743
  $$renderer4.push(`<!--[-->`);
1739
1744
  {
1740
1745
  AppShell($$renderer4, { preflight, initialPath, snapshot, pet, filter });
@@ -1,4 +1,7 @@
1
1
  // @bun
2
+ import {
3
+ Bot
4
+ } from "./chunk-f9td8ej2.js";
2
5
  import {
3
6
  Rotate_ccw
4
7
  } from "./chunk-jx6h1xzp.js";
@@ -27,11 +30,11 @@ import"./chunk-xpt1a7jm.js";
27
30
 
28
31
  // src/pages/Avatars.svelte
29
32
  import"svelte/internal/flags/async";
30
- import * as $9 from "svelte/internal/server";
33
+ import * as $8 from "svelte/internal/server";
31
34
 
32
35
  // src/components/AvatarsView.svelte
33
36
  import"svelte/internal/flags/async";
34
- import * as $8 from "svelte/internal/server";
37
+ import * as $7 from "svelte/internal/server";
35
38
 
36
39
  // src/components/AvatarEditor.svelte
37
40
  import"svelte/internal/flags/async";
@@ -371,27 +374,9 @@ function AvatarEditor($$renderer, $$props) {
371
374
  });
372
375
  }
373
376
 
374
- // node_modules/@lucide/svelte/dist/icons/bot.svelte
375
- import"svelte/internal/flags/async";
376
- import * as $6 from "svelte/internal/server";
377
- function Bot($$renderer, $$props) {
378
- let { $$slots, $$events, ...props } = $$props;
379
- const iconNode = [
380
- ["path", { d: "M12 8V4H8" }],
381
- [
382
- "rect",
383
- { width: "16", height: "12", x: "4", y: "8", rx: "2" }
384
- ],
385
- ["path", { d: "M2 14h2" }],
386
- ["path", { d: "M20 14h2" }],
387
- ["path", { d: "M15 13v2" }],
388
- ["path", { d: "M9 13v2" }]
389
- ];
390
- Icon($$renderer, $6.spread_props([{ name: "bot" }, props, { iconNode }]));
391
- }
392
377
  // node_modules/@lucide/svelte/dist/icons/pencil.svelte
393
378
  import"svelte/internal/flags/async";
394
- import * as $7 from "svelte/internal/server";
379
+ import * as $6 from "svelte/internal/server";
395
380
  function Pencil($$renderer, $$props) {
396
381
  let { $$slots, $$events, ...props } = $$props;
397
382
  const iconNode = [
@@ -403,7 +388,7 @@ function Pencil($$renderer, $$props) {
403
388
  ],
404
389
  ["path", { d: "m15 5 4 4" }]
405
390
  ];
406
- Icon($$renderer, $7.spread_props([{ name: "pencil" }, props, { iconNode }]));
391
+ Icon($$renderer, $6.spread_props([{ name: "pencil" }, props, { iconNode }]));
407
392
  }
408
393
  // src/components/AvatarsView.svelte
409
394
  function AvatarsView($$renderer, $$props) {
@@ -426,8 +411,8 @@ function AvatarsView($$renderer, $$props) {
426
411
  {
427
412
  AvatarEditor($$renderer2, { namePlaceholder, editing, oncancelEdit: () => editing = null });
428
413
  }
429
- $$renderer2.push(`<!----></div> <section class="catalog svelte-fkq7sr"><header class="svelte-fkq7sr"><h2 class="svelte-fkq7sr">The set</h2> <p class="svelte-fkq7sr">${$8.escape(avatars.length)} hand-crafted 8\xD78 sprites</p></header> <ul class="svelte-fkq7sr"><!--[-->`);
430
- const each_array = $8.ensure_array_like(avatars);
414
+ $$renderer2.push(`<!----></div> <section class="catalog svelte-fkq7sr"><header class="svelte-fkq7sr"><h2 class="svelte-fkq7sr">The set</h2> <p class="svelte-fkq7sr">${$7.escape(avatars.length)} hand-crafted 8\xD78 sprites</p></header> <ul class="svelte-fkq7sr"><!--[-->`);
415
+ const each_array = $7.ensure_array_like(avatars);
431
416
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
432
417
  let art = each_array[$$index];
433
418
  $$renderer2.push(`<li class="svelte-fkq7sr">`);
@@ -441,12 +426,12 @@ function AvatarsView($$renderer, $$props) {
441
426
  } else {
442
427
  $$renderer2.push("<!--[-1-->");
443
428
  }
444
- $$renderer2.push(`<!--]--> ${$8.escape(art.name)}</span> `);
429
+ $$renderer2.push(`<!--]--> ${$7.escape(art.name)}</span> `);
445
430
  if (art.robot) {
446
431
  $$renderer2.push("<!--[0-->");
447
- $$renderer2.push(`<button type="button"${$8.attr_class("edit-btn svelte-fkq7sr", undefined, { active: editing?.name === art.name })}${$8.attr("disabled", editing?.name === art.name, true)}>`);
432
+ $$renderer2.push(`<button type="button"${$7.attr_class("edit-btn svelte-fkq7sr", undefined, { active: editing?.name === art.name })}${$7.attr("disabled", editing?.name === art.name, true)}>`);
448
433
  Pencil($$renderer2, { size: 11 });
449
- $$renderer2.push(`<!----> <span>${$8.escape(editing?.name === art.name ? "Editing" : "Redraw")}</span></button>`);
434
+ $$renderer2.push(`<!----> <span>${$7.escape(editing?.name === art.name ? "Editing" : "Redraw")}</span></button>`);
450
435
  } else {
451
436
  $$renderer2.push("<!--[-1-->");
452
437
  }
@@ -464,7 +449,7 @@ function Avatars($$renderer, $$props) {
464
449
  let { namePlaceholder } = $$props;
465
450
  if (true) {
466
451
  let failed = function($$renderer3, error) {
467
- $$renderer3.push(`<mochi-island-failure data-component="AvatarsView"${$9.attr("data-message", error.message)}></mochi-island-failure>`);
452
+ $$renderer3.push(`<mochi-island-failure data-component="AvatarsView"${$8.attr("data-message", error.message)}></mochi-island-failure>`);
468
453
  };
469
454
  $$renderer2.push("<!--[0-->");
470
455
  $$renderer2.boundary({ failed }, ($$renderer3) => {
@@ -472,7 +457,7 @@ function Avatars($$renderer, $$props) {
472
457
  {
473
458
  HydratableBoundary($$renderer3, {
474
459
  children: ($$renderer4) => {
475
- $$renderer4.push(`<mochi-hydratable-island component-name="AvatarsView_257s9yq1wwr4f" component-url="__MOCHI_COMPONENT_URL__AvatarsView_257s9yq1wwr4f__"${$9.attr("props-ref", emitIslandProps({ namePlaceholder }))}>`);
460
+ $$renderer4.push(`<mochi-hydratable-island component-name="AvatarsView_257s9yq1wwr4f" component-url="__MOCHI_COMPONENT_URL__AvatarsView_257s9yq1wwr4f__"${$8.attr("props-ref", emitIslandProps({ namePlaceholder }))}>`);
476
461
  $$renderer4.push(`<!--[-->`);
477
462
  {
478
463
  AvatarsView($$renderer4, { namePlaceholder });