codebay 0.10.0 → 0.11.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 (101) hide show
  1. package/.mochi/manifest.json +193 -167
  2. package/.mochi/svelte-client/HydratableIsland-dammyce5.js +1 -0
  3. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-v65ctd99.js +2 -0
  4. package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-htjfv8q9.js +14 -0
  5. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-v07seqge.js +1 -0
  6. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-hj9yvqc4.js +38 -0
  7. package/.mochi/svelte-client/chunk-0zkdsrth.js +2 -0
  8. package/.mochi/svelte-client/{chunk-bn731rda.js → chunk-566rqq4c.js} +2 -2
  9. package/.mochi/svelte-client/chunk-79aj59e0.js +2 -0
  10. package/.mochi/svelte-client/{chunk-wvtkwfsh.js → chunk-czkxd74n.js} +1 -1
  11. package/.mochi/svelte-client/{chunk-p20tkpde.js → chunk-hxydjtda.js} +1 -1
  12. package/.mochi/svelte-client/chunk-qx1defbm.js +2 -0
  13. package/.mochi/svelte-client/chunk-r3wxmmc0.js +2 -0
  14. package/.mochi/svelte-client/{chunk-j72r8pkk.js → chunk-vs6pd2b4.js} +2 -2
  15. package/.mochi/svelte-client/{chunk-t0ap7q89.js → chunk-wjagstre.js} +1 -1
  16. package/.mochi/svelte-client/{chunk-0fjx3z3r.js → chunk-y9yy1004.js} +1 -1
  17. package/.mochi/svelte-compile/{App-59cdj86f.server.js → App-mzn3dqjm.server.js} +182 -72
  18. package/.mochi/svelte-compile/{Avatars-fmagfyj2.server.js → Avatars-c0k5jx8q.server.js} +3 -6
  19. package/.mochi/svelte-compile/{Instance-s1gqwzmx.server.js → Instance-hj76qnha.server.js} +4 -4
  20. package/.mochi/svelte-compile/{Settings-k447mt0x.server.js → Settings-tvc5yp08.server.js} +39 -28
  21. package/.mochi/svelte-compile/chunk-ed46m58e.js +22 -0
  22. package/.mochi/svelte-compile/{chunk-th2dbqvc.js → chunk-gz6hv1h5.js} +5 -1
  23. package/.mochi/svelte-compile/chunk-zd49axkf.js +65 -0
  24. package/.mochi/svelte-css/{AppBar-3bxinv4pabv8l.css → AppBar-1gtu2me3fni8e.css} +1 -1
  25. package/.mochi/svelte-css/AvatarEditor-1mjvec6bwdkv8.css +1 -0
  26. package/.mochi/svelte-css/{AvatarsView-2llo48w0wt0xn.css → AvatarsView-26ya4ep5n1ze7.css} +1 -1
  27. package/.mochi/svelte-css/Button-208u50wkms8ya.css +1 -0
  28. package/.mochi/svelte-css/CoinButton-2727devjtsn10.css +1 -0
  29. package/.mochi/svelte-css/CredMenu-7qowd1oxujet.css +1 -0
  30. package/.mochi/svelte-css/DashboardView-17a0b8epjurhb.css +1 -0
  31. package/.mochi/svelte-css/FolderBrowser-i0uj58dph27f.css +1 -0
  32. package/.mochi/svelte-css/HealthBox-r0giuhjn2wj4.css +1 -0
  33. package/.mochi/svelte-css/IdeBar-1mtgemqfuvqzi.css +1 -0
  34. package/.mochi/svelte-css/InstanceCard-25z7nas7y98zk.css +1 -0
  35. package/.mochi/svelte-css/InstanceFilter-2vglmyy0yrbbc.css +1 -0
  36. package/.mochi/svelte-css/InstanceView-oozmmctp8m3p.css +1 -0
  37. package/.mochi/svelte-css/SettingsCog-1jdeprd3ilczz.css +1 -0
  38. package/.mochi/svelte-css/{SettingsView-n3oy75uonzp2.css → SettingsView-bccw34agd2bj.css} +1 -1
  39. package/.mochi/svelte-css/StatusBadge-2eisdtnrsnfdc.css +1 -0
  40. package/.mochi/svelte-css/TerminalPane-2ywc86rhtmr9l.css +1 -0
  41. package/.mochi/svelte-css/ThemePicker-3fw4synubier0.css +1 -0
  42. package/migrations/0008_config_migrated.sql +1 -0
  43. package/package.json +8 -8
  44. package/src/components/AppBar.svelte +2 -2
  45. package/src/components/AppShell.svelte +71 -7
  46. package/src/components/AvatarEditor.svelte +10 -10
  47. package/src/components/AvatarsView.svelte +0 -0
  48. package/src/components/Button.svelte +13 -9
  49. package/src/components/CoinButton.svelte +2 -2
  50. package/src/components/CredMenu.svelte +8 -6
  51. package/src/components/DashboardView.svelte +2 -2
  52. package/src/components/FolderBrowser.svelte +39 -36
  53. package/src/components/HealthBox.svelte +5 -4
  54. package/src/components/IdeBar.svelte +286 -112
  55. package/src/components/InstanceCard.svelte +7 -7
  56. package/src/components/InstanceFilter.svelte +6 -6
  57. package/src/components/InstanceView.svelte +27 -21
  58. package/src/components/SettingsCog.svelte +4 -3
  59. package/src/components/SettingsView.svelte +7 -11
  60. package/src/components/StatusBadge.svelte +8 -6
  61. package/src/components/TerminalPane.svelte +19 -7
  62. package/src/components/ThemePicker.svelte +150 -8
  63. package/src/components/TopBar.svelte +1 -1
  64. package/src/components/UiShowcase.svelte +300 -64
  65. package/src/lib/db.server.ts +7 -3
  66. package/src/lib/devcontainer.server.ts +211 -38
  67. package/src/lib/docker.server.ts +10 -0
  68. package/src/lib/git.server.ts +28 -0
  69. package/src/lib/instances.server.ts +117 -18
  70. package/src/lib/tab-nav.ts +30 -0
  71. package/src/routes.ts +12 -0
  72. package/src/shell.html +56 -23
  73. package/src/theme.ts +8 -1
  74. package/src/toast.ts +9 -0
  75. package/src/types.ts +7 -0
  76. package/.mochi/svelte-client/HydratableIsland-aebn1fa1.js +0 -1
  77. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-rx6arrv5.js +0 -2
  78. package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-jpjdmgpe.js +0 -14
  79. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-c9y47dat.js +0 -1
  80. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-d61feq89.js +0 -38
  81. package/.mochi/svelte-client/chunk-8xvr02wh.js +0 -2
  82. package/.mochi/svelte-client/chunk-9143wy3j.js +0 -2
  83. package/.mochi/svelte-client/chunk-k37wj1jm.js +0 -2
  84. package/.mochi/svelte-client/chunk-pc0fm37c.js +0 -2
  85. package/.mochi/svelte-compile/chunk-3t7v4hk0.js +0 -52
  86. package/.mochi/svelte-compile/chunk-gkjgybb2.js +0 -15
  87. package/.mochi/svelte-css/AvatarEditor-2mdq8ss346drw.css +0 -1
  88. package/.mochi/svelte-css/Button-oharop2xz6am.css +0 -1
  89. package/.mochi/svelte-css/CoinButton-1rej3sh3tkjud.css +0 -1
  90. package/.mochi/svelte-css/CredMenu-9hwgeptp7crb.css +0 -1
  91. package/.mochi/svelte-css/DashboardView-1cy4xpqhja9sx.css +0 -1
  92. package/.mochi/svelte-css/FolderBrowser-2pxp9z1o7zixk.css +0 -1
  93. package/.mochi/svelte-css/HealthBox-er2her0jukwl.css +0 -1
  94. package/.mochi/svelte-css/IdeBar-3bgr3m5z0lpeg.css +0 -1
  95. package/.mochi/svelte-css/InstanceCard-3vnltxnbxkvay.css +0 -1
  96. package/.mochi/svelte-css/InstanceFilter-3q6x0jt0hcgpz.css +0 -1
  97. package/.mochi/svelte-css/InstanceView-1pd7j16bd2b16.css +0 -1
  98. package/.mochi/svelte-css/SettingsCog-jftyadvo64qo.css +0 -1
  99. package/.mochi/svelte-css/StatusBadge-3mq0j7z6aq4j.css +0 -1
  100. package/.mochi/svelte-css/TerminalPane-3bwgk6ulzq6b3.css +0 -1
  101. package/.mochi/svelte-css/ThemePicker-1ir8jyocm8mvi.css +0 -1
