codebay 0.0.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/.mochi/import-css/index-0nwv3654.css +18 -0
  2. package/.mochi/import-css/index-xndx4980.css +54 -0
  3. package/.mochi/manifest.json +1612 -0
  4. package/.mochi/server-island.js +1 -0
  5. package/.mochi/svelte-client/HydratableIsland-wrq79y0w.js +1 -0
  6. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-7xgbmxxg.js +2 -0
  7. package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-3cnbjpz2.js +13 -0
  8. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-2ntmdm3e.js +1 -0
  9. package/.mochi/svelte-client/_hydrate-SettingsView_8hmarwmf8onq-t08spym1.js +23 -0
  10. package/.mochi/svelte-client/chunk-04qv4w6w.js +2 -0
  11. package/.mochi/svelte-client/chunk-5jnepvzx.js +2 -0
  12. package/.mochi/svelte-client/chunk-hcztrd75.js +1 -0
  13. package/.mochi/svelte-client/chunk-qxwt25hn.js +4 -0
  14. package/.mochi/svelte-client/chunk-sjmcgh7f.js +2 -0
  15. package/.mochi/svelte-client/chunk-tr67wtwn.js +2 -0
  16. package/.mochi/svelte-compile/App-f0q5n4rk.server.js +1168 -0
  17. package/.mochi/svelte-compile/Avatars-p8gfef7x.server.js +332 -0
  18. package/.mochi/svelte-compile/ClientStats-z3tn9ad6.server.js +99 -0
  19. package/.mochi/svelte-compile/DefaultError-wh77vebf.server.js +52 -0
  20. package/.mochi/svelte-compile/Instance-atjwsczx.server.js +356 -0
  21. package/.mochi/svelte-compile/Settings-q88xw6h8.server.js +1173 -0
  22. package/.mochi/svelte-compile/chunk-4kwy539a.js +14 -0
  23. package/.mochi/svelte-compile/chunk-9bjk7yx6.js +81 -0
  24. package/.mochi/svelte-compile/chunk-btmcxhqy.js +58 -0
  25. package/.mochi/svelte-compile/chunk-sxqys3nw.js +1668 -0
  26. package/.mochi/svelte-compile/chunk-v6796ga4.js +3295 -0
  27. package/.mochi/svelte-compile/chunk-we0ggtws.js +34 -0
  28. package/.mochi/svelte-css/AppBar-3bxinv4pabv8l.css +1 -0
  29. package/.mochi/svelte-css/AppShell-36mpg5smnbmuw.css +1 -0
  30. package/.mochi/svelte-css/Avatar-24th63awm9mna.css +1 -0
  31. package/.mochi/svelte-css/AvatarEditor-1ryrs1md5g36y.css +1 -0
  32. package/.mochi/svelte-css/AvatarsView-3hq37u4dgtljn.css +1 -0
  33. package/.mochi/svelte-css/BackLink-2wlu0eovz9j86.css +1 -0
  34. package/.mochi/svelte-css/BranchBox-1yqu1q2mgnjwz.css +1 -0
  35. package/.mochi/svelte-css/Brand-1la7zw5uhcbl4.css +1 -0
  36. package/.mochi/svelte-css/Button-2vtbrzb5kgu25.css +1 -0
  37. package/.mochi/svelte-css/CheckmarkIcon-3qlazj2oc50jc.css +1 -0
  38. package/.mochi/svelte-css/ClientStats-19qzckq40p2q9.css +1 -0
  39. package/.mochi/svelte-css/CoinButton-1rej3sh3tkjud.css +1 -0
  40. package/.mochi/svelte-css/CredMenu-9hwgeptp7crb.css +1 -0
  41. package/.mochi/svelte-css/DashboardView-1cy4xpqhja9sx.css +1 -0
  42. package/.mochi/svelte-css/DefaultError-2b0daamydxgb2.css +1 -0
  43. package/.mochi/svelte-css/ErrorIcon-2x0tzsqxskw28.css +1 -0
  44. package/.mochi/svelte-css/FolderBrowser-1x428zb3f2kti.css +1 -0
  45. package/.mochi/svelte-css/HealthBox-er2her0jukwl.css +1 -0
  46. package/.mochi/svelte-css/IdeBar-2qoqi2ya9zdn3.css +1 -0
  47. package/.mochi/svelte-css/IdeLoader-26rlko8e00j3g.css +1 -0
  48. package/.mochi/svelte-css/InstanceCard-16f77aysm7lgp.css +1 -0
  49. package/.mochi/svelte-css/InstanceView-wq85bxtusont.css +1 -0
  50. package/.mochi/svelte-css/LoaderIcon-soq5wt3p05ye.css +1 -0
  51. package/.mochi/svelte-css/PortsBox-1t25b5yg7jva3.css +1 -0
  52. package/.mochi/svelte-css/SettingsCog-jftyadvo64qo.css +1 -0
  53. package/.mochi/svelte-css/SettingsView-1nfdwnm16cpp2.css +1 -0
  54. package/.mochi/svelte-css/Skeleton-8k69usiju43h.css +1 -0
  55. package/.mochi/svelte-css/StatusBadge-3mq0j7z6aq4j.css +1 -0
  56. package/.mochi/svelte-css/ThemePicker-1ir8jyocm8mvi.css +1 -0
  57. package/.mochi/svelte-css/ToastBar-3havgkmtofntq.css +1 -0
  58. package/.mochi/svelte-css/ToastIcon-2z5wrkc95khg0.css +1 -0
  59. package/.mochi/svelte-css/ToastMessage-2jfwb2og2lfa8.css +1 -0
  60. package/.mochi/svelte-css/ToastWrapper-1fbnym10rm2nv.css +1 -0
  61. package/.mochi/svelte-css/Toaster-kk60j193854n.css +1 -0
  62. package/.mochi/svelte-css/TopBar-2q87li6yt8ids.css +1 -0
  63. package/LICENSE +21 -0
  64. package/README.md +34 -3
  65. package/bin/codebay.ts +22 -0
  66. package/migrations/0001_init.sql +20 -0
  67. package/migrations/0002_port_forwards.sql +9 -0
  68. package/migrations/0003_options.sql +4 -0
  69. package/migrations/0004_instance_image.sql +1 -0
  70. package/package.json +87 -9
  71. package/public/sounds/done.wav +0 -0
  72. package/public/sounds/waiting.wav +0 -0
  73. package/src/__fixtures__/HelloWorld.svelte +4 -0
  74. package/src/additional-svelte-typings.d.ts +1 -0
  75. package/src/api.ts +61 -0
  76. package/src/avatars/anchor.ts +17 -0
  77. package/src/avatars/bear.ts +17 -0
  78. package/src/avatars/bee.ts +17 -0
  79. package/src/avatars/bob-marley.ts +17 -0
  80. package/src/avatars/car.ts +17 -0
  81. package/src/avatars/carpathians.ts +17 -0
  82. package/src/avatars/cat-body.ts +17 -0
  83. package/src/avatars/cat-sits.ts +17 -0
  84. package/src/avatars/cat.ts +17 -0
  85. package/src/avatars/celtic-cross.ts +17 -0
  86. package/src/avatars/cherry.ts +17 -0
  87. package/src/avatars/cotton.ts +17 -0
  88. package/src/avatars/crab.ts +17 -0
  89. package/src/avatars/crown.ts +17 -0
  90. package/src/avatars/diamond.ts +17 -0
  91. package/src/avatars/dog.ts +17 -0
  92. package/src/avatars/elephant.ts +17 -0
  93. package/src/avatars/fish.ts +17 -0
  94. package/src/avatars/fleur-de-lis.ts +17 -0
  95. package/src/avatars/flower.ts +17 -0
  96. package/src/avatars/fox.ts +17 -0
  97. package/src/avatars/frog.ts +17 -0
  98. package/src/avatars/ghost.ts +17 -0
  99. package/src/avatars/giraffe.ts +17 -0
  100. package/src/avatars/glasses.ts +17 -0
  101. package/src/avatars/heart.ts +17 -0
  102. package/src/avatars/index.ts +128 -0
  103. package/src/avatars/invader.ts +17 -0
  104. package/src/avatars/kangaroo.ts +17 -0
  105. package/src/avatars/key.ts +17 -0
  106. package/src/avatars/lightning.ts +17 -0
  107. package/src/avatars/mushroom.ts +17 -0
  108. package/src/avatars/name-prompts.ts +30 -0
  109. package/src/avatars/octopus.ts +17 -0
  110. package/src/avatars/owl.ts +17 -0
  111. package/src/avatars/penguin.ts +17 -0
  112. package/src/avatars/planet.ts +17 -0
  113. package/src/avatars/rabbit.ts +17 -0
  114. package/src/avatars/rat.ts +17 -0
  115. package/src/avatars/robot.ts +17 -0
  116. package/src/avatars/rocket.ts +17 -0
  117. package/src/avatars/sea.ts +17 -0
  118. package/src/avatars/serialize.ts +65 -0
  119. package/src/avatars/skull.ts +17 -0
  120. package/src/avatars/snail.ts +17 -0
  121. package/src/avatars/snake.ts +17 -0
  122. package/src/avatars/snakegame.ts +17 -0
  123. package/src/avatars/star.ts +17 -0
  124. package/src/avatars/svelte.ts +17 -0
  125. package/src/avatars/target.ts +17 -0
  126. package/src/avatars/tree.ts +17 -0
  127. package/src/avatars/types.ts +24 -0
  128. package/src/avatars/ukraine.ts +17 -0
  129. package/src/avatars/whale.ts +17 -0
  130. package/src/avatars/wheat.ts +17 -0
  131. package/src/avatars/yinyan.ts +17 -0
  132. package/src/components/AppBar.svelte +35 -0
  133. package/src/components/AppShell.svelte +302 -0
  134. package/src/components/Avatar.svelte +235 -0
  135. package/src/components/AvatarEditor.svelte +297 -0
  136. package/src/components/AvatarsView.svelte +115 -0
  137. package/src/components/BranchBox.svelte +32 -0
  138. package/src/components/Brand.svelte +41 -0
  139. package/src/components/Button.svelte +161 -0
  140. package/src/components/CoinButton.svelte +121 -0
  141. package/src/components/CredMenu.svelte +171 -0
  142. package/src/components/DashboardView.svelte +198 -0
  143. package/src/components/FolderBrowser.svelte +635 -0
  144. package/src/components/HealthBox.svelte +161 -0
  145. package/src/components/IdeBar.svelte +186 -0
  146. package/src/components/IdeLoader.svelte +135 -0
  147. package/src/components/InstanceCard.svelte +220 -0
  148. package/src/components/InstanceView.svelte +567 -0
  149. package/src/components/PortsBox.svelte +74 -0
  150. package/src/components/SettingsCog.svelte +22 -0
  151. package/src/components/SettingsView.svelte +1494 -0
  152. package/src/components/Skeleton.svelte +43 -0
  153. package/src/components/StatusBadge.svelte +54 -0
  154. package/src/components/ThemePicker.svelte +77 -0
  155. package/src/components/TopBar.svelte +64 -0
  156. package/src/components/UiShowcase.svelte +578 -0
  157. package/src/components/ui-showcase/ComponentDemo.svelte +85 -0
  158. package/src/container-injections/attention-hooks.ts +117 -0
  159. package/src/container-injections/claude-aliases.ts +43 -0
  160. package/src/container-injections/claude-code-credentials.ts +145 -0
  161. package/src/container-injections/claude-code-custom.ts +125 -0
  162. package/src/container-injections/claude-no-coauthor.ts +35 -0
  163. package/src/container-injections/claude-skip-permissions.ts +38 -0
  164. package/src/container-injections/claude-statusline.ts +109 -0
  165. package/src/container-injections/git-identity.ts +63 -0
  166. package/src/container-injections/git-safe-directory.ts +18 -0
  167. package/src/container-injections/github-credentials.ts +162 -0
  168. package/src/container-injections/host-env-vars.ts +108 -0
  169. package/src/container-injections/tmux.ts +67 -0
  170. package/src/fontsource.d.ts +3 -0
  171. package/src/index.ts +81 -0
  172. package/src/lib/auth.server.ts +95 -0
  173. package/src/lib/bridge.server.ts +34 -0
  174. package/src/lib/config.server.ts +140 -0
  175. package/src/lib/crypto.server.ts +12 -0
  176. package/src/lib/db.server.ts +196 -0
  177. package/src/lib/devcontainer.server.ts +511 -0
  178. package/src/lib/docker-client.server.ts +61 -0
  179. package/src/lib/docker.server.ts +139 -0
  180. package/src/lib/exec.server.ts +92 -0
  181. package/src/lib/git.server.ts +68 -0
  182. package/src/lib/health.server.ts +105 -0
  183. package/src/lib/injections.server.ts +72 -0
  184. package/src/lib/instances.server.ts +552 -0
  185. package/src/lib/links.ts +9 -0
  186. package/src/lib/picker.server.ts +46 -0
  187. package/src/lib/ports.server.ts +9 -0
  188. package/src/lib/proxy.server.ts +170 -0
  189. package/src/lib/repo-url.ts +60 -0
  190. package/src/lib/spawn.server.ts +14 -0
  191. package/src/lib/theme.server.ts +22 -0
  192. package/src/live.ts +50 -0
  193. package/src/pages/App.svelte +14 -0
  194. package/src/pages/Avatars.svelte +9 -0
  195. package/src/pages/Instance.svelte +9 -0
  196. package/src/pages/Settings.svelte +76 -0
  197. package/src/pages/UI.svelte +10 -0
  198. package/src/routes.ts +444 -0
  199. package/src/settings.ts +14 -0
  200. package/src/shell.html +100 -0
  201. package/src/sound.ts +69 -0
  202. package/src/theme.ts +24 -0
  203. package/src/types.ts +79 -0
  204. package/svelte.config.js +5 -0
