codebay 0.8.0 → 0.9.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 (79) hide show
  1. package/.mochi/import-css/xterm-1yy1hf1g.css +252 -0
  2. package/.mochi/manifest.json +330 -211
  3. package/.mochi/svelte-client/HydratableIsland-k6q8esj4.js +1 -0
  4. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-sg96rp17.js +2 -0
  5. package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-92hepzby.js +14 -0
  6. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-p3f649gk.js +1 -0
  7. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-dzmgmv78.js +29 -0
  8. package/.mochi/svelte-client/chunk-2j95sv83.js +1 -0
  9. package/.mochi/svelte-client/chunk-6rbs0mhx.js +1 -0
  10. package/.mochi/svelte-client/chunk-7wkvn2vx.js +2 -0
  11. package/.mochi/svelte-client/chunk-a2psjmrm.js +2 -0
  12. package/.mochi/svelte-client/chunk-m497q88s.js +2 -0
  13. package/.mochi/svelte-client/{chunk-fqg2qzj8.js → chunk-m4fzsd5b.js} +1 -1
  14. package/.mochi/svelte-client/chunk-mpv3qx28.js +36 -0
  15. package/.mochi/svelte-client/chunk-rs41by6w.js +2 -0
  16. package/.mochi/svelte-client/{chunk-qj7zy2d9.js → chunk-v65n8th6.js} +4 -4
  17. package/.mochi/svelte-compile/{App-6rcf0d74.server.js → App-7vjcp38v.server.js} +368 -37
  18. package/.mochi/svelte-compile/{Avatars-pzyz0tv3.server.js → Avatars-e2cfc95t.server.js} +130 -25
  19. package/.mochi/svelte-compile/{ClientStats-z3tn9ad6.server.js → ClientStats-4cphmrnp.server.js} +1 -1
  20. package/.mochi/svelte-compile/{DefaultError-wh77vebf.server.js → DefaultError-je52k17d.server.js} +1 -1
  21. package/.mochi/svelte-compile/{Instance-49ksrp11.server.js → Instance-h78n2dsv.server.js} +16 -13
  22. package/.mochi/svelte-compile/{Settings-sz5d6qj7.server.js → Settings-tav2asn7.server.js} +153 -127
  23. package/.mochi/svelte-compile/{chunk-fpe16ywq.js → chunk-60mpagr9.js} +17 -7
  24. package/.mochi/svelte-compile/chunk-9nqc2r0y.js +9706 -0
  25. package/.mochi/svelte-compile/{chunk-6ghzacpg.js → chunk-bpqwf1nw.js} +36 -4
  26. package/.mochi/svelte-compile/chunk-jx6h1xzp.js +20 -0
  27. package/.mochi/svelte-compile/{chunk-q8rbesaw.js → chunk-m8ygpyhr.js} +5 -4
  28. package/.mochi/svelte-compile/chunk-rtdne1m8.js +31 -0
  29. package/.mochi/svelte-compile/{chunk-we0ggtws.js → chunk-xpt1a7jm.js} +2 -1
  30. package/.mochi/svelte-css/AvatarEditor-2mdq8ss346drw.css +1 -0
  31. package/.mochi/svelte-css/{AvatarsView-2ughbzc26luyb.css → AvatarsView-2llo48w0wt0xn.css} +1 -1
  32. package/.mochi/svelte-css/FolderBrowser-2pxp9z1o7zixk.css +1 -0
  33. package/.mochi/svelte-css/{IdeBar-2qoqi2ya9zdn3.css → IdeBar-10xodudcx57qr.css} +1 -1
  34. package/.mochi/svelte-css/{SettingsView-3uycxa8z548m4.css → SettingsView-2qfauz68axro1.css} +1 -1
  35. package/.mochi/svelte-css/TerminalPane-3bwgk6ulzq6b3.css +1 -0
  36. package/.mochi/svelte-css/TerminalSplit-2416xfuln89a3.css +1 -0
  37. package/migrations/0005_instance_mode.sql +1 -0
  38. package/migrations/0006_terminal_split.sql +1 -0
  39. package/package.json +3 -1
  40. package/src/avatars/serialize.ts +35 -6
  41. package/src/components/AppShell.svelte +46 -8
  42. package/src/components/Avatar.svelte +3 -2
  43. package/src/components/AvatarEditor.svelte +96 -19
  44. package/src/components/AvatarsView.svelte +0 -0
  45. package/src/components/DashboardView.svelte +22 -7
  46. package/src/components/FolderBrowser.svelte +88 -8
  47. package/src/components/HealthBox.svelte +12 -5
  48. package/src/components/IdeBar.svelte +10 -0
  49. package/src/components/InstanceCard.svelte +3 -1
  50. package/src/components/InstanceView.svelte +1 -0
  51. package/src/components/SettingsView.svelte +108 -0
  52. package/src/components/TerminalPane.svelte +274 -0
  53. package/src/components/TerminalSplit.svelte +154 -0
  54. package/src/container-injections/claude-code-ide-extension.ts +2 -0
  55. package/src/container-injections/ttyd.ts +49 -0
  56. package/src/lib/config.server.ts +3 -0
  57. package/src/lib/db.server.ts +14 -4
  58. package/src/lib/devcontainer.server.ts +136 -22
  59. package/src/lib/health.server.ts +1 -1
  60. package/src/lib/injections.server.ts +15 -5
  61. package/src/lib/instances.server.ts +64 -10
  62. package/src/lib/proxy.server.ts +87 -11
  63. package/src/pages/App.svelte +5 -3
  64. package/src/pages/Settings.svelte +4 -0
  65. package/src/routes.ts +55 -6
  66. package/src/types.ts +18 -0
  67. package/.mochi/svelte-client/HydratableIsland-qyjx1d98.js +0 -1
  68. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-fkna7bj2.js +0 -2
  69. package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-89wtkb86.js +0 -13
  70. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-eamnbyqk.js +0 -1
  71. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-kdra4mcb.js +0 -28
  72. package/.mochi/svelte-client/chunk-330mrspw.js +0 -2
  73. package/.mochi/svelte-client/chunk-4jgkak13.js +0 -1
  74. package/.mochi/svelte-client/chunk-k5m4kt20.js +0 -2
  75. package/.mochi/svelte-client/chunk-rpdphch7.js +0 -2
  76. package/.mochi/svelte-compile/chunk-bacb4b0r.js +0 -14
  77. package/.mochi/svelte-css/AvatarEditor-2ewwtejaml4e2.css +0 -1
  78. package/.mochi/svelte-css/FolderBrowser-1x428zb3f2kti.css +0 -1
  79. /package/.mochi/svelte-compile/{chunk-btmcxhqy.js → chunk-brjv9pyd.js} +0 -0