@@ -1,27 +1,28 @@
1
1
  // @bun
2
2
  import {
3
3
  StatusBadge,
4
- apiDelete,
5
- apiFetch,
6
- apiPost,
7
4
  forwardedPortUrl
8
- } from "./chunk-3t7v4hk0.js";
5
+ } from "./chunk-ed46m58e.js";
9
6
  import {
10
7
  Layout_template,
11
8
  Plus,
12
9
  Terminal
13
10
  } from "./chunk-bpqwf1nw.js";
14
11
  import {
12
+ apiDelete,
13
+ apiFetch,
14
+ apiPost,
15
15
  ideUrl
16
- } from "./chunk-gkjgybb2.js";
16
+ } from "./chunk-zd49axkf.js";
17
17
  import {
18
18
  AppBar,
19
19
  Avatar,
20
20
  Button,
21
+ TOAST_OPTIONS,
21
22
  Toaster,
22
23
  dist_default,
23
24
  findAvatar
24
- } from "./chunk-th2dbqvc.js";
25
+ } from "./chunk-gz6hv1h5.js";
25
26
  import {
26
27
  HydratableBoundary,
27
28
  Icon,
@@ -36,13 +37,40 @@ import {
36
37
 
37
38
  // src/pages/App.svelte
38
39
  import"svelte/internal/flags/async";
39
- import * as $29 from "svelte/internal/server";
40
+ import * as $31 from "svelte/internal/server";
40
41
 
41
42
  // src/components/AppShell.svelte
42
43
  import"svelte/internal/flags/async";
43
- import * as $28 from "svelte/internal/server";
44
+ import * as $30 from "svelte/internal/server";
45
+ import { tick as tick2 } from "svelte";
44
46
  import { SvelteSet } from "svelte/reactivity";
45
47
 
48
+ // src/lib/tab-nav.ts
49
+ function digitTarget(digit, count) {
50
+ return digit === 9 ? count - 1 : digit - 1;
51
+ }
52
+ function nextTabIndex(current, key, count) {
53
+ if (count <= 0)
54
+ return null;
55
+ const from = current < 0 || current >= count ? 0 : current;
56
+ switch (key) {
57
+ case "ArrowRight":
58
+ return (from + 1) % count;
59
+ case "ArrowLeft":
60
+ return (from - 1 + count) % count;
61
+ case "Home":
62
+ return 0;
63
+ case "End":
64
+ return count - 1;
65
+ default: {
66
+ if (!/^[1-9]$/.test(key))
67
+ return null;
68
+ const target = digitTarget(Number(key), count);
69
+ return target < count ? target : null;
70
+ }
71
+ }
72
+ }
73
+
46
74
  // src/components/DashboardView.svelte
47
75
  import"svelte/internal/flags/async";
48
76
  import * as $20 from "svelte/internal/server";
@@ -808,7 +836,7 @@ function TopBar($$renderer, $$props) {
808
836
  });
809
837
  $$renderer2.push(`<!----> `);
810
838
  Button($$renderer2, {
811
- variant: "primary",
839
+ variant: "default",
812
840
  size: "sm",
813
841
  square: true,
814
842
  icon: altMode() === "terminal" ? Terminal : Layout_template,
@@ -1023,7 +1051,7 @@ function DashboardView($$renderer, $$props) {
1023
1051
 
1024
1052
  // src/components/IdeBar.svelte
1025
1053
  import"svelte/internal/flags/async";
1026
- import * as $22 from "svelte/internal/server";
1054
+ import * as $24 from "svelte/internal/server";
1027
1055
 
1028
1056
  // node_modules/@lucide/svelte/dist/icons/rotate-cw.svelte
1029
1057
  import"svelte/internal/flags/async";
@@ -1039,6 +1067,22 @@ function Rotate_cw($$renderer, $$props) {
1039
1067
  ];
1040
1068
  Icon($$renderer, $21.spread_props([{ name: "rotate-cw" }, props, { iconNode }]));
1041
1069
  }
1070
+ // node_modules/@lucide/svelte/dist/icons/chevron-left.svelte
1071
+ import"svelte/internal/flags/async";
1072
+ import * as $22 from "svelte/internal/server";
1073
+ function Chevron_left($$renderer, $$props) {
1074
+ let { $$slots, $$events, ...props } = $$props;
1075
+ const iconNode = [["path", { d: "m15 18-6-6 6-6" }]];
1076
+ Icon($$renderer, $22.spread_props([{ name: "chevron-left" }, props, { iconNode }]));
1077
+ }
1078
+ // node_modules/@lucide/svelte/dist/icons/chevron-right.svelte
1079
+ import"svelte/internal/flags/async";
1080
+ import * as $23 from "svelte/internal/server";
1081
+ function Chevron_right($$renderer, $$props) {
1082
+ let { $$slots, $$events, ...props } = $$props;
1083
+ const iconNode = [["path", { d: "m9 18 6-6-6-6" }]];
1084
+ Icon($$renderer, $23.spread_props([{ name: "chevron-right" }, props, { iconNode }]));
1085
+ }
1042
1086
  // src/components/IdeBar.svelte
1043
1087
  function IdeBar($$renderer, $$props) {
1044
1088
  $$renderer.component(($$renderer2) => {
@@ -1054,53 +1098,102 @@ function IdeBar($$renderer, $$props) {
1054
1098
  oncommitrename,
1055
1099
  oncancelrename
1056
1100
  } = $$props;
1101
+ const activeIndex = $24.derived(() => running.findIndex((i) => i.id === active));
1102
+ const focusIndex = $24.derived(() => activeIndex() >= 0 ? activeIndex() : 0);
1103
+ let viewport = null;
1104
+ let content = null;
1105
+ let atStart = true;
1106
+ let atEnd = true;
1107
+ const tabEls = {};
1108
+ const overflowing = $24.derived(() => !atStart || !atEnd);
1109
+ function measure() {
1110
+ if (!viewport)
1111
+ return;
1112
+ atStart = viewport.scrollLeft <= 1;
1113
+ atEnd = viewport.scrollLeft + viewport.clientWidth >= viewport.scrollWidth - 1;
1114
+ }
1115
+ function select(index) {
1116
+ const inst = running[index];
1117
+ if (!inst)
1118
+ return;
1119
+ onselect(inst.id);
1120
+ tabEls[inst.id]?.focus();
1121
+ }
1122
+ function onTabKeydown(e) {
1123
+ const next = nextTabIndex(activeIndex(), e.key, running.length);
1124
+ if (next === null)
1125
+ return;
1126
+ e.preventDefault();
1127
+ select(next);
1128
+ }
1129
+ function page(direction) {
1130
+ if (!viewport)
1131
+ return;
1132
+ viewport.scrollBy({ left: direction * Math.max(160, viewport.clientWidth * 0.7) });
1133
+ }
1057
1134
  AppBar($$renderer2, {
1058
1135
  children: ($$renderer3) => {
1059
1136
  if (running.length > 0) {
1060
1137
  $$renderer3.push("<!--[0-->");
1061
- $$renderer3.push(`<nav class="tabs svelte-r39acv"><!--[-->`);
1062
- const each_array = $22.ensure_array_like(running);
1063
- for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
1064
- let inst = each_array[$$index];
1065
- $$renderer3.push(`<div${$22.attr_class("tab svelte-r39acv", undefined, {
1066
- active: inst.id === active,
1067
- "attn-done": inst.id !== active && attention[inst.id] === "done",
1068
- "attn-waiting": inst.id !== active && attention[inst.id] === "waiting"
1069
- })}>`);
1138
+ $$renderer3.push(`<div class="strip svelte-r39acv">`);
1139
+ if (overflowing()) {
1140
+ $$renderer3.push("<!--[0-->");
1141
+ $$renderer3.push(`<button type="button" class="page svelte-r39acv"${$24.attr("disabled", atStart, true)} aria-label="Scroll tabs left">`);
1142
+ Chevron_left($$renderer3, { size: 16 });
1143
+ $$renderer3.push(`<!----></button>`);
1144
+ } else {
1145
+ $$renderer3.push("<!--[-1-->");
1146
+ }
1147
+ $$renderer3.push(`<!--]--> <div class="viewport svelte-r39acv"><div class="tabs svelte-r39acv" role="tablist" aria-label="Instances"><!--[-->`);
1148
+ const each_array = $24.ensure_array_like(running);
1149
+ for (let i = 0, $$length = each_array.length;i < $$length; i++) {
1150
+ let inst = each_array[i];
1070
1151
  if (editingId === inst.id) {
1071
1152
  $$renderer3.push("<!--[0-->");
1072
- $$renderer3.push(`<div class="tab-label editing svelte-r39acv">`);
1153
+ $$renderer3.push(`<div class="tab editing svelte-r39acv">`);
1073
1154
  Avatar($$renderer3, {
1074
1155
  name: inst.name,
1075
1156
  art: findAvatar(inst.avatar ?? undefined) ?? null,
1076
- scale: 4
1157
+ scale: 3
1077
1158
  });
1078
- $$renderer3.push(`<!----> <input class="tab-name-edit svelte-r39acv"${$22.attr("value", editingName)} autofocus=""/></div>`);
1159
+ $$renderer3.push(`<!----> <input class="tab-name-edit svelte-r39acv"${$24.attr("value", editingName)} autofocus=""/></div>`);
1079
1160
  } else {
1080
1161
  $$renderer3.push("<!--[-1-->");
1081
- $$renderer3.push(`<button type="button" class="tab-label svelte-r39acv"${$22.attr("title", inst.name)}>`);
1162
+ $$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)}>`);
1082
1163
  Avatar($$renderer3, {
1083
1164
  name: inst.name,
1084
1165
  art: findAvatar(inst.avatar ?? undefined) ?? null,
1085
- scale: 4
1166
+ scale: 3
1086
1167
  });
1087
- $$renderer3.push(`<!----> <span class="tab-name svelte-r39acv">${$22.escape(inst.name)}</span> `);
1168
+ $$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")}>`);
1088
1169
  if (inst.mode === "terminal") {
1089
1170
  $$renderer3.push("<!--[0-->");
1090
- $$renderer3.push(`<span class="tab-mode svelte-r39acv" title="Terminal-only instance">`);
1091
- Terminal($$renderer3, { size: 13 });
1092
- $$renderer3.push(`<!----></span>`);
1171
+ Terminal($$renderer3, { size: 11 });
1172
+ } else {
1173
+ $$renderer3.push("<!--[-1-->");
1174
+ Layout_template($$renderer3, { size: 11 });
1175
+ }
1176
+ $$renderer3.push(`<!--]--></span> `);
1177
+ if (inst.id !== active && attention[inst.id]) {
1178
+ $$renderer3.push("<!--[0-->");
1179
+ $$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>`);
1093
1180
  } else {
1094
1181
  $$renderer3.push("<!--[-1-->");
1095
- $$renderer3.push(`<span class="tab-mode svelte-r39acv" title="Full IDE instance">`);
1096
- Layout_template($$renderer3, { size: 13 });
1097
- $$renderer3.push(`<!----></span>`);
1098
1182
  }
1099
1183
  $$renderer3.push(`<!--]--></button>`);
1100
1184
  }
1101
- $$renderer3.push(`<!--]--></div>`);
1185
+ $$renderer3.push(`<!--]-->`);
1186
+ }
1187
+ $$renderer3.push(`<!--]--></div></div> `);
1188
+ if (overflowing()) {
1189
+ $$renderer3.push("<!--[0-->");
1190
+ $$renderer3.push(`<button type="button" class="page trailing svelte-r39acv"${$24.attr("disabled", atEnd, true)} aria-label="Scroll tabs right">`);
1191
+ Chevron_right($$renderer3, { size: 16 });
1192
+ $$renderer3.push(`<!----></button>`);
1193
+ } else {
1194
+ $$renderer3.push("<!--[-1-->");
1102
1195
  }
1103
- $$renderer3.push(`<!--]--></nav>`);
1196
+ $$renderer3.push(`<!--]--></div>`);
1104
1197
  } else {
1105
1198
  $$renderer3.push("<!--[-1-->");
1106
1199
  }
@@ -1113,41 +1206,41 @@ function IdeBar($$renderer, $$props) {
1113
1206
  } else {
1114
1207
  $$renderer3.push("<!--[-1-->");
1115
1208
  }
1116
- $$renderer3.push(`<!--]--> <a class="cog svelte-r39acv"${$22.attr("href", withPopupMarker("/settings"))} target="_blank" rel="noopener noreferrer" title="Settings" aria-label="Settings">`);
1209
+ $$renderer3.push(`<!--]--> <a class="cog svelte-r39acv"${$24.attr("href", withPopupMarker("/settings"))} target="_blank" rel="noopener noreferrer" title="Settings" aria-label="Settings">`);
1117
1210
  Settings($$renderer3, { size: 18 });
1118
1211
  $$renderer3.push(`<!----></a></div>`);
1119
1212
  },
1120
1213
  $$slots: { default: true }
1121
1214
  });
1122
- $22.bind_props($$props, { editingName });
1215
+ $24.bind_props($$props, { editingName });
1123
1216
  });
1124
1217
  }
1125
1218
 
1126
1219
  // src/components/IdeLoader.svelte
1127
1220
  import"svelte/internal/flags/async";
1128
- import * as $23 from "svelte/internal/server";
1221
+ import * as $25 from "svelte/internal/server";
1129
1222
  function IdeLoader($$renderer, $$props) {
1130
1223
  $$renderer.component(($$renderer2) => {
1131
1224
  let { speed = 1, mode = "ide", stalledAfterMs, onoverride } = $$props;
1132
- const isTerminal = $23.derived(() => mode === "terminal");
1225
+ const isTerminal = $25.derived(() => mode === "terminal");
1133
1226
  let stalled = false;
1134
1227
  const ROWS = 3;
1135
1228
  const COLS = 22;
1136
1229
  const BASE_TICK_MS = 140;
1137
1230
  const FLIPS_PER_TICK = 7;
1138
- const tickMs = $23.derived(() => Math.max(20, BASE_TICK_MS / speed));
1231
+ const tickMs = $25.derived(() => Math.max(20, BASE_TICK_MS / speed));
1139
1232
  const seed = () => Array.from({ length: ROWS }, () => Array.from({ length: COLS }, () => Math.random() < 0.5 ? 0 : 1));
1140
1233
  let grid = seed();
1141
1234
  $$renderer2.push(`<div class="loader svelte-w5e143"><div class="grid svelte-w5e143" aria-hidden="true"><!--[-->`);
1142
- const each_array = $23.ensure_array_like(grid);
1235
+ const each_array = $25.ensure_array_like(grid);
1143
1236
  for (let i = 0, $$length = each_array.length;i < $$length; i++) {
1144
1237
  let row = each_array[i];
1145
- $$renderer2.push(`<div class="row svelte-w5e143">${$23.escape(row.join(""))}</div>`);
1238
+ $$renderer2.push(`<div class="row svelte-w5e143">${$25.escape(row.join(""))}</div>`);
1146
1239
  }
1147
- $$renderer2.push(`<!--]--></div> <div class="label svelte-w5e143">Loading ${$23.escape(isTerminal() ? "terminal" : "editor")}<span class="dot svelte-w5e143">.</span><span class="dot svelte-w5e143">.</span><span class="dot svelte-w5e143">.</span></div> `);
1240
+ $$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> `);
1148
1241
  if (stalled) {
1149
1242
  $$renderer2.push("<!--[0-->");
1150
- $$renderer2.push(`<div class="stalled svelte-w5e143"><p class="svelte-w5e143">Waiting for ${$23.escape(isTerminal() ? "the terminal" : "code-server")} to answer inside the container.</p> `);
1243
+ $$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> `);
1151
1244
  if (onoverride) {
1152
1245
  $$renderer2.push("<!--[0-->");
1153
1246
  Button($$renderer2, {
@@ -1171,11 +1264,11 @@ function IdeLoader($$renderer, $$props) {
1171
1264
 
1172
1265
  // src/components/TerminalSplit.svelte
1173
1266
  import"svelte/internal/flags/async";
1174
- import * as $27 from "svelte/internal/server";
1267
+ import * as $29 from "svelte/internal/server";
1175
1268
 
1176
1269
  // node_modules/@lucide/svelte/dist/icons/panel-right-open.svelte
1177
1270
  import"svelte/internal/flags/async";
1178
- import * as $24 from "svelte/internal/server";
1271
+ import * as $26 from "svelte/internal/server";
1179
1272
  function Panel_right_open($$renderer, $$props) {
1180
1273
  let { $$slots, $$events, ...props } = $$props;
1181
1274
  const iconNode = [
@@ -1186,11 +1279,11 @@ function Panel_right_open($$renderer, $$props) {
1186
1279
  ["path", { d: "M15 3v18" }],
1187
1280
  ["path", { d: "m10 15-3-3 3-3" }]
1188
1281
  ];
1189
- Icon($$renderer, $24.spread_props([{ name: "panel-right-open" }, props, { iconNode }]));
1282
+ Icon($$renderer, $26.spread_props([{ name: "panel-right-open" }, props, { iconNode }]));
1190
1283
  }
1191
1284
  // node_modules/@lucide/svelte/dist/icons/panel-right-close.svelte
1192
1285
  import"svelte/internal/flags/async";
1193
- import * as $25 from "svelte/internal/server";
1286
+ import * as $27 from "svelte/internal/server";
1194
1287
  function Panel_right_close($$renderer, $$props) {
1195
1288
  let { $$slots, $$events, ...props } = $$props;
1196
1289
  const iconNode = [
@@ -1201,11 +1294,11 @@ function Panel_right_close($$renderer, $$props) {
1201
1294
  ["path", { d: "M15 3v18" }],
1202
1295
  ["path", { d: "m8 9 3 3-3 3" }]
1203
1296
  ];
1204
- Icon($$renderer, $25.spread_props([{ name: "panel-right-close" }, props, { iconNode }]));
1297
+ Icon($$renderer, $27.spread_props([{ name: "panel-right-close" }, props, { iconNode }]));
1205
1298
  }
1206
1299
  // src/components/TerminalPane.svelte
1207
1300
  import"svelte/internal/flags/async";
1208
- import * as $26 from "svelte/internal/server";
1301
+ import * as $28 from "svelte/internal/server";
1209
1302
  import { onMount } from "svelte";
1210
1303
  function TerminalPane($$renderer, $$props) {
1211
1304
  $$renderer.component(($$renderer2) => {
@@ -1302,15 +1395,18 @@ function TerminalPane($$renderer, $$props) {
1302
1395
  }
1303
1396
  }
1304
1397
  function applyTheme() {
1305
- if (!term)
1398
+ if (!term || !el)
1306
1399
  return;
1307
- const cs = getComputedStyle(document.documentElement);
1308
- const bg = cs.getPropertyValue("--bg").trim() || "#1a1a1a";
1309
- const fg = cs.getPropertyValue("--ink").trim() || "#e6e6e6";
1400
+ const cs = getComputedStyle(el);
1401
+ const bg = cs.backgroundColor || "#0d0e0a";
1402
+ const fg = cs.color || "#d8d9cf";
1310
1403
  term.options.theme = { background: bg, foreground: fg, cursor: fg, cursorAccent: bg };
1311
1404
  }
1312
1405
  onMount(() => {
1313
1406
  let themeObs;
1407
+ const scheme = window.matchMedia("(prefers-color-scheme: dark)");
1408
+ const onScheme = () => applyTheme();
1409
+ scheme.addEventListener("change", onScheme);
1314
1410
  (async () => {
1315
1411
  const [{ Terminal: Terminal2 }, { FitAddon }] = await Promise.all([import("./chunk-9nqc2r0y.js"), import("./chunk-rtdne1m8.js")]);
1316
1412
  if (disposed)
@@ -1341,6 +1437,7 @@ function TerminalPane($$renderer, $$props) {
1341
1437
  disposed = true;
1342
1438
  sizeObs.disconnect();
1343
1439
  themeObs?.disconnect();
1440
+ scheme.removeEventListener("change", onScheme);
1344
1441
  if (retry)
1345
1442
  clearTimeout(retry);
1346
1443
  try {
@@ -1406,7 +1503,7 @@ function TerminalSplit($$renderer, $$props) {
1406
1503
  e.preventDefault();
1407
1504
  }
1408
1505
  function splitToggle($$renderer3) {
1409
- $$renderer3.push(`<button type="button"${$27.attr("aria-pressed", open)}${$27.attr("title", open ? "Hide the shell pane" : "Open a shell alongside Claude")}${$27.attr("aria-label", open ? "Hide the shell pane" : "Open a shell alongside Claude")}>`);
1506
+ $$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")}>`);
1410
1507
  if (open) {
1411
1508
  $$renderer3.push("<!--[0-->");
1412
1509
  Panel_right_close($$renderer3, { size: 14 });
@@ -1416,7 +1513,7 @@ function TerminalSplit($$renderer, $$props) {
1416
1513
  }
1417
1514
  $$renderer3.push(`<!--]--></button>`);
1418
1515
  }
1419
- $$renderer2.push(`<div class="split svelte-1ysvu88"><div class="side svelte-1ysvu88"${$27.attr_style("", { "flex-basis": open ? `${ratio}%` : "100%" })}>`);
1516
+ $$renderer2.push(`<div class="split svelte-1ysvu88"><div class="side svelte-1ysvu88"${$29.attr_style("", { "flex-basis": open ? `${ratio}%` : "100%" })}>`);
1420
1517
  TerminalPane($$renderer2, {
1421
1518
  id,
1422
1519
  active,
@@ -1426,7 +1523,7 @@ function TerminalSplit($$renderer, $$props) {
1426
1523
  $$renderer2.push(`<!----></div> `);
1427
1524
  if (mounted) {
1428
1525
  $$renderer2.push("<!--[0-->");
1429
- $$renderer2.push(`<div${$27.attr_class("divider svelte-1ysvu88", undefined, { hidden: !open })} role="separator" aria-orientation="vertical" aria-label="Resize terminal panes"${$27.attr("aria-valuenow", Math.round(ratio))}${$27.attr("aria-valuemin", 20)}${$27.attr("aria-valuemax", 80)} tabindex="0"></div> <div${$27.attr_class("side svelte-1ysvu88", undefined, { hidden: !open })}${$27.attr_style("", { "flex-basis": `${$27.stringify(100 - ratio)}%` })}>`);
1526
+ $$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)}%` })}>`);
1430
1527
  TerminalPane($$renderer2, {
1431
1528
  id,
1432
1529
  arg: "shell",
@@ -1451,7 +1548,7 @@ function AppShell($$renderer, $$props) {
1451
1548
  let livePet = pet;
1452
1549
  let liveFilter = filter;
1453
1550
  let loaded = snapshot.length > 0;
1454
- const running = $28.derived(() => instances.filter((i) => i.status === "running"));
1551
+ const running = $30.derived(() => instances.filter((i) => i.status === "running"));
1455
1552
  let attention = Object.fromEntries(snapshot.map((i) => [i.id, i.attention]));
1456
1553
  let editingId = null;
1457
1554
  let editingName = "";
@@ -1482,9 +1579,9 @@ function AppShell($$renderer, $$props) {
1482
1579
  apiPost("/api/settings/filter", { value: v }).catch(() => {});
1483
1580
  }
1484
1581
  let path = initialPath;
1485
- const onIde = $28.derived(() => path.startsWith("/ide"));
1486
- const requestedId = $28.derived(() => path.startsWith("/ide/") ? path.slice("/ide/".length) : "");
1487
- const active = $28.derived(() => onIde() ? running().some((i) => i.id === requestedId()) ? requestedId() : running()[0]?.id ?? "" : "");
1582
+ const onIde = $30.derived(() => path.startsWith("/ide"));
1583
+ const requestedId = $30.derived(() => path.startsWith("/ide/") ? path.slice("/ide/".length) : "");
1584
+ const active = $30.derived(() => onIde() ? running().some((i) => i.id === requestedId()) ? requestedId() : running()[0]?.id ?? "" : "");
1488
1585
  function navigate(to) {
1489
1586
  if (to === path)
1490
1587
  return;
@@ -1497,7 +1594,7 @@ function AppShell($$renderer, $$props) {
1497
1594
  const forced = new SvelteSet;
1498
1595
  const mountable = (id) => everReady.has(id) || forced.has(id);
1499
1596
  const STALLED_AFTER_MS = 1e4;
1500
- const activeInstance = $28.derived(() => running().find((i) => i.id === active()));
1597
+ const activeInstance = $30.derived(() => running().find((i) => i.id === active()));
1501
1598
  const frames = {};
1502
1599
  function reloadActive() {
1503
1600
  const inst = activeInstance();
@@ -1506,10 +1603,27 @@ function AppShell($$renderer, $$props) {
1506
1603
  loadedFrames.delete(inst.id);
1507
1604
  frames[inst.id]?.contentWindow?.location.replace(ideUrl(inst));
1508
1605
  }
1606
+ function jumpToTab(e, fromFrame) {
1607
+ if (!e.altKey || e.ctrlKey || e.metaKey || editingId)
1608
+ return;
1609
+ const digit = /^Digit([1-9])$/.exec(e.code)?.[1];
1610
+ if (!digit)
1611
+ return;
1612
+ const next = nextTabIndex(running().findIndex((i) => i.id === active()), digit, running().length);
1613
+ const target = next === null ? undefined : running()[next];
1614
+ if (!target)
1615
+ return;
1616
+ e.preventDefault();
1617
+ e.stopPropagation();
1618
+ navigate(`/ide/${target.id}`);
1619
+ if (fromFrame)
1620
+ tick2().then(() => frames[target.id]?.contentWindow?.focus());
1621
+ }
1622
+ const framedTabIds = $30.derived(() => running().filter((i) => i.mode !== "terminal" && loadedFrames.has(i.id)).map((i) => i.id).join(" "));
1509
1623
  let $$settled = true;
1510
1624
  let $$inner_renderer;
1511
1625
  function $$render_inner($$renderer3) {
1512
- $$renderer3.push(`<div${$28.attr_class("app svelte-1duc7gd", undefined, { ide: onIde() })}>`);
1626
+ $$renderer3.push(`<div${$30.attr_class("app svelte-1duc7gd", undefined, { ide: onIde() })}>`);
1513
1627
  if (onIde()) {
1514
1628
  $$renderer3.push("<!--[0-->");
1515
1629
  IdeBar($$renderer3, {
@@ -1541,13 +1655,13 @@ function AppShell($$renderer, $$props) {
1541
1655
  onFilter: setFilter
1542
1656
  });
1543
1657
  }
1544
- $$renderer3.push(`<!--]--> <div${$28.attr_class("panes svelte-1duc7gd", undefined, { hidden: !onIde() })}><!--[-->`);
1545
- const each_array = $28.ensure_array_like(running());
1658
+ $$renderer3.push(`<!--]--> <div${$30.attr_class("panes svelte-1duc7gd", undefined, { hidden: !onIde() })}><!--[-->`);
1659
+ const each_array = $30.ensure_array_like(running());
1546
1660
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
1547
1661
  let inst = each_array[$$index];
1548
1662
  if (visited.has(inst.id)) {
1549
1663
  $$renderer3.push("<!--[0-->");
1550
- $$renderer3.push(`<div${$28.attr_class("pane svelte-1duc7gd", undefined, { active: inst.id === active() })}>`);
1664
+ $$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)}`)}>`);
1551
1665
  if (mountable(inst.id)) {
1552
1666
  $$renderer3.push("<!--[0-->");
1553
1667
  if (inst.mode === "terminal") {
@@ -1559,7 +1673,7 @@ function AppShell($$renderer, $$props) {
1559
1673
  });
1560
1674
  } else {
1561
1675
  $$renderer3.push("<!--[-1-->");
1562
- $$renderer3.push(`<iframe${$28.attr("src", ideUrl(inst))}${$28.attr("title", inst.name)} class="svelte-1duc7gd" onload="this.__e=event"></iframe>`);
1676
+ $$renderer3.push(`<iframe${$30.attr("src", ideUrl(inst))}${$30.attr("title", inst.name)} class="svelte-1duc7gd" onload="this.__e=event"></iframe>`);
1563
1677
  }
1564
1678
  $$renderer3.push(`<!--]-->`);
1565
1679
  } else {
@@ -1593,11 +1707,7 @@ function AppShell($$renderer, $$props) {
1593
1707
  $$renderer3.push("<!--[-1-->");
1594
1708
  }
1595
1709
  $$renderer3.push(`<!--]--></div></div> `);
1596
- Toaster($$renderer3, {
1597
- toastOptions: {
1598
- style: "border:1px solid var(--ink); background:var(--bg-card); color:var(--ink); box-shadow:4px 4px 0 var(--ink); font-family:var(--font-mono); font-size:13px;"
1599
- }
1600
- });
1710
+ Toaster($$renderer3, { toastOptions: TOAST_OPTIONS });
1601
1711
  $$renderer3.push(`<!---->`);
1602
1712
  }
1603
1713
  do {
@@ -1615,7 +1725,7 @@ function App($$renderer, $$props) {
1615
1725
  let { preflight, initialPath, snapshot, pet, filter } = $$props;
1616
1726
  if (true) {
1617
1727
  let failed = function($$renderer3, error) {
1618
- $$renderer3.push(`<mochi-island-failure data-component="AppShell"${$29.attr("data-message", error.message)}></mochi-island-failure>`);
1728
+ $$renderer3.push(`<mochi-island-failure data-component="AppShell"${$31.attr("data-message", error.message)}></mochi-island-failure>`);
1619
1729
  };
1620
1730
  $$renderer2.push("<!--[0-->");
1621
1731
  $$renderer2.boundary({ failed }, ($$renderer3) => {
@@ -1623,7 +1733,7 @@ function App($$renderer, $$props) {
1623
1733
  {
1624
1734
  HydratableBoundary($$renderer3, {
1625
1735
  children: ($$renderer4) => {
1626
- $$renderer4.push(`<mochi-hydratable-island component-name="AppShell_2rtnxn6pgp2rh" component-url="__MOCHI_COMPONENT_URL__AppShell_2rtnxn6pgp2rh__"${$29.attr("props-ref", emitIslandProps({ preflight, initialPath, snapshot, pet, filter }))}>`);
1736
+ $$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 }))}>`);
1627
1737
  $$renderer4.push(`<!--[-->`);
1628
1738
  {
1629
1739
  AppShell($$renderer4, { preflight, initialPath, snapshot, pet, filter });
@@ -11,11 +11,12 @@ import {
11
11
  OFF,
12
12
  ON,
13
13
  ROWS,
14
+ TOAST_OPTIONS,
14
15
  Toaster,
15
16
  avatars,
16
17
  decode,
17
18
  dist_default
18
- } from "./chunk-th2dbqvc.js";
19
+ } from "./chunk-gz6hv1h5.js";
19
20
  import {
20
21
  HydratableBoundary,
21
22
  Icon,
@@ -452,11 +453,7 @@ function AvatarsView($$renderer, $$props) {
452
453
  $$renderer2.push(`<!--]--></li>`);
453
454
  }
454
455
  $$renderer2.push(`<!--]--></ul></section></main></div> `);
455
- Toaster($$renderer2, {
456
- toastOptions: {
457
- style: "border:1px solid var(--ink); background:var(--bg-card); color:var(--ink); box-shadow:4px 4px 0 var(--ink); font-family:var(--font-mono); font-size:13px;"
458
- }
459
- });
456
+ Toaster($$renderer2, { toastOptions: TOAST_OPTIONS });
460
457
  $$renderer2.push(`<!---->`);
461
458
  });
462
459
  }
@@ -1,13 +1,13 @@
1
1
  // @bun
2
2
  import {
3
3
  StatusBadge,
4
- apiDelete,
5
- apiPost,
6
4
  forwardedPortUrl
7
- } from "./chunk-3t7v4hk0.js";
5
+ } from "./chunk-ed46m58e.js";
8
6
  import {
7
+ apiDelete,
8
+ apiPost,
9
9
  ideUrl
10
- } from "./chunk-gkjgybb2.js";
10
+ } from "./chunk-zd49axkf.js";
11
11
  import {
12
12
  HydratableBoundary,
13
13
  Icon,