@@ -0,0 +1,34 @@
1
+ // @bun
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ function __accessProp(key) {
8
+ return this[key];
9
+ }
10
+ var __toESMCache_node;
11
+ var __toESMCache_esm;
12
+ var __toESM = (mod, isNodeMode, target) => {
13
+ var canCache = mod != null && typeof mod === "object";
14
+ if (canCache) {
15
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
16
+ var cached = cache.get(mod);
17
+ if (cached)
18
+ return cached;
19
+ }
20
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
21
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
22
+ for (let key of __getOwnPropNames(mod))
23
+ if (!__hasOwnProp.call(to, key))
24
+ __defProp(to, key, {
25
+ get: __accessProp.bind(mod, key),
26
+ enumerable: true
27
+ });
28
+ if (canCache)
29
+ cache.set(mod, to);
30
+ return to;
31
+ };
32
+ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
33
+
34
+ export { __toESM, __commonJS };
@@ -0,0 +1 @@
1
+ .bar.svelte-fcv4i8{display:flex;border-bottom:1px solid var(--rule);background:var(--bg-card);align-items:stretch;gap:0;height:44px}.home.svelte-fcv4i8{display:inline-flex;color:var(--ink);border-right:1px solid var(--rule);flex:none;justify-content:center;align-items: center;width:48px}.home.svelte-fcv4i8:hover{background:var(--ink);color:var(--bg)}
@@ -0,0 +1 @@
1
+ .app.ide.svelte-1duc7gd{display:flex;flex-direction:column;height:100vh}.panes.svelte-1duc7gd{position:relative;flex:1;min-height:0}.panes.hidden.svelte-1duc7gd{display:none}.pane.svelte-1duc7gd{position:absolute;inset:0}.pane.svelte-1duc7gd:not(.active){display:none}iframe.svelte-1duc7gd{display:block;border:0;width:100%;height:100%}.empty.svelte-1duc7gd{position:absolute;display:flex;color:var(--ink-faint);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;justify-content:center;align-items: center;font-size:13px;inset:0}
@@ -0,0 +1 @@
1
+ .avatar.svelte-1pre9qb{display:grid;grid-template-columns:repeat(10,1fr);grid-template-rows:repeat(10,1fr);border:1px solid var(--ink);background:var(--bg);flex:none}.px.svelte-1pre9qb{box-sizing:border-box;padding:0 var(--gap)var(--gap)0;background-clip:content-box;background-color:var(--rule-soft)}.px.on.svelte-1pre9qb{background-color:var(--ink)}@property --hue{syntax:"<angle>";inherits:false;initial-value:0deg}@property --spin{syntax:"<angle>";inherits:false;initial-value:0deg}.avatar.interactive.svelte-1pre9qb{position:relative;cursor:pointer;touch-action:none}.invert.svelte-1pre9qb{position:absolute;pointer-events:none;opacity:0;mix-blend-mode:difference;-webkit-mask:radial-gradient(circle at var(--bx)var(--by),#000 0%,#000000eb 24%,#0000 58%);mask:radial-gradient(circle at var(--bx)var(--by),#000 0%,#000000eb 24%,#0000 58%);background:#fff;inset:0}.avatar.pressed.svelte-1pre9qb .invert:where(.svelte-1pre9qb){opacity:1}.avatar.ghosting.svelte-1pre9qb .invert:where(.svelte-1pre9qb){opacity:0;transition:opacity .25s ease-out}.bloom.svelte-1pre9qb{position:absolute;pointer-events:none;opacity:0;mix-blend-mode:screen;filter:hue-rotate(var(--hue,0deg));background:conic-gradient(from var(--spin,0deg)at var(--bx)var(--by),#ff0080,#ffae00,#00ff6a,#00b3ff,#7a00ff,#ff0080),radial-gradient(circle at var(--bx)var(--by),#0d0e0ad9 0%,#0d0e0a66 18%,transparent 45%);-webkit-mask:radial-gradient(circle at var(--bx)var(--by),transparent 8%,#000 26%,#000 38%,transparent 60%);mask:radial-gradient(circle at var(--bx)var(--by),transparent 8%,#000 26%,#000 38%,transparent 60%);transition:--hue .35s ease-out,--spin .35s ease-out;inset:0}.avatar.pressed.svelte-1pre9qb .bloom:where(.svelte-1pre9qb){opacity:.45}.avatar.ghosting.svelte-1pre9qb .bloom:where(.svelte-1pre9qb){opacity:0;transition:opacity .25s ease-out}@media (prefers-reduced-motion:no-preference){.avatar.interactive.svelte-1pre9qb{transition:transform .25s ease-out}.avatar.pressed.svelte-1pre9qb{transition:transform 60ms ease-out;transform:scale(.97)}}
@@ -0,0 +1 @@
1
+ .editor.svelte-qu6vp4{display:flex;background:var(--bg-card);border:1px solid var(--rule);overflow:hidden;flex-direction:column;width:100%}.head.svelte-qu6vp4{display:flex;border-bottom:1px solid var(--ink);background:var(--ink);align-items: center;padding:14px 18px}.head.svelte-qu6vp4 h2:where(.svelte-qu6vp4){font-family:var(--font-display);text-transform:uppercase;letter-spacing:.06em;color:var(--bg);margin:0;font-size:17px;font-weight:700}.body.svelte-qu6vp4{display:flex;flex-wrap:wrap;gap:18px;padding:18px}.grid-frame.svelte-qu6vp4{display:grid;grid-template-columns:repeat(10,40px);grid-template-rows:repeat(10,40px);border:1px solid var(--ink);background:var(--bg);flex:none;width:400px;height:400px}.ring-cell.svelte-qu6vp4{box-sizing:border-box;background-clip:content-box;background-color:var(--rule-soft);opacity:.4;padding:0 1px 1px 0}.grid.svelte-qu6vp4{display:grid;grid-template-columns:repeat(8,1fr);grid-template-rows:repeat(8,1fr);grid-column:2/10;grid-row:2/10;cursor:crosshair;touch-action:none}.cell.svelte-qu6vp4{box-sizing:border-box;background-clip:content-box;background-color:var(--rule-soft);padding:0 1px 1px 0}.cell.on.svelte-qu6vp4{background-color:var(--ink)}.side.svelte-qu6vp4{display:flex;flex-direction:column;flex:1;gap:16px;min-width:160px}.preview-label.svelte-qu6vp4{text-transform:uppercase;letter-spacing:.06em;color:var(--ink-faint);font-size:11px;font-family:var(--font-mono)}.preview-row.svelte-qu6vp4{display:flex;align-items: flex-end;gap:10px;margin-top:6px}.name-field.svelte-qu6vp4{display:flex;flex-direction:column;gap:6px}.name-field.svelte-qu6vp4 input:where(.svelte-qu6vp4){font-family:var(--font-mono);border:1px solid var(--ink);background:var(--bg);color:var(--ink);padding:8px 12px;font-size:13px}.name-field.svelte-qu6vp4 input:where(.svelte-qu6vp4)::placeholder{color:var(--ink-faint)}.name-field.svelte-qu6vp4 input:where(.svelte-qu6vp4):focus{outline:none;box-shadow:inset 3px 3px 0 var(--rule-soft)}.tools.svelte-qu6vp4{display:flex;gap:8px}.foot.svelte-qu6vp4{display:flex;border-top:1px solid var(--ink);flex-wrap:wrap;justify-content:space-between;align-items: center;gap:12px;padding:14px 18px}.hint.svelte-qu6vp4{font-family:var(--font-mono);color:var(--ink-faint);flex:1;min-width:180px;font-size:12px}.actions.svelte-qu6vp4{display:flex;gap:8px}.actions.svelte-qu6vp4 .btn{white-space:nowrap}
@@ -0,0 +1 @@
1
+ .page.svelte-fkq7sr{display:flex;flex-direction:column;min-height:100vh}.title.svelte-fkq7sr{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;color:var(--ink-soft);align-items: center;padding:0 14px;font-size:12px}.content.svelte-fkq7sr{display:flex;flex-direction:column;flex:1;align-items: center;gap:24px;padding:32px 20px}.content.svelte-fkq7sr>*{width:100%;max-width:720px}.catalog.svelte-fkq7sr{background:var(--bg-card);border:1px solid var(--rule);padding:18px}.catalog.svelte-fkq7sr header:where(.svelte-fkq7sr){margin-bottom:20px}.catalog.svelte-fkq7sr h2:where(.svelte-fkq7sr){font-family:var(--font-display);text-transform:uppercase;letter-spacing:.06em;margin:0;font-size:17px;font-weight:700}.catalog.svelte-fkq7sr header:where(.svelte-fkq7sr) p:where(.svelte-fkq7sr){font-family:var(--font-mono);color:var(--ink-soft);margin:4px 0 0;font-size:12px}ul.svelte-fkq7sr{list-style:none;display:grid;grid-template-columns:repeat(auto-fill,minmax(110px,1fr));gap:20px;margin:0;padding:0}li.svelte-fkq7sr{display:flex;flex-direction:column;align-items: center;gap:8px}.label.svelte-fkq7sr{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;color:var(--ink-soft);font-size:11px}
@@ -0,0 +1 @@
1
+ a.svelte-8oqqxp{display:inline-block;color:#1d1d1f;text-decoration:none;border-bottom:1px solid;padding-bottom:2px;transition:opacity .15s;font-size:15px;font-weight:500}a.svelte-8oqqxp:hover{opacity:.7}@media (max-width:480px){a.svelte-8oqqxp{font-size:14px}}@media (prefers-color-scheme:dark){a.svelte-8oqqxp{color:#f5f5f7}}
@@ -0,0 +1 @@
1
+ .branch.svelte-jv8lut{display:inline-flex;font-family:var(--font-mono);color:var(--ink);border:1px solid var(--ink-faint);align-items: center;gap:5px;max-width:100%;margin-top:6px;padding:2px 7px;font-size:12px}.branch.svelte-jv8lut svg{flex:none}.branch.svelte-jv8lut span:where(.svelte-jv8lut){overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@@ -0,0 +1 @@
1
+ .brand.svelte-94cd8h{display:inline-flex;font-family:var(--font-display);text-transform:uppercase;letter-spacing:.04em;color:inherit;text-decoration:none;align-items:baseline;gap:11px;font-size:22px;font-weight:700}.logo.svelte-94cd8h{display:inline-flex;align-self: center;align-items: center}.tagline.svelte-94cd8h{font-family:var(--font-sans);letter-spacing:.08em;color:var(--ink-soft);font-size:12px;font-weight:500}@media (max-width:640px){.tagline.svelte-94cd8h{display:none}}
@@ -0,0 +1 @@
1
+ .btn.svelte-1klcfz0{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;border:1px solid var(--ink);background:var(--bg-card);color:var(--ink);cursor:pointer;text-decoration:none;justify-content:center;align-items: center;gap:7px;font-weight:600}.btn.svelte-1klcfz0:disabled{opacity:.4;cursor:not-allowed}.btn[aria-disabled=true].svelte-1klcfz0{opacity:.4;cursor:not-allowed;pointer-events:none}.btn.sm.svelte-1klcfz0{padding:7px 12px;font-size:12px}.btn.md.svelte-1klcfz0{padding:9px 16px;font-size:13px}.btn.lg.svelte-1klcfz0{padding:12px 22px;font-size:15px}.btn.default.svelte-1klcfz0:hover:not(:disabled){background:var(--ink);color:var(--bg)}.btn.primary.svelte-1klcfz0{background:var(--ink);color:var(--bg);font-weight:700}.btn.primary.svelte-1klcfz0:hover:not(:disabled){background:var(--bg-card);color:var(--ink)}.btn.ghost.svelte-1klcfz0{background:0 0;border-style:dashed}.btn.ghost.svelte-1klcfz0:hover:not(:disabled){background:var(--ink);color:var(--bg);border-style:solid}.btn.danger.svelte-1klcfz0{color:var(--danger);border-color:var(--danger)}.btn.danger.svelte-1klcfz0:hover:not(:disabled){color:var(--danger);background-color:var(--danger-soft);background-image:linear-gradient(90deg,var(--danger)50%,transparent 0),linear-gradient(90deg,var(--danger)50%,transparent 0),linear-gradient(0deg,var(--danger)50%,transparent 0),linear-gradient(0deg,var(--danger)50%,transparent 0);animation:svelte-1klcfz0-marching-ants 2s linear infinite;background-position:0 0,0 100%,0 0,100% 0;background-repeat:repeat-x,repeat-x,repeat-y,repeat-y;background-size:14px 2px,14px 2px,2px 14px,2px 14px;border-color:#0000}@keyframes svelte-1klcfz0-marching-ants{to{background-position:28px 0,-28px 100%,0 -28px,100% 28px}}
@@ -0,0 +1 @@
1
+ div.svelte-1did3zw{opacity:0;background:var(--primary,#61d345);position:relative;animation:svelte-1did3zw-circleAnimation .3s cubic-bezier(.175,.885,.32,1.275)forwards;animation-delay:.1s;border-radius:10px;width:20px;height:20px;transform:rotate(45deg)}div.svelte-1did3zw:after{content:"";box-sizing:border-box;animation:svelte-1did3zw-checkmarkAnimation .2s ease-out forwards;opacity:0;animation-delay:.2s;position:absolute;border-bottom:2px solid;border-right:2px solid;border-color:var(--secondary,#fff);width:6px;height:10px;bottom:6px;left:6px}@keyframes svelte-1did3zw-circleAnimation{0%{transform:scale(0)rotate(45deg);opacity:0}to{transform:scale(1)rotate(45deg);opacity:1}}@keyframes svelte-1did3zw-checkmarkAnimation{0%{height:0;width:0;opacity:0}40%{height:0;width:6px;opacity:1}to{opacity:1;height:10px}}
@@ -0,0 +1 @@
1
+ html,body{overflow-x:hidden;margin:0}*,*:before,*:after{box-sizing:border-box}body{color:#c9d1d9;background:#0d1117;padding:24px;font:14px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace}h1.svelte-kvp4dv{color:#58a6ff;margin-bottom:4px}.subtitle.svelte-kvp4dv{color:#8b949e;margin-bottom:32px}h2.svelte-kvp4dv{color:#e3b341;margin:32px 0 8px;font-size:14px}.total.svelte-kvp4dv{color:#8b949e;font-weight:400}table.svelte-kvp4dv{border-collapse:collapse;width:100%}th.svelte-kvp4dv{color:#8b949e;text-align:left;border-bottom:1px solid #21262d;padding:4px 8px;font-weight:400}td.svelte-kvp4dv{border-bottom:1px solid #161b22;padding:3px 8px}td.path.svelte-kvp4dv{color:#79c0ff;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:500px}td.size.svelte-kvp4dv{text-align:right;color:#a5d6ff;white-space:nowrap;font-variant-numeric:tabular-nums}td.pct.svelte-kvp4dv{text-align:right;color:#8b949e;font-variant-numeric:tabular-nums;width:50px}td.bar.svelte-kvp4dv{width:210px}.bar-fill.svelte-kvp4dv{background:#1f6feb;border-radius:2px;height:10px}section.svelte-kvp4dv{margin-bottom:32px}
@@ -0,0 +1 @@
1
+ .coin-row.svelte-1ioj7vz{display:flex;align-items: center;gap:16px;width:100%;max-width:560px;padding:8px 0}.pixel-line.svelte-1ioj7vz{background:repeating-linear-gradient(90deg,var(--rule)0 2px,transparent 2px 6px);flex:1;height:2px}.coin-btn.svelte-1ioj7vz{display:flex;cursor:pointer;text-decoration:none;background:0 0;border:none;flex-direction:column;flex:none;align-items: center;gap:4px;padding:4px}.new.svelte-1ioj7vz{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.14em;color:var(--ink-soft);animation:svelte-1ioj7vz-coin-blink 2.6s steps(1,end)infinite;font-size:8px;font-weight:700}.coin.svelte-1ioj7vz{display:block;box-shadow:2px 2px 0 var(--ink);animation:svelte-1ioj7vz-coin-spin 2.6s ease-in-out infinite}.coin-btn.svelte-1ioj7vz:hover .coin:where(.svelte-1ioj7vz){animation:none;box-shadow:1px 1px 0 var(--ink);transform:translate(1px,1px)}.coin-btn.svelte-1ioj7vz:focus-visible{outline:2px solid var(--ink);outline-offset:2px}@keyframes svelte-1ioj7vz-coin-spin{0%,55%{transform:scaleX(1)}66%{transform:scaleX(.12)}78%{transform:scaleX(-1)}89%{transform:scaleX(.12)}to{transform:scaleX(1)}}@keyframes svelte-1ioj7vz-coin-blink{0%,55%,to{opacity:1}66%,89%{opacity:.25}}@media (prefers-reduced-motion:reduce){.coin.svelte-1ioj7vz,.new.svelte-1ioj7vz{animation:none}}
@@ -0,0 +1 @@
1
+ .cred-menu.svelte-vongf9{position:relative;display:inline-flex}.cred.svelte-vongf9{display:inline-flex;border:1px solid var(--ink);background:var(--ink);color:var(--bg);cursor:pointer;justify-content:center;align-items: center;width:32px;height:32px;font-size:14px;line-height:1}.cred.svelte-vongf9:hover{background:var(--bg);color:var(--ink)}.cred.ok.svelte-vongf9{background:var(--ok-bg);border-color:var(--ok-line);color:var(--ok-ink)}.cred.ok.svelte-vongf9:hover{background:var(--ok-ink);border-color:var(--ok-ink);color:var(--ok-bg)}.cred.warn.svelte-vongf9{background:var(--warn-bg);border-color:var(--warn-line);color:var(--warn-ink)}.cred.warn.svelte-vongf9:hover{background:var(--warn-ink);border-color:var(--warn-ink);color:var(--warn-bg)}.cred.error.svelte-vongf9{background:var(--bg);color:var(--ink)}.cred-dropdown.svelte-vongf9{position:absolute;z-index:20;background:var(--bg-card);min-width:220px;padding:6px;top:calc(100% + 6px);right:0}.cred-row.svelte-vongf9{display:flex;color:var(--ink);text-align:left;font-family:var(--font-mono);cursor:pointer;background:0 0;border:0;align-items: center;gap:9px;width:100%;padding:7px 9px;font-size:12px}.cred-row.svelte-vongf9:hover{background:var(--ink);color:var(--bg)}.cred-row.svelte-vongf9:hover .cred-state:where(.svelte-vongf9){color:var(--bg)}.dot.svelte-vongf9{border:1px solid;flex:none;width:9px;height:9px}.dot.on.svelte-vongf9{background:currentColor}.dot.off.svelte-vongf9{background:0 0}.cred-state.svelte-vongf9{color:var(--ink-soft);margin-left:auto}
@@ -0,0 +1 @@
1
+ .stage.svelte-146pixd{max-width:1080px;margin:0 auto;padding:28px 24px 80px}.banner.svelte-146pixd{display:flex;font-family:var(--font-mono);flex-wrap:wrap;gap:8px;margin-bottom:20px;padding:12px 16px;font-size:13px}.banner.error.svelte-146pixd{background:var(--bg-card);color:var(--ink);border:2px solid var(--ink);box-shadow:4px 4px 0 var(--ink)}.empty.svelte-146pixd{text-align:center;padding:80px 20px}.empty-title.svelte-146pixd{font-family:var(--font-display);text-transform:uppercase;letter-spacing:.06em;margin:0 0 8px;font-size:26px;font-weight:700}.empty-sub.svelte-146pixd{color:var(--ink-soft);margin:0 0 22px}.grid.svelte-146pixd{list-style:none;display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:18px;margin:0;padding:0}
@@ -0,0 +1 @@
1
+ html,body{overflow-x:hidden;margin:0}*,*:before,*:after{box-sizing:border-box}body{--buncss-light:initial;--buncss-dark: ;color-scheme:light dark}@media (prefers-color-scheme:dark){body{--buncss-light: ;--buncss-dark:initial}}.wrap.svelte-gaasgn{--mochi-error-bg:#f1ecdf;--mochi-error-bg-card:#fbf8f1;--mochi-error-ink:#2a2825;--mochi-error-ink-soft:#6b665e;--mochi-error-ink-faint:#a39e94;--mochi-error-rule:#e6e0d2;--mochi-error-code-bg:#2a2825;--mochi-error-code-ink:#f1ecdf;--mochi-error-gradient-tint:#385c471a;--mochi-error-shadow:0 1px 0 #2a28250a,0 30px 60px -28px #2a28252e,0 12px 24px -16px #2a28251a;--mochi-error-font-serif:Georgia,"Iowan Old Style","Palatino Linotype",Cambria,serif;--mochi-error-font-sans:-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;--mochi-error-font-mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;background:radial-gradient(1200px 600px at 50% -10%,var(--mochi-error-gradient-tint),transparent 60%),var(--mochi-error-bg);color:var(--mochi-error-ink);font-family:var(--mochi-error-font-sans);-webkit-font-smoothing:antialiased;isolation:isolate;width:100%;min-height:100vh;font-size:15px;line-height:1.55}.topbar.svelte-gaasgn{padding:22px 28px}.brand.svelte-gaasgn{display:inline-flex;font-family:var(--mochi-error-font-serif);color:var(--mochi-error-ink);opacity:.75;align-items:baseline;gap:8px;font-size:20px;font-weight:600}.logo.svelte-gaasgn{line-height:1;transform:translateY(2px)}.stage.svelte-gaasgn{display:flex;justify-content:center;align-items: center;min-height:calc(100vh - 78px);padding:24px 24px 60px}.panel.svelte-gaasgn{background:var(--mochi-error-bg-card);border:1px solid var(--mochi-error-rule);box-shadow:var(--mochi-error-shadow);border-radius:14px;width:100%;max-width:620px;padding:44px 44px 38px}.status.svelte-gaasgn{font-family:var(--mochi-error-font-serif);letter-spacing:-.03em;color:var(--mochi-error-ink);margin:0;font-size:88px;font-weight:500;line-height:1}.message.svelte-gaasgn{font-family:var(--mochi-error-font-serif);color:var(--mochi-error-ink-soft);word-break:break-word;margin:14px 0 26px;font-size:19px;font-style:italic;line-height:1.5}.actions.svelte-gaasgn{display:flex;align-items: center;gap:16px}.divider.svelte-gaasgn{background:var(--mochi-error-rule);height:1px;margin:30px -44px 22px}.stack-label.svelte-gaasgn{font-family:var(--mochi-error-font-serif);letter-spacing:.18em;text-transform:uppercase;color:var(--mochi-error-ink-faint);margin-bottom:10px;font-size:11px;font-weight:600}.stack.svelte-gaasgn{background:var(--mochi-error-code-bg);color:var(--mochi-error-code-ink);font-family:var(--mochi-error-font-mono);overflow:auto;white-space:pre;-webkit-overflow-scrolling:touch;border:0;border-radius:8px;max-width:100%;margin:0;padding:16px 18px;font-size:12.5px;line-height:1.6}@media (max-width:640px){.topbar.svelte-gaasgn{padding:18px 20px}.stage.svelte-gaasgn{min-height:calc(100vh - 70px);padding:16px 16px 48px}.panel.svelte-gaasgn{border-radius:12px;padding:30px 22px 26px}.status.svelte-gaasgn{letter-spacing:-.025em;font-size:64px}.message.svelte-gaasgn{margin:10px 0 22px;font-size:17px}.brand.svelte-gaasgn{font-size:18px}.divider.svelte-gaasgn{margin:26px -22px 20px}.stack.svelte-gaasgn{padding:14px;font-size:11.5px;line-height:1.55}}@media (max-width:380px){.status.svelte-gaasgn{font-size:52px}.message.svelte-gaasgn{font-size:16px}.panel.svelte-gaasgn{padding:24px 18px 22px}.divider.svelte-gaasgn{margin:22px -18px 16px}}@media (prefers-color-scheme:dark){.wrap.svelte-gaasgn{--mochi-error-bg:#1a1815;--mochi-error-bg-card:#23201c;--mochi-error-ink:#f1ecdf;--mochi-error-ink-soft:#a39e94;--mochi-error-ink-faint:#6b665e;--mochi-error-rule:#2d2a25;--mochi-error-code-bg:#0f0e0c;--mochi-error-code-ink:#e6e0d2;--mochi-error-gradient-tint:#9ab8a30f;--mochi-error-shadow:0 1px 0 #0000004d,0 30px 60px -28px #0009,0 12px 24px -16px #0006}}
@@ -0,0 +1 @@
1
+ div.svelte-1ro2ggf{opacity:0;background:var(--primary,#ff4b4b);position:relative;animation:svelte-1ro2ggf-circleAnimation .3s cubic-bezier(.175,.885,.32,1.275)forwards;animation-delay:.1s;border-radius:10px;width:20px;height:20px;transform:rotate(45deg)}div.svelte-1ro2ggf:after,div.svelte-1ro2ggf:before{content:"";animation:svelte-1ro2ggf-firstLineAnimation .15s ease-out forwards;animation-delay:.15s;position:absolute;opacity:0;background:var(--secondary,#fff);border-radius:3px;width:12px;height:2px;bottom:9px;left:4px}div.svelte-1ro2ggf:before{animation:svelte-1ro2ggf-secondLineAnimation .15s ease-out forwards;animation-delay:.18s;transform:rotate(90deg)}@keyframes svelte-1ro2ggf-circleAnimation{0%{transform:scale(0)rotate(45deg);opacity:0}to{transform:scale(1)rotate(45deg);opacity:1}}@keyframes svelte-1ro2ggf-firstLineAnimation{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes svelte-1ro2ggf-secondLineAnimation{0%{transform:scale(0)rotate(90deg);opacity:0}to{transform:scale(1)rotate(90deg);opacity:1}}
@@ -0,0 +1 @@
1
+ .overlay.svelte-oq97c4{position:fixed;background:color-mix(in srgb,var(--ink)50%,transparent);display:grid;z-index:50;place-items: center;padding:24px;inset:0}.modal.svelte-oq97c4{display:flex;background:var(--bg-card);overflow:hidden;box-shadow:8px 8px 0 var(--ink);flex-direction:column;width:min(620px,100%);max-height:80vh}.head.svelte-oq97c4{display:flex;border-bottom:1px solid var(--ink);background:var(--ink);justify-content:space-between;align-items: center;padding:14px 18px}.head.svelte-oq97c4 h2:where(.svelte-oq97c4){font-family:var(--font-display);text-transform:uppercase;letter-spacing:.06em;color:var(--bg);margin:0;font-size:17px;font-weight:700}.x.svelte-oq97c4{display:inline-flex;cursor:pointer;color:var(--bg);background:0 0;border:none;align-items: center}.x.svelte-oq97c4:hover{opacity:.7}.clone.svelte-oq97c4{border-bottom:1px solid var(--rule-soft);padding:12px 18px}.clone-label.svelte-oq97c4{text-transform:uppercase;letter-spacing:.06em;color:var(--ink-faint);padding-bottom:6px;font-size:11px}.clone-row.svelte-oq97c4{display:flex;gap:8px}.clone-url.svelte-oq97c4,.clone-branch.svelte-oq97c4{font-family:var(--font-mono);border:1px solid var(--ink);background:var(--bg);color:var(--ink);padding:8px 12px;font-size:13px}.clone-url.svelte-oq97c4{flex:1;min-width:0}.clone-branch.svelte-oq97c4{flex:none;width:140px}.clone-url.svelte-oq97c4::placeholder,.clone-branch.svelte-oq97c4::placeholder{color:var(--ink-faint)}.clone-url.svelte-oq97c4:focus,.clone-branch.svelte-oq97c4:focus{outline:none;box-shadow:inset 3px 3px 0 var(--rule-soft)}.clone-btn.svelte-oq97c4{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.05em;border:1px solid var(--ink);background:var(--ink);color:var(--bg);cursor:pointer;white-space:nowrap;padding:8px 14px;font-size:12px;font-weight:700}.clone-btn.svelte-oq97c4:hover:not(:disabled){background:var(--bg-card);color:var(--ink)}.clone-btn.svelte-oq97c4:disabled{opacity:.4;cursor:not-allowed}.crumbs.svelte-oq97c4{border-bottom:1px solid var(--rule-soft);overflow-x:auto;overflow-y:hidden;flex-shrink:0;min-height:18px;padding:10px 18px}.crumbs.svelte-oq97c4 code:where(.svelte-oq97c4){font-family:var(--font-mono);color:var(--ink-soft);white-space:nowrap;font-size:12px}.recent.svelte-oq97c4{border-bottom:1px solid var(--rule-soft);overflow:auto;flex-shrink:0;max-height:40vh;padding:8px}.recent-label.svelte-oq97c4{text-transform:uppercase;letter-spacing:.06em;color:var(--ink-faint);padding:2px 10px 6px;font-size:11px}.recent-row.svelte-oq97c4{position:relative;display:flex;align-items: center}.recent-pick.svelte-oq97c4{display:flex;cursor:pointer;font:inherit;text-align:left;color:var(--ink);background:0 0;border:none;border-radius:8px;flex:1;align-items: center;gap:10px;min-width:0;padding:8px 10px}.recent-pick.svelte-oq97c4:hover{background:var(--ink);color:var(--bg)}.recent-pick.svelte-oq97c4:hover .recent-path:where(.svelte-oq97c4){color:var(--bg)}.recent-text.svelte-oq97c4{display:flex;flex-direction:column;min-width:0}.recent-name.svelte-oq97c4{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.recent-path.svelte-oq97c4{font-family:var(--font-mono);color:var(--ink-faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.recent-x.svelte-oq97c4{position:absolute;display:inline-flex;background:var(--bg-card);color:var(--ink-soft);cursor:pointer;opacity:0;border:none;border-radius:6px;align-items: center;padding:5px 7px;line-height:1;top:50%;right:8px;transform:translateY(-50%)}.recent-row.svelte-oq97c4:hover .recent-x:where(.svelte-oq97c4){opacity:1}.recent-x.svelte-oq97c4:hover{color:var(--bg);background:var(--ink)}.recent-toggle.svelte-oq97c4{cursor:pointer;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.05em;color:var(--ink);background:0 0;border:none;margin:4px 6px 2px;padding:4px 6px;font-size:12px}.recent-toggle.svelte-oq97c4:hover{text-decoration:underline}.search.svelte-oq97c4{border-bottom:1px solid var(--rule-soft);padding:10px 18px}.search.svelte-oq97c4 input:where(.svelte-oq97c4){font-family:var(--font-mono);border:1px solid var(--ink);background:var(--bg);color:var(--ink);width:100%;padding:8px 12px;font-size:13px}.search.svelte-oq97c4 input:where(.svelte-oq97c4)::placeholder{color:var(--ink-faint)}.search.svelte-oq97c4 input:where(.svelte-oq97c4):focus{outline:none;box-shadow:inset 3px 3px 0 var(--rule-soft)}.list.svelte-oq97c4{overflow:auto;flex:1;padding:8px}.row.svelte-oq97c4{display:flex;border:1px solid #0000;border-radius:8px;align-items: center;gap:6px;padding:2px 4px}.row.first-match.svelte-oq97c4{border-color:var(--rule-soft)}.row.svelte-oq97c4 .nav:where(.svelte-oq97c4){display:flex;cursor:pointer;font:inherit;text-align:left;color:var(--ink);background:0 0;border:none;border-radius:8px;flex:1;align-items: center;gap:10px;padding:9px 10px}.row.svelte-oq97c4 .nav:where(.svelte-oq97c4):hover{background:var(--ink);color:var(--bg)}.row.svelte-oq97c4 .nav:where(.svelte-oq97c4):hover .icon:where(.svelte-oq97c4){color:var(--bg)}.ename.svelte-oq97c4{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.badge.svelte-oq97c4{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;color:var(--ink);border:1px solid var(--ink);background:0 0;padding:2px 5px;font-size:9px;font-weight:600}.row.svelte-oq97c4 .nav:where(.svelte-oq97c4):hover .badge:where(.svelte-oq97c4){color:var(--bg);border-color:var(--bg)}.pick-inline.svelte-oq97c4{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.05em;border:1px solid var(--ink);background:var(--bg-card);cursor:pointer;color:var(--ink);padding:6px 10px;font-size:11px;font-weight:600}.pick-inline.svelte-oq97c4:hover{background:var(--ink);color:var(--bg)}.muted.svelte-oq97c4{color:var(--ink-faint);text-align:center;padding:18px}.muted.err.svelte-oq97c4{color:var(--ink);font-weight:600}.warn.svelte-oq97c4{display:flex;background:var(--warn-bg);color:var(--warn-ink);font-family:var(--font-mono);border-top:1px solid var(--warn-line);align-items: flex-start;gap:8px;padding:10px 18px;font-size:12.5px}.warn.svelte-oq97c4 svg{flex:none;margin-top:1px}.warn.svelte-oq97c4 code:where(.svelte-oq97c4){font-family:var(--font-mono);border:1px solid var(--warn-line);background:#ffffff59;padding:0 5px;font-size:.9em}.foot.svelte-oq97c4{display:flex;border-top:1px solid var(--ink);justify-content:space-between;align-items: center;gap:12px;padding:14px 18px}.hint.svelte-oq97c4{font-family:var(--font-mono);color:var(--ink-faint);font-size:12px}.primary.svelte-oq97c4{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;border:1px solid var(--ink);background:var(--ink);color:var(--bg);cursor:pointer;white-space:nowrap;padding:9px 16px;font-size:13px;font-weight:700}.primary.svelte-oq97c4:hover:not(:disabled){background:var(--bg-card);color:var(--ink)}.primary.svelte-oq97c4:disabled{opacity:.4;cursor:not-allowed}.icon.svelte-oq97c4{display:inline-flex;color:var(--ink-soft);align-items: center}
@@ -0,0 +1 @@
1
+ .healthwrap.svelte-1hnopyv{overflow:hidden}.healthwrap.dim.svelte-1hnopyv{opacity:.5}.health.svelte-1hnopyv{background:var(--bg-card);display:grid;grid-template-columns:max-content 1fr max-content;align-items: center}.hrow.svelte-1hnopyv{display:grid;grid-template-columns:subgrid;grid-column:1/-1;border-top:1px solid var(--rule-soft);align-items: center;gap:12px;padding:10px 14px}.hrow.svelte-1hnopyv:first-child{border-top:none}.box.svelte-1hnopyv{border:1px solid var(--ink);display:inline-flex;color:var(--ink);justify-content:center;align-items: center;width:16px;height:16px}.box.ok.svelte-1hnopyv{background:var(--ink);color:var(--bg)}.box.bad.svelte-1hnopyv{background:0 0}.box.idle.svelte-1hnopyv{border-color:var(--ink-faint)}.hlabel.svelte-1hnopyv{font-family:var(--font-mono);color:var(--ink-soft);font-size:13px}.hvalue.svelte-1hnopyv{font-family:var(--font-display);letter-spacing:.1em;text-transform:uppercase;color:var(--ink);justify-self:end;font-size:11px;font-weight:700}.hfoot.svelte-1hnopyv{border-top:1px solid var(--rule-soft);background:var(--bg);font-family:var(--font-mono);color:var(--ink-faint);padding:7px 14px;font-size:11px}
@@ -0,0 +1 @@
1
+ .cog.svelte-r39acv{display:inline-flex;color:var(--ink);border-left:1px solid var(--rule);flex:none;justify-content:center;align-items: center;width:48px;margin-left:auto}.cog.svelte-r39acv:hover{background:var(--ink);color:var(--bg)}.tabs.svelte-r39acv{display:flex;overflow-x:auto;align-items:stretch;min-width:0}.tab.svelte-r39acv{display:inline-flex;border-right:1px solid var(--rule-soft);align-items:stretch}.tab.active.svelte-r39acv{background:var(--ink)}.tab.attn-done.svelte-r39acv{animation:svelte-r39acv-attn-pulse-green 1.8s ease-in-out infinite}.tab.attn-waiting.svelte-r39acv{animation:svelte-r39acv-attn-pulse-amber 1.8s ease-in-out infinite}@keyframes svelte-r39acv-attn-pulse-green{0%,to{background:0 0;box-shadow:inset 0 -2px 0 color-mix(in srgb,var(--attn-done)40%,transparent)}50%{background:color-mix(in srgb,var(--attn-done)32%,transparent);box-shadow:inset 0 -2px 0 var(--attn-done)}}@keyframes svelte-r39acv-attn-pulse-amber{0%,to{background:0 0;box-shadow:inset 0 -2px 0 color-mix(in srgb,var(--attn-waiting)40%,transparent)}50%{background:color-mix(in srgb,var(--attn-waiting)32%,transparent);box-shadow:inset 0 -2px 0 var(--attn-waiting)}}@media (prefers-reduced-motion:reduce){.tab.attn-done.svelte-r39acv,.tab.attn-waiting.svelte-r39acv{animation-duration:0s;background:color-mix(in srgb,var(--attn-done)28%,transparent)}.tab.attn-waiting.svelte-r39acv{background:color-mix(in srgb,var(--attn-waiting)28%,transparent)}}.tab-label.svelte-r39acv{appearance:none;cursor:pointer;color:var(--ink-soft);font-family:var(--font-mono);display:inline-flex;text-transform:uppercase;letter-spacing:.06em;background:0 0;border:0;align-items: center;gap:10px;max-width:240px;padding:0 12px;font-size:12px}.tab-name.svelte-r39acv{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tab.svelte-r39acv:not(.active) .tab-label:where(.svelte-r39acv):hover{color:var(--ink)}.tab.active.svelte-r39acv .tab-label:where(.svelte-r39acv){color:var(--bg)}.tab-label.editing.svelte-r39acv{cursor:default}.tab-name-edit.svelte-r39acv{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;border:1px solid var(--ink-soft);background:var(--bg);color:var(--ink);outline:none;width:130px;margin:0;padding:2px 4px;font-size:12px}
@@ -0,0 +1 @@
1
+ .loader.svelte-w5e143{position:absolute;display:flex;background:var(--bg);color:var(--ink);flex-direction:column;justify-content:center;align-items: center;gap:20px;inset:0}.grid.svelte-w5e143{font-family:var(--font-display);letter-spacing:.22em;color:var(--ink-faint);font-size:30px;line-height:1.1}.row.svelte-w5e143{white-space:pre}.label.svelte-w5e143{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.18em;color:var(--ink-soft);font-size:18px}.stalled.svelte-w5e143{display:flex;text-align:center;flex-direction:column;align-items: center;gap:12px;max-width:34ch}.stalled.svelte-w5e143 p:where(.svelte-w5e143){font-family:var(--font-mono);color:var(--ink-faint);margin:0;font-size:13px;line-height:1.5}.dot.svelte-w5e143{animation:svelte-w5e143-blink 1.2s ease-in-out infinite}.dot.svelte-w5e143:nth-child(2){animation-delay:.2s}.dot.svelte-w5e143:nth-child(3){animation-delay:.4s}@keyframes svelte-w5e143-blink{0%,to{opacity:.2}50%{opacity:1}}@media (prefers-reduced-motion:reduce){.dot.svelte-w5e143{animation:none}}
@@ -0,0 +1 @@
1
+ .card.svelte-13338y7{background:var(--bg-card);padding:16px 16px 14px;transition:transform 80ms steps(2,end),box-shadow 80ms steps(2,end)}.card.svelte-13338y7:hover{box-shadow:6px 6px 0 var(--ink);transform:translate(-1px,-1px)}.card-head.svelte-13338y7{display:flex;align-items: center;gap:11px}.attn.svelte-13338y7{border:1px solid var(--ink);flex:none;width:14px;height:14px}.attn.attn-done.svelte-13338y7{background:var(--attn-done);animation:svelte-13338y7-card-attn-pulse 1.4s ease-in-out infinite}.attn.attn-waiting.svelte-13338y7{background:var(--attn-waiting);animation:svelte-13338y7-card-attn-pulse 1.4s ease-in-out infinite}@keyframes svelte-13338y7-card-attn-pulse{0%,to{box-shadow:0 0 #0000;filter:brightness(.85)}50%{box-shadow:0 0 7px 2px color-mix(in srgb,currentColor 60%,transparent);filter:brightness(1.15)}}.attn.attn-done.svelte-13338y7{color:var(--attn-done)}.attn.attn-waiting.svelte-13338y7{color:var(--attn-waiting)}@media (prefers-reduced-motion:reduce){.attn.svelte-13338y7{animation:none;filter:none}}.name.svelte-13338y7{font-family:var(--font-mono);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink);text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;flex:1;min-width:0;margin:0;padding:2px 4px;font-size:15px;font-weight:600}.name.svelte-13338y7:hover{border-color:var(--ink-faint)}.name-edit.svelte-13338y7{font-family:var(--font-mono);border:1px solid var(--ink);background:var(--bg);color:var(--ink);outline:none;flex:1;min-width:0;margin:0;padding:2px 4px;font-size:15px;font-weight:600}.path.svelte-13338y7{font-family:var(--font-mono);color:var(--ink-soft);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:10px;font-size:12px}.card-error.svelte-13338y7{font-family:var(--font-mono);color:var(--ink);background:var(--bg);border:1px solid var(--ink);overflow:auto;max-height:80px;margin-top:10px;padding:8px 10px;font-size:12px}.actions.svelte-13338y7{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}
@@ -0,0 +1 @@
1
+ .topbar.svelte-15fxkvm{display:flex;border-bottom:1px solid var(--rule);align-items: center;gap:18px;padding:16px 24px}.back.svelte-15fxkvm{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;color:var(--ink-soft);text-decoration:none;align-items: center;gap:5px;font-size:12px}.back.svelte-15fxkvm:hover{color:var(--ink)}.title.svelte-15fxkvm{display:flex;flex:1;align-items: center;gap:12px}.name.svelte-15fxkvm{font-family:var(--font-display);text-transform:uppercase;letter-spacing:.03em;font-size:20px;font-weight:700}.open.svelte-15fxkvm{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;color:var(--ink);text-decoration:none;border:1px solid var(--ink);align-items: center;gap:6px;padding:7px 12px;font-size:12px;font-weight:600}.open.svelte-15fxkvm:hover{background:var(--ink);color:var(--bg)}.restart.svelte-15fxkvm{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;color:var(--ink);background:var(--bg);border:1px solid var(--ink);cursor:pointer;align-items: center;gap:6px;padding:7px 12px;font-size:12px;font-weight:600}.restart.svelte-15fxkvm:hover:not(:disabled){background:var(--ink);color:var(--bg)}.restart.svelte-15fxkvm:disabled{opacity:.5;cursor:not-allowed}.restart-err.svelte-15fxkvm{font-family:var(--font-mono);color:var(--danger);margin:0;padding:8px 24px 0;font-size:12px}.stage.svelte-15fxkvm{max-width:1200px;margin:0 auto;padding:20px 24px 40px}.meta.svelte-15fxkvm{display:grid;grid-template-columns:max-content 1fr;align-items: center;gap:6px 14px;margin-bottom:18px}.meta.svelte-15fxkvm .k:where(.svelte-15fxkvm){font-family:var(--font-display);letter-spacing:.14em;text-transform:uppercase;color:var(--ink-faint);font-size:12px;font-weight:700}.meta.svelte-15fxkvm code:where(.svelte-15fxkvm){font-family:var(--font-mono);color:var(--ink-soft);font-size:13px}.meta.svelte-15fxkvm code.muted:where(.svelte-15fxkvm){color:var(--ink-faint)}.healthslot.svelte-15fxkvm,.ports.svelte-15fxkvm{margin-bottom:18px}.ports-bar.svelte-15fxkvm{display:flex;justify-content:space-between;align-items: center}.rebuild.svelte-15fxkvm{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;background:var(--bg);color:var(--ink);border:1px solid var(--bg);cursor:pointer;padding:4px 9px;font-size:10px;font-weight:600}.rebuild.svelte-15fxkvm:hover:not(:disabled){color:var(--bg);background:0 0}.rebuild.svelte-15fxkvm:disabled{opacity:.5;cursor:not-allowed}.ports-body.svelte-15fxkvm{background:var(--bg-card);padding:12px 14px 14px}.port-list.svelte-15fxkvm{list-style:none;display:flex;flex-direction:column;gap:6px;margin:0 0 12px;padding:0}.port-list.svelte-15fxkvm li:where(.svelte-15fxkvm){display:flex;font-family:var(--font-mono);align-items: center;gap:8px;font-size:13px}.port-list.svelte-15fxkvm .cp:where(.svelte-15fxkvm){color:var(--ink);font-weight:600}.port-list.svelte-15fxkvm .arr:where(.svelte-15fxkvm){color:var(--ink-faint)}.port-list.svelte-15fxkvm a:where(.svelte-15fxkvm){display:inline-flex;color:var(--ink);text-decoration:none;border-bottom:1px solid var(--ink-faint);align-items: center;gap:4px}.port-list.svelte-15fxkvm a:where(.svelte-15fxkvm):hover{border-bottom-color:var(--ink)}.rm.svelte-15fxkvm{border:1px solid var(--ink-faint);color:var(--ink-soft);cursor:pointer;background:0 0;width:20px;height:20px;margin-left:auto;font-size:15px;line-height:1}.rm.svelte-15fxkvm:hover{border-color:var(--danger);color:var(--danger)}.empty.svelte-15fxkvm{font-family:var(--font-mono);color:var(--ink-faint);margin:0 0 12px;font-size:12px}.add.svelte-15fxkvm{display:flex;gap:8px}.add.svelte-15fxkvm input:where(.svelte-15fxkvm){font-family:var(--font-mono);border:1px solid var(--ink);background:var(--bg);color:var(--ink);outline:none;flex:1;min-width:0;padding:6px 9px;font-size:13px}.add.svelte-15fxkvm button:where(.svelte-15fxkvm){font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;border:1px solid var(--ink);background:var(--bg-card);color:var(--ink);cursor:pointer;padding:6px 14px;font-size:12px;font-weight:600}.add.svelte-15fxkvm button:where(.svelte-15fxkvm):hover{background:var(--ink);color:var(--bg)}.port-err.svelte-15fxkvm{font-family:var(--font-mono);color:var(--danger);margin:10px 0 0;font-size:12px}.hint.svelte-15fxkvm{font-family:var(--font-mono);color:var(--ink-faint);margin:10px 0 0;font-size:11px}.hint.pending.svelte-15fxkvm{color:var(--ink-soft)}.hint.svelte-15fxkvm code:where(.svelte-15fxkvm){color:var(--ink)}.logwrap.svelte-15fxkvm{overflow:hidden}.log-bar.svelte-15fxkvm{display:flex;justify-content:space-between;align-items: center}.copy.svelte-15fxkvm{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;background:var(--bg);color:var(--ink);border:1px solid var(--bg);cursor:pointer;padding:4px 9px;font-size:10px;font-weight:600}.copy.svelte-15fxkvm:hover:not(:disabled){color:var(--bg);background:0 0}.copy.svelte-15fxkvm:disabled{opacity:.5;cursor:not-allowed}.logs.svelte-15fxkvm{position:relative;background:repeating-linear-gradient(0deg,var(--screen-line)0 1px,transparent 1px 3px),var(--screen-bg);color:var(--screen-ink);overflow:auto;height:calc(100vh - 320px);min-height:360px;padding:14px}.logs.svelte-15fxkvm pre:where(.svelte-15fxkvm){font-family:var(--font-mono);white-space:pre-wrap;word-break:break-word;margin:0;font-size:12.5px;line-height:1.5}@keyframes svelte-15fxkvm-lcd-blink{50%{background:0 0}}.caret.svelte-15fxkvm{display:inline-block;background:var(--screen-ink);vertical-align:text-bottom;animation:svelte-15fxkvm-lcd-blink 1.05s steps(1)infinite;width:.6em;height:1.05em;margin-left:2px}.err.svelte-15fxkvm{background:var(--bg-card);color:var(--ink);border-top:2px solid var(--ink);font-family:var(--font-mono);padding:12px 14px;font-size:13px}
@@ -0,0 +1 @@
1
+ div.svelte-tyythq{box-sizing:border-box;border:2px solid;border-color:var(--secondary,#e0e0e0);border-right-color:var(--primary,#616161);animation:svelte-tyythq-rotate 1s linear infinite;border-radius:100%;width:12px;height:12px}@keyframes svelte-tyythq-rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}
@@ -0,0 +1 @@
1
+ .fports.svelte-1uaz383{display:inline-flex;font-family:var(--font-mono);color:var(--ink);border:1px solid var(--ink-faint);align-items: center;gap:5px;max-width:100%;margin-top:6px;padding:2px 7px;font-size:12px}.fports.svelte-1uaz383 svg{flex:none}.list.svelte-1uaz383{display:flex;flex-wrap:wrap;min-width:0}.fport.svelte-1uaz383{color:var(--ink-soft);text-decoration:none}.fport.svelte-1uaz383:before{content:"○ ";color:var(--ink-faint)}.fport.open.svelte-1uaz383{color:var(--ink)}.fport.open.svelte-1uaz383:before{content:"● ";color:var(--ink)}.fport.svelte-1uaz383:hover{text-decoration:underline}.fport.svelte-1uaz383:not(:last-child):after{content:",";color:var(--ink-faint);margin-right:4px}
@@ -0,0 +1 @@
1
+ .cog.svelte-1e745g8{display:inline-flex;border:1px solid var(--ink);background:var(--bg-card);color:var(--ink);justify-content:center;align-items: center;width:32px;height:32px}.cog.svelte-1e745g8:hover{background:var(--ink);color:var(--bg)}
@@ -0,0 +1 @@
1
+ .page.svelte-1n6ht58{display:flex;flex-direction:column;min-height:100vh}.title.svelte-1n6ht58{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;color:var(--ink-soft);align-items: center;padding:0 14px;font-size:12px}.content.svelte-1n6ht58{display:flex;flex-direction:column;flex:1;align-items: center;gap:16px;padding:32px 20px}.card.svelte-1n6ht58{background:var(--bg-card);border:1px solid var(--rule);width:100%;max-width:560px;height:max-content}.danger-card.svelte-1n6ht58{border-color:var(--danger)}.disabled-card.svelte-1n6ht58{opacity:.55;pointer-events:none}.danger-card.svelte-1n6ht58 .btn{white-space:nowrap;flex:none}.version.svelte-1n6ht58{font-family:var(--font-mono);letter-spacing:.08em;color:var(--ink-soft);font-size:11px}.shutting.svelte-1n6ht58{font-family:var(--font-mono);color:var(--danger);text-align:right;flex:none;max-width:200px;font-size:12px;line-height:1.4}.row.svelte-1n6ht58{display:flex;justify-content:space-between;align-items: center;gap:16px;padding:18px}.row.divided.svelte-1n6ht58{border-top:1px solid var(--rule);align-items: flex-start}.row.divided.svelte-1n6ht58 .btn{white-space:nowrap;flex:none}.sub.svelte-1n6ht58{padding:0 18px 14px}code.svelte-1n6ht58{font-family:var(--font-mono);background:var(--bg);border:1px solid var(--rule);border-radius:3px;padding:1px 4px;font-size:.92em}.label.svelte-1n6ht58{display:flex;color:var(--ink);align-items: flex-start;gap:12px;min-width:0}.text.svelte-1n6ht58{min-width:0}.name.svelte-1n6ht58{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;font-size:13px}.arch.svelte-1n6ht58{letter-spacing:.04em;color:var(--ink-soft);border:1px solid var(--rule);vertical-align:middle;border-radius:3px;margin-left:8px;padding:2px 6px;font-size:11px}.tip.svelte-1n6ht58{color:var(--ink-soft);background:color-mix(in srgb,var(--info)10%,transparent);border:1px solid color-mix(in srgb,var(--info)35%,transparent);border-radius:4px;width:100%;margin-top:4px;padding:8px 10px}.desc.svelte-1n6ht58{font-family:var(--font-mono);color:var(--ink-faint);margin-top:4px;font-size:12px;line-height:1.4}.image-row.svelte-1n6ht58,.token-row.svelte-1n6ht58{flex-wrap:wrap}.image-controls.svelte-1n6ht58{display:flex;flex:1;justify-content:flex-end;align-items: center;gap:8px;min-width:220px}.image-input.svelte-1n6ht58{font-family:var(--font-mono);color:var(--ink);background:var(--bg);border:1px solid var(--rule);flex:1;min-width:0;padding:8px 10px;font-size:12px}.image-input.svelte-1n6ht58:focus-visible{outline:2px solid var(--ink);outline-offset:1px}.image-controls.svelte-1n6ht58 .btn{flex:none}.msg.svelte-1n6ht58{font-family:var(--font-mono);width:100%;margin-top:2px;font-size:12px;line-height:1.4}.msg.error.svelte-1n6ht58{color:var(--danger)}.msg.ok.svelte-1n6ht58{color:var(--ink-soft)}.switch.svelte-1n6ht58{position:relative;cursor:pointer;flex:none}.switch.svelte-1n6ht58 input:where(.svelte-1n6ht58){position:absolute;opacity:0;cursor:pointer;margin:0;inset:0}.track.svelte-1n6ht58{display:block;border:1px solid var(--rule);background:var(--bg);border-radius:999px;width:44px;height:24px;transition:background .15s}.thumb.svelte-1n6ht58{display:block;background:var(--ink-faint);border-radius:999px;width:18px;height:18px;margin:2px;transition:transform .15s,background .15s}.switch.svelte-1n6ht58 input:where(.svelte-1n6ht58):checked+.track:where(.svelte-1n6ht58){background:var(--switch-on-bg)}.switch.svelte-1n6ht58 input:where(.svelte-1n6ht58):checked+.track:where(.svelte-1n6ht58) .thumb:where(.svelte-1n6ht58){background:var(--ink);transform:translate(20px)}.switch.svelte-1n6ht58 input:where(.svelte-1n6ht58):focus-visible+.track:where(.svelte-1n6ht58){outline:2px solid var(--ink);outline-offset:2px}.model-fields.svelte-1n6ht58{display:flex;flex-direction:column;flex:1;gap:6px;min-width:220px}.model-row.svelte-1n6ht58{display:flex;align-items: center;gap:8px}.model-label.svelte-1n6ht58{font-family:var(--font-mono);color:var(--ink-soft);text-align:right;flex:none;width:72px;font-size:11px}.model-row.svelte-1n6ht58 .image-input:where(.svelte-1n6ht58){flex:1}.model-save-row.svelte-1n6ht58{display:flex;justify-content:flex-end;margin-top:4px}.var-row.svelte-1n6ht58{flex-direction:column;align-items:stretch;gap:10px}.var-list.svelte-1n6ht58{display:flex;flex-direction:column;gap:6px}.var-item.svelte-1n6ht58{display:flex;background:var(--bg);border:1px solid var(--rule);align-items: center;gap:8px;padding:6px 8px}.var-name.svelte-1n6ht58{font-family:var(--font-mono);color:var(--ink);word-break:break-all;flex:1;min-width:0;font-size:12px}.var-status.svelte-1n6ht58{font-family:var(--font-mono);letter-spacing:.04em;color:var(--danger);flex:none;font-size:11px}.var-status.present.svelte-1n6ht58{color:var(--ink-soft)}.var-remove.svelte-1n6ht58{display:inline-flex;color:var(--ink-soft);border:1px solid var(--rule);cursor:pointer;background:0 0;flex:none;justify-content:center;align-items: center;width:22px;height:22px;padding:0}.var-remove.svelte-1n6ht58:hover:not(:disabled){color:var(--danger);border-color:var(--danger)}.var-remove.svelte-1n6ht58:disabled{opacity:.4;cursor:not-allowed}.var-empty.svelte-1n6ht58{font-family:var(--font-mono);color:var(--ink-faint);font-size:12px}.var-add.svelte-1n6ht58{display:flex;gap:8px}.var-add.svelte-1n6ht58 .btn{flex:none}
@@ -0,0 +1 @@
1
+ .skel.svelte-tl058d{display:inline-block;background:linear-gradient(90deg,var(--rule-soft)25%,var(--bg-card)50%,var(--rule-soft)75%);animation:svelte-tl058d-shimmer 1.4s linear infinite;vertical-align:middle;background-size:200% 100%;height:.95em}.skel.wide.svelte-tl058d{width:min(420px,60vw)}.skel.pill.svelte-tl058d{border-radius:999px;width:64px;height:18px}@keyframes svelte-tl058d-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}
@@ -0,0 +1 @@
1
+ .status.svelte-1hqr9xd{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.1em;border:1px solid var(--ink);white-space:nowrap;padding:3px 7px;font-size:10px;font-weight:600}.status.running.svelte-1hqr9xd{background:var(--ink);color:var(--bg)}.status.stopped.svelte-1hqr9xd{color:var(--ink-soft);border-color:var(--ink-faint);background:0 0}.status.creating.svelte-1hqr9xd{background:var(--ink);color:var(--bg);animation:svelte-1hqr9xd-lcd-blink 1.1s steps(1)infinite}.status.error.svelte-1hqr9xd{background:var(--danger);color:var(--bg);border-color:var(--danger);font-weight:700}@keyframes svelte-1hqr9xd-lcd-blink{50%{background:0 0;color:var(--ink)}}
@@ -0,0 +1 @@
1
+ .picker.svelte-3gcwuj{display:inline-flex;border:1px solid var(--ink);background:var(--bg-card);flex:none}.segment.svelte-3gcwuj{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;color:var(--ink);cursor:pointer;background:0 0;border:none;align-items: center;gap:6px;padding:7px 12px;font-size:12px;font-weight:600}.segment.svelte-3gcwuj+.segment:where(.svelte-3gcwuj){border-left:1px solid var(--ink)}.segment.svelte-3gcwuj:hover:not(.active){background:var(--ink);color:var(--bg)}.segment.active.svelte-3gcwuj{background:var(--ink);color:var(--bg);cursor:default;font-weight:700}.segment.svelte-3gcwuj:focus-visible{outline:2px solid var(--ink);outline-offset:-2px}
@@ -0,0 +1 @@
1
+ @keyframes svelte-yae3e8-enterAnimation{0%{transform:translate3d(0,calc(var(--factor)*-200%),0)scale(.6);opacity:.5}to{transform:translate(0,0)scale(1);opacity:1}}@keyframes svelte-yae3e8-exitAnimation{0%{transform:translateZ(-1px)scale(1);opacity:1}to{transform:translate3d(0,calc(var(--factor)*-150%),-1px)scale(.6);opacity:0}}@keyframes svelte-yae3e8-fadeInAnimation{0%{opacity:0}to{opacity:1}}@keyframes svelte-yae3e8-fadeOutAnimation{0%{opacity:1}to{opacity:0}}.base.svelte-yae3e8{display:flex;color:#363636;will-change:transform;pointer-events:auto;background:#fff;border-radius:8px;align-items: center;max-width:350px;padding:8px 10px;line-height:1.3;box-shadow:0 3px 10px #0000001a,0 3px 3px #0000000d}.transparent.svelte-yae3e8{opacity:0}.enter.svelte-yae3e8{animation:svelte-yae3e8-enterAnimation .35s cubic-bezier(.21,1.02,.73,1)forwards}.exit.svelte-yae3e8{animation:svelte-yae3e8-exitAnimation .4s cubic-bezier(.06,.71,.55,1)forwards}.fadeIn.svelte-yae3e8{animation:svelte-yae3e8-fadeInAnimation .35s cubic-bezier(.21,1.02,.73,1)forwards}.fadeOut.svelte-yae3e8{animation:svelte-yae3e8-fadeOutAnimation .4s cubic-bezier(.06,.71,.55,1)forwards}
@@ -0,0 +1 @@
1
+ .indicator.svelte-t33qv2{position:relative;display:flex;justify-content:center;align-items: center;min-width:20px;min-height:20px}.status.svelte-t33qv2{position:absolute}.animated.svelte-t33qv2{position:relative;opacity:.4;animation:svelte-t33qv2-enter .3s .12s cubic-bezier(.175,.885,.32,1.275)forwards;min-width:20px;transform:scale(.6)}@keyframes svelte-t33qv2-enter{0%{transform:scale(.6);opacity:.4}to{transform:scale(1);opacity:1}}
@@ -0,0 +1 @@
1
+ .message.svelte-1gudbf6{display:flex;color:inherit;white-space:pre-line;flex:auto;justify-content:center;margin:4px 10px}
@@ -0,0 +1 @@
1
+ .wrapper.svelte-1pz3gqy{display:flex;position:absolute;transform:translateY(calc(var(--offset,16px)*var(--factor)*1px));left:0;right:0}.transition.svelte-1pz3gqy{transition:all .23s cubic-bezier(.21,1.02,.73,1)}.active.svelte-1pz3gqy{z-index:9999}.active.svelte-1pz3gqy>*{pointer-events:auto}
@@ -0,0 +1 @@
1
+ .toaster.svelte-haq5xk{--default-offset:16px;position:fixed;z-index:9999;top:var(--default-offset);left:var(--default-offset);right:var(--default-offset);bottom:var(--default-offset);pointer-events:none}
@@ -0,0 +1 @@
1
+ .topbar.svelte-1h259us{display:flex;border-bottom:1px solid var(--rule);justify-content:space-between;align-items: center;padding:18px 28px}.topbar-actions.svelte-1h259us{display:inline-flex;align-items: center;gap:14px}
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Stanislav Khromov
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,5 +1,36 @@
1
- # codebay
1
+ # Codebay
2
2
 
3
- 🚧 **Placeholder** — this package name is reserved for an upcoming project. Nothing to install yet.
3
+ **Codebay - the devcontainer manager** — a web UI for spinning up isolated devcontainer instances from any local folder or Git repo URL, each running Claude Code in a browser-based VS Code (`code-server`).
4
4
 
5
- A real `0.x` release is on the way.
5
+ ## Quick start
6
+
7
+ Requires [Bun](https://bun.sh) >= 1.3.13 (Node.js is not supported) and a running Docker daemon (Docker Desktop, Colima, OrbStack…). macOS and Linux are supported; Windows is untested.
8
+
9
+ ```sh
10
+ bunx codebay@latest
11
+ ```
12
+
13
+ The UI opens at `http://localhost:6969`. State (SQLite DB + per-instance workspace copies) lives in `~/.codebay`.
14
+
15
+ ## Configuration
16
+
17
+ - `PORT` — server port (default `6969`)
18
+ - `DATA_DIR` — where state lives (default `~/.codebay`)
19
+ - `DOCKER_HOST` — Docker socket/URL (defaults to your active Docker context)
20
+ - `HOST` — bind address (default `127.0.0.1`). Set `0.0.0.0` to reach codebay from other machines; your instances' forwarded app ports are then published on all interfaces too. Each container's code-server port stays loopback-only regardless — it runs without a password of its own and is reached through the Basic-Auth-gated `/p/:id/` proxy instead. Existing instances need a **Restart** to pick up the new binding.
21
+ - `BASIC_AUTH_PASSWORD` — enables HTTP Basic Auth over the whole UI (disabled when unset); required if you bind beyond loopback with `HOST=0.0.0.0`
22
+ - `CODEBAY_CLAUDE_CODE_TOKEN` — Claude Code token to inject into every container (e.g. from `claude setup-token`) instead of discovering the host's credentials
23
+ - `CODEBAY_GITHUB_TOKEN` — GitHub token to inject instead of reading `gh auth token` from the host
24
+ - `DISABLE_OPEN_BROWSER=1` — skip opening the browser on startup
25
+
26
+ ## Development
27
+
28
+ ```sh
29
+ bun install
30
+ bun run dev # dev server, local ./.codebay DATA_DIR, no browser launch
31
+ bun run checks # format + typecheck + tests
32
+ ```
33
+
34
+ ## License
35
+
36
+ MIT
package/bin/codebay.ts ADDED
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env bun
2
+ // Entry for `bunx codebay`. The server resolves htmlShell, SSR page components,
3
+ // ./public, and the .mochi manifest relative to process.cwd(), so chdir into the
4
+ // package root before booting. Dynamic import() of a relative specifier resolves
5
+ // against this module's URL (not cwd), so the chdir doesn't affect it.
6
+ import { fileURLToPath } from 'node:url';
7
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
8
+
9
+ if (typeof Bun === 'undefined') {
10
+ console.error('codebay requires Bun — run it with `bunx codebay` (https://bun.sh).');
11
+ process.exit(1);
12
+ }
13
+
14
+ // config.server.ts resolves a relative DATA_DIR against process.cwd(). Pin it to the
15
+ // directory the user actually ran the command from, before the chdir below moves cwd
16
+ // into the (possibly npm-cached) package root.
17
+ if (process.env.DATA_DIR && !isAbsolute(process.env.DATA_DIR)) {
18
+ process.env.DATA_DIR = resolve(process.cwd(), process.env.DATA_DIR);
19
+ }
20
+
21
+ process.chdir(join(dirname(fileURLToPath(import.meta.url)), '..'));
22
+ await import('../src/index.ts');
@@ -0,0 +1,20 @@
1
+ CREATE TABLE IF NOT EXISTS instances (
2
+ id TEXT PRIMARY KEY,
3
+ name TEXT NOT NULL,
4
+ source_path TEXT NOT NULL,
5
+ workspace_path TEXT NOT NULL,
6
+ host_port INTEGER NOT NULL,
7
+ container_id TEXT,
8
+ remote_workspace_folder TEXT,
9
+ status TEXT NOT NULL,
10
+ error TEXT,
11
+ created_at INTEGER NOT NULL,
12
+ bridge_token TEXT NOT NULL DEFAULT '',
13
+ remote_user TEXT
14
+ );
15
+
16
+ CREATE TABLE IF NOT EXISTS folder_history (
17
+ source_path TEXT PRIMARY KEY,
18
+ name TEXT NOT NULL,
19
+ last_used_at INTEGER NOT NULL
20
+ );
@@ -0,0 +1,9 @@
1
+ CREATE TABLE IF NOT EXISTS port_forwards (
2
+ instance_id TEXT NOT NULL,
3
+ container_port INTEGER NOT NULL,
4
+ host_port INTEGER NOT NULL,
5
+ created_at INTEGER NOT NULL,
6
+ PRIMARY KEY (instance_id, container_port)
7
+ );
8
+
9
+ CREATE INDEX IF NOT EXISTS idx_port_forwards_instance ON port_forwards(instance_id);
@@ -0,0 +1,4 @@
1
+ CREATE TABLE IF NOT EXISTS options (
2
+ key TEXT PRIMARY KEY,
3
+ value TEXT NOT NULL
4
+ );
@@ -0,0 +1 @@
1
+ ALTER TABLE instances ADD COLUMN image_source TEXT;
package/package.json CHANGED
@@ -1,11 +1,89 @@
1
1
  {
2
- "name": "codebay",
3
- "version": "0.0.1",
4
- "description": "Placeholder — package name reserved. Real release coming soon.",
5
- "license": "MIT",
6
- "keywords": [
7
- "devcontainers",
8
- "code-server",
9
- "placeholder"
10
- ]
2
+ "name": "codebay",
3
+ "version": "0.2.1",
4
+ "description": "Web UI for spinning up isolated devcontainer instances from any local folder, each with a browser-based VS Code (code-server) — built for parallel Claude Code workflows.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Stanislav Khromov",
8
+ "homepage": "https://github.com/khromov/codebay#readme",
9
+ "bugs": {
10
+ "url": "https://github.com/khromov/codebay/issues"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/khromov/codebay.git"
15
+ },
16
+ "keywords": [
17
+ "devcontainer",
18
+ "devcontainers",
19
+ "code-server",
20
+ "claude-code",
21
+ "vscode",
22
+ "docker",
23
+ "bun"
24
+ ],
25
+ "bin": {
26
+ "codebay": "bin/codebay.ts"
27
+ },
28
+ "files": [
29
+ "bin",
30
+ "src",
31
+ "!src/**/*.test.ts",
32
+ "public",
33
+ "migrations",
34
+ ".mochi",
35
+ "!.mochi/dev",
36
+ "svelte.config.js",
37
+ "README.md",
38
+ "LICENSE"
39
+ ],
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
43
+ "engines": {
44
+ "bun": ">=1.3.14"
45
+ },
46
+ "scripts": {
47
+ "build": "mochi-framework build",
48
+ "start": "bun src/index.ts",
49
+ "prod": "bun run build && bun run start",
50
+ "dev": "MODE=development DISABLE_OPEN_BROWSER=1 DATA_DIR=./.codebay bun src/index.ts",
51
+ "typecheck": "svelte-check --tsconfig ./tsconfig.json --compiler-warnings 'attribute_illegal_colon:ignore' && tsc -p tsconfig.json --noEmit",
52
+ "test": "bun test",
53
+ "lint": "prettier --check . && eslint .",
54
+ "format": "prettier --write .",
55
+ "checks": "bun run format && bun run typecheck && bun run test",
56
+ "clean": "rimraf .mochi",
57
+ "gen:chimes": "bun scripts/gen-chimes.ts",
58
+ "debug:tokens": "bun scripts/debug-tokens.ts",
59
+ "verify:package": "bun scripts/verify-package.ts"
60
+ },
61
+ "dependencies": {
62
+ "@devcontainers/cli": "^0.88.0",
63
+ "@fontsource-variable/doto": "^5.2.10",
64
+ "@fontsource-variable/jetbrains-mono": "^5.2.8",
65
+ "@lucide/svelte": "^1.27.0",
66
+ "@zihaolam/bun-sqlite-migrations": "^1.0.3",
67
+ "dockerode": "^5.0.1",
68
+ "mochi-framework": "^0.9.0",
69
+ "svelte": "^5.56.8",
70
+ "svelte-french-toast": "^1.2.0"
71
+ },
72
+ "devDependencies": {
73
+ "@eslint/js": "^10.0.1",
74
+ "@types/bun": "1.3.14",
75
+ "@types/dockerode": "^4.0.1",
76
+ "eslint": "^10.8.0",
77
+ "eslint-plugin-svelte": "^3.20.0",
78
+ "globals": "^17.8.0",
79
+ "prettier": "^3.9.4",
80
+ "prettier-plugin-svelte": "^4.1.1",
81
+ "svelte-check": "4.7.4",
82
+ "typescript": "^6.0.3",
83
+ "typescript-eslint": "^8.62.1"
84
+ },
85
+ "resolutions": {
86
+ "msgpackr-extract": "npm:@mochi-framework/msgpackr-extract-stub@*",
87
+ "svelte": "5.56.8"
88
+ }
11
89
  }
Binary file
Binary file
@@ -0,0 +1,4 @@
1
+ <!-- Minimal page used only by src/index.isolated.test.ts as a Mochi.serve smoke test. -->
2
+ <main>
3
+ <h1>Hello Mochi!</h1>
4
+ </main>
@@ -0,0 +1 @@
1
+ /// <reference types="mochi-framework/ambient" />
package/src/api.ts ADDED
@@ -0,0 +1,61 @@
1
+ interface ApiErrorBody {
2
+ error?: { message: string };
3
+ }
4
+
5
+ /** A forged cross-site request can't set a custom header, which is what the CSRF guard leans on. */
6
+ const APP_REQUEST_HEADER = 'X-Codebay-Request';
7
+
8
+ /** Throws on a non-ok response, so callers can treat a return value as success. */
9
+ export async function apiFetch<T = unknown>(
10
+ url: string,
11
+ init?: RequestInit,
12
+ fallbackMessage = 'Request failed'
13
+ ): Promise<T> {
14
+ const res = await fetch(url, {
15
+ ...init,
16
+ headers: {
17
+ ...(init?.headers as Record<string, string> | undefined),
18
+ [APP_REQUEST_HEADER]: '1'
19
+ }
20
+ });
21
+ if (!res.ok) {
22
+ const data = (await res.json().catch(() => null)) as ApiErrorBody | null;
23
+ throw new Error(data?.error?.message ?? fallbackMessage);
24
+ }
25
+ return (await res.json().catch(() => ({}))) as T;
26
+ }
27
+
28
+ export function apiPost<T = unknown>(
29
+ url: string,
30
+ body?: unknown,
31
+ fallbackMessage?: string
32
+ ): Promise<T> {
33
+ return apiJson<T>('POST', url, body, fallbackMessage);
34
+ }
35
+
36
+ export function apiDelete<T = unknown>(
37
+ url: string,
38
+ body?: unknown,
39
+ fallbackMessage?: string
40
+ ): Promise<T> {
41
+ return apiJson<T>('DELETE', url, body, fallbackMessage);
42
+ }
43
+
44
+ function apiJson<T>(
45
+ method: 'POST' | 'DELETE',
46
+ url: string,
47
+ body: unknown,
48
+ fallbackMessage?: string
49
+ ): Promise<T> {
50
+ return apiFetch<T>(
51
+ url,
52
+ body === undefined
53
+ ? { method }
54
+ : {
55
+ method,
56
+ headers: { 'Content-Type': 'application/json' },
57
+ body: JSON.stringify(body)
58
+ },
59
+ fallbackMessage
60
+ );
61
+ }
@@ -0,0 +1,17 @@
1
+ import type { AvatarArt } from './types.ts';
2
+
3
+ const art: AvatarArt = {
4
+ name: 'anchor',
5
+ pixels: [
6
+ '...##...',
7
+ '..#..#..',
8
+ '..#..#..',
9
+ '.######.',
10
+ '...##...',
11
+ '#..##..#',
12
+ '########',
13
+ '.######.'
14
+ ]
15
+ };
16
+
17
+ export default art;
@@ -0,0 +1,17 @@
1
+ import type { AvatarArt } from './types.ts';
2
+
3
+ const art: AvatarArt = {
4
+ name: 'bear',
5
+ pixels: [
6
+ '##....##',
7
+ '###..###',
8
+ '########',
9
+ '##.##.##',
10
+ '########',
11
+ '########',
12
+ '###..###',
13
+ '.######.'
14
+ ]
15
+ };
16
+
17
+ export default art;
@@ -0,0 +1,17 @@
1
+ import type { AvatarArt } from './types.ts';
2
+
3
+ const art: AvatarArt = {
4
+ name: 'bee',
5
+ pixels: [
6
+ '.#....#.',
7
+ '##.##.##',
8
+ '#.####.#',
9
+ '.######.',
10
+ '.######.',
11
+ '........',
12
+ '.######.',
13
+ '..####..'
14
+ ]
15
+ };
16
+
17
+ export default art;