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.
@@ -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-oozmmctp8m3p.css",
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/InstanceFilter.svelte": "/_mochi/css/InstanceFilter-2vglmyy0yrbbc.css",
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/SettingsCog.svelte": "/_mochi/css/SettingsCog-1jdeprd3ilczz.css"
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-oozmmctp8m3p.css": "svelte-css/InstanceView-oozmmctp8m3p.css",
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(--attn-done);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}
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.0",
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",
@@ -574,7 +574,7 @@
574
574
  width: 6px;
575
575
  height: 6px;
576
576
  border-radius: 50%;
577
- background: var(--attn-done);
577
+ background: var(--live-dot);
578
578
  }
579
579
  .copy:disabled {
580
580
  opacity: var(--dim-panel);
@@ -45,7 +45,10 @@
45
45
  '--info'
46
46
  ]
47
47
  },
48
- { group: 'Attention', tokens: ['--attn-done', '--attn-waiting', '--switch-on-bg'] }
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
- /** Sits in the same directory as the project's own config so relative paths resolve identically. */
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
- export function devcontainerUpArgs(
906
- workspaceDir: string,
907
- opts: { noCache?: boolean; configPath?: string } = {}
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: { noCache?: boolean; configPath?: string } = {}
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, which
485
- // no longer matches containers built from the pre-separate-config path — drop them ourselves.
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);