@@ -1,4 +1,7 @@
1
1
  // @bun
2
+ import {
3
+ Rotate_ccw
4
+ } from "./chunk-jx6h1xzp.js";
2
5
  import {
3
6
  AppBar,
4
7
  Avatar,
@@ -10,22 +13,24 @@ import {
10
13
  ROWS,
11
14
  Toaster,
12
15
  avatars,
16
+ decode,
13
17
  dist_default
14
- } from "./chunk-q8rbesaw.js";
18
+ } from "./chunk-m8ygpyhr.js";
15
19
  import {
16
20
  HydratableBoundary,
17
21
  Icon,
22
+ X,
18
23
  emitIslandProps
19
- } from "./chunk-fpe16ywq.js";
20
- import"./chunk-we0ggtws.js";
24
+ } from "./chunk-60mpagr9.js";
25
+ import"./chunk-xpt1a7jm.js";
21
26
 
22
27
  // src/pages/Avatars.svelte
23
28
  import"svelte/internal/flags/async";
24
- import * as $8 from "svelte/internal/server";
29
+ import * as $9 from "svelte/internal/server";
25
30
 
26
31
  // src/components/AvatarsView.svelte
27
32
  import"svelte/internal/flags/async";
28
- import * as $7 from "svelte/internal/server";
33
+ import * as $8 from "svelte/internal/server";
29
34
 
