@shmulikdav/solix 1.11.5 → 1.11.7
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/dist/index.js +102 -49
- package/dist/web/assets/{CrewPanel-DnWEdhyp.js → CrewPanel-BYvcG5oQ.js} +1 -1
- package/dist/web/assets/{GalaxyPanel-D9Y_9vly.js → GalaxyPanel-DT8jgkU7.js} +1 -1
- package/dist/web/assets/{Scene-4hP2eHau.js → Scene-CjTLgXh2.js} +1 -1
- package/dist/web/assets/{TimelineDrawer-B8cmMQCx.js → TimelineDrawer-CUopz64l.js} +1 -1
- package/dist/web/assets/{WorkspacePanel-DtGmdzLr.js → WorkspacePanel-DxXJoWBn.js} +1 -1
- package/dist/web/assets/index-7ez2Aqq0.css +1 -0
- package/dist/web/assets/{index-BLLO-8aM.js → index-CXWl4STS.js} +165 -165
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/web/assets/index-BJ0cPJK5.css +0 -1
package/dist/index.js
CHANGED
|
@@ -57,7 +57,13 @@ var unpinAdvisorCmd = (id) => postAdvisor(id, "unpin");
|
|
|
57
57
|
|
|
58
58
|
// src/demo.ts
|
|
59
59
|
import { spawn } from "child_process";
|
|
60
|
-
import {
|
|
60
|
+
import {
|
|
61
|
+
existsSync,
|
|
62
|
+
mkdirSync,
|
|
63
|
+
readFileSync,
|
|
64
|
+
unlinkSync,
|
|
65
|
+
writeFileSync
|
|
66
|
+
} from "fs";
|
|
61
67
|
import { homedir } from "os";
|
|
62
68
|
import { join } from "path";
|
|
63
69
|
import { fileURLToPath } from "url";
|
|
@@ -144,6 +150,66 @@ async function getJson(base, path) {
|
|
|
144
150
|
function randomChoice(arr) {
|
|
145
151
|
return arr[Math.floor(Math.random() * arr.length)];
|
|
146
152
|
}
|
|
153
|
+
async function killChildHard(child) {
|
|
154
|
+
if (child.exitCode != null || child.signalCode != null) return;
|
|
155
|
+
try {
|
|
156
|
+
child.kill("SIGTERM");
|
|
157
|
+
} catch {
|
|
158
|
+
}
|
|
159
|
+
for (let i = 0; i < 20; i++) {
|
|
160
|
+
if (child.exitCode != null || child.signalCode != null) return;
|
|
161
|
+
await sleep(100);
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
child.kill("SIGKILL");
|
|
165
|
+
} catch {
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
async function reapStaleDemoServers() {
|
|
169
|
+
if (!existsSync(DEMO_PID_PATH)) return;
|
|
170
|
+
let pids = [];
|
|
171
|
+
try {
|
|
172
|
+
pids = readFileSync(DEMO_PID_PATH, "utf8").split("\n").map((l) => parseInt(l.trim(), 10)).filter((n) => Number.isInteger(n) && n > 0);
|
|
173
|
+
} catch {
|
|
174
|
+
pids = [];
|
|
175
|
+
}
|
|
176
|
+
const alive = pids.filter((pid) => {
|
|
177
|
+
try {
|
|
178
|
+
process.kill(pid, 0);
|
|
179
|
+
return true;
|
|
180
|
+
} catch {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
if (alive.length === 0) {
|
|
185
|
+
try {
|
|
186
|
+
unlinkSync(DEMO_PID_PATH);
|
|
187
|
+
} catch {
|
|
188
|
+
}
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
console.log(
|
|
192
|
+
`[solix demo] cleaning up ${alive.length} stale sandbox server(s) from a previous run\u2026`
|
|
193
|
+
);
|
|
194
|
+
for (const pid of alive) {
|
|
195
|
+
try {
|
|
196
|
+
process.kill(pid, "SIGTERM");
|
|
197
|
+
} catch {
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
await sleep(400);
|
|
201
|
+
for (const pid of alive) {
|
|
202
|
+
try {
|
|
203
|
+
process.kill(pid, 0);
|
|
204
|
+
process.kill(pid, "SIGKILL");
|
|
205
|
+
} catch {
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
try {
|
|
209
|
+
unlinkSync(DEMO_PID_PATH);
|
|
210
|
+
} catch {
|
|
211
|
+
}
|
|
212
|
+
}
|
|
147
213
|
async function bootSandbox(preferredPort) {
|
|
148
214
|
let port = preferredPort;
|
|
149
215
|
if (!await isPortFree(port)) {
|
|
@@ -158,22 +224,7 @@ async function bootSandbox(preferredPort) {
|
|
|
158
224
|
return null;
|
|
159
225
|
}
|
|
160
226
|
}
|
|
161
|
-
|
|
162
|
-
try {
|
|
163
|
-
const pid = parseInt(readFileSync(DEMO_PID_PATH, "utf8").trim(), 10);
|
|
164
|
-
if (pid > 0) {
|
|
165
|
-
try {
|
|
166
|
-
process.kill(pid, 0);
|
|
167
|
-
try {
|
|
168
|
-
process.kill(pid);
|
|
169
|
-
} catch {
|
|
170
|
-
}
|
|
171
|
-
} catch {
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
} catch {
|
|
175
|
-
}
|
|
176
|
-
}
|
|
227
|
+
await reapStaleDemoServers();
|
|
177
228
|
mkdirSync(SOLIX_HOME, { recursive: true });
|
|
178
229
|
const selfScript = fileURLToPath(import.meta.url);
|
|
179
230
|
const child = spawn(
|
|
@@ -194,10 +245,8 @@ async function bootSandbox(preferredPort) {
|
|
|
194
245
|
);
|
|
195
246
|
if (child.pid) {
|
|
196
247
|
try {
|
|
197
|
-
(
|
|
198
|
-
|
|
199
|
-
String(child.pid)
|
|
200
|
-
);
|
|
248
|
+
writeFileSync(DEMO_PID_PATH, `${child.pid}
|
|
249
|
+
`);
|
|
201
250
|
} catch {
|
|
202
251
|
}
|
|
203
252
|
}
|
|
@@ -207,15 +256,24 @@ async function bootSandbox(preferredPort) {
|
|
|
207
256
|
}
|
|
208
257
|
});
|
|
209
258
|
if (!await waitForServer(port, SERVER_BOOT_TIMEOUT_MS)) {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
259
|
+
const secs = Math.round(SERVER_BOOT_TIMEOUT_MS / 1e3);
|
|
260
|
+
if (child.exitCode != null || child.signalCode != null) {
|
|
261
|
+
console.error(
|
|
262
|
+
`[solix demo] the sandbox server exited during startup (see the error above).`
|
|
263
|
+
);
|
|
264
|
+
} else {
|
|
265
|
+
console.error(
|
|
266
|
+
`[solix demo] the sandbox server started but isn't responding on ${baseUrl(
|
|
267
|
+
port
|
|
268
|
+
)} after ${secs}s.`
|
|
269
|
+
);
|
|
270
|
+
console.error(
|
|
271
|
+
`[solix demo] this usually means a firewall or security tool is blocking localhost, or a stale server is stuck. Try a fresh --port, or check that ${baseUrl(
|
|
272
|
+
port
|
|
273
|
+
)} opens in your browser.`
|
|
274
|
+
);
|
|
218
275
|
}
|
|
276
|
+
await killChildHard(child);
|
|
219
277
|
return null;
|
|
220
278
|
}
|
|
221
279
|
return { child, port, base: baseUrl(port) };
|
|
@@ -489,18 +547,13 @@ function startTicker(base, state) {
|
|
|
489
547
|
}
|
|
490
548
|
function registerTeardown(opts) {
|
|
491
549
|
let torn = false;
|
|
492
|
-
const onSignal = (sig) => {
|
|
550
|
+
const onSignal = async (sig) => {
|
|
493
551
|
if (torn) return;
|
|
494
552
|
torn = true;
|
|
495
553
|
console.log(`
|
|
496
554
|
[solix demo] received ${sig} \u2014 tearing down\u2026`);
|
|
497
555
|
if (opts.stopTicker) opts.stopTicker();
|
|
498
|
-
if (opts.child)
|
|
499
|
-
try {
|
|
500
|
-
opts.child.kill();
|
|
501
|
-
} catch {
|
|
502
|
-
}
|
|
503
|
-
}
|
|
556
|
+
if (opts.child) await killChildHard(opts.child);
|
|
504
557
|
if (!opts.keep) {
|
|
505
558
|
for (const p of [DEMO_DB_PATH, `${DEMO_DB_PATH}-shm`, `${DEMO_DB_PATH}-wal`, DEMO_PID_PATH]) {
|
|
506
559
|
try {
|
|
@@ -514,8 +567,8 @@ function registerTeardown(opts) {
|
|
|
514
567
|
}
|
|
515
568
|
process.exit(0);
|
|
516
569
|
};
|
|
517
|
-
process.on("SIGINT", onSignal);
|
|
518
|
-
process.on("SIGTERM", onSignal);
|
|
570
|
+
process.on("SIGINT", () => void onSignal("SIGINT"));
|
|
571
|
+
process.on("SIGTERM", () => void onSignal("SIGTERM"));
|
|
519
572
|
}
|
|
520
573
|
async function tryOpenBrowser(url) {
|
|
521
574
|
const platform = process.platform;
|
|
@@ -829,7 +882,7 @@ async function doctor() {
|
|
|
829
882
|
}
|
|
830
883
|
|
|
831
884
|
// src/galaxy.ts
|
|
832
|
-
import { readFileSync as readFileSync2, writeFileSync } from "fs";
|
|
885
|
+
import { readFileSync as readFileSync2, writeFileSync as writeFileSync2 } from "fs";
|
|
833
886
|
var PORT2 = process.env.SOLIX_PORT ?? "4242";
|
|
834
887
|
var BASE2 = `http://127.0.0.1:${PORT2}`;
|
|
835
888
|
async function api2(path, init) {
|
|
@@ -851,7 +904,7 @@ async function exportGalaxyCmd(outFile, opts = {}) {
|
|
|
851
904
|
`/api/galaxy/export${qs ? `?${qs}` : ""}`
|
|
852
905
|
);
|
|
853
906
|
const text = JSON.stringify(manifest, null, 2) + "\n";
|
|
854
|
-
|
|
907
|
+
writeFileSync2(outFile, text);
|
|
855
908
|
console.log(`[solix] exported galaxy to ${outFile}`);
|
|
856
909
|
} catch (err) {
|
|
857
910
|
console.error(`[solix] export failed: ${String(err)}`);
|
|
@@ -941,7 +994,7 @@ import {
|
|
|
941
994
|
readdirSync as readdirSync2,
|
|
942
995
|
readFileSync as readFileSync3,
|
|
943
996
|
statSync as statSync2,
|
|
944
|
-
writeFileSync as
|
|
997
|
+
writeFileSync as writeFileSync3,
|
|
945
998
|
chmodSync
|
|
946
999
|
} from "fs";
|
|
947
1000
|
import { randomBytes } from "crypto";
|
|
@@ -1001,7 +1054,7 @@ function mergeHooks(existing, solix) {
|
|
|
1001
1054
|
function ensureToken() {
|
|
1002
1055
|
if (existsSync4(SOLIX_TOKEN_FILE)) return;
|
|
1003
1056
|
const token = randomBytes(24).toString("hex");
|
|
1004
|
-
|
|
1057
|
+
writeFileSync3(SOLIX_TOKEN_FILE, token, { mode: 384 });
|
|
1005
1058
|
try {
|
|
1006
1059
|
chmodSync(SOLIX_TOKEN_FILE, 384);
|
|
1007
1060
|
} catch {
|
|
@@ -1089,7 +1142,7 @@ function install(opts = {}) {
|
|
|
1089
1142
|
}
|
|
1090
1143
|
const merged = mergeHooks(existing.hooks, buildSolixHooks());
|
|
1091
1144
|
const next = { ...existing, hooks: merged };
|
|
1092
|
-
|
|
1145
|
+
writeFileSync3(CLAUDE_SETTINGS, JSON.stringify(next, null, 2) + "\n");
|
|
1093
1146
|
console.log(`[solix] merged hooks into ${CLAUDE_SETTINGS}`);
|
|
1094
1147
|
}
|
|
1095
1148
|
|
|
@@ -1098,7 +1151,7 @@ import {
|
|
|
1098
1151
|
appendFileSync,
|
|
1099
1152
|
existsSync as existsSync5,
|
|
1100
1153
|
readFileSync as readFileSync4,
|
|
1101
|
-
writeFileSync as
|
|
1154
|
+
writeFileSync as writeFileSync4
|
|
1102
1155
|
} from "fs";
|
|
1103
1156
|
import { homedir as homedir3 } from "os";
|
|
1104
1157
|
import { basename, join as join5 } from "path";
|
|
@@ -1163,7 +1216,7 @@ function uninstallShim() {
|
|
|
1163
1216
|
if (endIdx < 0) return false;
|
|
1164
1217
|
const before = current.slice(0, startIdx).replace(/\n+$/, "\n");
|
|
1165
1218
|
const after = current.slice(endIdx + BLOCK_END.length).replace(/^\n+/, "");
|
|
1166
|
-
|
|
1219
|
+
writeFileSync4(rcPath, before + after);
|
|
1167
1220
|
console.log(`[solix] shim removed from ${basename(rcPath)}.`);
|
|
1168
1221
|
return true;
|
|
1169
1222
|
}
|
|
@@ -5611,7 +5664,7 @@ var BANNER = `
|
|
|
5611
5664
|
async function start(opts = {}) {
|
|
5612
5665
|
const port = opts.port ?? Number(process.env.SOLIX_PORT ?? 4242);
|
|
5613
5666
|
console.log(BANNER);
|
|
5614
|
-
const handle = await createSolixServer({ port, version: "1.11.
|
|
5667
|
+
const handle = await createSolixServer({ port, version: "1.11.7" });
|
|
5615
5668
|
const url = `http://${handle.hostname}:${handle.port}`;
|
|
5616
5669
|
console.log(`[solix] server listening on ${url}`);
|
|
5617
5670
|
console.log(`[solix] events -> POST ${url}/events`);
|
|
@@ -5637,7 +5690,7 @@ async function start(opts = {}) {
|
|
|
5637
5690
|
}
|
|
5638
5691
|
|
|
5639
5692
|
// src/uninstall.ts
|
|
5640
|
-
import { copyFileSync as copyFileSync2, existsSync as existsSync13, readFileSync as readFileSync10, writeFileSync as
|
|
5693
|
+
import { copyFileSync as copyFileSync2, existsSync as existsSync13, readFileSync as readFileSync10, writeFileSync as writeFileSync5 } from "fs";
|
|
5641
5694
|
function uninstall() {
|
|
5642
5695
|
uninstallShim();
|
|
5643
5696
|
if (existsSync13(CLAUDE_BACKUP)) {
|
|
@@ -5660,13 +5713,13 @@ function uninstall() {
|
|
|
5660
5713
|
if (cur.hooks[evt].length === 0) delete cur.hooks[evt];
|
|
5661
5714
|
}
|
|
5662
5715
|
}
|
|
5663
|
-
|
|
5716
|
+
writeFileSync5(CLAUDE_SETTINGS, JSON.stringify(cur, null, 2) + "\n");
|
|
5664
5717
|
console.log(`[solix] removed Solix hooks from ${CLAUDE_SETTINGS}`);
|
|
5665
5718
|
}
|
|
5666
5719
|
|
|
5667
5720
|
// src/index.ts
|
|
5668
5721
|
var program = new Command();
|
|
5669
|
-
program.name("solix").description("Solix \u2014 a solar-system command center for Claude Code agents").version("1.11.
|
|
5722
|
+
program.name("solix").description("Solix \u2014 a solar-system command center for Claude Code agents").version("1.11.7");
|
|
5670
5723
|
program.command("start", { isDefault: true }).description("Start the Solix server and open the browser").option("-p, --port <port>", "port to listen on", (v) => parseInt(v, 10), 4242).option("--no-open", "do not open browser automatically").action(async (opts) => {
|
|
5671
5724
|
await start({ port: opts.port, noOpen: !opts.open });
|
|
5672
5725
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aj as r,aE as u,r as j,j as e}from"./index-
|
|
1
|
+
import{aj as r,aE as u,r as j,j as e}from"./index-CXWl4STS.js";function f({open:i,onClose:l}){const a=r(u),n=r(t=>t.enableAdvisor),d=r(t=>t.disableAdvisor),o=r(t=>t.pinAdvisor),c=r(t=>t.unpinAdvisor),x=r(t=>t.selectAdvisor);if(j.useEffect(()=>{if(!i)return;let t=!1;return fetch("/api/advisors").then(p=>p.ok?p.json():[]).then(p=>{if(t)return;const{applyMessage:v}=r.getState();for(const h of p)v({type:"advisor_upsert",advisor:h})}).catch(()=>{}),()=>{t=!0}},[i]),!i)return null;const s=a.filter(t=>t.enabled),b=a.filter(t=>!t.enabled);return e.jsxs("div",{className:"absolute inset-0 z-50 flex items-center justify-center",children:[e.jsx("div",{className:"absolute inset-0 bg-black/80 backdrop-blur-lg"}),e.jsxs("div",{className:"relative z-10 w-[620px] max-w-[94vw] max-h-[88vh] flex flex-col rounded-xl border border-solix-accent/40 bg-solix-panel shadow-2xl",children:[e.jsxs("div",{className:"px-5 py-4 border-b border-solix-border flex items-start justify-between",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs uppercase tracking-widest text-solix-accent",children:"crew"}),e.jsx("div",{className:"text-lg font-semibold mt-0.5",children:"Advisor roster"}),e.jsxs("div",{className:"text-xs text-slate-400 mt-1",children:[s.length," active · ",b.length," available. Enable an advisor to add it to the inner ring and the + Task picker."]})]}),e.jsx("button",{onClick:l,className:"text-slate-400 hover:text-slate-100","aria-label":"Close",children:"✕"})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto px-5 py-4 space-y-5",children:[e.jsx(m,{title:`Active crew · ${s.length}`,advisors:s,enableAdvisor:n,disableAdvisor:d,pinAdvisor:o,unpinAdvisor:c,selectAdvisor:x,onClose:l}),b.length>0&&e.jsx(m,{title:`Available (opt-in) · ${b.length}`,advisors:b,enableAdvisor:n,disableAdvisor:d,pinAdvisor:o,unpinAdvisor:c,selectAdvisor:x,onClose:l})]})]})]})}function m({title:i,advisors:l,enableAdvisor:a,disableAdvisor:n,pinAdvisor:d,unpinAdvisor:o,selectAdvisor:c,onClose:x}){return e.jsxs("div",{children:[e.jsx("div",{className:"text-[10px] uppercase tracking-widest text-slate-500 mb-2",children:i}),e.jsx("div",{className:"space-y-2",children:l.map(s=>e.jsx("div",{className:"rounded border border-solix-border bg-black/20 p-3",children:e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{style:{color:s.color},children:s.glyph}),e.jsx("span",{className:"font-semibold text-slate-100",children:s.codename}),e.jsxs("span",{className:"text-[10px] uppercase tracking-wide text-slate-500",children:[s.name," · ",String(s.defaultModel)]}),s.pinned&&e.jsx("span",{className:"text-[9px] uppercase tracking-wider text-amber-300 border border-amber-300/40 rounded px-1 py-0.5",children:"pinned"})]}),e.jsx("div",{className:"mt-1 text-xs text-slate-400 leading-snug",children:s.description})]}),e.jsxs("div",{className:"flex flex-col gap-1.5 shrink-0",children:[s.enabled?e.jsx("button",{onClick:()=>n(s.id),className:"px-2.5 py-1 rounded border border-solix-border text-slate-400 text-xs hover:text-white hover:bg-solix-border/30",children:"Disable"}):e.jsx("button",{onClick:()=>a(s.id),className:"px-2.5 py-1 rounded bg-cyan-500/20 border border-cyan-400/60 text-cyan-100 text-xs hover:bg-cyan-500/30",children:"+ Add"}),s.enabled&&(s.pinned?e.jsx("button",{onClick:()=>o(s.id),className:"px-2.5 py-1 rounded bg-amber-500/15 border border-amber-400/50 text-amber-200 text-xs hover:bg-amber-500/25",children:"Unpin"}):e.jsx("button",{onClick:()=>d(s.id),className:"px-2.5 py-1 rounded bg-amber-500/10 border border-amber-400/30 text-amber-200/80 text-xs hover:bg-amber-500/20",title:"Spawn an always-on session",children:"Pin"})),e.jsx("button",{onClick:()=>{c(s.id),x()},className:"px-2.5 py-1 rounded border border-solix-border text-slate-300 text-xs hover:text-white hover:bg-solix-border/30",children:"Details"})]})]})},s.id))})]})}export{f as CrewPanel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as c,aj as $,j as e}from"./index-BLLO-8aM.js";function H(s,i){const a=new Map(s.advisors.map(t=>[t.role,t])),n=new Map(i.advisors.map(t=>[t.role,t])),h=[...n.keys()].filter(t=>!a.has(t)),v=[...a.keys()].filter(t=>!n.has(t)),j=[...n.keys()].filter(t=>a.has(t)).map(t=>({role:t,from:a.get(t).pinned,to:n.get(t).pinned})).filter(t=>t.from!==t.to),x=new Set(s.skills.map(t=>t.id)),p=new Set(i.skills.map(t=>t.id)),r=[...p].filter(t=>!x.has(t)),b=[...x].filter(t=>!p.has(t)),d=new Set(s.projects.map(t=>t.name)),f=new Set(i.projects.map(t=>t.name)),u=[...f].filter(t=>!d.has(t)),g=[...d].filter(t=>!f.has(t));return{advisors:{added:h.sort(),removed:v.sort(),pinChanged:j.sort((t,S)=>t.role.localeCompare(S.role))},skills:{added:r.sort(),removed:b.sort()},projects:{added:u.sort(),removed:g.sort()}}}function W({open:s,onClose:i}){const[a,n]=c.useState("share"),[h,v]=c.useState("My Galaxy"),[j,x]=c.useState(""),[p,r]=c.useState(""),[b,d]=c.useState(!1),[f,u]=c.useState(null),[g,t]=c.useState(null),S=$(o=>Object.keys(o.sessions).length),I=$(o=>Object.values(o.advisors).filter(y=>y.enabled).length),l=$(o=>Object.keys(o.skills).length);if(!s)return null;const m=async()=>{d(!0),u(null);try{const o=new URLSearchParams({name:h}),y=await fetch(`/api/galaxy/export?${o.toString()}`);if(!y.ok)throw new Error(`HTTP ${y.status}`);const N=await y.json(),C=new Blob([JSON.stringify(N,null,2)],{type:"application/json"}),w=URL.createObjectURL(C),k=document.createElement("a");k.href=w,k.download=`${h.toLowerCase().replace(/\s+/g,"-")}.galaxy.json`,k.click(),URL.revokeObjectURL(w),u("Downloaded.")}catch(o){u(`Export failed: ${String(o)}`)}finally{d(!1)}},U=async o=>{d(!0),u(null);try{const N=await(await fetch("/api/galaxy/import",{method:"POST",headers:{"Content-Type":"application/json"},body:o})).json();N.ok?(u(`Imported: ${N.advisorsEnabled} enabled, ${N.advisorsDisabled} disabled, ${N.projectsHinted} projects.`),x(""),r("")):u(`Import failed: ${N.error??"unknown"}`)}catch(y){u(`Import failed: ${String(y)}`)}finally{d(!1)}},E=async(o,y,N)=>{u(null);let C,w=N;if(w)try{const k=await fetch("/api/galaxy/export?preview=1");if(k.ok){const B=await k.json();C=H(B,w)}}catch{}t({body:o,label:y,diff:C,manifest:w})},O=()=>{let o;try{o=JSON.parse(j)}catch{u("Could not parse JSON.");return}E(j,"pasted manifest",o)},D=()=>{E(JSON.stringify({url:p}),`URL: ${p}`,void 0)},_=()=>{if(!g)return;const o=g.body;t(null),U(o)},J=()=>{t(null)};return e.jsxs("div",{className:"absolute top-16 right-0 bottom-0 w-full sm:w-[480px] bg-solix-panel border-l border-solix-border backdrop-blur-md flex flex-col z-30",children:[e.jsxs("div",{className:"px-4 py-3 border-b border-solix-border flex items-start justify-between",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs uppercase tracking-wide text-solix-accent",children:"Galaxy"}),e.jsx("div",{className:"text-lg font-semibold",children:"Share your space"}),e.jsxs("div",{className:"text-xs text-slate-400 mt-0.5",children:[I," advisors · ",l," skills ·"," ",S," sessions"]})]}),e.jsx("button",{onClick:i,className:"text-slate-400 hover:text-slate-100",children:"✕"})]}),e.jsxs("div",{className:"flex border-b border-solix-border text-xs",children:[e.jsx(P,{active:a==="share",onClick:()=>n("share"),children:"Sharing"}),e.jsx(P,{active:a==="versions",onClick:()=>n("versions"),children:"Versions"}),e.jsx(P,{active:a==="audit",onClick:()=>n("audit"),children:"Audit"})]}),a==="audit"?e.jsx(G,{open:s}):a==="versions"?e.jsx(V,{open:s}):e.jsxs("div",{className:"flex-1 overflow-y-auto p-4 space-y-6",children:[e.jsxs("section",{children:[e.jsx("div",{className:"text-xs uppercase tracking-wide text-slate-400 mb-2",children:"Export"}),e.jsx("input",{value:h,onChange:o=>v(o.target.value),placeholder:"Galaxy name",className:"w-full text-sm bg-black/40 border border-solix-border rounded p-2 text-slate-100 placeholder-slate-600 focus:outline-none focus:border-solix-accent"}),e.jsx("button",{onClick:()=>void m(),disabled:b,className:"mt-2 w-full py-2 rounded bg-solix-accent/20 border border-solix-accent text-solix-accent text-sm hover:bg-solix-accent/30 disabled:opacity-50",children:"Download manifest (.galaxy.json)"})]}),e.jsxs("section",{children:[e.jsx("div",{className:"text-xs uppercase tracking-wide text-slate-400 mb-2",children:"Import from URL"}),e.jsx("input",{value:p,onChange:o=>r(o.target.value),placeholder:"https://… or local server URL",className:"w-full text-sm bg-black/40 border border-solix-border rounded p-2 text-slate-100 placeholder-slate-600 focus:outline-none focus:border-solix-accent"}),e.jsx("button",{onClick:D,disabled:b||!p.trim(),className:"mt-2 w-full py-2 rounded bg-cyan-500/15 border border-cyan-400/40 text-cyan-200 text-sm hover:bg-cyan-500/25 disabled:opacity-50",children:"Pull and import"})]}),e.jsxs("section",{children:[e.jsx("div",{className:"text-xs uppercase tracking-wide text-slate-400 mb-2",children:"Import from JSON"}),e.jsx("textarea",{value:j,onChange:o=>x(o.target.value),placeholder:"Paste a galaxy manifest JSON here…",rows:10,className:"w-full text-xs bg-black/40 border border-solix-border rounded p-2 text-slate-100 placeholder-slate-600 focus:outline-none focus:border-solix-accent font-mono resize-none"}),e.jsx("button",{onClick:O,disabled:b||!j.trim(),className:"mt-2 w-full py-2 rounded bg-cyan-500/15 border border-cyan-400/40 text-cyan-200 text-sm hover:bg-cyan-500/25 disabled:opacity-50",children:"Apply manifest"})]}),g&&e.jsx(K,{label:g.label,diff:g.diff,manifest:g.manifest,busy:b,onConfirm:_,onCancel:J}),f&&e.jsx("div",{className:"text-xs text-slate-300 border border-solix-border rounded p-2 bg-black/30",children:f})]}),e.jsx("div",{className:"px-4 py-3 border-t border-solix-border text-xs text-slate-500",children:a==="audit"?"Append-only history. Read-only.":a==="versions"?"Each export snapshots a version. Identical re-exports are deduped.":"Imports never spawn pinned advisors or run shell commands. You're in control."})]})}function P({active:s,onClick:i,children:a}){return e.jsx("button",{onClick:i,className:`flex-1 px-3 py-2 ${s?"text-solix-accent border-b-2 border-solix-accent":"text-slate-400 hover:text-slate-200 border-b-2 border-transparent"}`,children:a})}const F=["permission_approved","permission_denied","advisor_invoked","advisor_pinned","advisor_unpinned","galaxy_imported"];function G({open:s}){const[i,a]=c.useState([]),[n,h]=c.useState("all"),[v,j]=c.useState(!1),[x,p]=c.useState(null);return c.useEffect(()=>{if(!s)return;let r=!1;j(!0),p(null);const b=`/api/audit${n==="all"?"":`?kind=${n}`}`;return fetch(b).then(d=>d.ok?d.json():Promise.reject(new Error(`HTTP ${d.status}`))).then(d=>{r||a(d)}).catch(d=>{r||p(d.message)}).finally(()=>{r||j(!1)}),()=>{r=!0}},[s,n]),e.jsxs("div",{className:"flex-1 overflow-y-auto p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[e.jsx(T,{label:"all",active:n==="all",onClick:()=>h("all")}),F.map(r=>e.jsx(T,{label:A(r),active:n===r,onClick:()=>h(r)},r))]}),v&&e.jsx("div",{className:"text-xs text-slate-500 italic",children:"Loading…"}),x&&e.jsxs("div",{className:"text-xs text-solix-danger italic",children:["Could not load audit events: ",x]}),!v&&i.length===0&&e.jsx("div",{className:"text-xs text-slate-500 italic",children:"No audit events yet. Approve a permission or invoke an advisor and they'll start appearing here."}),e.jsx("ul",{className:"space-y-1.5",children:i.map(r=>e.jsxs("li",{className:"rounded border border-solix-border bg-black/20 p-2",children:[e.jsxs("div",{className:"flex items-center justify-between text-[10px]",children:[e.jsx("span",{className:`uppercase tracking-wide ${M(r.kind)}`,children:A(r.kind)}),e.jsx("span",{className:"text-slate-500 font-mono",children:new Date(r.ts).toLocaleString("en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,month:"short",day:"numeric"})})]}),e.jsx("div",{className:"text-[12px] text-slate-100 mt-1 leading-snug",children:r.summary})]},r.id))})]})}function T({label:s,active:i,onClick:a}){return e.jsx("button",{onClick:a,className:`text-[10px] px-2 py-0.5 rounded border ${i?"bg-solix-accent/15 border-solix-accent text-solix-accent":"border-solix-border text-slate-400 hover:text-slate-200"}`,children:s})}function A(s){return s==="all"?"all":s.replace(/_/g," ")}function M(s){return s==="permission_approved"?"text-solix-ok":s==="permission_denied"?"text-solix-danger":s==="galaxy_imported"?"text-cyan-300":s.startsWith("advisor_")?"text-amber-300":"text-slate-300"}function V({open:s}){const[i,a]=c.useState([]),[n,h]=c.useState(!1),[v,j]=c.useState(null),[x,p]=c.useState(null),[r,b]=c.useState(null),[d,f]=c.useState(null),[u,g]=c.useState(!1);c.useEffect(()=>{if(!s)return;let l=!1;return h(!0),fetch("/api/galaxy/versions").then(m=>m.ok?m.json():Promise.reject(new Error(`HTTP ${m.status}`))).then(m=>{l||a(m)}).catch(m=>{l||j(m.message)}).finally(()=>{l||h(!1)}),()=>{l=!0}},[s]),c.useEffect(()=>{if(!x||!r){f(null);return}if(x===r){f(null);return}let l=!1;return g(!0),fetch(`/api/galaxy/diff?from=${x}&to=${r}`).then(m=>m.ok?m.json():Promise.reject(new Error(`HTTP ${m.status}`))).then(m=>{l||f(m)}).catch(()=>{l||f(null)}).finally(()=>{l||g(!1)}),()=>{l=!0}},[x,r]);const t=l=>{x?!r&&l!==x?b(l):(p(l),b(null),f(null)):p(l)},S=()=>{p(null),b(null),f(null)},I=l=>l.id===x?"from":l.id===r?"to":null;return e.jsxs("div",{className:"flex-1 overflow-y-auto p-4 space-y-3",children:[(x||r)&&e.jsxs("div",{className:"flex items-center justify-between text-[11px] text-slate-400",children:[e.jsxs("div",{children:[x&&!r&&"Pick a second version to diff…",x&&r&&u&&"Computing diff…",x&&r&&!u&&d&&e.jsxs(e.Fragment,{children:["v",d.from.ordinal," → v",d.to.ordinal]})]}),e.jsx("button",{onClick:S,className:"text-slate-500 hover:text-slate-100",children:"clear"})]}),d&&e.jsx(R,{diff:d.diff}),n&&e.jsx("div",{className:"text-xs text-slate-500 italic",children:"Loading…"}),v&&e.jsxs("div",{className:"text-xs text-solix-danger italic",children:["Could not load versions: ",v]}),!n&&i.length===0&&e.jsx("div",{className:"text-xs text-slate-500 italic",children:'No versions yet. Hit "Download manifest" on the Sharing tab to create one.'}),e.jsx("ul",{className:"space-y-1.5",children:i.map(l=>{const m=I(l);return e.jsx("li",{children:e.jsxs("button",{onClick:()=>t(l.id),className:`w-full text-left rounded border p-2 ${m==="from"?"border-solix-accent bg-solix-accent/10":m==="to"?"border-cyan-400 bg-cyan-400/10":"border-solix-border bg-black/20 hover:bg-solix-border/30"}`,children:[e.jsxs("div",{className:"flex items-center justify-between text-[10px]",children:[e.jsxs("span",{className:"uppercase tracking-wide text-slate-400",children:["v",l.ordinal," · ",l.name]}),e.jsx("span",{className:"text-slate-500 font-mono",children:new Date(l.ts).toLocaleString("en-US",{hour:"2-digit",minute:"2-digit",month:"short",day:"numeric"})})]}),e.jsxs("div",{className:"text-[11px] text-slate-300 mt-1",children:[l.manifest.advisors.length," advisors ·"," ",l.manifest.skills.length," skills ·"," ",l.manifest.projects.length," projects",m&&e.jsxs("span",{className:"ml-2 text-[9px] uppercase tracking-wider text-slate-400",children:["[",m,"]"]})]})]})},l.id)})})]})}function R({diff:s}){return s.advisors.added.length===0&&s.advisors.removed.length===0&&s.advisors.pinChanged.length===0&&s.skills.added.length===0&&s.skills.removed.length===0&&s.projects.added.length===0&&s.projects.removed.length===0?e.jsx("div",{className:"text-xs text-slate-500 italic border border-solix-border rounded p-2 bg-black/20",children:"No changes between these versions."}):e.jsxs("div",{className:"rounded border border-solix-border bg-black/30 p-2 space-y-2 text-xs",children:[e.jsx(L,{label:"Advisors",added:s.advisors.added,removed:s.advisors.removed}),s.advisors.pinChanged.length>0&&e.jsxs("div",{children:[e.jsx("div",{className:"text-[10px] uppercase tracking-wide text-slate-500",children:"Advisor pin changes"}),e.jsx("ul",{className:"mt-1 space-y-0.5",children:s.advisors.pinChanged.map(a=>e.jsxs("li",{className:"text-slate-200",children:[e.jsx("span",{className:"font-mono",children:a.role}),":"," ",a.from?"pinned":"unpinned"," →"," ",a.to?"pinned":"unpinned"]},a.role))})]}),e.jsx(L,{label:"Skills",added:s.skills.added,removed:s.skills.removed}),e.jsx(L,{label:"Projects",added:s.projects.added,removed:s.projects.removed})]})}function K({label:s,diff:i,manifest:a,busy:n,onConfirm:h,onCancel:v}){return e.jsxs("div",{className:"rounded border border-amber-300/60 bg-amber-500/10 p-3 space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("div",{className:"text-[11px] uppercase tracking-wide text-amber-200",children:"confirm import"}),e.jsx("div",{className:"text-[10px] text-slate-400 font-mono truncate max-w-[55%]",children:s})]}),a&&e.jsxs("div",{className:"text-xs text-slate-200",children:[e.jsx("span",{className:"font-semibold",children:a.name}),a.author&&e.jsxs("span",{className:"text-slate-400",children:[" · by ",a.author]})]}),i?e.jsx(R,{diff:i}):a?e.jsx("div",{className:"text-xs text-slate-400 italic",children:"Could not compute a diff against the current galaxy. Apply will still proceed if you confirm."}):e.jsx("div",{className:"text-xs text-slate-300",children:"Solix will fetch the manifest from this URL and apply it. Diff preview is only available for pasted JSON."}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("button",{onClick:h,disabled:n,className:"flex-1 py-1.5 rounded bg-amber-500/20 border border-amber-300 text-amber-100 text-xs hover:bg-amber-500/30 disabled:opacity-50",children:"Apply"}),e.jsx("button",{onClick:v,disabled:n,className:"px-3 py-1.5 rounded border border-solix-border text-slate-300 text-xs hover:text-white disabled:opacity-50",children:"Cancel"})]})]})}function L({label:s,added:i,removed:a}){return i.length===0&&a.length===0?null:e.jsxs("div",{children:[e.jsx("div",{className:"text-[10px] uppercase tracking-wide text-slate-500",children:s}),e.jsxs("ul",{className:"mt-1 space-y-0.5",children:[i.map(n=>e.jsxs("li",{className:"text-solix-ok",children:["+ ",n]},`+${n}`)),a.map(n=>e.jsxs("li",{className:"text-solix-danger",children:["− ",n]},`-${n}`))]})]})}export{W as GalaxyPanel};
|
|
1
|
+
import{r as c,aj as $,j as e}from"./index-CXWl4STS.js";function H(s,i){const a=new Map(s.advisors.map(t=>[t.role,t])),n=new Map(i.advisors.map(t=>[t.role,t])),h=[...n.keys()].filter(t=>!a.has(t)),v=[...a.keys()].filter(t=>!n.has(t)),j=[...n.keys()].filter(t=>a.has(t)).map(t=>({role:t,from:a.get(t).pinned,to:n.get(t).pinned})).filter(t=>t.from!==t.to),x=new Set(s.skills.map(t=>t.id)),p=new Set(i.skills.map(t=>t.id)),r=[...p].filter(t=>!x.has(t)),b=[...x].filter(t=>!p.has(t)),d=new Set(s.projects.map(t=>t.name)),f=new Set(i.projects.map(t=>t.name)),u=[...f].filter(t=>!d.has(t)),g=[...d].filter(t=>!f.has(t));return{advisors:{added:h.sort(),removed:v.sort(),pinChanged:j.sort((t,S)=>t.role.localeCompare(S.role))},skills:{added:r.sort(),removed:b.sort()},projects:{added:u.sort(),removed:g.sort()}}}function W({open:s,onClose:i}){const[a,n]=c.useState("share"),[h,v]=c.useState("My Galaxy"),[j,x]=c.useState(""),[p,r]=c.useState(""),[b,d]=c.useState(!1),[f,u]=c.useState(null),[g,t]=c.useState(null),S=$(o=>Object.keys(o.sessions).length),I=$(o=>Object.values(o.advisors).filter(y=>y.enabled).length),l=$(o=>Object.keys(o.skills).length);if(!s)return null;const m=async()=>{d(!0),u(null);try{const o=new URLSearchParams({name:h}),y=await fetch(`/api/galaxy/export?${o.toString()}`);if(!y.ok)throw new Error(`HTTP ${y.status}`);const N=await y.json(),C=new Blob([JSON.stringify(N,null,2)],{type:"application/json"}),w=URL.createObjectURL(C),k=document.createElement("a");k.href=w,k.download=`${h.toLowerCase().replace(/\s+/g,"-")}.galaxy.json`,k.click(),URL.revokeObjectURL(w),u("Downloaded.")}catch(o){u(`Export failed: ${String(o)}`)}finally{d(!1)}},U=async o=>{d(!0),u(null);try{const N=await(await fetch("/api/galaxy/import",{method:"POST",headers:{"Content-Type":"application/json"},body:o})).json();N.ok?(u(`Imported: ${N.advisorsEnabled} enabled, ${N.advisorsDisabled} disabled, ${N.projectsHinted} projects.`),x(""),r("")):u(`Import failed: ${N.error??"unknown"}`)}catch(y){u(`Import failed: ${String(y)}`)}finally{d(!1)}},E=async(o,y,N)=>{u(null);let C,w=N;if(w)try{const k=await fetch("/api/galaxy/export?preview=1");if(k.ok){const B=await k.json();C=H(B,w)}}catch{}t({body:o,label:y,diff:C,manifest:w})},O=()=>{let o;try{o=JSON.parse(j)}catch{u("Could not parse JSON.");return}E(j,"pasted manifest",o)},D=()=>{E(JSON.stringify({url:p}),`URL: ${p}`,void 0)},_=()=>{if(!g)return;const o=g.body;t(null),U(o)},J=()=>{t(null)};return e.jsxs("div",{className:"absolute top-16 right-0 bottom-0 w-full sm:w-[480px] bg-solix-panel border-l border-solix-border backdrop-blur-md flex flex-col z-30",children:[e.jsxs("div",{className:"px-4 py-3 border-b border-solix-border flex items-start justify-between",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs uppercase tracking-wide text-solix-accent",children:"Galaxy"}),e.jsx("div",{className:"text-lg font-semibold",children:"Share your space"}),e.jsxs("div",{className:"text-xs text-slate-400 mt-0.5",children:[I," advisors · ",l," skills ·"," ",S," sessions"]})]}),e.jsx("button",{onClick:i,className:"text-slate-400 hover:text-slate-100",children:"✕"})]}),e.jsxs("div",{className:"flex border-b border-solix-border text-xs",children:[e.jsx(P,{active:a==="share",onClick:()=>n("share"),children:"Sharing"}),e.jsx(P,{active:a==="versions",onClick:()=>n("versions"),children:"Versions"}),e.jsx(P,{active:a==="audit",onClick:()=>n("audit"),children:"Audit"})]}),a==="audit"?e.jsx(G,{open:s}):a==="versions"?e.jsx(V,{open:s}):e.jsxs("div",{className:"flex-1 overflow-y-auto p-4 space-y-6",children:[e.jsxs("section",{children:[e.jsx("div",{className:"text-xs uppercase tracking-wide text-slate-400 mb-2",children:"Export"}),e.jsx("input",{value:h,onChange:o=>v(o.target.value),placeholder:"Galaxy name",className:"w-full text-sm bg-black/40 border border-solix-border rounded p-2 text-slate-100 placeholder-slate-600 focus:outline-none focus:border-solix-accent"}),e.jsx("button",{onClick:()=>void m(),disabled:b,className:"mt-2 w-full py-2 rounded bg-solix-accent/20 border border-solix-accent text-solix-accent text-sm hover:bg-solix-accent/30 disabled:opacity-50",children:"Download manifest (.galaxy.json)"})]}),e.jsxs("section",{children:[e.jsx("div",{className:"text-xs uppercase tracking-wide text-slate-400 mb-2",children:"Import from URL"}),e.jsx("input",{value:p,onChange:o=>r(o.target.value),placeholder:"https://… or local server URL",className:"w-full text-sm bg-black/40 border border-solix-border rounded p-2 text-slate-100 placeholder-slate-600 focus:outline-none focus:border-solix-accent"}),e.jsx("button",{onClick:D,disabled:b||!p.trim(),className:"mt-2 w-full py-2 rounded bg-cyan-500/15 border border-cyan-400/40 text-cyan-200 text-sm hover:bg-cyan-500/25 disabled:opacity-50",children:"Pull and import"})]}),e.jsxs("section",{children:[e.jsx("div",{className:"text-xs uppercase tracking-wide text-slate-400 mb-2",children:"Import from JSON"}),e.jsx("textarea",{value:j,onChange:o=>x(o.target.value),placeholder:"Paste a galaxy manifest JSON here…",rows:10,className:"w-full text-xs bg-black/40 border border-solix-border rounded p-2 text-slate-100 placeholder-slate-600 focus:outline-none focus:border-solix-accent font-mono resize-none"}),e.jsx("button",{onClick:O,disabled:b||!j.trim(),className:"mt-2 w-full py-2 rounded bg-cyan-500/15 border border-cyan-400/40 text-cyan-200 text-sm hover:bg-cyan-500/25 disabled:opacity-50",children:"Apply manifest"})]}),g&&e.jsx(K,{label:g.label,diff:g.diff,manifest:g.manifest,busy:b,onConfirm:_,onCancel:J}),f&&e.jsx("div",{className:"text-xs text-slate-300 border border-solix-border rounded p-2 bg-black/30",children:f})]}),e.jsx("div",{className:"px-4 py-3 border-t border-solix-border text-xs text-slate-500",children:a==="audit"?"Append-only history. Read-only.":a==="versions"?"Each export snapshots a version. Identical re-exports are deduped.":"Imports never spawn pinned advisors or run shell commands. You're in control."})]})}function P({active:s,onClick:i,children:a}){return e.jsx("button",{onClick:i,className:`flex-1 px-3 py-2 ${s?"text-solix-accent border-b-2 border-solix-accent":"text-slate-400 hover:text-slate-200 border-b-2 border-transparent"}`,children:a})}const F=["permission_approved","permission_denied","advisor_invoked","advisor_pinned","advisor_unpinned","galaxy_imported"];function G({open:s}){const[i,a]=c.useState([]),[n,h]=c.useState("all"),[v,j]=c.useState(!1),[x,p]=c.useState(null);return c.useEffect(()=>{if(!s)return;let r=!1;j(!0),p(null);const b=`/api/audit${n==="all"?"":`?kind=${n}`}`;return fetch(b).then(d=>d.ok?d.json():Promise.reject(new Error(`HTTP ${d.status}`))).then(d=>{r||a(d)}).catch(d=>{r||p(d.message)}).finally(()=>{r||j(!1)}),()=>{r=!0}},[s,n]),e.jsxs("div",{className:"flex-1 overflow-y-auto p-4 space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-1.5 flex-wrap",children:[e.jsx(T,{label:"all",active:n==="all",onClick:()=>h("all")}),F.map(r=>e.jsx(T,{label:A(r),active:n===r,onClick:()=>h(r)},r))]}),v&&e.jsx("div",{className:"text-xs text-slate-500 italic",children:"Loading…"}),x&&e.jsxs("div",{className:"text-xs text-solix-danger italic",children:["Could not load audit events: ",x]}),!v&&i.length===0&&e.jsx("div",{className:"text-xs text-slate-500 italic",children:"No audit events yet. Approve a permission or invoke an advisor and they'll start appearing here."}),e.jsx("ul",{className:"space-y-1.5",children:i.map(r=>e.jsxs("li",{className:"rounded border border-solix-border bg-black/20 p-2",children:[e.jsxs("div",{className:"flex items-center justify-between text-[10px]",children:[e.jsx("span",{className:`uppercase tracking-wide ${M(r.kind)}`,children:A(r.kind)}),e.jsx("span",{className:"text-slate-500 font-mono",children:new Date(r.ts).toLocaleString("en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,month:"short",day:"numeric"})})]}),e.jsx("div",{className:"text-[12px] text-slate-100 mt-1 leading-snug",children:r.summary})]},r.id))})]})}function T({label:s,active:i,onClick:a}){return e.jsx("button",{onClick:a,className:`text-[10px] px-2 py-0.5 rounded border ${i?"bg-solix-accent/15 border-solix-accent text-solix-accent":"border-solix-border text-slate-400 hover:text-slate-200"}`,children:s})}function A(s){return s==="all"?"all":s.replace(/_/g," ")}function M(s){return s==="permission_approved"?"text-solix-ok":s==="permission_denied"?"text-solix-danger":s==="galaxy_imported"?"text-cyan-300":s.startsWith("advisor_")?"text-amber-300":"text-slate-300"}function V({open:s}){const[i,a]=c.useState([]),[n,h]=c.useState(!1),[v,j]=c.useState(null),[x,p]=c.useState(null),[r,b]=c.useState(null),[d,f]=c.useState(null),[u,g]=c.useState(!1);c.useEffect(()=>{if(!s)return;let l=!1;return h(!0),fetch("/api/galaxy/versions").then(m=>m.ok?m.json():Promise.reject(new Error(`HTTP ${m.status}`))).then(m=>{l||a(m)}).catch(m=>{l||j(m.message)}).finally(()=>{l||h(!1)}),()=>{l=!0}},[s]),c.useEffect(()=>{if(!x||!r){f(null);return}if(x===r){f(null);return}let l=!1;return g(!0),fetch(`/api/galaxy/diff?from=${x}&to=${r}`).then(m=>m.ok?m.json():Promise.reject(new Error(`HTTP ${m.status}`))).then(m=>{l||f(m)}).catch(()=>{l||f(null)}).finally(()=>{l||g(!1)}),()=>{l=!0}},[x,r]);const t=l=>{x?!r&&l!==x?b(l):(p(l),b(null),f(null)):p(l)},S=()=>{p(null),b(null),f(null)},I=l=>l.id===x?"from":l.id===r?"to":null;return e.jsxs("div",{className:"flex-1 overflow-y-auto p-4 space-y-3",children:[(x||r)&&e.jsxs("div",{className:"flex items-center justify-between text-[11px] text-slate-400",children:[e.jsxs("div",{children:[x&&!r&&"Pick a second version to diff…",x&&r&&u&&"Computing diff…",x&&r&&!u&&d&&e.jsxs(e.Fragment,{children:["v",d.from.ordinal," → v",d.to.ordinal]})]}),e.jsx("button",{onClick:S,className:"text-slate-500 hover:text-slate-100",children:"clear"})]}),d&&e.jsx(R,{diff:d.diff}),n&&e.jsx("div",{className:"text-xs text-slate-500 italic",children:"Loading…"}),v&&e.jsxs("div",{className:"text-xs text-solix-danger italic",children:["Could not load versions: ",v]}),!n&&i.length===0&&e.jsx("div",{className:"text-xs text-slate-500 italic",children:'No versions yet. Hit "Download manifest" on the Sharing tab to create one.'}),e.jsx("ul",{className:"space-y-1.5",children:i.map(l=>{const m=I(l);return e.jsx("li",{children:e.jsxs("button",{onClick:()=>t(l.id),className:`w-full text-left rounded border p-2 ${m==="from"?"border-solix-accent bg-solix-accent/10":m==="to"?"border-cyan-400 bg-cyan-400/10":"border-solix-border bg-black/20 hover:bg-solix-border/30"}`,children:[e.jsxs("div",{className:"flex items-center justify-between text-[10px]",children:[e.jsxs("span",{className:"uppercase tracking-wide text-slate-400",children:["v",l.ordinal," · ",l.name]}),e.jsx("span",{className:"text-slate-500 font-mono",children:new Date(l.ts).toLocaleString("en-US",{hour:"2-digit",minute:"2-digit",month:"short",day:"numeric"})})]}),e.jsxs("div",{className:"text-[11px] text-slate-300 mt-1",children:[l.manifest.advisors.length," advisors ·"," ",l.manifest.skills.length," skills ·"," ",l.manifest.projects.length," projects",m&&e.jsxs("span",{className:"ml-2 text-[9px] uppercase tracking-wider text-slate-400",children:["[",m,"]"]})]})]})},l.id)})})]})}function R({diff:s}){return s.advisors.added.length===0&&s.advisors.removed.length===0&&s.advisors.pinChanged.length===0&&s.skills.added.length===0&&s.skills.removed.length===0&&s.projects.added.length===0&&s.projects.removed.length===0?e.jsx("div",{className:"text-xs text-slate-500 italic border border-solix-border rounded p-2 bg-black/20",children:"No changes between these versions."}):e.jsxs("div",{className:"rounded border border-solix-border bg-black/30 p-2 space-y-2 text-xs",children:[e.jsx(L,{label:"Advisors",added:s.advisors.added,removed:s.advisors.removed}),s.advisors.pinChanged.length>0&&e.jsxs("div",{children:[e.jsx("div",{className:"text-[10px] uppercase tracking-wide text-slate-500",children:"Advisor pin changes"}),e.jsx("ul",{className:"mt-1 space-y-0.5",children:s.advisors.pinChanged.map(a=>e.jsxs("li",{className:"text-slate-200",children:[e.jsx("span",{className:"font-mono",children:a.role}),":"," ",a.from?"pinned":"unpinned"," →"," ",a.to?"pinned":"unpinned"]},a.role))})]}),e.jsx(L,{label:"Skills",added:s.skills.added,removed:s.skills.removed}),e.jsx(L,{label:"Projects",added:s.projects.added,removed:s.projects.removed})]})}function K({label:s,diff:i,manifest:a,busy:n,onConfirm:h,onCancel:v}){return e.jsxs("div",{className:"rounded border border-amber-300/60 bg-amber-500/10 p-3 space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("div",{className:"text-[11px] uppercase tracking-wide text-amber-200",children:"confirm import"}),e.jsx("div",{className:"text-[10px] text-slate-400 font-mono truncate max-w-[55%]",children:s})]}),a&&e.jsxs("div",{className:"text-xs text-slate-200",children:[e.jsx("span",{className:"font-semibold",children:a.name}),a.author&&e.jsxs("span",{className:"text-slate-400",children:[" · by ",a.author]})]}),i?e.jsx(R,{diff:i}):a?e.jsx("div",{className:"text-xs text-slate-400 italic",children:"Could not compute a diff against the current galaxy. Apply will still proceed if you confirm."}):e.jsx("div",{className:"text-xs text-slate-300",children:"Solix will fetch the manifest from this URL and apply it. Diff preview is only available for pasted JSON."}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("button",{onClick:h,disabled:n,className:"flex-1 py-1.5 rounded bg-amber-500/20 border border-amber-300 text-amber-100 text-xs hover:bg-amber-500/30 disabled:opacity-50",children:"Apply"}),e.jsx("button",{onClick:v,disabled:n,className:"px-3 py-1.5 rounded border border-solix-border text-slate-300 text-xs hover:text-white disabled:opacity-50",children:"Cancel"})]})]})}function L({label:s,added:i,removed:a}){return i.length===0&&a.length===0?null:e.jsxs("div",{children:[e.jsx("div",{className:"text-[10px] uppercase tracking-wide text-slate-500",children:s}),e.jsxs("ul",{className:"mt-1 space-y-0.5",children:[i.map(n=>e.jsxs("li",{className:"text-solix-ok",children:["+ ",n]},`+${n}`)),a.map(n=>e.jsxs("li",{className:"text-solix-danger",children:["− ",n]},`-${n}`))]})]})}export{W as GalaxyPanel};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as E,g as Yf,j as S,R as Xf,O as Wn,P as Vn,S as $o,a as Bo,V as Kf,b as Zf,B as qf,N as Vu,A as Qu,W as Jf,C as $f,c as ve,d as Te,e as ed,L as No,f as td,U as An,T as nd,h as rd,D as Cn,i as Ss,M as pr,k as hr,l as el,Q as tl,m as id,n as sd,I as od,F as su,o as nl,p as xr,q as ld,s as dl,t as Yu,u as Ht,v as ou,w as lu,x as Xu,y as zn,z as ad,E as ud,G as tn,H as st,J as fs,K as Qn,X as ri,Y as it,Z as cd,_ as fd,$ as dd,a0 as Ku,a1 as Ft,a2 as ds,a3 as pd,a4 as ps,a5 as Tr,a6 as pl,a7 as Zu,a8 as qu,a9 as wr,aa as hd,ab as Kn,ac as _e,ad as Ju,ae as md,af as $u,ag as hs,ah as rl,ai as vd,aj as se,ak as ms,al as il,am as xs,an as sl,ao as ec,ap as gd,aq as yd,ar as Sd,as as xd,at as wd,au as Ed,av as Md,aw as _d,ax as Td,ay as Rd,az as hl,aA as Pd,aB as Cd,aC as Ad,aD as zd}from"./index-
|
|
1
|
+
import{r as E,g as Yf,j as S,R as Xf,O as Wn,P as Vn,S as $o,a as Bo,V as Kf,b as Zf,B as qf,N as Vu,A as Qu,W as Jf,C as $f,c as ve,d as Te,e as ed,L as No,f as td,U as An,T as nd,h as rd,D as Cn,i as Ss,M as pr,k as hr,l as el,Q as tl,m as id,n as sd,I as od,F as su,o as nl,p as xr,q as ld,s as dl,t as Yu,u as Ht,v as ou,w as lu,x as Xu,y as zn,z as ad,E as ud,G as tn,H as st,J as fs,K as Qn,X as ri,Y as it,Z as cd,_ as fd,$ as dd,a0 as Ku,a1 as Ft,a2 as ds,a3 as pd,a4 as ps,a5 as Tr,a6 as pl,a7 as Zu,a8 as qu,a9 as wr,aa as hd,ab as Kn,ac as _e,ad as Ju,ae as md,af as $u,ag as hs,ah as rl,ai as vd,aj as se,ak as ms,al as il,am as xs,an as sl,ao as ec,ap as gd,aq as yd,ar as Sd,as as xd,at as wd,au as Ed,av as Md,aw as _d,ax as Td,ay as Rd,az as hl,aA as Pd,aB as Cd,aC as Ad,aD as zd}from"./index-CXWl4STS.js";var tc={exports:{}},Zn={};/**
|
|
2
2
|
* @license React
|
|
3
3
|
* react-reconciler-constants.production.min.js
|
|
4
4
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aj as n,r,j as s}from"./index-
|
|
1
|
+
import{aj as n,r,j as s}from"./index-CXWl4STS.js";const P=[1,4,16,64];function S({open:l,onClose:u}){const e=n(t=>t.playback),m=n(t=>t.enterPlayback),v=n(t=>t.exitPlayback),o=n(t=>t.setPlaybackTime),f=n(t=>t.setPlaybackSpeed),p=n(t=>t.setPlaybackPlaying),x=n(t=>t.setPlaybackLoading),[i,g]=r.useState(30);r.useEffect(()=>{if(!l||e.active&&e.events.length>0)return;x(!0);const t=Date.now()-i*60*1e3;fetch(`/api/timeline?sinceMs=${t}&untilMs=${Date.now()}`).then(a=>a.json()).then(a=>{if(a.events.length===0){x(!1),m([],Date.now()-6e4,Date.now());return}m(a.events,a.earliest,a.latest)}).catch(a=>{console.warn("[timeline] fetch failed",a),x(!1)})},[l,i]);const c=r.useRef(0);if(r.useEffect(()=>{if(!e.active||!e.playing)return;let t=0;const a=h=>{const N=c.current?h-c.current:16;c.current=h;const b=e.currentMs+N*e.speed;b>=e.latestMs?(o(e.latestMs),p(!1)):(o(b),t=requestAnimationFrame(a))};return t=requestAnimationFrame(a),()=>{cancelAnimationFrame(t),c.current=0}},[e.active,e.playing,e.speed,e.latestMs]),!l)return null;const j=()=>{v(),u()},y=Math.max(1,e.latestMs-e.earliestMs),k=e.active?(e.currentMs-e.earliestMs)/y*100:0,M=e.events.filter(t=>t.ts<=e.currentMs);return s.jsx("div",{className:"absolute bottom-0 inset-x-0 z-30 bg-solix-panel/95 backdrop-blur border-t border-solix-border",children:s.jsxs("div",{className:"px-4 py-3 max-w-6xl mx-auto",children:[s.jsxs("div",{className:"flex items-center justify-between mb-2",children:[s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("span",{className:"text-xs uppercase tracking-widest text-solix-accent",children:"▸ Playback"}),s.jsxs("span",{className:"text-[10px] text-slate-400",children:[e.events.length," events · last ",i," min"]})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsxs("select",{value:i,onChange:t=>g(parseInt(t.target.value,10)),className:"text-[10px] bg-black/40 border border-solix-border rounded px-1.5 py-0.5 text-slate-300",children:[s.jsx("option",{value:5,children:"5 min"}),s.jsx("option",{value:15,children:"15 min"}),s.jsx("option",{value:30,children:"30 min"}),s.jsx("option",{value:60,children:"1 hour"}),s.jsx("option",{value:180,children:"3 hours"})]}),s.jsx("button",{onClick:j,className:"text-slate-400 hover:text-slate-100 text-xs",children:"✕ Live"})]})]}),s.jsxs("div",{className:"flex items-center gap-3",children:[s.jsx("button",{onClick:()=>p(!e.playing),disabled:!e.active||e.events.length===0,className:"w-8 h-8 rounded-full bg-solix-accent/20 border border-solix-accent text-solix-accent text-sm hover:bg-solix-accent/30 disabled:opacity-40 flex items-center justify-center",children:e.playing?"⏸":"▶"}),s.jsxs("div",{className:"flex-1 relative",children:[s.jsx("input",{type:"range",min:e.earliestMs,max:e.latestMs,value:e.currentMs,onChange:t=>o(parseInt(t.target.value,10)),className:"w-full",disabled:!e.active}),s.jsx("div",{className:"absolute -top-1.5 h-0.5 bg-solix-accent/40 pointer-events-none",style:{left:0,width:`${k}%`}})]}),s.jsx("div",{className:"flex items-center gap-1",children:P.map(t=>s.jsxs("button",{onClick:()=>f(t),className:`text-[10px] px-1.5 py-0.5 rounded border ${e.speed===t?"bg-solix-accent/20 border-solix-accent text-solix-accent":"border-solix-border text-slate-400 hover:text-slate-200"}`,children:[t,"×"]},t))})]}),s.jsxs("div",{className:"mt-2 flex items-center justify-between text-[10px] text-slate-500 font-mono",children:[s.jsx("span",{children:d(e.earliestMs)}),s.jsxs("span",{className:"text-solix-accent",children:[d(e.currentMs)," · ",M.length," events"]}),s.jsx("span",{children:d(e.latestMs)})]}),e.loading&&s.jsx("div",{className:"text-center text-xs text-slate-500 italic mt-2",children:"Loading timeline…"}),!e.loading&&e.events.length===0&&e.active&&s.jsx("div",{className:"text-center text-xs text-slate-500 italic mt-2",children:"No events in this range. Try a longer window or run some agents first."})]})})}function d(l){return l?new Date(l).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}):"—"}export{S as TimelineDrawer};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aj as x,aF as g,r as m,j as e}from"./index-
|
|
1
|
+
import{aj as x,aF as g,r as m,j as e}from"./index-CXWl4STS.js";const u=l=>`$${l.toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:2})}`,v=l=>Intl.NumberFormat(void 0,{notation:"compact",maximumFractionDigits:1}).format(l);function r({label:l,value:a,hint:s}){return e.jsxs("div",{className:"rounded-lg border border-solix-border bg-black/20 p-3",children:[e.jsx("div",{className:"text-[10px] uppercase tracking-widest text-slate-400",children:l}),e.jsx("div",{className:"mt-1 text-xl font-semibold tabular-nums text-slate-100",children:a}),s?e.jsx("div",{className:"text-[11px] text-slate-500 mt-0.5",children:s}):null]})}function o({n:l,label:a,color:s}){return e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:`inline-block w-2 h-2 rounded-full ${s}`}),e.jsx("span",{className:"tabular-nums font-medium text-slate-200",children:l}),e.jsx("span",{className:"text-slate-500",children:a})]})}function f({open:l,onClose:a}){const s=x(g),p=x(t=>t.selectSession),[c,d]=m.useState(null);if(m.useEffect(()=>{if(!l)return;let t=!1;return Promise.all([fetch("/api/audit?kind=permission_approved").then(i=>i.ok?i.json():Promise.resolve([])),fetch("/api/audit?kind=permission_denied").then(i=>i.ok?i.json():Promise.resolve([]))]).then(([i,j])=>{t||d(i.length+j.length)}).catch(()=>{t||d(null)}),()=>{t=!0}},[l]),!l)return null;const n=s.missions,h=[["done",n.completed],["failed",n.failed],["active",n.active],["cancelled",n.cancelled]];return e.jsxs("div",{className:"absolute top-16 right-0 bottom-0 w-full sm:w-[480px] bg-solix-panel border-l border-solix-border backdrop-blur-md flex flex-col z-30",children:[e.jsxs("div",{className:"px-4 py-3 border-b border-solix-border flex items-start justify-between",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs uppercase tracking-wide text-solix-accent",children:"Mission Control"}),e.jsx("div",{className:"text-lg font-semibold",children:"Your workspace"}),e.jsxs("div",{className:"text-xs text-slate-400 mt-0.5",children:[s.sessionCount," sessions · ",s.projectCount," projects ·"," ",s.advisorCount," advisors · ",s.skillCount," skills"]})]}),e.jsx("button",{onClick:a,className:"text-slate-400 hover:text-slate-100",children:"✕"})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto p-4 space-y-5",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[e.jsx(r,{label:"Total spend",value:u(s.totalSpendUsd)}),e.jsx(r,{label:"Total tokens",value:v(s.totalTokens)}),e.jsx(r,{label:"Cost / mission",value:u(s.costPerCompletedMission),hint:`${s.completedMissions} completed`}),e.jsx(r,{label:"Interventions",value:c===null?"—":String(c),hint:`${s.pendingPermissions} pending now`})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-[10px] uppercase tracking-widest text-slate-500 mb-2",children:"Status"}),e.jsxs("div",{className:"flex items-center gap-4 text-sm",children:[e.jsx(o,{n:s.activeCount,label:"active",color:"bg-solix-ok"}),e.jsx(o,{n:s.attentionCount,label:"need you",color:"bg-solix-danger"}),e.jsx(o,{n:s.idleCount,label:"idle",color:"bg-slate-600"})]})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-[10px] uppercase tracking-widest text-slate-500 mb-2",children:"Missions"}),e.jsx("div",{className:"grid grid-cols-4 gap-2 text-center",children:h.map(([t,i])=>e.jsxs("div",{className:"rounded border border-solix-border bg-black/20 py-2",children:[e.jsx("div",{className:"text-lg font-semibold tabular-nums",children:i}),e.jsx("div",{className:"text-[10px] uppercase tracking-wide text-slate-500",children:t})]},t))})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-[10px] uppercase tracking-widest text-slate-500 mb-2",children:"Context pressure"}),e.jsxs("div",{className:"text-sm text-slate-300 tabular-nums",children:["avg ",Math.round(s.contextAvgPct),"% · max"," ",e.jsxs("span",{className:s.contextMaxPct>=85?"text-solix-danger font-medium":"",children:[Math.round(s.contextMaxPct),"%"]}),s.contextMaxPct>=85?e.jsxs("span",{className:"text-solix-danger",children:[" ","— an agent is near its limit"]}):null]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"text-[10px] uppercase tracking-widest text-slate-500 mb-2",children:["Needs you (",s.needsYou.length,")"]}),s.needsYou.length===0?e.jsx("div",{className:"text-sm text-slate-500",children:"Nothing waiting — the fleet is running itself."}):e.jsx("div",{className:"space-y-1.5",children:s.needsYou.map(t=>e.jsx("button",{onClick:()=>p(t.id),className:"w-full text-left rounded border border-solix-danger/40 bg-solix-danger/5 px-3 py-2 hover:bg-solix-danger/10",children:e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-sm font-medium text-slate-100 truncate",children:t.name??t.id.slice(0,8)}),e.jsx("span",{className:"text-[11px] uppercase tracking-wide text-solix-danger whitespace-nowrap",children:t.status.replace(/_/g," ")})]})},t.id))})]})]})]})}export{f as WorkspacePanel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.-top-1\.5{top:-.375rem}.bottom-0{bottom:0}.bottom-4{bottom:1rem}.left-1\/2{left:50%}.right-0{right:0}.right-4{right:1rem}.top-0{top:0}.top-16{top:4rem}.top-20{top:5rem}.top-full{top:100%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0\.5{height:.125rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-2{height:.5rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-full{height:100%}.max-h-72{max-height:18rem}.max-h-\[88vh\]{max-height:88vh}.w-10{width:2.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-\[420px\]{width:420px}.w-\[480px\]{width:480px}.w-\[520px\]{width:520px}.w-\[620px\]{width:620px}.w-\[…\]{width:…}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-\[200px\]{max-width:200px}.max-w-\[55\%\]{max-width:55%}.max-w-\[85\%\]{max-width:85%}.max-w-\[92vw\]{max-width:92vw}.max-w-\[94vw\]{max-width:94vw}.max-w-md{max-width:28rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-1{row-gap:.25rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-solix-border>:not([hidden])~:not([hidden]){border-color:#7882c82e}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-300{--tw-border-opacity: 1;border-color:rgb(252 211 77 / var(--tw-border-opacity, 1))}.border-amber-300\/40{border-color:#fcd34d66}.border-amber-300\/50{border-color:#fcd34d80}.border-amber-300\/60{border-color:#fcd34d99}.border-amber-400\/30{border-color:#fbbf244d}.border-amber-400\/40{border-color:#fbbf2466}.border-amber-400\/50{border-color:#fbbf2480}.border-cyan-300{--tw-border-opacity: 1;border-color:rgb(103 232 249 / var(--tw-border-opacity, 1))}.border-cyan-300\/40{border-color:#67e8f966}.border-cyan-400{--tw-border-opacity: 1;border-color:rgb(34 211 238 / var(--tw-border-opacity, 1))}.border-cyan-400\/40{border-color:#22d3ee66}.border-cyan-400\/60{border-color:#22d3ee99}.border-solix-accent{--tw-border-opacity: 1;border-color:rgb(168 85 247 / var(--tw-border-opacity, 1))}.border-solix-accent\/30{border-color:#a855f74d}.border-solix-accent\/40{border-color:#a855f766}.border-solix-accent\/50{border-color:#a855f780}.border-solix-accent\/60{border-color:#a855f799}.border-solix-border{border-color:#7882c82e}.border-solix-danger{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-solix-danger\/40{border-color:#ef444466}.border-solix-ok{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity, 1))}.border-solix-ok\/40{border-color:#10b98166}.border-solix-warn{--tw-border-opacity: 1;border-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-solix-warn\/40{border-color:#f59e0b66}.border-transparent{border-color:transparent}.border-white\/10{border-color:#ffffff1a}.bg-amber-400\/20{background-color:#fbbf2433}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/15{background-color:#f59e0b26}.bg-amber-500\/20{background-color:#f59e0b33}.bg-black\/20{background-color:#0003}.bg-black\/30{background-color:#0000004d}.bg-black\/40{background-color:#0006}.bg-black\/50{background-color:#00000080}.bg-black\/60{background-color:#0009}.bg-black\/80{background-color:#000c}.bg-cyan-400\/10{background-color:#22d3ee1a}.bg-cyan-400\/20{background-color:#22d3ee33}.bg-cyan-500\/15{background-color:#06b6d426}.bg-cyan-500\/20{background-color:#06b6d433}.bg-slate-600{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity, 1))}.bg-slate-800{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.bg-solix-accent{--tw-bg-opacity: 1;background-color:rgb(168 85 247 / var(--tw-bg-opacity, 1))}.bg-solix-accent\/10{background-color:#a855f71a}.bg-solix-accent\/15{background-color:#a855f726}.bg-solix-accent\/20{background-color:#a855f733}.bg-solix-accent\/40{background-color:#a855f766}.bg-solix-accent\/5{background-color:#a855f70d}.bg-solix-bg{--tw-bg-opacity: 1;background-color:rgb(5 6 12 / var(--tw-bg-opacity, 1))}.bg-solix-border\/50{background-color:#7882c880}.bg-solix-danger{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-solix-danger\/10{background-color:#ef44441a}.bg-solix-danger\/20{background-color:#ef444433}.bg-solix-danger\/5{background-color:#ef44440d}.bg-solix-ok{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-solix-ok\/10{background-color:#10b9811a}.bg-solix-ok\/15{background-color:#10b98126}.bg-solix-ok\/20{background-color:#10b98133}.bg-solix-panel{--tw-bg-opacity: 1;background-color:rgb(15 18 32 / var(--tw-bg-opacity, 1))}.bg-solix-panel\/60{background-color:#0f122099}.bg-solix-panel\/80{background-color:#0f1220cc}.bg-solix-panel\/85{background-color:#0f1220d9}.bg-solix-panel\/95{background-color:#0f1220f2}.bg-solix-warn{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-solix-warn\/10{background-color:#f59e0b1a}.bg-white\/20{background-color:#fff3}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-20{padding-bottom:5rem}.pb-3{padding-bottom:.75rem}.pb-8{padding-bottom:2rem}.pt-1{padding-top:.25rem}.pt-20{padding-top:5rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.ordinal{--tw-ordinal: ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-100{--tw-text-opacity: 1;color:rgb(254 243 199 / var(--tw-text-opacity, 1))}.text-amber-100\/80{color:#fef3c7cc}.text-amber-200{--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.text-amber-200\/70{color:#fde68ab3}.text-amber-200\/80{color:#fde68acc}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-cyan-100{--tw-text-opacity: 1;color:rgb(207 250 254 / var(--tw-text-opacity, 1))}.text-cyan-200{--tw-text-opacity: 1;color:rgb(165 243 252 / var(--tw-text-opacity, 1))}.text-cyan-300{--tw-text-opacity: 1;color:rgb(103 232 249 / var(--tw-text-opacity, 1))}.text-cyan-300\/70{color:#67e8f9b3}.text-cyan-300\/80{color:#67e8f9cc}.text-slate-100{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.text-slate-200{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-solix-accent{--tw-text-opacity: 1;color:rgb(168 85 247 / var(--tw-text-opacity, 1))}.text-solix-accent\/80{color:#a855f7cc}.text-solix-danger{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-solix-danger\/80{color:#ef4444cc}.text-solix-ok{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-solix-warn{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/70{color:#ffffffb3}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-slate-600::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(71 85 105 / var(--tw-placeholder-opacity, 1))}.placeholder-slate-600::placeholder{--tw-placeholder-opacity: 1;color:rgb(71 85 105 / var(--tw-placeholder-opacity, 1))}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-lg{--tw-backdrop-blur: blur(16px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}html,body,#root{height:100%;margin:0}body{overflow:hidden}canvas{display:block;outline:none}@keyframes solix-pulse{0%,to{opacity:1}50%{opacity:.4}}.solix-pulse{animation:solix-pulse 1.5s ease-in-out infinite}.hover\:bg-amber-500\/20:hover{background-color:#f59e0b33}.hover\:bg-amber-500\/25:hover{background-color:#f59e0b40}.hover\:bg-amber-500\/30:hover{background-color:#f59e0b4d}.hover\:bg-cyan-500\/25:hover{background-color:#06b6d440}.hover\:bg-cyan-500\/30:hover{background-color:#06b6d44d}.hover\:bg-solix-accent\/15:hover{background-color:#a855f726}.hover\:bg-solix-accent\/25:hover{background-color:#a855f740}.hover\:bg-solix-accent\/30:hover{background-color:#a855f74d}.hover\:bg-solix-border\/20:hover{background-color:#7882c833}.hover\:bg-solix-border\/30:hover{background-color:#7882c84d}.hover\:bg-solix-border\/40:hover{background-color:#7882c866}.hover\:bg-solix-danger\/10:hover{background-color:#ef44441a}.hover\:bg-solix-danger\/15:hover{background-color:#ef444426}.hover\:bg-solix-danger\/30:hover{background-color:#ef44444d}.hover\:bg-solix-ok\/25:hover{background-color:#10b98140}.hover\:bg-solix-ok\/30:hover{background-color:#10b9814d}.hover\:bg-white\/30:hover{background-color:#ffffff4d}.hover\:text-slate-100:hover{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.hover\:text-slate-200:hover{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.hover\:text-slate-300:hover{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.focus\:border-solix-accent:focus{--tw-border-opacity: 1;border-color:rgb(168 85 247 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:block{display:block}@media (min-width: 640px){.sm\:ml-3{margin-left:.75rem}.sm\:inline-block{display:inline-block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:w-\[460px\]{width:460px}.sm\:w-\[480px\]{width:480px}.sm\:gap-3{gap:.75rem}}@media (min-width: 768px){.md\:block{display:block}}
|