codebay 0.11.0 → 0.11.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.
- package/.mochi/manifest.json +18 -18
- package/.mochi/svelte-css/{InstanceView-oozmmctp8m3p.css → InstanceView-32j12hyg8v9u0.css} +1 -1
- package/package.json +1 -1
- package/src/components/InstanceView.svelte +1 -1
- package/src/components/UiShowcase.svelte +4 -1
- package/src/lib/devcontainer.server.ts +15 -9
- package/src/lib/instances.server.ts +6 -4
- package/src/shell.html +4 -0
package/.mochi/manifest.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"$mochi/templates/ClientStats/ClientStats.svelte": "/_mochi/css/ClientStats-19qzckq40p2q9.css",
|
|
14
14
|
"$mochi/templates/BackLink.svelte": "/_mochi/css/BackLink-2wlu0eovz9j86.css",
|
|
15
15
|
"src/components/AppShell.svelte": "/_mochi/css/AppShell-36mpg5smnbmuw.css",
|
|
16
|
-
"src/components/InstanceView.svelte": "/_mochi/css/InstanceView-
|
|
16
|
+
"src/components/InstanceView.svelte": "/_mochi/css/InstanceView-32j12hyg8v9u0.css",
|
|
17
17
|
"src/components/AvatarsView.svelte": "/_mochi/css/AvatarsView-26ya4ep5n1ze7.css",
|
|
18
18
|
"src/components/SettingsView.svelte": "/_mochi/css/SettingsView-bccw34agd2bj.css",
|
|
19
19
|
"src/components/TerminalSplit.svelte": "/_mochi/css/TerminalSplit-2416xfuln89a3.css",
|
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
"src/components/IdeLoader.svelte": "/_mochi/css/IdeLoader-26rlko8e00j3g.css",
|
|
23
23
|
"node_modules/svelte-french-toast/dist/components/CheckmarkIcon.svelte": "/_mochi/css/CheckmarkIcon-3qlazj2oc50jc.css",
|
|
24
24
|
"node_modules/svelte-french-toast/dist/components/ToastIcon.svelte": "/_mochi/css/ToastIcon-2z5wrkc95khg0.css",
|
|
25
|
-
"node_modules/svelte-french-toast/dist/components/LoaderIcon.svelte": "/_mochi/css/LoaderIcon-soq5wt3p05ye.css",
|
|
26
|
-
"node_modules/svelte-french-toast/dist/components/ErrorIcon.svelte": "/_mochi/css/ErrorIcon-2x0tzsqxskw28.css",
|
|
27
25
|
"node_modules/svelte-french-toast/dist/components/Toaster.svelte": "/_mochi/css/Toaster-kk60j193854n.css",
|
|
26
|
+
"node_modules/svelte-french-toast/dist/components/ErrorIcon.svelte": "/_mochi/css/ErrorIcon-2x0tzsqxskw28.css",
|
|
27
|
+
"node_modules/svelte-french-toast/dist/components/LoaderIcon.svelte": "/_mochi/css/LoaderIcon-soq5wt3p05ye.css",
|
|
28
28
|
"node_modules/svelte-french-toast/dist/components/ToastBar.svelte": "/_mochi/css/ToastBar-3havgkmtofntq.css",
|
|
29
29
|
"src/components/Skeleton.svelte": "/_mochi/css/Skeleton-8k69usiju43h.css",
|
|
30
30
|
"src/components/StatusBadge.svelte": "/_mochi/css/StatusBadge-2eisdtnrsnfdc.css",
|
|
@@ -36,24 +36,24 @@
|
|
|
36
36
|
"src/components/ThemePicker.svelte": "/_mochi/css/ThemePicker-3fw4synubier0.css",
|
|
37
37
|
"src/components/CoinButton.svelte": "/_mochi/css/CoinButton-2727devjtsn10.css",
|
|
38
38
|
"src/components/TerminalPane.svelte": "/_mochi/css/TerminalPane-2ywc86rhtmr9l.css",
|
|
39
|
-
"src/components/FolderBrowser.svelte": "/_mochi/css/FolderBrowser-i0uj58dph27f.css",
|
|
40
|
-
"src/components/InstanceCard.svelte": "/_mochi/css/InstanceCard-25z7nas7y98zk.css",
|
|
41
39
|
"src/components/TopBar.svelte": "/_mochi/css/TopBar-2y76zxwehrfos.css",
|
|
40
|
+
"src/components/InstanceCard.svelte": "/_mochi/css/InstanceCard-25z7nas7y98zk.css",
|
|
41
|
+
"src/components/FolderBrowser.svelte": "/_mochi/css/FolderBrowser-i0uj58dph27f.css",
|
|
42
42
|
"node_modules/svelte-french-toast/dist/components/ToastMessage.svelte": "/_mochi/css/ToastMessage-2jfwb2og2lfa8.css",
|
|
43
43
|
"node_modules/svelte-french-toast/dist/components/ToastWrapper.svelte": "/_mochi/css/ToastWrapper-1fbnym10rm2nv.css",
|
|
44
|
-
"src/components/BranchBox.svelte": "/_mochi/css/BranchBox-1yqu1q2mgnjwz.css",
|
|
45
|
-
"src/components/PortsBox.svelte": "/_mochi/css/PortsBox-1t25b5yg7jva3.css",
|
|
46
44
|
"src/components/Brand.svelte": "/_mochi/css/Brand-1bh2b800g5vrn.css",
|
|
47
|
-
"src/components/
|
|
45
|
+
"src/components/SettingsCog.svelte": "/_mochi/css/SettingsCog-1jdeprd3ilczz.css",
|
|
46
|
+
"src/components/PortsBox.svelte": "/_mochi/css/PortsBox-1t25b5yg7jva3.css",
|
|
48
47
|
"src/components/CredMenu.svelte": "/_mochi/css/CredMenu-7qowd1oxujet.css",
|
|
49
|
-
"src/components/
|
|
48
|
+
"src/components/InstanceFilter.svelte": "/_mochi/css/InstanceFilter-2vglmyy0yrbbc.css",
|
|
49
|
+
"src/components/BranchBox.svelte": "/_mochi/css/BranchBox-1yqu1q2mgnjwz.css"
|
|
50
50
|
},
|
|
51
51
|
"clientFiles": {
|
|
52
52
|
"/_mochi/css/DefaultError-2b0daamydxgb2.css": "svelte-css/DefaultError-2b0daamydxgb2.css",
|
|
53
53
|
"/_mochi/css/ClientStats-19qzckq40p2q9.css": "svelte-css/ClientStats-19qzckq40p2q9.css",
|
|
54
54
|
"/_mochi/css/BackLink-2wlu0eovz9j86.css": "svelte-css/BackLink-2wlu0eovz9j86.css",
|
|
55
55
|
"/_mochi/css/AppShell-36mpg5smnbmuw.css": "svelte-css/AppShell-36mpg5smnbmuw.css",
|
|
56
|
-
"/_mochi/css/InstanceView-
|
|
56
|
+
"/_mochi/css/InstanceView-32j12hyg8v9u0.css": "svelte-css/InstanceView-32j12hyg8v9u0.css",
|
|
57
57
|
"/_mochi/css/AvatarsView-26ya4ep5n1ze7.css": "svelte-css/AvatarsView-26ya4ep5n1ze7.css",
|
|
58
58
|
"/_mochi/css/SettingsView-bccw34agd2bj.css": "svelte-css/SettingsView-bccw34agd2bj.css",
|
|
59
59
|
"/_mochi/css/TerminalSplit-2416xfuln89a3.css": "svelte-css/TerminalSplit-2416xfuln89a3.css",
|
|
@@ -62,9 +62,9 @@
|
|
|
62
62
|
"/_mochi/css/IdeLoader-26rlko8e00j3g.css": "svelte-css/IdeLoader-26rlko8e00j3g.css",
|
|
63
63
|
"/_mochi/css/CheckmarkIcon-3qlazj2oc50jc.css": "svelte-css/CheckmarkIcon-3qlazj2oc50jc.css",
|
|
64
64
|
"/_mochi/css/ToastIcon-2z5wrkc95khg0.css": "svelte-css/ToastIcon-2z5wrkc95khg0.css",
|
|
65
|
-
"/_mochi/css/LoaderIcon-soq5wt3p05ye.css": "svelte-css/LoaderIcon-soq5wt3p05ye.css",
|
|
66
|
-
"/_mochi/css/ErrorIcon-2x0tzsqxskw28.css": "svelte-css/ErrorIcon-2x0tzsqxskw28.css",
|
|
67
65
|
"/_mochi/css/Toaster-kk60j193854n.css": "svelte-css/Toaster-kk60j193854n.css",
|
|
66
|
+
"/_mochi/css/ErrorIcon-2x0tzsqxskw28.css": "svelte-css/ErrorIcon-2x0tzsqxskw28.css",
|
|
67
|
+
"/_mochi/css/LoaderIcon-soq5wt3p05ye.css": "svelte-css/LoaderIcon-soq5wt3p05ye.css",
|
|
68
68
|
"/_mochi/css/ToastBar-3havgkmtofntq.css": "svelte-css/ToastBar-3havgkmtofntq.css",
|
|
69
69
|
"/_mochi/css/Skeleton-8k69usiju43h.css": "svelte-css/Skeleton-8k69usiju43h.css",
|
|
70
70
|
"/_mochi/css/StatusBadge-2eisdtnrsnfdc.css": "svelte-css/StatusBadge-2eisdtnrsnfdc.css",
|
|
@@ -76,17 +76,17 @@
|
|
|
76
76
|
"/_mochi/css/ThemePicker-3fw4synubier0.css": "svelte-css/ThemePicker-3fw4synubier0.css",
|
|
77
77
|
"/_mochi/css/CoinButton-2727devjtsn10.css": "svelte-css/CoinButton-2727devjtsn10.css",
|
|
78
78
|
"/_mochi/css/TerminalPane-2ywc86rhtmr9l.css": "svelte-css/TerminalPane-2ywc86rhtmr9l.css",
|
|
79
|
-
"/_mochi/css/FolderBrowser-i0uj58dph27f.css": "svelte-css/FolderBrowser-i0uj58dph27f.css",
|
|
80
|
-
"/_mochi/css/InstanceCard-25z7nas7y98zk.css": "svelte-css/InstanceCard-25z7nas7y98zk.css",
|
|
81
79
|
"/_mochi/css/TopBar-2y76zxwehrfos.css": "svelte-css/TopBar-2y76zxwehrfos.css",
|
|
80
|
+
"/_mochi/css/InstanceCard-25z7nas7y98zk.css": "svelte-css/InstanceCard-25z7nas7y98zk.css",
|
|
81
|
+
"/_mochi/css/FolderBrowser-i0uj58dph27f.css": "svelte-css/FolderBrowser-i0uj58dph27f.css",
|
|
82
82
|
"/_mochi/css/ToastMessage-2jfwb2og2lfa8.css": "svelte-css/ToastMessage-2jfwb2og2lfa8.css",
|
|
83
83
|
"/_mochi/css/ToastWrapper-1fbnym10rm2nv.css": "svelte-css/ToastWrapper-1fbnym10rm2nv.css",
|
|
84
|
-
"/_mochi/css/BranchBox-1yqu1q2mgnjwz.css": "svelte-css/BranchBox-1yqu1q2mgnjwz.css",
|
|
85
|
-
"/_mochi/css/PortsBox-1t25b5yg7jva3.css": "svelte-css/PortsBox-1t25b5yg7jva3.css",
|
|
86
84
|
"/_mochi/css/Brand-1bh2b800g5vrn.css": "svelte-css/Brand-1bh2b800g5vrn.css",
|
|
87
|
-
"/_mochi/css/InstanceFilter-2vglmyy0yrbbc.css": "svelte-css/InstanceFilter-2vglmyy0yrbbc.css",
|
|
88
|
-
"/_mochi/css/CredMenu-7qowd1oxujet.css": "svelte-css/CredMenu-7qowd1oxujet.css",
|
|
89
85
|
"/_mochi/css/SettingsCog-1jdeprd3ilczz.css": "svelte-css/SettingsCog-1jdeprd3ilczz.css",
|
|
86
|
+
"/_mochi/css/PortsBox-1t25b5yg7jva3.css": "svelte-css/PortsBox-1t25b5yg7jva3.css",
|
|
87
|
+
"/_mochi/css/CredMenu-7qowd1oxujet.css": "svelte-css/CredMenu-7qowd1oxujet.css",
|
|
88
|
+
"/_mochi/css/InstanceFilter-2vglmyy0yrbbc.css": "svelte-css/InstanceFilter-2vglmyy0yrbbc.css",
|
|
89
|
+
"/_mochi/css/BranchBox-1yqu1q2mgnjwz.css": "svelte-css/BranchBox-1yqu1q2mgnjwz.css",
|
|
90
90
|
"/_mochi/import-css/index-0nwv3654.css": "import-css/index-0nwv3654.css",
|
|
91
91
|
"/_mochi/import-css/index-xndx4980.css": "import-css/index-xndx4980.css",
|
|
92
92
|
"/_mochi/import-css/xterm-1yy1hf1g.css": "import-css/xterm-1yy1hf1g.css",
|
|
@@ -1 +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(--edge);align-items: center;gap:6px;padding:7px 12px;font-size:12px;font-weight:600}.open.svelte-15fxkvm:hover{background:var(--fill);border-color:var(--fill);color:var(--fill-ink)}.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(--edge);cursor:pointer;align-items: center;gap:6px;padding:7px 12px;font-size:12px;font-weight:600}.restart.svelte-15fxkvm:hover:not(:disabled){background:var(--fill);border-color:var(--fill);color:var(--fill-ink)}.restart.svelte-15fxkvm:disabled{opacity:var(--dim-panel);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(--fill-ink);color:var(--fill);border:1px solid var(--fill-ink);cursor:pointer;padding:4px 9px;font-size:10px;font-weight:600}.rebuild.svelte-15fxkvm:hover:not(:disabled){color:var(--fill-ink);background:0 0}.rebuild.svelte-15fxkvm:disabled{opacity:var(--dim-panel);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(--edge);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(--fill);border-color:var(--fill);color:var(--fill-ink)}.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}.log-actions.svelte-15fxkvm{display:flex;align-items: center;gap:6px}.copy.svelte-15fxkvm{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;background:var(--fill-ink);color:var(--fill);border:1px solid var(--fill-ink);cursor:pointer;align-items: center;gap:5px;padding:4px 9px;font-size:10px;font-weight:600}.copy.svelte-15fxkvm:hover:not(:disabled),.copy.active.svelte-15fxkvm{color:var(--fill-ink);background:0 0}.dot.svelte-15fxkvm{background:var(--
|
|
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(--edge);align-items: center;gap:6px;padding:7px 12px;font-size:12px;font-weight:600}.open.svelte-15fxkvm:hover{background:var(--fill);border-color:var(--fill);color:var(--fill-ink)}.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(--edge);cursor:pointer;align-items: center;gap:6px;padding:7px 12px;font-size:12px;font-weight:600}.restart.svelte-15fxkvm:hover:not(:disabled){background:var(--fill);border-color:var(--fill);color:var(--fill-ink)}.restart.svelte-15fxkvm:disabled{opacity:var(--dim-panel);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(--fill-ink);color:var(--fill);border:1px solid var(--fill-ink);cursor:pointer;padding:4px 9px;font-size:10px;font-weight:600}.rebuild.svelte-15fxkvm:hover:not(:disabled){color:var(--fill-ink);background:0 0}.rebuild.svelte-15fxkvm:disabled{opacity:var(--dim-panel);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(--edge);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(--fill);border-color:var(--fill);color:var(--fill-ink)}.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}.log-actions.svelte-15fxkvm{display:flex;align-items: center;gap:6px}.copy.svelte-15fxkvm{display:inline-flex;font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;background:var(--fill-ink);color:var(--fill);border:1px solid var(--fill-ink);cursor:pointer;align-items: center;gap:5px;padding:4px 9px;font-size:10px;font-weight:600}.copy.svelte-15fxkvm:hover:not(:disabled),.copy.active.svelte-15fxkvm{color:var(--fill-ink);background:0 0}.dot.svelte-15fxkvm{background:var(--live-dot);border-radius:50%;flex:none;width:6px;height:6px}.copy.svelte-15fxkvm:disabled{opacity:var(--dim-panel);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;overflow-anchor:none;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}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codebay",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.1",
|
|
4
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
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -45,7 +45,10 @@
|
|
|
45
45
|
'--info'
|
|
46
46
|
]
|
|
47
47
|
},
|
|
48
|
-
{
|
|
48
|
+
{
|
|
49
|
+
group: 'Attention',
|
|
50
|
+
tokens: ['--attn-done', '--attn-waiting', '--live-dot', '--switch-on-bg']
|
|
51
|
+
}
|
|
49
52
|
];
|
|
50
53
|
|
|
51
54
|
const chips: Record<string, HTMLElement> = {};
|
|
@@ -456,7 +456,10 @@ export function findDevcontainerConfig(dir: string): string | null {
|
|
|
456
456
|
const CODEBAY_CONFIG_NESTED = 'codebay.devcontainer.json';
|
|
457
457
|
const CODEBAY_CONFIG_FLAT = '.codebay.devcontainer.json';
|
|
458
458
|
|
|
459
|
-
/**
|
|
459
|
+
/**
|
|
460
|
+
* Sits in the same directory as the project's own config, which is what `--config` points the CLI at:
|
|
461
|
+
* relative dockerfile/compose/feature paths resolve against that directory either way.
|
|
462
|
+
*/
|
|
460
463
|
export function overrideConfigPath(
|
|
461
464
|
workspaceDir: string,
|
|
462
465
|
canonical: string | null = findDevcontainerConfig(workspaceDir)
|
|
@@ -524,7 +527,7 @@ const HOST_GATEWAY_ARG = '--add-host=host.docker.internal:host-gateway';
|
|
|
524
527
|
|
|
525
528
|
/**
|
|
526
529
|
* Merges the project's config (read-only) into a Codebay-owned sibling file that `devcontainer up
|
|
527
|
-
* --config` boots from, so the project's own devcontainer.json never shows as modified in git.
|
|
530
|
+
* --override-config` boots from, so the project's own devcontainer.json never shows as modified in git.
|
|
528
531
|
*/
|
|
529
532
|
export async function writeOverrideConfig(
|
|
530
533
|
workspaceDir: string,
|
|
@@ -534,7 +537,7 @@ export async function writeOverrideConfig(
|
|
|
534
537
|
mode: InstanceMode = 'ide',
|
|
535
538
|
permissionMode: ClaudePermissionMode = 'default',
|
|
536
539
|
envVars: { name: string; value: string }[] = []
|
|
537
|
-
): Promise<{ imageSource: string; configPath: string }> {
|
|
540
|
+
): Promise<{ imageSource: string; configPath: string | null; overrideConfigPath: string }> {
|
|
538
541
|
const isTerminal = mode === 'terminal';
|
|
539
542
|
const canonical = findDevcontainerConfig(workspaceDir);
|
|
540
543
|
const target = overrideConfigPath(workspaceDir, canonical);
|
|
@@ -640,7 +643,7 @@ export async function writeOverrideConfig(
|
|
|
640
643
|
|
|
641
644
|
await writeLocalGitExclude(workspaceDir);
|
|
642
645
|
|
|
643
|
-
return { imageSource, configPath: target };
|
|
646
|
+
return { imageSource, configPath: canonical, overrideConfigPath: target };
|
|
644
647
|
}
|
|
645
648
|
|
|
646
649
|
/** `codebay-tmux` has been injected into every config this manager has ever written. */
|
|
@@ -902,10 +905,10 @@ export interface UpResult {
|
|
|
902
905
|
description?: string;
|
|
903
906
|
}
|
|
904
907
|
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
) {
|
|
908
|
+
/** `configPath` is the project's own config (`--config`), `overrideConfigPath` the Codebay-owned one. */
|
|
909
|
+
type UpOptions = { noCache?: boolean; configPath?: string; overrideConfigPath?: string };
|
|
910
|
+
|
|
911
|
+
export function devcontainerUpArgs(workspaceDir: string, opts: UpOptions = {}) {
|
|
909
912
|
const args = [
|
|
910
913
|
devcontainerBin(),
|
|
911
914
|
'up',
|
|
@@ -913,7 +916,10 @@ export function devcontainerUpArgs(
|
|
|
913
916
|
workspaceDir,
|
|
914
917
|
'--remove-existing-container'
|
|
915
918
|
];
|
|
919
|
+
// --config rejects any basename but devcontainer.json/.devcontainer.json, so the Codebay-owned
|
|
920
|
+
// file rides --override-config; --config only pins which path relative resolution is based on.
|
|
916
921
|
if (opts.configPath) args.push('--config', opts.configPath);
|
|
922
|
+
if (opts.overrideConfigPath) args.push('--override-config', opts.overrideConfigPath);
|
|
917
923
|
// Only takes effect because --remove-existing-container drops the container before the build.
|
|
918
924
|
if (opts.noCache) args.push('--build-no-cache');
|
|
919
925
|
return args;
|
|
@@ -931,7 +937,7 @@ export function devcontainerUpEnv(): Record<string, string | undefined> {
|
|
|
931
937
|
export async function devcontainerUp(
|
|
932
938
|
workspaceDir: string,
|
|
933
939
|
onLog: (chunk: string) => void,
|
|
934
|
-
opts:
|
|
940
|
+
opts: UpOptions = {}
|
|
935
941
|
): Promise<UpResult> {
|
|
936
942
|
const proc = Bun.spawn(devcontainerUpArgs(workspaceDir, opts), {
|
|
937
943
|
cwd: workspaceDir,
|
|
@@ -467,7 +467,7 @@ async function provision(row: InstanceRow, opts: { noCache?: boolean } = {}): Pr
|
|
|
467
467
|
}));
|
|
468
468
|
appendLog(row.id, `Injecting ${surfaceLabel(row.mode)} (host port ${row.host_port})\n`);
|
|
469
469
|
const defaultImage = getOption('default_image') ?? DEFAULT_IMAGE;
|
|
470
|
-
const { imageSource, configPath } = await writeOverrideConfig(
|
|
470
|
+
const { imageSource, configPath, overrideConfigPath } = await writeOverrideConfig(
|
|
471
471
|
row.workspace_path,
|
|
472
472
|
row.host_port,
|
|
473
473
|
forwards,
|
|
@@ -481,8 +481,9 @@ async function provision(row: InstanceRow, opts: { noCache?: boolean } = {}): Pr
|
|
|
481
481
|
const noCache = opts.noCache || getOption('disable_build_cache') === '1';
|
|
482
482
|
if (noCache) appendLog(row.id, `Building without cache (--build-no-cache)\n`);
|
|
483
483
|
|
|
484
|
-
// The CLI's --remove-existing-container matches by the devcontainer.config_file label,
|
|
485
|
-
//
|
|
484
|
+
// The CLI's --remove-existing-container matches by the devcontainer.config_file label, and
|
|
485
|
+
// deliberately ignores a workspace match whose label differs — so a container left by a build
|
|
486
|
+
// that labelled itself differently would survive and keep the host port. Drop it ourselves.
|
|
486
487
|
if (row.container_id && !(await removeContainerOnly(row.container_id))) {
|
|
487
488
|
appendLog(
|
|
488
489
|
row.id,
|
|
@@ -494,7 +495,8 @@ async function provision(row: InstanceRow, opts: { noCache?: boolean } = {}): Pr
|
|
|
494
495
|
const upStart = Date.now();
|
|
495
496
|
const result = await devcontainerUp(row.workspace_path, (chunk) => appendLog(row.id, chunk), {
|
|
496
497
|
noCache,
|
|
497
|
-
configPath
|
|
498
|
+
configPath: configPath ?? undefined,
|
|
499
|
+
overrideConfigPath
|
|
498
500
|
});
|
|
499
501
|
appendLog(row.id, `⏱ devcontainer up: ${elapsed(upStart)}\n`);
|
|
500
502
|
|
package/src/shell.html
CHANGED
|
@@ -57,6 +57,10 @@
|
|
|
57
57
|
--screen-ink: light-dark(#d8d9cf, #e8b055);
|
|
58
58
|
--screen-line: light-dark(rgba(255, 255, 255, 0.04), rgba(232, 176, 85, 0.05));
|
|
59
59
|
--attn-done: #22c55e;
|
|
60
|
+
/* The "live" LED on an inverted chip. Green reads as a lit indicator on
|
|
61
|
+
light's near-black chip; on dark's amber one it clashes, so there it
|
|
62
|
+
drops to the chip's own ink (matches --fill-ink). */
|
|
63
|
+
--live-dot: light-dark(#22c55e, #17130a);
|
|
60
64
|
--attn-waiting: light-dark(#f59e0b, #ff7a2f);
|
|
61
65
|
/* Softened in dark — a saturated blue is the one hue that fights the warm ground. */
|
|
62
66
|
--info: light-dark(#388bfd, #6c9fd8);
|