30
35
  // src/components/AvatarEditor.svelte
31
36
  import"svelte/internal/flags/async";
@@ -138,9 +143,14 @@ ${rows}
138
143
  export default art;
139
144
  `;
140
145
  }
141
- function toIssueUrl(art) {
142
- const title = `Avatar contribution: ${art.name}`;
143
- const body = [
146
+ function toIssueUrl(art, mode = "create") {
147
+ const body = mode === "edit" ? editIssueBody(art) : createIssueBody(art);
148
+ const title = mode === "edit" ? `Avatar edit: ${art.name}` : `Avatar contribution: ${art.name}`;
149
+ const params = new URLSearchParams({ title, body });
150
+ return `${REPO_URL}/issues/new?${params}`;
151
+ }
152
+ function createIssueBody(art) {
153
+ return [
144
154
  "Hi! I drew this avatar in the editor easter egg and I'd love to see it in the official set.",
145
155
  "",
146
156
  "```",
@@ -156,17 +166,34 @@ function toIssueUrl(art) {
156
166
  "_It should satisfy `src/avatars/avatars.test.ts`: exactly 8\xD78, only `#`/`+`/`.` pixels, unique name._"
157
167
  ].join(`
158
168
  `);
159
- const params = new URLSearchParams({ title, body });
160
- return `${REPO_URL}/issues/new?${params}`;
169
+ }
170
+ function editIssueBody(art) {
171
+ return [
172
+ `Hi! I redrew the existing \`${art.name}\` sprite by hand in the editor easter egg \u2014 it started as an AI-generated placeholder and this replaces it.`,
173
+ "",
174
+ "```",
175
+ ...art.pixels,
176
+ "```",
177
+ "",
178
+ `Ready-to-paste replacement for \`src/avatars/${art.name}.ts\` (the \`robot\` flag is intentionally dropped \u2014 it's hand-drawn now):`,
179
+ "",
180
+ "```ts",
181
+ toModuleSource(art).trimEnd(),
182
+ "```",
183
+ "",
184
+ "_It should satisfy `src/avatars/avatars.test.ts`: exactly 8\xD78, only `#`/`+`/`.` pixels._"
185
+ ].join(`
186
+ `);
161
187
  }
162
188
 
163
189
  // src/components/AvatarEditor.svelte
