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,356 @@
1
+ // @bun
2
+ import {
3
+ StatusBadge,
4
+ apiDelete,
5
+ apiPost,
6
+ forwardedPortUrl,
7
+ ideUrl
8
+ } from "./chunk-btmcxhqy.js";
9
+ import {
10
+ X
11
+ } from "./chunk-4kwy539a.js";
12
+ import {
13
+ HydratableBoundary,
14
+ Icon,
15
+ emitIslandProps
16
+ } from "./chunk-v6796ga4.js";
17
+ import"./chunk-we0ggtws.js";
18
+
19
+ // src/pages/Instance.svelte
20
+ import"svelte/internal/flags/async";
21
+ import * as $7 from "svelte/internal/server";
22
+
23
+ // src/components/InstanceView.svelte
24
+ import"svelte/internal/flags/async";
25
+ import * as $6 from "svelte/internal/server";
26
+
27
+ // node_modules/@lucide/svelte/dist/icons/arrow-left.svelte
28
+ import"svelte/internal/flags/async";
29
+ import * as $ from "svelte/internal/server";
30
+ function Arrow_left($$renderer, $$props) {
31
+ let { $$slots, $$events, ...props } = $$props;
32
+ const iconNode = [
33
+ ["path", { d: "m12 19-7-7 7-7" }],
34
+ ["path", { d: "M19 12H5" }]
35
+ ];
36
+ Icon($$renderer, $.spread_props([{ name: "arrow-left" }, props, { iconNode }]));
37
+ }
38
+ // node_modules/@lucide/svelte/dist/icons/arrow-up-right.svelte
39
+ import"svelte/internal/flags/async";
40
+ import * as $2 from "svelte/internal/server";
41
+ function Arrow_up_right($$renderer, $$props) {
42
+ let { $$slots, $$events, ...props } = $$props;
43
+ const iconNode = [["path", { d: "M7 7h10v10" }], ["path", { d: "M7 17 17 7" }]];
44
+ Icon($$renderer, $2.spread_props([{ name: "arrow-up-right" }, props, { iconNode }]));
45
+ }
46
+ // src/components/HealthBox.svelte
47
+ import"svelte/internal/flags/async";
48
+ import * as $5 from "svelte/internal/server";
49
+
50
+ // node_modules/@lucide/svelte/dist/icons/check.svelte
51
+ import"svelte/internal/flags/async";
52
+ import * as $3 from "svelte/internal/server";
53
+ function Check($$renderer, $$props) {
54
+ let { $$slots, $$events, ...props } = $$props;
55
+ const iconNode = [["path", { d: "M20 6 9 17l-5-5" }]];
56
+ Icon($$renderer, $3.spread_props([{ name: "check" }, props, { iconNode }]));
57
+ }
58
+ // src/components/Skeleton.svelte
59
+ import"svelte/internal/flags/async";
60
+ import * as $4 from "svelte/internal/server";
61
+ function Skeleton($$renderer, $$props) {
62
+ let { variant = "text", width } = $$props;
63
+ $$renderer.push(`<span${$4.attr_class(`skel ${$4.stringify(variant)}`, "svelte-tl058d")}${$4.attr_style("", { width })}></span>`);
64
+ }
65
+
66
+ // src/components/HealthBox.svelte
67
+ function HealthBox($$renderer, $$props) {
68
+ $$renderer.component(($$renderer2) => {
69
+ const FIXED_CHECKS = ["Container running", "Code-server reachable"];
70
+ let {
71
+ health = null,
72
+ lastFetchedAt = null,
73
+ active = true,
74
+ injectionChecks = 0
75
+ } = $$props;
76
+ const checks = $5.derived(() => {
77
+ if (!health)
78
+ return [];
79
+ const v = (ok) => ({ ok, value: ok ? "OK" : "\u2014" });
80
+ return [
81
+ { label: FIXED_CHECKS[0], ...v(health.containerRunning) },
82
+ { label: FIXED_CHECKS[1], ...v(health.codeServerAccessible) },
83
+ ...health.injections.map((i) => ({ label: i.label, ...v(i.ok) }))
84
+ ];
85
+ });
86
+ function getNumberOfChecks() {
87
+ return health ? checks().length : FIXED_CHECKS.length + injectionChecks;
88
+ }
89
+ let now = Date.now();
90
+ const agoLabel = $5.derived(() => {
91
+ if (!active && !health)
92
+ return "Container not running";
93
+ if (!lastFetchedAt)
94
+ return "Waiting for first check\u2026";
95
+ const secs = Math.max(0, Math.round((now - lastFetchedAt) / 1000));
96
+ return `Updated ${secs}s ago`;
97
+ });
98
+ $$renderer2.push(`<div${$5.attr_class("healthwrap panel svelte-1hnopyv", undefined, { dim: !active && !health })}><div class="panel-bar">Health</div> <div class="health svelte-1hnopyv">`);
99
+ if (health) {
100
+ $$renderer2.push("<!--[0-->");
101
+ $$renderer2.push(`<!--[-->`);
102
+ const each_array = $5.ensure_array_like(checks());
103
+ for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
104
+ let check = each_array[$$index];
105
+ $$renderer2.push(`<div class="hrow svelte-1hnopyv"><span${$5.attr_class(`box ${check.ok ? "ok" : "bad"}`, "svelte-1hnopyv")}>`);
106
+ if (check.ok) {
107
+ $$renderer2.push("<!--[0-->");
108
+ Check($$renderer2, { size: 12, strokeWidth: 3 });
109
+ } else {
110
+ $$renderer2.push("<!--[-1-->");
111
+ X($$renderer2, { size: 12, strokeWidth: 3 });
112
+ }
113
+ $$renderer2.push(`<!--]--></span> <span class="hlabel svelte-1hnopyv">${$5.escape(check.label)}</span> <span class="hvalue svelte-1hnopyv">${$5.escape(check.value)}</span></div>`);
114
+ }
115
+ $$renderer2.push(`<!--]-->`);
116
+ } else if (active) {
117
+ $$renderer2.push("<!--[1-->");
118
+ $$renderer2.push(`<!--[-->`);
119
+ const each_array_1 = $5.ensure_array_like(Array(getNumberOfChecks()));
120
+ for (let i = 0, $$length = each_array_1.length;i < $$length; i++) {
121
+ let _ = each_array_1[i];
122
+ $$renderer2.push(`<div class="hrow svelte-1hnopyv"><span class="box idle svelte-1hnopyv"></span> `);
123
+ Skeleton($$renderer2, { width: "120px" });
124
+ $$renderer2.push(`<!----> `);
125
+ Skeleton($$renderer2, { variant: "pill" });
126
+ $$renderer2.push(`<!----></div>`);
127
+ }
128
+ $$renderer2.push(`<!--]-->`);
129
+ } else {
130
+ $$renderer2.push("<!--[-1-->");
131
+ $$renderer2.push(`<!--[-->`);
132
+ const each_array_2 = $5.ensure_array_like(FIXED_CHECKS);
133
+ for (let $$index_2 = 0, $$length = each_array_2.length;$$index_2 < $$length; $$index_2++) {
134
+ let label = each_array_2[$$index_2];
135
+ $$renderer2.push(`<div class="hrow svelte-1hnopyv"><span class="box idle svelte-1hnopyv"></span> <span class="hlabel svelte-1hnopyv">${$5.escape(label)}</span> <span class="hvalue svelte-1hnopyv">\u2014</span></div>`);
136
+ }
137
+ $$renderer2.push(`<!--]-->`);
138
+ }
139
+ $$renderer2.push(`<!--]--></div> <div class="hfoot svelte-1hnopyv">${$5.escape(agoLabel())}</div></div>`);
140
+ });
141
+ }
142
+
143
+ // src/components/InstanceView.svelte
144
+ function InstanceView($$renderer, $$props) {
145
+ $$renderer.component(($$renderer2) => {
146
+ let { id, injectionChecks = 0 } = $$props;
147
+ let instance = null;
148
+ let health = null;
149
+ let lastFetchedAt = null;
150
+ let logs = "";
151
+ function autoscroll(node) {
152
+ node.scrollTop = node.scrollHeight;
153
+ }
154
+ const url = $6.derived(() => instance ? ideUrl(instance) : "#");
155
+ let newPort = "";
156
+ let portError = null;
157
+ let pendingRebuild = false;
158
+ const forwards = $6.derived(() => instance?.forwarded_ports ?? []);
159
+ const building = $6.derived(() => instance?.status === "creating");
160
+ async function portAction(run) {
161
+ portError = null;
162
+ try {
163
+ await run();
164
+ return true;
165
+ } catch (err) {
166
+ portError = err.message;
167
+ return false;
168
+ }
169
+ }
170
+ async function addPort(e) {
171
+ e.preventDefault();
172
+ const port = Number.parseInt(newPort, 10);
173
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
174
+ portError = "Enter a port number between 1 and 65535";
175
+ return;
176
+ }
177
+ const ok = await portAction(() => apiPost(`/api/instances/${id}/ports`, { port }));
178
+ if (ok) {
179
+ newPort = "";
180
+ pendingRebuild = true;
181
+ }
182
+ }
183
+ async function removePort(port) {
184
+ const ok = await portAction(() => apiDelete(`/api/instances/${id}/ports/${port}`));
185
+ if (ok)
186
+ pendingRebuild = true;
187
+ }
188
+ async function restart() {
189
+ const ok = await portAction(() => apiPost(`/api/instances/${id}/rebuild`));
190
+ if (ok)
191
+ pendingRebuild = false;
192
+ }
193
+ let restartError = null;
194
+ let restarting = false;
195
+ const restartOpts = {
196
+ onPending: (v) => restarting = v,
197
+ submit: () => {
198
+ restartError = null;
199
+ return ({ result }) => {
200
+ if (result.type === "failure") {
201
+ restartError = result.data?.error ?? "Restart failed";
202
+ } else if (result.type === "error") {
203
+ restartError = "Network error. Try again.";
204
+ }
205
+ };
206
+ }
207
+ };
208
+ let copied = false;
209
+ let copyTimer;
210
+ async function copyLogs() {
211
+ await navigator.clipboard.writeText(logs);
212
+ copied = true;
213
+ clearTimeout(copyTimer);
214
+ copyTimer = setTimeout(() => copied = false, 2000);
215
+ }
216
+ $$renderer2.push(`<header class="topbar svelte-15fxkvm"><a class="back svelte-15fxkvm" href="/">`);
217
+ Arrow_left($$renderer2, { size: 15 });
218
+ $$renderer2.push(`<!----> All instances</a> <div class="title svelte-15fxkvm"><span class="name svelte-15fxkvm">${$6.escape(instance?.name ?? "Instance")}</span> `);
219
+ if (instance) {
220
+ $$renderer2.push("<!--[0-->");
221
+ StatusBadge($$renderer2, { status: instance.status });
222
+ } else {
223
+ $$renderer2.push("<!--[-1-->");
224
+ Skeleton($$renderer2, { variant: "pill" });
225
+ }
226
+ $$renderer2.push(`<!--]--></div> `);
227
+ if (instance?.status === "running") {
228
+ $$renderer2.push("<!--[0-->");
229
+ $$renderer2.push(`<form method="POST" action="?/restart" class="svelte-15fxkvm"><button class="restart svelte-15fxkvm" type="submit"${$6.attr("disabled", restarting || building(), true)}>${$6.escape(restarting || building() ? "Restarting\u2026" : "Restart container")}</button></form> <a class="open svelte-15fxkvm"${$6.attr("href", url())} target="_blank" rel="noopener">Open in new tab `);
230
+ Arrow_up_right($$renderer2, { size: 15 });
231
+ $$renderer2.push(`<!----></a>`);
232
+ } else {
233
+ $$renderer2.push("<!--[-1-->");
234
+ }
235
+ $$renderer2.push(`<!--]--></header> `);
236
+ if (restartError) {
237
+ $$renderer2.push("<!--[0-->");
238
+ $$renderer2.push(`<p class="restart-err svelte-15fxkvm">${$6.escape(restartError)}</p>`);
239
+ } else {
240
+ $$renderer2.push("<!--[-1-->");
241
+ }
242
+ $$renderer2.push(`<!--]--> <main class="stage svelte-15fxkvm"><div class="meta svelte-15fxkvm"><span class="k svelte-15fxkvm">Source</span> `);
243
+ if (instance) {
244
+ $$renderer2.push("<!--[0-->");
245
+ $$renderer2.push(`<code class="svelte-15fxkvm">${$6.escape(instance.source_path)}</code>`);
246
+ } else {
247
+ $$renderer2.push("<!--[-1-->");
248
+ Skeleton($$renderer2, { variant: "wide" });
249
+ }
250
+ $$renderer2.push(`<!--]--> <span class="k svelte-15fxkvm">Image</span> `);
251
+ if (instance) {
252
+ $$renderer2.push("<!--[0-->");
253
+ if (instance.image_source === "local") {
254
+ $$renderer2.push("<!--[0-->");
255
+ $$renderer2.push(`<code class="svelte-15fxkvm">local (project devcontainer.json)</code>`);
256
+ } else if (instance.image_source) {
257
+ $$renderer2.push("<!--[1-->");
258
+ $$renderer2.push(`<code class="svelte-15fxkvm">${$6.escape(instance.image_source)}</code>`);
259
+ } else {
260
+ $$renderer2.push("<!--[-1-->");
261
+ $$renderer2.push(`<code class="muted svelte-15fxkvm">\u2014</code>`);
262
+ }
263
+ $$renderer2.push(`<!--]-->`);
264
+ } else {
265
+ $$renderer2.push("<!--[-1-->");
266
+ Skeleton($$renderer2, { variant: "wide" });
267
+ }
268
+ $$renderer2.push(`<!--]--></div> <div class="healthslot svelte-15fxkvm">`);
269
+ HealthBox($$renderer2, {
270
+ health,
271
+ lastFetchedAt,
272
+ injectionChecks,
273
+ active: !instance || instance.status === "running"
274
+ });
275
+ $$renderer2.push(`<!----></div> <section class="ports panel svelte-15fxkvm"><div class="ports-bar panel-bar svelte-15fxkvm"><span class="svelte-15fxkvm">Forwarded ports</span> `);
276
+ if (pendingRebuild) {
277
+ $$renderer2.push("<!--[0-->");
278
+ $$renderer2.push(`<button class="rebuild svelte-15fxkvm"${$6.attr("disabled", building(), true)}>${$6.escape(building() ? "Restarting\u2026" : "Restart to apply")}</button>`);
279
+ } else {
280
+ $$renderer2.push("<!--[-1-->");
281
+ }
282
+ $$renderer2.push(`<!--]--></div> <div class="ports-body svelte-15fxkvm">`);
283
+ if (forwards().length) {
284
+ $$renderer2.push("<!--[0-->");
285
+ $$renderer2.push(`<ul class="port-list svelte-15fxkvm"><!--[-->`);
286
+ const each_array = $6.ensure_array_like(forwards());
287
+ for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
288
+ let f = each_array[$$index];
289
+ $$renderer2.push(`<li class="svelte-15fxkvm"><span class="cp svelte-15fxkvm">:${$6.escape(f.container_port)}</span> <span class="arr svelte-15fxkvm">\u2192</span> <a${$6.attr("href", forwardedPortUrl(f.host_port))} target="_blank" rel="noopener" class="svelte-15fxkvm">${$6.escape(forwardedPortUrl(f.host_port).replace("http://", ""))} `);
290
+ Arrow_up_right($$renderer2, { size: 12 });
291
+ $$renderer2.push(`<!----></a> <button class="rm svelte-15fxkvm" title="Remove">\xD7</button></li>`);
292
+ }
293
+ $$renderer2.push(`<!--]--></ul>`);
294
+ } else {
295
+ $$renderer2.push("<!--[-1-->");
296
+ $$renderer2.push(`<p class="empty svelte-15fxkvm">No ports forwarded yet.</p>`);
297
+ }
298
+ $$renderer2.push(`<!--]--> <form class="add svelte-15fxkvm"><input type="number" min="1" max="65535" placeholder="container port (e.g. 3000)"${$6.attr("value", newPort)} spellcheck="false" class="svelte-15fxkvm"/> <button type="submit" class="svelte-15fxkvm">Add</button></form> `);
299
+ if (portError) {
300
+ $$renderer2.push("<!--[0-->");
301
+ $$renderer2.push(`<p class="port-err svelte-15fxkvm">${$6.escape(portError)}</p>`);
302
+ } else {
303
+ $$renderer2.push("<!--[-1-->");
304
+ }
305
+ $$renderer2.push(`<!--]--> `);
306
+ if (pendingRebuild) {
307
+ $$renderer2.push("<!--[0-->");
308
+ $$renderer2.push(`<p class="hint pending svelte-15fxkvm">Port changes apply when you <strong class="svelte-15fxkvm">Restart</strong> (recreates the container).</p>`);
309
+ } else {
310
+ $$renderer2.push("<!--[-1-->");
311
+ }
312
+ $$renderer2.push(`<!--]--> <p class="hint svelte-15fxkvm">Your app must bind to <code class="svelte-15fxkvm">0.0.0.0</code> inside the container to be reachable.</p></div></section> <div class="logwrap panel svelte-15fxkvm"><div class="log-bar panel-bar svelte-15fxkvm"><span class="svelte-15fxkvm">Boot log</span> <button class="copy svelte-15fxkvm"${$6.attr("disabled", !logs, true)}>${$6.escape(copied ? "Copied!" : "Copy logs")}</button></div> <div class="logs svelte-15fxkvm"><pre class="svelte-15fxkvm">${$6.escape(logs || "Waiting for output\u2026")}<span class="caret svelte-15fxkvm"></span></pre></div> `);
313
+ if (instance?.status === "error" && instance.error) {
314
+ $$renderer2.push("<!--[0-->");
315
+ $$renderer2.push(`<div class="err svelte-15fxkvm">${$6.escape(instance.error)}</div>`);
316
+ } else {
317
+ $$renderer2.push("<!--[-1-->");
318
+ }
319
+ $$renderer2.push(`<!--]--></div></main>`);
320
+ });
321
+ }
322
+
323
+ // src/pages/Instance.svelte
324
+ function Instance($$renderer, $$props) {
325
+ $$renderer.component(($$renderer2) => {
326
+ let { id, injectionChecks } = $$props;
327
+ if (true) {
328
+ let failed = function($$renderer3, error) {
329
+ $$renderer3.push(`<mochi-island-failure data-component="InstanceView"${$7.attr("data-message", error.message)}></mochi-island-failure>`);
330
+ };
331
+ $$renderer2.push("<!--[0-->");
332
+ $$renderer2.boundary({ failed }, ($$renderer3) => {
333
+ $$renderer3.push(`<!--[-->`);
334
+ {
335
+ HydratableBoundary($$renderer3, {
336
+ children: ($$renderer4) => {
337
+ $$renderer4.push(`<mochi-hydratable-island component-name="InstanceView_2ma45l9bybfhl" component-url="__MOCHI_COMPONENT_URL__InstanceView_2ma45l9bybfhl__"${$7.attr("props-ref", emitIslandProps({ id, injectionChecks }))}>`);
338
+ $$renderer4.push(`<!--[-->`);
339
+ {
340
+ InstanceView($$renderer4, { id, injectionChecks });
341
+ }
342
+ $$renderer4.push(`<!--]-->`);
343
+ $$renderer4.push(`</mochi-hydratable-island>`);
344
+ },
345
+ $$slots: { default: true }
346
+ });
347
+ }
348
+ $$renderer3.push(`<!--]-->`);
349
+ });
350
+ }
351
+ $$renderer2.push(`<!--]-->`);
352
+ });
353
+ }
354
+ export {
355
+ Instance as default
356
+ };