164
190
  function AvatarEditor($$renderer, $$props) {
165
191
  $$renderer.component(($$renderer2) => {
166
- let { namePlaceholder } = $$props;
167
- let cells = Array(ROWS * COLS).fill(OFF);
168
- let avatarName = "";
169
- const slug = $5.derived(() => normalizeName(avatarName));
192
+ let { namePlaceholder, editing = null, oncancelEdit } = $$props;
193
+ const isEdit = $5.derived(() => editing != null);
194
+ let cells = editing ? decode(editing) : Array(ROWS * COLS).fill(OFF);
195
+ let avatarName = editing?.name ?? "";
196
+ const slug = $5.derived(() => editing ? editing.name : normalizeName(avatarName));
170
197
  const art = $5.derived(() => ({ name: slug() || "my-avatar", pixels: cellsToPixels(cells) }));
171
198
  const canContribute = $5.derived(() => slug().length > 0 && cells.some((c) => c !== OFF));
172
199
  let mode = "cycle";
@@ -216,6 +243,10 @@ function AvatarEditor($$renderer, $$props) {
216
243
  function clear() {
217
244
  cells = Array(ROWS * COLS).fill(OFF);
218
245
  }
246
+ function reset() {
247
+ if (editing)
248
+ cells = decode(editing);
249
+ }
219
250
  function invert() {
220
251
  cells = cells.map((c) => c === ON ? OFF : c === OFF ? ON : c);
221
252
  }
@@ -227,7 +258,16 @@ function AvatarEditor($$renderer, $$props) {
227
258
  dist_default.error(`Copy failed: ${err.message}`);
228
259
  }
229
260
  }
230
- $$renderer2.push(`<section class="editor svelte-qu6vp4"><div class="head svelte-qu6vp4"><h2 class="svelte-qu6vp4">Draw your own avatar</h2></div> <div class="body svelte-qu6vp4"><div class="grid-frame svelte-qu6vp4"><!--[-->`);
261
+ $$renderer2.push(`<section class="editor svelte-qu6vp4"><div class="head svelte-qu6vp4"><h2 class="svelte-qu6vp4">${$5.escape(isEdit() ? `Redraw \u201C${editing.name}\u201D` : "Draw your own avatar")}</h2> `);
262
+ if (isEdit()) {
263
+ $$renderer2.push("<!--[0-->");
264
+ $$renderer2.push(`<button type="button" class="head-cancel svelte-qu6vp4">`);
265
+ X($$renderer2, { size: 14 });
266
+ $$renderer2.push(`<!----> <span>New drawing</span></button>`);
267
+ } else {
268
+ $$renderer2.push("<!--[-1-->");
269
+ }
270
+ $$renderer2.push(`<!--]--></div> <div class="body svelte-qu6vp4"><div class="grid-frame svelte-qu6vp4"><!--[-->`);
231
271
  const each_array = $5.ensure_array_like(RING_CELLS);
232
272
  for (let i = 0, $$length = each_array.length;i < $$length; i++) {
233
273
  let { r, c } = each_array[i];
@@ -243,13 +283,45 @@ function AvatarEditor($$renderer, $$props) {
243
283
  Avatar($$renderer2, { art: art(), name: art().name, scale: 6 });
244
284
  $$renderer2.push(`<!----> `);
245
285
  Avatar($$renderer2, { art: art(), name: art().name, scale: 3 });
246
- $$renderer2.push(`<!----></div></div> <label class="name-field svelte-qu6vp4"><span class="preview-label svelte-qu6vp4">Name</span> <input type="text"${$5.attr("value", avatarName)}${$5.attr("placeholder", namePlaceholder)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" maxlength="24" class="svelte-qu6vp4"/></label> <div class="mode-field svelte-qu6vp4"><span class="preview-label svelte-qu6vp4">Mode</span> <div class="modes svelte-qu6vp4" role="radiogroup" aria-label="Drawing mode"><!--[-->`);
286
+ $$renderer2.push(`<!----></div></div> `);
287
+ if (isEdit()) {
288
+ $$renderer2.push("<!--[0-->");
289
+ $$renderer2.push(`<div class="preview before"><div class="preview-label svelte-qu6vp4">Before</div> <div class="preview-row svelte-qu6vp4">`);
290
+ Avatar($$renderer2, { art: editing, name: editing.name, scale: 3 });
291
+ $$renderer2.push(`<!----></div></div>`);
292
+ } else {
293
+ $$renderer2.push("<!--[-1-->");
294
+ }
295
+ $$renderer2.push(`<!--]--> <label class="name-field svelte-qu6vp4"><span class="preview-label svelte-qu6vp4">Name</span> `);
296
+ if (isEdit()) {
297
+ $$renderer2.push("<!--[0-->");
298
+ $$renderer2.push(`<input type="text"${$5.attr("value", editing.name)} readonly="" aria-readonly="true" class="svelte-qu6vp4"/>`);
299
+ } else {
300
+ $$renderer2.push("<!--[-1-->");
301
+ $$renderer2.push(`<input type="text"${$5.attr("value", avatarName)}${$5.attr("placeholder", namePlaceholder)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" maxlength="24" class="svelte-qu6vp4"/>`);
302
+ }
303
+ $$renderer2.push(`<!--]--></label> <div class="mode-field svelte-qu6vp4"><span class="preview-label svelte-qu6vp4">Mode</span> <div class="modes svelte-qu6vp4" role="radiogroup" aria-label="Drawing mode"><!--[-->`);
247
304
  const each_array_2 = $5.ensure_array_like(MODES);
248
305
  for (let i = 0, $$length = each_array_2.length;i < $$length; i++) {
249
306
  let m = each_array_2[i];
250
307
  $$renderer2.push(`<button type="button"${$5.attr_class("mode svelte-qu6vp4", undefined, { active: mode === m.id })} role="radio"${$5.attr("aria-checked", mode === m.id)}${$5.attr("tabindex", mode === m.id ? 0 : -1)}>${$5.escape(m.label)}</button>`);
251
308
  }
252
309
  $$renderer2.push(`<!--]--></div></div> <div class="tools svelte-qu6vp4">`);
310
+ if (isEdit()) {
311
+ $$renderer2.push("<!--[0-->");
312
+ Button($$renderer2, {
313
+ size: "sm",
314
+ icon: Rotate_ccw,
315
+ onclick: reset,
316
+ children: ($$renderer3) => {
317
+ $$renderer3.push(`<!---->Reset`);
318
+ },
319
+ $$slots: { default: true }
320
+ });
321
+ } else {
322
+ $$renderer2.push("<!--[-1-->");
323
+ }
324
+ $$renderer2.push(`<!--]--> `);
253
325
  Button($$renderer2, {
254
326
  size: "sm",
255
327
  icon: Eraser,
@@ -269,7 +341,7 @@ function AvatarEditor($$renderer, $$props) {
269
341
  },
270
342
  $$slots: { default: true }
271
343
  });
272
- $$renderer2.push(`<!----></div></div></div> <div class="foot svelte-qu6vp4"><span class="hint svelte-qu6vp4">Draw something, then open an issue to get it into the official set.</span> <div class="actions svelte-qu6vp4">`);
344
+ $$renderer2.push(`<!----></div></div></div> <div class="foot svelte-qu6vp4"><span class="hint svelte-qu6vp4">${$5.escape(isEdit() ? "Redraw it, then open an issue to replace the AI-generated original." : "Draw something, then open an issue to get it into the official set.")}</span> <div class="actions svelte-qu6vp4">`);
273
345
  Button($$renderer2, {
274
346
  size: "sm",
275
347
  icon: Copy,
@@ -286,7 +358,7 @@ function AvatarEditor($$renderer, $$props) {
286
358
  variant: "primary",
287
359
  icon: External_link,
288
360
  disabled: !canContribute(),
289
- href: toIssueUrl(art()),
361
+ href: toIssueUrl(art(), isEdit() ? "edit" : "create"),
290
362
  target: "_blank",
291
363
  rel: "noopener",
292
364
  children: ($$renderer3) => {
@@ -316,10 +388,32 @@ function Bot($$renderer, $$props) {
316
388
  ];
317
389
  Icon($$renderer, $6.spread_props([{ name: "bot" }, props, { iconNode }]));
318
390
  }
391
+ // node_modules/@lucide/svelte/dist/icons/pencil.svelte
392
+ import"svelte/internal/flags/async";
393
+ import * as $7 from "svelte/internal/server";
394
+ function Pencil($$renderer, $$props) {
395
+ let { $$slots, $$events, ...props } = $$props;
396
+ const iconNode = [
397
+ [
398
+ "path",
399
+ {
400
+ d: "M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"
401
+ }
402
+ ],
403
+ ["path", { d: "m15 5 4 4" }]
404
+ ];
405
+ Icon($$renderer, $7.spread_props([{ name: "pencil" }, props, { iconNode }]));
406
+ }
319
407
  // src/components/AvatarsView.svelte
320
408
  function AvatarsView($$renderer, $$props) {
321
409
  $$renderer.component(($$renderer2) => {
322
410
  let { namePlaceholder } = $$props;
411
+ let editing = null;
412
+ let editorEl = null;
413
+ function startEdit(art) {
414
+ editing = art;
415
+ editorEl?.scrollIntoView({ behavior: "smooth", block: "start" });
416
+ }
323
417
  $$renderer2.push(`<div class="page svelte-fkq7sr">`);
324
418
  AppBar($$renderer2, {
325
419
  children: ($$renderer3) => {
@@ -327,10 +421,12 @@ function AvatarsView($$renderer, $$props) {
327
421
  },
328
422
  $$slots: { default: true }
329
423
  });
330
- $$renderer2.push(`<!----> <main class="content svelte-fkq7sr">`);
331
- AvatarEditor($$renderer2, { namePlaceholder });
332
- $$renderer2.push(`<!----> <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"><!--[-->`);
333
- const each_array = $7.ensure_array_like(avatars);
424
+ $$renderer2.push(`<!----> <main class="content svelte-fkq7sr"><div class="editor-slot svelte-fkq7sr"><!---->`);
425
+ {
426
+ AvatarEditor($$renderer2, { namePlaceholder, editing, oncancelEdit: () => editing = null });
427
+ }
428
+ $$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"><!--[-->`);
429
+ const each_array = $8.ensure_array_like(avatars);
334
430
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
335
431
  let art = each_array[$$index];
336
432
  $$renderer2.push(`<li class="svelte-fkq7sr">`);
@@ -344,7 +440,16 @@ function AvatarsView($$renderer, $$props) {
344
440
  } else {
345
441
  $$renderer2.push("<!--[-1-->");
346
442
  }
347
- $$renderer2.push(`<!--]--> ${$7.escape(art.name)}</span></li>`);
443
+ $$renderer2.push(`<!--]--> ${$8.escape(art.name)}</span> `);
444
+ if (art.robot) {
445
+ $$renderer2.push("<!--[0-->");
446
+ $$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)}>`);
447
+ Pencil($$renderer2, { size: 11 });
448
+ $$renderer2.push(`<!----> <span>${$8.escape(editing?.name === art.name ? "Editing" : "Redraw")}</span></button>`);
449
+ } else {
450
+ $$renderer2.push("<!--[-1-->");
451
+ }
452
+ $$renderer2.push(`<!--]--></li>`);
348
453
  }
349
454
  $$renderer2.push(`<!--]--></ul></section></main></div> `);
350
455
  Toaster($$renderer2, {
@@ -362,7 +467,7 @@ function Avatars($$renderer, $$props) {
362
467
  let { namePlaceholder } = $$props;
363
468
  if (true) {
364
469
  let failed = function($$renderer3, error) {
365
- $$renderer3.push(`<mochi-island-failure data-component="AvatarsView"${$8.attr("data-message", error.message)}></mochi-island-failure>`);
470
+ $$renderer3.push(`<mochi-island-failure data-component="AvatarsView"${$9.attr("data-message", error.message)}></mochi-island-failure>`);
366
471
  };
367
472
  $$renderer2.push("<!--[0-->");
368
473
  $$renderer2.boundary({ failed }, ($$renderer3) => {
@@ -370,7 +475,7 @@ function Avatars($$renderer, $$props) {
370
475
  {
371
476
  HydratableBoundary($$renderer3, {
372
477
  children: ($$renderer4) => {
373
- $$renderer4.push(`<mochi-hydratable-island component-name="AvatarsView_257s9yq1wwr4f" component-url="__MOCHI_COMPONENT_URL__AvatarsView_257s9yq1wwr4f__"${$8.attr("props-ref", emitIslandProps({ namePlaceholder }))}>`);
478
+ $$renderer4.push(`<mochi-hydratable-island component-name="AvatarsView_257s9yq1wwr4f" component-url="__MOCHI_COMPONENT_URL__AvatarsView_257s9yq1wwr4f__"${$9.attr("props-ref", emitIslandProps({ namePlaceholder }))}>`);
374
479
  $$renderer4.push(`<!--[-->`);
375
480
  {
376
481
  AvatarsView($$renderer4, { namePlaceholder });
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import"./chunk-we0ggtws.js";
2
+ import"./chunk-xpt1a7jm.js";
3
3
 
4
4
  // node_modules/mochi-framework/src/templates/ClientStats/ClientStats.svelte
5
5
  import"svelte/internal/flags/async";
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import"./chunk-we0ggtws.js";
2
+ import"./chunk-xpt1a7jm.js";
3
3
 
4
4
  // node_modules/mochi-framework/src/templates/DefaultError.svelte
5
5
  import"svelte/internal/flags/async";
@@ -5,16 +5,14 @@ import {
5
5
  apiPost,
6
6
  forwardedPortUrl,
7
7
  ideUrl
8
- } from "./chunk-btmcxhqy.js";
9
- import {
10
- X
11
- } from "./chunk-bacb4b0r.js";
8
+ } from "./chunk-brjv9pyd.js";
12
9
  import {
13
10
  HydratableBoundary,
14
11
  Icon,
12
+ X,
15
13
  emitIslandProps
16
- } from "./chunk-fpe16ywq.js";
17
- import"./chunk-we0ggtws.js";
14
+ } from "./chunk-60mpagr9.js";
15
+ import"./chunk-xpt1a7jm.js";
18
16
 
19
17
  // src/pages/Instance.svelte
20
18
  import"svelte/internal/flags/async";
@@ -66,25 +64,29 @@ function Skeleton($$renderer, $$props) {
66
64
  // src/components/HealthBox.svelte
67
65
  function HealthBox($$renderer, $$props) {
68
66
  $$renderer.component(($$renderer2) => {
69
- const FIXED_CHECKS = ["Container running", "Code-server reachable"];
70
67
  let {
71
68
  health = null,
72
69
  lastFetchedAt = null,
73
70
  active = true,
74
- injectionChecks = 0
71
+ injectionChecks = 0,
72
+ mode = "ide"
75
73
  } = $$props;
74
+ const FIXED_CHECKS = $5.derived(() => [
75
+ "Container running",
76
+ mode === "terminal" ? "Terminal reachable" : "Code-server reachable"
77
+ ]);
76
78
  const checks = $5.derived(() => {
77
79
  if (!health)
78
80
  return [];
79
81
  const v = (ok) => ({ ok, value: ok ? "OK" : "\u2014" });
80
82
  return [
81
- { label: FIXED_CHECKS[0], ...v(health.containerRunning) },
82
- { label: FIXED_CHECKS[1], ...v(health.codeServerAccessible) },
83
+ { label: FIXED_CHECKS()[0], ...v(health.containerRunning) },
84
+ { label: FIXED_CHECKS()[1], ...v(health.codeServerAccessible) },
83
85
  ...health.injections.map((i) => ({ label: i.label, ...v(i.ok) }))
84
86
  ];
85
87
  });
86
88
  function getNumberOfChecks() {
87
- return health ? checks().length : FIXED_CHECKS.length + injectionChecks;
89
+ return health ? checks().length : FIXED_CHECKS().length + injectionChecks;
88
90
  }
89
91
  let now = Date.now();
90
92
  const agoLabel = $5.derived(() => {
@@ -129,7 +131,7 @@ function HealthBox($$renderer, $$props) {
129
131
  } else {
130
132
  $$renderer2.push("<!--[-1-->");
131
133
  $$renderer2.push(`<!--[-->`);
132
- const each_array_2 = $5.ensure_array_like(FIXED_CHECKS);
134
+ const each_array_2 = $5.ensure_array_like(FIXED_CHECKS());
133
135
  for (let $$index_2 = 0, $$length = each_array_2.length;$$index_2 < $$length; $$index_2++) {
134
136
  let label = each_array_2[$$index_2];
135
137
  $$renderer2.push(`<div class="hrow svelte-1hnopyv"><span class="box idle svelte-1hnopyv"></span> <span class="hlabel svelte-1hnopyv">${$5.escape(label)}</span> <span class="hvalue svelte-1hnopyv">\u2014</span></div>`);
@@ -282,7 +284,8 @@ function InstanceView($$renderer, $$props) {
282
284
  health,
283
285
  lastFetchedAt,
284
286
  injectionChecks,
285
- active: !instance || instance.status === "running"
287
+ active: !instance || instance.status === "running",
288
+ mode: instance?.mode ?? "ide"
286
289
  });
287
290
  $$renderer2.push(`<!----></div> <section class="ports panel svelte-15fxkvm"><div class="ports-bar panel-bar svelte-15fxkvm"><span class="svelte-15fxkvm">Forwarded ports</span> `);
288
291
  if (pendingRebuild) {