volute 0.18.0 → 0.20.0
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/README.md +67 -67
- package/dist/activity-events-OMXKXD5N.js +16 -0
- package/dist/archive-ZCFOSTKB.js +15 -0
- package/dist/{channel-SLURLIRV.js → channel-PUQKGSQM.js} +60 -7
- package/dist/{chunk-6BDNWYKG.js → chunk-32VR2EOH.js} +2 -2
- package/dist/chunk-5XNT2472.js +36 -0
- package/dist/{chunk-QJIIHU32.js → chunk-7NO7EV5Z.js} +2 -2
- package/dist/{chunk-6DVBMLVN.js → chunk-7UFKREVW.js} +2 -2
- package/dist/chunk-AW7P4EVV.js +159 -0
- package/dist/{chunk-2Y77MCFG.js → chunk-DYZGP3EW.js} +2 -2
- package/dist/{chunk-M77QBTEH.js → chunk-EBGCNDMM.js} +24 -14
- package/dist/{chunk-37X7ECMF.js → chunk-FCDU5BFX.js} +1 -1
- package/dist/chunk-FGSYHIS3.js +891 -0
- package/dist/chunk-GZ7DW4YL.js +97 -0
- package/dist/chunk-IKMY5X76.js +375 -0
- package/dist/chunk-NSE7VJQA.js +159 -0
- package/dist/{chunk-GSPWIM5E.js → chunk-O6ASDHFO.js} +79 -7
- package/dist/{chunk-ZCEYUUID.js → chunk-OGXOMR65.js} +2 -1
- package/dist/{chunk-AYB7XAWO.js → chunk-PUVXOZ6T.js} +120 -279
- package/dist/{chunk-GK4E7LM7.js → chunk-RHEGSQFJ.js} +1 -1
- package/dist/{chunk-MVSXRMJJ.js → chunk-SCUDS4US.js} +1 -1
- package/dist/chunk-TIWH32HP.js +227 -0
- package/dist/{chunk-FW5API7X.js → chunk-UJ6GHNR7.js} +2 -2
- package/dist/chunk-UU7A7KLB.js +58 -0
- package/dist/{chunk-OYSZNX5I.js → chunk-VDWCHYTS.js} +1 -1
- package/dist/{chunk-OJQ47SCA.js → chunk-WC6ZHVRL.js} +1 -1
- package/dist/chunk-YUIHSKR6.js +72 -0
- package/dist/cli.js +43 -25
- package/dist/{connector-3ELFMI2R.js → connector-JBVNZ7VK.js} +6 -6
- package/dist/connectors/discord.js +2 -2
- package/dist/connectors/slack.js +2 -2
- package/dist/connectors/telegram.js +2 -2
- package/dist/{create-ZWHCRT5F.js → create-HP4OVVHF.js} +6 -4
- package/dist/{daemon-client-ODKDUYDE.js → daemon-client-ITWUCNFO.js} +2 -2
- package/dist/{daemon-restart-2HVTHZAT.js → daemon-restart-KPSWNYTH.js} +6 -6
- package/dist/daemon.js +2463 -1707
- package/dist/db-C2CJ46ZU.js +10 -0
- package/dist/{delete-6G6WEX4F.js → delete-BSU7K3RY.js} +1 -1
- package/dist/delivery-manager-CSG7LXA4.js +16 -0
- package/dist/down-ZY35KMHR.js +14 -0
- package/dist/{env-6IDWGBUH.js → env-A3LMO777.js} +6 -6
- package/dist/export-6QBUOQGC.js +100 -0
- package/dist/file-C57SK5DK.js +204 -0
- package/dist/{history-YUEKTJ2N.js → history-WNK3DFUM.js} +6 -6
- package/dist/{import-EDGRLIGO.js → import-XEC34Y4Z.js} +3 -3
- package/dist/log-PPPZDVEF.js +39 -0
- package/dist/{login-ORQDXLBM.js → login-HNH3EUQV.js} +2 -2
- package/dist/{logout-XC5AUO5I.js → logout-I5CB5UZS.js} +2 -2
- package/dist/{logs-GYOR3L2L.js → logs-SF2IMJN4.js} +6 -6
- package/dist/merge-33C237A4.js +46 -0
- package/dist/{mind-OJN6RBZW.js → mind-Z7CKD6DG.js} +14 -10
- package/dist/mind-activity-tracker-624QLQLC.js +19 -0
- package/dist/mind-manager-3DMYKZPB.js +18 -0
- package/dist/{package-OKLFO7UY.js → package-4NHAVUUI.js} +5 -3
- package/dist/{pages-6IV4VQTU.js → pages-4DGQT7ZA.js} +2 -2
- package/dist/{publish-Q4RPSJLL.js → publish-TAJUET4I.js} +22 -5
- package/dist/pull-XAEWQJ47.js +39 -0
- package/dist/{register-LDE6LRXY.js → register-VSPCMHKX.js} +2 -2
- package/dist/{restart-YFAWFS5T.js → restart-IQKMCK5M.js} +6 -6
- package/dist/{schedule-AGYLDMNS.js → schedule-FFZG23IW.js} +31 -11
- package/dist/schema-GFH6RV3W.js +26 -0
- package/dist/{seed-AP4Q7RZ7.js → seed-J43YDKXG.js} +7 -4
- package/dist/{send-BNDTLUPM.js → send-KVIZIGCE.js} +8 -8
- package/dist/{service-U7MZ2H7F.js → service-LUR7WDO7.js} +6 -6
- package/dist/{setup-DJKIZKGW.js → setup-52YRV7VP.js} +23 -7
- package/dist/shared-KO35ZM44.js +39 -0
- package/dist/{skill-2Y42P4JY.js → skill-BCVNI6TV.js} +6 -6
- package/{templates/_base/_skills → dist/skills}/orientation/SKILL.md +1 -1
- package/{templates/_base/_skills → dist/skills}/sessions/SKILL.md +2 -2
- package/{templates/_base/_skills → dist/skills}/volute-mind/SKILL.md +51 -3
- package/dist/{sprout-TJ3BHVOG.js → sprout-QN7Y4VVO.js} +38 -20
- package/dist/{start-3YYRXBKP.js → start-I5JYB65M.js} +6 -6
- package/dist/{status-VSFZYX7S.js → status-4ESFLGH4.js} +5 -5
- package/dist/status-D7E5HHBV.js +35 -0
- package/dist/{status-OKNA6AR3.js → status-FU2PFVVF.js} +5 -4
- package/dist/{stop-AA5K5LYG.js → stop-NBVKEFQQ.js} +6 -6
- package/dist/{up-7B3BWF2U.js → up-FS7CKM6V.js} +5 -5
- package/dist/{update-YAGN5ODG.js → update-FJIHDJKM.js} +5 -5
- package/dist/{update-check-APLTH4IN.js → update-check-MWE5AH4U.js} +2 -2
- package/dist/{upgrade-KXZCQSZN.js → upgrade-AIT24B5I.js} +1 -1
- package/dist/{variant-X5QFG6KK.js → variant-63ZWO2W7.js} +4 -4
- package/dist/variants-JAGWGBXG.js +26 -0
- package/dist/web-assets/assets/index-CUZTZzaW.js +64 -0
- package/dist/web-assets/assets/index-adVuCkqy.css +1 -0
- package/dist/web-assets/index.html +2 -2
- package/drizzle/0010_delivery_queue.sql +12 -0
- package/drizzle/0011_rename_human_to_brain.sql +1 -0
- package/drizzle/0012_activity.sql +11 -0
- package/drizzle/meta/0010_snapshot.json +7 -0
- package/drizzle/meta/0011_snapshot.json +7 -0
- package/drizzle/meta/0012_snapshot.json +7 -0
- package/drizzle/meta/_journal.json +21 -0
- package/package.json +5 -3
- package/templates/_base/.init/.config/hooks/startup-context.sh +1 -1
- package/templates/_base/.init/.config/scripts/session-reader.ts +3 -3
- package/templates/_base/home/.config/routes.json +2 -2
- package/templates/_base/home/VOLUTE.md +16 -1
- package/templates/_base/src/lib/auto-commit.ts +51 -14
- package/templates/_base/src/lib/daemon-client.ts +22 -0
- package/templates/_base/src/lib/router.ts +123 -1
- package/templates/_base/src/lib/transparency.ts +1 -1
- package/templates/_base/src/lib/types.ts +4 -0
- package/templates/_base/src/lib/volute-server.ts +91 -2
- package/templates/claude/.init/.config/routes.json +7 -1
- package/templates/claude/src/server.ts +2 -2
- package/templates/claude/volute-template.json +1 -2
- package/templates/pi/.init/.config/routes.json +7 -1
- package/templates/pi/src/agent.ts +12 -6
- package/templates/pi/src/lib/session-context-extension.ts +6 -4
- package/templates/pi/src/server.ts +2 -0
- package/templates/pi/volute-template.json +1 -2
- package/dist/chunk-PO5Q2AYN.js +0 -121
- package/dist/down-A56B5JLK.js +0 -14
- package/dist/mind-manager-Z7O7PN2O.js +0 -15
- package/dist/web-assets/assets/index-CtiimdWK.css +0 -1
- package/dist/web-assets/assets/index-kt1_EcuO.js +0 -63
- /package/{templates/_base/_skills → dist/skills}/memory/SKILL.md +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { createHash, verify } from "node:crypto";
|
|
1
2
|
import { createServer, type IncomingMessage, type Server } from "node:http";
|
|
2
3
|
import { log } from "./logger.js";
|
|
3
4
|
import type { Router } from "./router.js";
|
|
4
|
-
import type { VoluteRequest } from "./types.js";
|
|
5
|
+
import type { VoluteContentPart, VoluteRequest } from "./types.js";
|
|
5
6
|
|
|
6
7
|
function readBody(req: IncomingMessage): Promise<string> {
|
|
7
8
|
return new Promise((resolve, reject) => {
|
|
@@ -12,6 +13,71 @@ function readBody(req: IncomingMessage): Promise<string> {
|
|
|
12
13
|
});
|
|
13
14
|
}
|
|
14
15
|
|
|
16
|
+
function extractText(content: VoluteContentPart[] | string): string {
|
|
17
|
+
if (typeof content === "string") return content;
|
|
18
|
+
return content
|
|
19
|
+
.filter((p): p is { type: "text"; text: string } => p.type === "text")
|
|
20
|
+
.map((p) => p.text)
|
|
21
|
+
.join("\n");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Normalize content to VoluteContentPart[] — connectors may send plain strings. */
|
|
25
|
+
function normalizeContent(content: unknown): VoluteContentPart[] {
|
|
26
|
+
if (Array.isArray(content)) return content as VoluteContentPart[];
|
|
27
|
+
if (typeof content === "string") return [{ type: "text", text: content }];
|
|
28
|
+
return [{ type: "text", text: JSON.stringify(content) }];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Verify an Ed25519 signature against a public key */
|
|
32
|
+
function verifySignature(
|
|
33
|
+
publicKeyPem: string,
|
|
34
|
+
content: string,
|
|
35
|
+
timestamp: string,
|
|
36
|
+
signature: string,
|
|
37
|
+
): boolean {
|
|
38
|
+
try {
|
|
39
|
+
const data = `${content}\n${timestamp}`;
|
|
40
|
+
return verify(null, Buffer.from(data), publicKeyPem, Buffer.from(signature, "base64"));
|
|
41
|
+
} catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Look up a mind's public key via the daemon API */
|
|
47
|
+
async function fetchPublicKey(fingerprint: string): Promise<string | null> {
|
|
48
|
+
const daemonPort = process.env.VOLUTE_DAEMON_PORT;
|
|
49
|
+
const daemonToken = process.env.VOLUTE_DAEMON_TOKEN;
|
|
50
|
+
if (!daemonPort || !daemonToken) return null;
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
const res = await fetch(
|
|
54
|
+
`http://127.0.0.1:${daemonPort}/api/keys/${encodeURIComponent(fingerprint)}`,
|
|
55
|
+
{ headers: { Authorization: `Bearer ${daemonToken}` }, signal: AbortSignal.timeout(2000) },
|
|
56
|
+
);
|
|
57
|
+
if (!res.ok) return null;
|
|
58
|
+
const data = (await res.json()) as { publicKey?: string };
|
|
59
|
+
return data.publicKey ?? null;
|
|
60
|
+
} catch (err) {
|
|
61
|
+
log("identity", "failed to fetch public key:", err);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Best-effort signature verification */
|
|
67
|
+
async function verifyRequest(body: VoluteRequest): Promise<boolean | undefined> {
|
|
68
|
+
if (!body.signature || !body.signatureTimestamp || !body.signerFingerprint) return undefined;
|
|
69
|
+
|
|
70
|
+
const publicKey = await fetchPublicKey(body.signerFingerprint);
|
|
71
|
+
if (!publicKey) return false;
|
|
72
|
+
|
|
73
|
+
// Verify the fingerprint matches
|
|
74
|
+
const expectedFingerprint = createHash("sha256").update(publicKey).digest("hex");
|
|
75
|
+
if (expectedFingerprint !== body.signerFingerprint) return false;
|
|
76
|
+
|
|
77
|
+
const text = extractText(body.content);
|
|
78
|
+
return verifySignature(publicKey, text, body.signatureTimestamp, body.signature);
|
|
79
|
+
}
|
|
80
|
+
|
|
15
81
|
export function createVoluteServer(options: {
|
|
16
82
|
router: Router;
|
|
17
83
|
port: number;
|
|
@@ -32,7 +98,30 @@ export function createVoluteServer(options: {
|
|
|
32
98
|
if (req.method === "POST" && url.pathname === "/message") {
|
|
33
99
|
try {
|
|
34
100
|
const body = JSON.parse(await readBody(req)) as VoluteRequest;
|
|
35
|
-
|
|
101
|
+
|
|
102
|
+
// Strip any sender-provided verified field to prevent spoofing
|
|
103
|
+
delete body.verified;
|
|
104
|
+
|
|
105
|
+
// Best-effort signature verification (non-blocking)
|
|
106
|
+
const verified = await verifyRequest(body);
|
|
107
|
+
if (verified !== undefined) body.verified = verified;
|
|
108
|
+
|
|
109
|
+
// Normalize content — connectors may send plain strings
|
|
110
|
+
body.content = normalizeContent(body.content);
|
|
111
|
+
|
|
112
|
+
// Handle batch payloads from delivery manager
|
|
113
|
+
if ((body as any).batch) {
|
|
114
|
+
const batch = (body as any).batch as {
|
|
115
|
+
channels: Record<string, any[]>;
|
|
116
|
+
};
|
|
117
|
+
router.dispatchBatch(batch, body.session ?? "main", body);
|
|
118
|
+
} else if (body.session) {
|
|
119
|
+
// Pre-routed by daemon delivery manager — dispatch directly
|
|
120
|
+
router.dispatch(body.content, body.session, body);
|
|
121
|
+
} else {
|
|
122
|
+
// Legacy: local routing (for minds running with old daemon)
|
|
123
|
+
router.route(body.content, body);
|
|
124
|
+
}
|
|
36
125
|
res.writeHead(200, { "Content-Type": "application/json" });
|
|
37
126
|
res.end(JSON.stringify({ ok: true }));
|
|
38
127
|
} catch (err) {
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"gateUnmatched": true,
|
|
3
|
-
"rules": [
|
|
3
|
+
"rules": [
|
|
4
|
+
{ "channel": "volute:*", "isDM": true, "session": "${channel}" },
|
|
5
|
+
{ "channel": "volute:*", "isDM": false, "session": "group-${channel}" }
|
|
6
|
+
],
|
|
7
|
+
"sessions": {
|
|
8
|
+
"group-*": { "batch": { "debounce": 20, "maxWait": 120, "triggers": ["@{{name}}"] } }
|
|
9
|
+
},
|
|
4
10
|
"default": "main"
|
|
5
11
|
}
|
|
@@ -20,10 +20,10 @@ if (config.model) log("server", `using model: ${config.model}`);
|
|
|
20
20
|
if (config.maxThinkingTokens) log("server", `max thinking tokens: ${config.maxThinkingTokens}`);
|
|
21
21
|
|
|
22
22
|
const systemPrompt = loadSystemPrompt();
|
|
23
|
-
const sessionsDir = resolve(".
|
|
23
|
+
const sessionsDir = resolve(".mind/sessions");
|
|
24
24
|
|
|
25
25
|
// Migrate old single session.json → sessions/main.json
|
|
26
|
-
const oldSessionPath = resolve(".
|
|
26
|
+
const oldSessionPath = resolve(".mind/session.json");
|
|
27
27
|
if (existsSync(oldSessionPath) && !existsSync(resolve(sessionsDir, "main.json"))) {
|
|
28
28
|
mkdirSync(sessionsDir, { recursive: true });
|
|
29
29
|
renameSync(oldSessionPath, resolve(sessionsDir, "main.json"));
|
|
@@ -4,6 +4,5 @@
|
|
|
4
4
|
"biome.json.tmpl": "biome.json",
|
|
5
5
|
"home/.config/config.json.tmpl": "home/.config/config.json"
|
|
6
6
|
},
|
|
7
|
-
"substitute": ["package.json", ".init/SOUL.md", "home/.config/routes.json"]
|
|
8
|
-
"skillsDir": "home/.claude/skills"
|
|
7
|
+
"substitute": ["package.json", ".init/SOUL.md", "home/.config/routes.json"]
|
|
9
8
|
}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"gateUnmatched": true,
|
|
3
|
-
"rules": [
|
|
3
|
+
"rules": [
|
|
4
|
+
{ "channel": "volute:*", "isDM": true, "session": "${channel}" },
|
|
5
|
+
{ "channel": "volute:*", "isDM": false, "session": "group-${channel}" }
|
|
6
|
+
],
|
|
7
|
+
"sessions": {
|
|
8
|
+
"group-*": { "batch": { "debounce": 20, "maxWait": 120, "triggers": ["@{{name}}"] } }
|
|
9
|
+
},
|
|
4
10
|
"default": "main"
|
|
5
11
|
}
|
|
@@ -39,6 +39,7 @@ type PiSession = {
|
|
|
39
39
|
export function createMind(options: {
|
|
40
40
|
systemPrompt: string;
|
|
41
41
|
cwd: string;
|
|
42
|
+
mindDir: string;
|
|
42
43
|
model?: string;
|
|
43
44
|
thinkingLevel?: "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
44
45
|
compactionMessage?: string;
|
|
@@ -83,7 +84,7 @@ export function createMind(options: {
|
|
|
83
84
|
|
|
84
85
|
const sessionManager = isEphemeral
|
|
85
86
|
? SessionManager.inMemory()
|
|
86
|
-
: SessionManager.continueRecent(options.cwd, `.
|
|
87
|
+
: SessionManager.continueRecent(options.cwd, `.mind/pi-sessions/${session.name}`);
|
|
87
88
|
|
|
88
89
|
log("mind", `session "${session.name}": ${isEphemeral ? "ephemeral" : "persistent"}`);
|
|
89
90
|
|
|
@@ -111,7 +112,7 @@ export function createMind(options: {
|
|
|
111
112
|
|
|
112
113
|
const sessionContextExtension = createSessionContextExtension({
|
|
113
114
|
currentSession: session.name,
|
|
114
|
-
|
|
115
|
+
mindDir: options.mindDir,
|
|
115
116
|
});
|
|
116
117
|
|
|
117
118
|
const replyInstructionsExtension = createReplyInstructionsExtension(session.messageChannels);
|
|
@@ -202,15 +203,20 @@ export function createMind(options: {
|
|
|
202
203
|
// Fire-and-forget: await session ready then prompt
|
|
203
204
|
(async () => {
|
|
204
205
|
await session.ready;
|
|
205
|
-
if (session.agentSession
|
|
206
|
+
if (!session.agentSession) {
|
|
207
|
+
log("mind", `session "${sessionName}": not initialized, dropping message`);
|
|
208
|
+
broadcast(session, { type: "done" });
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (session.agentSession.isStreaming) {
|
|
206
212
|
if (meta.interrupt) {
|
|
207
213
|
interruptSession(sessionName);
|
|
208
|
-
session.agentSession
|
|
214
|
+
session.agentSession.prompt(text, { streamingBehavior: "steer", ...opts });
|
|
209
215
|
} else {
|
|
210
|
-
session.agentSession
|
|
216
|
+
session.agentSession.prompt(text, { streamingBehavior: "followUp", ...opts });
|
|
211
217
|
}
|
|
212
218
|
} else {
|
|
213
|
-
session.agentSession
|
|
219
|
+
session.agentSession.prompt(text, opts);
|
|
214
220
|
}
|
|
215
221
|
})().catch((err) => {
|
|
216
222
|
log("mind", `session "${sessionName}": prompt failed:`, err);
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { resolve } from "node:path";
|
|
2
2
|
import type { ExtensionFactory } from "@mariozechner/pi-coding-agent";
|
|
3
|
+
import { log } from "./logger.js";
|
|
3
4
|
import { getSessionUpdates, resolvePiJsonl } from "./session-monitor.js";
|
|
4
5
|
|
|
5
6
|
export function createSessionContextExtension(options: {
|
|
6
7
|
currentSession: string;
|
|
7
|
-
|
|
8
|
+
mindDir: string;
|
|
8
9
|
}): ExtensionFactory {
|
|
9
10
|
return (pi) => {
|
|
10
11
|
pi.on("before_agent_start", () => {
|
|
11
12
|
try {
|
|
12
|
-
const sessionsDir = resolve(options.
|
|
13
|
+
const sessionsDir = resolve(options.mindDir, ".mind/pi-sessions");
|
|
13
14
|
const summary = getSessionUpdates({
|
|
14
15
|
currentSession: options.currentSession,
|
|
15
16
|
sessionsDir,
|
|
16
|
-
cursorFile: resolve(options.
|
|
17
|
+
cursorFile: resolve(options.mindDir, ".mind/session-cursors.json"),
|
|
17
18
|
jsonlResolver: (name) => resolvePiJsonl(sessionsDir, name),
|
|
18
19
|
format: "pi",
|
|
19
20
|
});
|
|
@@ -25,7 +26,8 @@ export function createSessionContextExtension(options: {
|
|
|
25
26
|
display: true,
|
|
26
27
|
},
|
|
27
28
|
};
|
|
28
|
-
} catch {
|
|
29
|
+
} catch (err) {
|
|
30
|
+
log("mind", "session context extension failed:", err);
|
|
29
31
|
return {};
|
|
30
32
|
}
|
|
31
33
|
});
|
|
@@ -21,9 +21,11 @@ if (config.thinkingLevel) log("server", `thinking level: ${config.thinkingLevel}
|
|
|
21
21
|
const systemPrompt = loadSystemPrompt();
|
|
22
22
|
const pkg = loadPackageInfo();
|
|
23
23
|
|
|
24
|
+
const mindDir = resolve(".");
|
|
24
25
|
const mind = createMind({
|
|
25
26
|
systemPrompt,
|
|
26
27
|
cwd: resolve("home"),
|
|
28
|
+
mindDir,
|
|
27
29
|
model: config.model,
|
|
28
30
|
thinkingLevel: config.thinkingLevel,
|
|
29
31
|
compactionMessage: config.compactionMessage,
|
|
@@ -4,6 +4,5 @@
|
|
|
4
4
|
"biome.json.tmpl": "biome.json",
|
|
5
5
|
"home/.config/config.json.tmpl": "home/.config/config.json"
|
|
6
6
|
},
|
|
7
|
-
"substitute": ["package.json", ".init/SOUL.md", "home/.config/routes.json"]
|
|
8
|
-
"skillsDir": "home/.claude/skills"
|
|
7
|
+
"substitute": ["package.json", ".init/SOUL.md", "home/.config/routes.json"]
|
|
9
8
|
}
|
package/dist/chunk-PO5Q2AYN.js
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
// src/lib/template.ts
|
|
4
|
-
import {
|
|
5
|
-
cpSync,
|
|
6
|
-
existsSync,
|
|
7
|
-
mkdirSync,
|
|
8
|
-
readdirSync,
|
|
9
|
-
readFileSync,
|
|
10
|
-
renameSync,
|
|
11
|
-
rmSync,
|
|
12
|
-
statSync,
|
|
13
|
-
writeFileSync
|
|
14
|
-
} from "fs";
|
|
15
|
-
import { tmpdir } from "os";
|
|
16
|
-
import { dirname, join, relative, resolve } from "path";
|
|
17
|
-
function findTemplatesRoot() {
|
|
18
|
-
let dir = dirname(new URL(import.meta.url).pathname);
|
|
19
|
-
for (let i = 0; i < 5; i++) {
|
|
20
|
-
const candidate = resolve(dir, "templates");
|
|
21
|
-
if (existsSync(resolve(candidate, "_base"))) return candidate;
|
|
22
|
-
dir = dirname(dir);
|
|
23
|
-
}
|
|
24
|
-
console.error(
|
|
25
|
-
"Templates directory not found. Searched up from:",
|
|
26
|
-
dirname(new URL(import.meta.url).pathname)
|
|
27
|
-
);
|
|
28
|
-
process.exit(1);
|
|
29
|
-
}
|
|
30
|
-
function composeTemplate(templatesRoot, templateName) {
|
|
31
|
-
const baseDir = resolve(templatesRoot, "_base");
|
|
32
|
-
const templateDir = resolve(templatesRoot, templateName);
|
|
33
|
-
if (!existsSync(baseDir)) {
|
|
34
|
-
console.error("Base template not found:", baseDir);
|
|
35
|
-
process.exit(1);
|
|
36
|
-
}
|
|
37
|
-
if (!existsSync(templateDir)) {
|
|
38
|
-
console.error(`Template not found: ${templateName}`);
|
|
39
|
-
process.exit(1);
|
|
40
|
-
}
|
|
41
|
-
const composedDir = resolve(tmpdir(), `volute-template-${Date.now()}`);
|
|
42
|
-
mkdirSync(composedDir, { recursive: true });
|
|
43
|
-
cpSync(baseDir, composedDir, { recursive: true });
|
|
44
|
-
for (const file of listFiles(templateDir)) {
|
|
45
|
-
const src = resolve(templateDir, file);
|
|
46
|
-
const dest = resolve(composedDir, file);
|
|
47
|
-
mkdirSync(dirname(dest), { recursive: true });
|
|
48
|
-
cpSync(src, dest);
|
|
49
|
-
}
|
|
50
|
-
const manifestPath = resolve(composedDir, "volute-template.json");
|
|
51
|
-
if (!existsSync(manifestPath)) {
|
|
52
|
-
rmSync(composedDir, { recursive: true, force: true });
|
|
53
|
-
console.error(`Template manifest not found: ${templateName}/volute-template.json`);
|
|
54
|
-
process.exit(1);
|
|
55
|
-
}
|
|
56
|
-
const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
|
|
57
|
-
const skillsSrc = resolve(composedDir, "_skills");
|
|
58
|
-
if (existsSync(skillsSrc)) {
|
|
59
|
-
const skillsDest = resolve(composedDir, manifest.skillsDir);
|
|
60
|
-
mkdirSync(skillsDest, { recursive: true });
|
|
61
|
-
cpSync(skillsSrc, skillsDest, { recursive: true });
|
|
62
|
-
rmSync(skillsSrc, { recursive: true, force: true });
|
|
63
|
-
}
|
|
64
|
-
rmSync(manifestPath);
|
|
65
|
-
return { composedDir, manifest };
|
|
66
|
-
}
|
|
67
|
-
function copyTemplateToDir(composedDir, destDir, mindName, manifest) {
|
|
68
|
-
cpSync(composedDir, destDir, { recursive: true });
|
|
69
|
-
for (const [from, to] of Object.entries(manifest.rename)) {
|
|
70
|
-
const fromPath = resolve(destDir, from);
|
|
71
|
-
if (existsSync(fromPath)) {
|
|
72
|
-
renameSync(fromPath, resolve(destDir, to));
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
for (const file of manifest.substitute) {
|
|
76
|
-
const path = resolve(destDir, file);
|
|
77
|
-
if (existsSync(path)) {
|
|
78
|
-
const content = readFileSync(path, "utf-8");
|
|
79
|
-
writeFileSync(path, content.replaceAll("{{name}}", mindName));
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
function applyInitFiles(destDir) {
|
|
84
|
-
const initDir = resolve(destDir, ".init");
|
|
85
|
-
if (!existsSync(initDir)) return;
|
|
86
|
-
const homeDir = resolve(destDir, "home");
|
|
87
|
-
for (const file of listFiles(initDir)) {
|
|
88
|
-
const src = resolve(initDir, file);
|
|
89
|
-
const dest = resolve(homeDir, file);
|
|
90
|
-
const parent = dirname(dest);
|
|
91
|
-
if (!existsSync(parent)) {
|
|
92
|
-
mkdirSync(parent, { recursive: true });
|
|
93
|
-
}
|
|
94
|
-
cpSync(src, dest);
|
|
95
|
-
}
|
|
96
|
-
rmSync(initDir, { recursive: true, force: true });
|
|
97
|
-
}
|
|
98
|
-
function listFiles(dir) {
|
|
99
|
-
const results = [];
|
|
100
|
-
function walk(current) {
|
|
101
|
-
for (const entry of readdirSync(current)) {
|
|
102
|
-
const full = join(current, entry);
|
|
103
|
-
if (statSync(full).isDirectory()) {
|
|
104
|
-
if (entry === ".git") continue;
|
|
105
|
-
walk(full);
|
|
106
|
-
} else {
|
|
107
|
-
results.push(relative(dir, full));
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
walk(dir);
|
|
112
|
-
return results;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export {
|
|
116
|
-
findTemplatesRoot,
|
|
117
|
-
composeTemplate,
|
|
118
|
-
copyTemplateToDir,
|
|
119
|
-
applyInitFiles,
|
|
120
|
-
listFiles
|
|
121
|
-
};
|
package/dist/down-A56B5JLK.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
run,
|
|
4
|
-
stopDaemon
|
|
5
|
-
} from "./chunk-QJIIHU32.js";
|
|
6
|
-
import "./chunk-6BDNWYKG.js";
|
|
7
|
-
import "./chunk-2Y77MCFG.js";
|
|
8
|
-
import "./chunk-ZCEYUUID.js";
|
|
9
|
-
import "./chunk-M77QBTEH.js";
|
|
10
|
-
import "./chunk-K3NQKI34.js";
|
|
11
|
-
export {
|
|
12
|
-
run,
|
|
13
|
-
stopDaemon
|
|
14
|
-
};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
MindManager,
|
|
4
|
-
getMindManager,
|
|
5
|
-
initMindManager
|
|
6
|
-
} from "./chunk-AYB7XAWO.js";
|
|
7
|
-
import "./chunk-OYSZNX5I.js";
|
|
8
|
-
import "./chunk-ZCEYUUID.js";
|
|
9
|
-
import "./chunk-M77QBTEH.js";
|
|
10
|
-
import "./chunk-K3NQKI34.js";
|
|
11
|
-
export {
|
|
12
|
-
MindManager,
|
|
13
|
-
getMindManager,
|
|
14
|
-
initMindManager
|
|
15
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.settings.svelte-4b0ckc{max-width:720px;margin:0 auto;animation:fadeIn .2s ease both}.error.svelte-4b0ckc{color:var(--red);font-size:12px;margin-bottom:16px}.loading.svelte-4b0ckc{color:var(--text-2);font-size:12px;padding:40px 0;text-align:center}.section.svelte-4b0ckc{margin-bottom:32px}.section-header.svelte-4b0ckc{display:flex;align-items:baseline;gap:10px;margin-bottom:12px}.section-title.svelte-4b0ckc{font-size:14px;font-weight:600;color:var(--text-0)}.section-subtitle.svelte-4b0ckc{font-size:11px;color:var(--text-2)}.prompt-card.svelte-4b0ckc{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius-lg);padding:14px 16px;margin-bottom:10px}.prompt-card.custom.svelte-4b0ckc{border-color:var(--yellow-dim)}.prompt-header.svelte-4b0ckc{display:flex;align-items:center;gap:8px;margin-bottom:4px}.prompt-key.svelte-4b0ckc{font-family:var(--mono);font-size:13px;font-weight:600;color:var(--text-0)}.custom-badge.svelte-4b0ckc{font-size:10px;padding:1px 6px;border-radius:3px;background:var(--yellow-dim);color:var(--yellow)}.prompt-desc.svelte-4b0ckc{font-size:12px;color:var(--text-2);margin-bottom:8px;line-height:1.5}.var-tags.svelte-4b0ckc{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:10px}.var-tag.svelte-4b0ckc{font-family:var(--mono);font-size:10px;padding:2px 6px;border-radius:3px;background:var(--bg-3);color:var(--accent);border:1px solid var(--border)}.prompt-content.svelte-4b0ckc{background:var(--bg-3);border:1px solid var(--border);border-radius:var(--radius);padding:10px 12px;overflow-x:auto;font-family:var(--mono);font-size:12px;line-height:1.5;color:var(--text-1);white-space:pre-wrap;word-break:break-word;margin-bottom:8px}.prompt-content.svelte-4b0ckc code:where(.svelte-4b0ckc){font-family:inherit;font-size:inherit}.edit-area.svelte-4b0ckc{width:100%;min-height:120px;background:var(--bg-3);border:1px solid var(--accent-dim);border-radius:var(--radius);padding:10px 12px;font-family:var(--mono);font-size:13px;line-height:1.5;color:var(--text-0);resize:vertical;margin-bottom:8px}.edit-area.svelte-4b0ckc:focus{outline:none;border-color:var(--accent)}.actions.svelte-4b0ckc{display:flex;gap:6px}.btn.svelte-4b0ckc{font-family:var(--mono);font-size:11px;padding:4px 10px;border-radius:var(--radius);cursor:pointer;border:1px solid transparent;transition:opacity .15s}.btn.svelte-4b0ckc:disabled{opacity:.5;cursor:not-allowed}.btn-edit.svelte-4b0ckc{background:var(--bg-3);color:var(--text-1);border-color:var(--border)}.btn-edit.svelte-4b0ckc:hover{color:var(--text-0);border-color:var(--border-bright)}.btn-save.svelte-4b0ckc{background:var(--accent-dim);color:var(--accent);border-color:var(--accent-border)}.btn-save.svelte-4b0ckc:hover:not(:disabled){border-color:var(--accent)}.btn-cancel.svelte-4b0ckc{background:var(--bg-3);color:var(--text-2);border-color:var(--border)}.btn-cancel.svelte-4b0ckc:hover:not(:disabled){color:var(--text-1)}.btn-reset.svelte-4b0ckc{background:var(--red-bg);color:var(--red);border-color:var(--red-border)}.btn-reset.svelte-4b0ckc:hover:not(:disabled){border-color:var(--red)}.modal-overlay.svelte-b3ltw6{position:fixed;inset:0;background:var(--overlay);display:flex;align-items:center;justify-content:center;z-index:200;animation:fadeIn .15s ease}.modal.svelte-b3ltw6{max-width:90vw;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-lg);display:flex;flex-direction:column;overflow:hidden}.modal.full.svelte-b3ltw6{width:80vw;height:70vh;max-width:960px}.modal-header.svelte-b3ltw6{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--border);padding:12px 16px;flex-shrink:0}.title.svelte-b3ltw6{font-size:13px;font-weight:600;color:var(--text-0)}.close-btn.svelte-b3ltw6{background:none;color:var(--text-2);font-size:14px;padding:4px 8px}.close-btn.svelte-b3ltw6:hover{color:var(--text-0)}.error.svelte-14apx5e{color:var(--red);padding:8px 12px;font-size:12px}.empty.svelte-14apx5e{color:var(--text-2);padding:24px;text-align:center;font-size:13px}.section-header.svelte-14apx5e{display:flex;align-items:center;justify-content:space-between;padding:0 0 12px}.section-title.svelte-14apx5e{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-2)}.upload-area.svelte-14apx5e{display:flex;align-items:center;gap:8px}.file-input.svelte-14apx5e{display:none}.upload-btn.svelte-14apx5e{padding:4px 12px;font-size:11px;border-radius:var(--radius);background:var(--accent-dim);color:var(--accent);font-weight:500}.upload-btn.svelte-14apx5e:disabled{opacity:.5}.skill-list.svelte-14apx5e{display:flex;flex-direction:column}.skill-row.svelte-14apx5e{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0;border-bottom:1px solid var(--border)}.skill-row.svelte-14apx5e:last-child{border-bottom:none}.skill-row.svelte-14apx5e:hover{background:var(--bg-2)}.skill-info.svelte-14apx5e{flex:1;min-width:0}.skill-name.svelte-14apx5e{font-size:13px;font-weight:500;color:var(--text-0)}.skill-desc.svelte-14apx5e{font-size:12px;color:var(--text-1);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.skill-meta.svelte-14apx5e{font-size:11px;color:var(--text-2);margin-top:2px}.skill-actions.svelte-14apx5e{display:flex;gap:4px;flex-shrink:0}.action-btn.svelte-14apx5e{padding:4px 10px;font-size:11px;border-radius:var(--radius);font-weight:500}.action-btn.svelte-14apx5e:disabled{opacity:.5}.remove-btn.svelte-14apx5e{background:var(--bg-3);color:var(--text-2)}.remove-btn.svelte-14apx5e:hover{color:var(--red)}.system-logs.svelte-y6pt47{display:flex;flex-direction:column;height:100%}.header.svelte-y6pt47{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;flex-shrink:0}.title.svelte-y6pt47{color:var(--text-1);font-size:13px;font-weight:500}.count.svelte-y6pt47{color:var(--text-2);font-size:11px}.filter-bar.svelte-y6pt47{display:flex;align-items:center;gap:6px;margin-bottom:8px;flex-shrink:0;flex-wrap:wrap}.filter-group.svelte-y6pt47{display:flex;gap:4px;flex-wrap:wrap}.filter-sep.svelte-y6pt47{width:1px;height:16px;background:var(--border);margin:0 4px}.pill.svelte-y6pt47{padding:2px 8px;border-radius:10px;font-size:10px;font-family:var(--mono);cursor:pointer;border:1px solid transparent;transition:opacity .1s}.pill-info.svelte-y6pt47,.pill-debug.svelte-y6pt47{background:color-mix(in srgb,var(--text-2) 15%,transparent);color:var(--text-2)}.pill-warn.svelte-y6pt47{background:color-mix(in srgb,var(--yellow) 15%,transparent);color:var(--yellow)}.pill-error.svelte-y6pt47{background:color-mix(in srgb,var(--red) 15%,transparent);color:var(--red)}.pill-cat.svelte-y6pt47{background:var(--bg-3);color:var(--text-2)}.pill-clear.svelte-y6pt47{background:none;color:var(--text-2);border:1px dashed var(--border);margin-left:4px}.pill-clear.svelte-y6pt47:hover{color:var(--text-1);border-color:var(--text-2)}.pill.inactive.svelte-y6pt47{opacity:.3}.pause-bar.svelte-y6pt47{padding:6px 12px;background:var(--bg-3);border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;font-size:11px;color:var(--text-2);flex-shrink:0}.resume-btn.svelte-y6pt47{background:var(--accent-dim);color:var(--accent);padding:2px 10px;border-radius:var(--radius);font-size:11px}.log-output.svelte-y6pt47{flex:1;overflow:auto;padding:12px;font-family:var(--mono);font-size:11px;line-height:1.7;color:var(--text-1);background:var(--bg-0);border:1px solid var(--border);border-radius:var(--radius-lg)}.waiting.svelte-y6pt47{color:var(--text-2)}.error.svelte-y6pt47{color:var(--red)}.log-line.svelte-y6pt47{animation:fadeIn .1s ease both;display:flex;gap:1ch}.ts.svelte-y6pt47{color:var(--text-2);flex-shrink:0}.level.svelte-y6pt47{flex-shrink:0;width:5ch}.cat.svelte-y6pt47{color:var(--text-2);opacity:.6;flex-shrink:0;width:12ch;overflow:hidden;text-overflow:ellipsis}.msg.svelte-y6pt47{color:var(--text-0);white-space:pre-wrap;word-break:break-word;min-width:0}.data.svelte-y6pt47{color:var(--text-2);white-space:pre-wrap;word-break:break-word}.tab-bar.svelte-1tbaq71{display:flex}.tab.svelte-1tbaq71{padding:10px 16px;background:transparent;color:var(--text-2);font-size:12px;font-weight:500;border-bottom:2px solid transparent;transition:all .15s;margin-bottom:-1px}.tab.active.svelte-1tbaq71{color:var(--accent);border-bottom-color:var(--accent)}.container.svelte-1j9xdsd{max-width:600px;animation:fadeIn .2s ease both}.header.svelte-1j9xdsd{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}.title.svelte-1j9xdsd{font-size:15px;font-weight:600}.user-list.svelte-1j9xdsd{display:flex;flex-direction:column;gap:8px}.user-row.svelte-1j9xdsd{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius)}.username.svelte-1j9xdsd{color:var(--text-0);margin-right:12px}.role.svelte-1j9xdsd{font-size:11px;color:var(--text-2)}.role.admin.svelte-1j9xdsd{color:var(--accent)}.role.pending.svelte-1j9xdsd{color:var(--yellow)}.approve-btn.svelte-1j9xdsd{padding:4px 12px;background:var(--accent-dim);color:var(--accent);border-radius:var(--radius);font-size:11px;font-weight:500}.error.svelte-1j9xdsd{color:var(--red);font-size:12px;margin-bottom:12px}.empty.svelte-1j9xdsd{color:var(--text-2);text-align:center;padding:24px}.modal-header.svelte-1r58s0h{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--border);padding:0 16px;flex-shrink:0}.close-btn.svelte-1r58s0h{background:none;color:var(--text-2);font-size:14px;padding:4px 8px}.close-btn.svelte-1r58s0h:hover{color:var(--text-0)}.modal-body.svelte-1r58s0h{flex:1;overflow:auto;padding:16px}.error.svelte-16qbe83{padding:8px 16px;font-size:12px;color:var(--red)}.channel-list.svelte-16qbe83{flex:1;overflow:auto;padding:8px}.empty.svelte-16qbe83{color:var(--text-2);font-size:12px;text-align:center;padding:20px}.channel-row.svelte-16qbe83{display:flex;align-items:center;justify-content:space-between;padding:8px;border-radius:var(--radius)}.channel-row.svelte-16qbe83:hover{background:var(--bg-2)}.channel-info.svelte-16qbe83{display:flex;flex-direction:column;gap:2px}.channel-name.svelte-16qbe83{font-size:13px;color:var(--text-0);font-weight:500}.channel-meta.svelte-16qbe83{font-size:11px;color:var(--text-2)}.action-btn.svelte-16qbe83{padding:4px 12px;font-size:11px;border-radius:var(--radius);background:var(--accent-dim);color:var(--accent);font-weight:500}.action-btn.leave.svelte-16qbe83{background:var(--bg-3);color:var(--text-2)}.create-section.svelte-16qbe83{display:flex;gap:8px;padding:12px 16px;border-top:1px solid var(--border)}.name-input.svelte-16qbe83{flex:1;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px;color:var(--text-0);font-size:12px;font-family:var(--mono);outline:none}.name-input.svelte-16qbe83:focus{border-color:var(--border-bright)}.create-btn.svelte-16qbe83{padding:8px 14px;background:var(--accent-dim);color:var(--accent);border-radius:var(--radius);font-size:12px;font-weight:500}.create-btn.svelte-16qbe83:disabled{opacity:.4}.container.svelte-zwrylj{display:flex;align-items:center;justify-content:center;height:100%;padding:24px}.card.svelte-zwrylj{width:320px;padding:32px;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-lg)}.branding.svelte-zwrylj{margin-bottom:24px;text-align:center}.logo.svelte-zwrylj{font-size:18px;font-weight:600;margin-bottom:4px}.accent.svelte-zwrylj{color:var(--accent)}.subtitle.svelte-zwrylj{color:var(--text-2);font-size:12px}.input.svelte-zwrylj{width:100%;padding:10px 12px;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-0);font-family:var(--mono);font-size:13px;outline:none}.input.svelte-zwrylj:focus{border-color:var(--border-bright)}.mt-8.svelte-zwrylj{margin-top:8px}.error.svelte-zwrylj{color:var(--red);font-size:12px;margin-top:8px}.submit-btn.svelte-zwrylj{width:100%;padding:10px 16px;margin-top:16px;background:var(--accent-dim);color:var(--accent);border-radius:var(--radius);font-size:13px;font-weight:500;font-family:var(--mono);border:none;cursor:pointer}.link-btn.svelte-zwrylj{background:transparent;color:var(--text-2);font-size:12px;font-family:var(--mono);border:none;cursor:pointer;padding:0}.toggle.svelte-zwrylj{margin-top:16px;text-align:center}.pending-msg.svelte-zwrylj{color:var(--yellow);margin-bottom:16px}.badge.svelte-w1qana{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;border-radius:var(--radius);font-size:11px;font-weight:500;letter-spacing:.02em;text-transform:uppercase}.dot.svelte-w1qana{width:5px;height:5px;border-radius:50%}.home.svelte-1egy5tu{max-width:800px;animation:fadeIn .2s ease both}.section.svelte-1egy5tu{margin-bottom:24px}.section-header.svelte-1egy5tu{display:flex;align-items:center;gap:8px;font-size:11px;text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px}.section-title.svelte-1egy5tu{color:var(--text-2)}.empty-hint.svelte-1egy5tu{color:var(--text-2);font-size:12px}.code-hint.svelte-1egy5tu{color:var(--text-1)}.mind-row.svelte-1egy5tu{display:flex;gap:10px;overflow-x:auto;padding-bottom:4px}.home-mind-card.svelte-1egy5tu{display:flex;flex-direction:column;gap:6px;padding:10px 14px;border-radius:var(--radius-lg);background:var(--bg-2);border:1px solid var(--border);min-width:150px;transition:border-color .15s;flex-shrink:0;cursor:pointer;text-align:left;color:inherit;font-size:inherit}.home-mind-card.svelte-1egy5tu:hover{border-color:var(--border-bright)}.mind-card-header.svelte-1egy5tu{display:flex;align-items:center;gap:6px}.mind-name.svelte-1egy5tu{color:var(--text-0);font-weight:500;font-size:13px}.seed-tag.svelte-1egy5tu{font-size:9px;color:var(--yellow)}.channel-row.svelte-1egy5tu{display:flex;gap:4px;flex-wrap:wrap}.channel-chip.svelte-1egy5tu{font-size:10px;padding:1px 5px;border-radius:3px;background:var(--accent-dim);color:var(--accent)}.mind-activity.svelte-1egy5tu{font-size:10px;color:var(--text-2)}.conv-list.svelte-1egy5tu{display:flex;flex-direction:column;gap:8px}.conv-card.svelte-1egy5tu{display:flex;align-items:center;gap:12px;padding:10px 14px;border-radius:var(--radius-lg);background:var(--bg-2);border:1px solid var(--border);transition:border-color .15s}.conv-card.svelte-1egy5tu:hover{border-color:var(--border-bright)}.conv-content.svelte-1egy5tu{flex:1;min-width:0}.conv-header.svelte-1egy5tu{display:flex;align-items:center;gap:6px;margin-bottom:2px}.conv-label.svelte-1egy5tu{color:var(--text-0);font-weight:500;font-size:12px}.conv-preview.svelte-1egy5tu{font-size:11px;color:var(--text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.conv-time.svelte-1egy5tu{color:var(--text-2);font-size:10px;flex-shrink:0}.pages-list.svelte-1egy5tu{display:flex;flex-direction:column;gap:4px}.page-row.svelte-1egy5tu{display:flex;justify-content:space-between;align-items:center;width:100%;padding:8px 12px;border-radius:var(--radius);background:var(--bg-2);border:1px solid var(--border);color:var(--text-0);font-size:12px;transition:border-color .15s;cursor:pointer;text-align:left}.page-row.svelte-1egy5tu:hover{border-color:var(--border-bright)}.page-mind.svelte-1egy5tu{color:var(--text-2)}.page-time.svelte-1egy5tu{color:var(--text-2);font-size:10px}.chat.svelte-6z343n{display:flex;flex-direction:column;height:100%}.orientation-bar.svelte-6z343n{padding:6px 12px;text-align:center;color:var(--yellow);font-size:11px;font-weight:500;letter-spacing:.05em;text-transform:uppercase;opacity:.6;border-bottom:1px solid var(--yellow-bg)}.messages.svelte-6z343n{flex:1;overflow:auto;padding:16px 0}.empty.svelte-6z343n{color:var(--text-2);text-align:center;padding:40px;font-size:13px}.error.svelte-6z343n{color:var(--red)}.entry.svelte-6z343n{display:flex;gap:10px;margin-bottom:16px;animation:fadeIn .2s ease both}.sender.svelte-6z343n{font-size:11px;font-weight:600;flex-shrink:0;margin-top:2px;text-transform:uppercase}.entry-content.svelte-6z343n{flex:1;min-width:0}.user-text.svelte-6z343n{color:var(--text-0);white-space:pre-wrap}.chat-image.svelte-6z343n{max-width:300px;max-height:200px;border-radius:var(--radius);margin-top:4px}.divider.svelte-6z343n{display:flex;align-items:center;gap:12px;margin:20px 0;color:var(--text-2);font-size:11px;letter-spacing:.03em}.divider-line.svelte-6z343n{flex:1;height:1px;background:var(--border)}.tool-block.svelte-6z343n{margin-bottom:8px;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;font-size:12px}.tool-header.svelte-6z343n{width:100%;display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:var(--bg-3);font-size:12px;font-family:var(--mono);text-align:left}.tool-label.svelte-6z343n{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.tool-arrow.svelte-6z343n{color:var(--text-2);margin-right:6px}.tool-status.svelte-6z343n{color:var(--accent);font-size:10px;flex-shrink:0;margin-left:8px}.tool-status.error.svelte-6z343n{color:var(--red)}.tool-detail.svelte-6z343n{padding:10px;background:var(--bg-1)}.tool-section-label.svelte-6z343n{margin-bottom:6px;color:var(--text-2)}.tool-pre.svelte-6z343n{color:var(--text-1);white-space:pre-wrap;word-break:break-all;font-size:11px;line-height:1.5}.tool-output.svelte-6z343n{max-height:200px;overflow:auto}.tool-output.error.svelte-6z343n{color:var(--red)}.image-strip.svelte-6z343n{display:flex;gap:8px;padding:8px 0;border-top:1px solid var(--border);overflow-x:auto}.image-preview.svelte-6z343n{position:relative;flex-shrink:0}.preview-thumb.svelte-6z343n{height:60px;border-radius:var(--radius);border:1px solid var(--border)}.remove-image.svelte-6z343n{position:absolute;top:-4px;right:-4px;width:18px;height:18px;border-radius:50%;background:var(--bg-3);color:var(--text-1);font-size:11px;display:flex;align-items:center;justify-content:center;border:1px solid var(--border);cursor:pointer;padding:0}.typing.svelte-6z343n{padding:4px 0;font-size:12px;color:var(--text-2);animation:pulse 1.5s ease infinite}.input-area.svelte-6z343n{border-top:1px solid var(--border);padding:12px 0 0;display:flex;gap:8px}.attach-btn.svelte-6z343n{padding:0 10px;background:var(--bg-2);color:var(--text-1);border-radius:var(--radius);font-size:16px;border:1px solid var(--border);cursor:pointer;flex-shrink:0}.chat-input.svelte-6z343n{flex:1;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:10px 12px;color:var(--text-0);font-family:var(--mono);font-size:13px;resize:none;outline:none;overflow:hidden;transition:border-color .15s}.chat-input.svelte-6z343n:focus{border-color:var(--border-bright)}.send-btn.svelte-6z343n{padding:0 16px;background:var(--bg-3);color:var(--text-2);border-radius:var(--radius);font-size:12px;font-weight:500;transition:all .15s}.send-btn.active.svelte-6z343n{background:var(--accent-dim);color:var(--accent)}.main-frame.svelte-n1trtr{height:100%;overflow:hidden}.frame-content.svelte-n1trtr{height:100%;overflow:auto}.frame-content.padded.svelte-n1trtr{padding:24px}.page-iframe.svelte-n1trtr{width:100%;height:100%;border:none}.event.svelte-173x8i5{position:relative;padding:6px 8px 6px 20px;animation:fadeIn .2s ease both}.event.svelte-173x8i5:after{content:"";position:absolute;left:-2px;top:12px;bottom:-12px;width:2px;background:var(--type-color);opacity:0;transition:opacity .15s}.event.svelte-173x8i5:hover:after{opacity:1}.event.collapsible.svelte-173x8i5{cursor:pointer}.marker.svelte-173x8i5{position:absolute;left:-5px;top:12px;width:8px;height:8px;border-radius:50%;z-index:1}.event-header.svelte-173x8i5{display:flex;align-items:center;gap:8px;margin-bottom:4px}.time.svelte-173x8i5{font-size:10px;color:var(--text-2);flex-shrink:0}.type-badge.svelte-173x8i5{font-size:10px;padding:1px 6px;border-radius:12px;font-weight:500}.channel-tag.svelte-173x8i5{font-size:10px;color:var(--text-2);background:var(--bg-3);padding:1px 6px;border-radius:var(--radius)}.chevron.svelte-173x8i5{font-size:9px;color:var(--text-2)}.event-body.svelte-173x8i5{font-size:13px;line-height:1.6}.sender.svelte-173x8i5{font-size:11px;font-weight:600;text-transform:uppercase;margin-right:8px}.sender.inbound.svelte-173x8i5{color:var(--blue)}.sender.outbound.svelte-173x8i5{color:var(--accent)}.user-text.svelte-173x8i5{display:inline;white-space:pre-wrap;color:var(--text-0)}.summary.svelte-173x8i5{font-size:12px;color:var(--text-1)}.summary.error.svelte-173x8i5{color:var(--red)}.dim.svelte-173x8i5{color:var(--text-2)}.detail.svelte-173x8i5,.detail-text.svelte-173x8i5{margin-top:6px;font-size:11px;background:var(--bg-3);border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px;overflow-x:auto;max-height:400px;overflow-y:auto;white-space:pre-wrap;word-break:break-all}.detail.svelte-173x8i5{font-family:var(--mono)}.detail.error.svelte-173x8i5{color:var(--red);border-color:var(--red-dim)}.detail-text.svelte-173x8i5{color:var(--text-2)}.usage-line.svelte-173x8i5{font-size:12px;color:var(--purple)}.model.svelte-173x8i5{color:var(--text-2);margin-left:6px;font-size:11px}.session-id.svelte-173x8i5{font-size:11px;color:var(--text-1);font-weight:600;margin-left:4px}.filters.svelte-h6u4xu{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:8px 0 12px;border-bottom:1px solid var(--border)}.custom-select.svelte-h6u4xu{position:relative}.select-trigger.svelte-h6u4xu{display:flex;align-items:center;gap:6px;background:var(--bg-2);color:var(--text-1);border:1px solid var(--border);border-radius:var(--radius);padding:4px 8px 4px 10px;font-size:12px;font-family:var(--mono);cursor:pointer;transition:border-color .15s,color .15s;min-width:120px;text-align:left}.select-trigger.svelte-h6u4xu:hover{border-color:var(--border-bright);color:var(--text-0)}.custom-select.open.svelte-h6u4xu .select-trigger:where(.svelte-h6u4xu){border-color:var(--border-bright);color:var(--text-0)}.select-value.svelte-h6u4xu{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select-arrow.svelte-h6u4xu{font-size:10px;color:var(--text-2);flex-shrink:0}.select-menu.svelte-h6u4xu{position:absolute;top:calc(100% + 4px);left:0;min-width:100%;max-height:240px;overflow-y:auto;background:var(--bg-2);border:1px solid var(--border-bright);border-radius:var(--radius);z-index:10;box-shadow:0 4px 16px #0006}.select-option.svelte-h6u4xu{display:block;width:100%;text-align:left;padding:6px 10px;font-size:12px;font-family:var(--mono);color:var(--text-1);background:none;border:none;cursor:pointer;white-space:nowrap;transition:background .1s,color .1s}.select-option.svelte-h6u4xu:hover{background:var(--bg-3);color:var(--text-0)}.select-option.selected.svelte-h6u4xu{color:var(--accent)}.option-meta.svelte-h6u4xu{color:var(--text-2);margin-left:6px}.types-menu.svelte-h6u4xu{min-width:140px}.types-actions.svelte-h6u4xu{display:flex;gap:4px;padding:4px 8px;border-bottom:1px solid var(--border)}.types-action.svelte-h6u4xu{font-size:10px;font-family:var(--mono);color:var(--text-2);background:none;border:none;cursor:pointer;padding:2px 6px;border-radius:var(--radius)}.types-action.svelte-h6u4xu:hover{color:var(--text-1);background:var(--bg-3)}.type-option.svelte-h6u4xu{display:flex;align-items:center;gap:8px}.type-dot.svelte-h6u4xu{width:6px;height:6px;border-radius:50%;flex-shrink:0;transition:background .15s}.live-pill.svelte-h6u4xu{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:12px;font-size:11px;cursor:pointer;border:1px solid var(--border);background:var(--bg-3);color:var(--text-2);font-family:var(--mono);transition:all .15s}.live-pill.svelte-h6u4xu:hover{border-color:var(--border-bright);color:var(--text-1)}.live-pill.active.svelte-h6u4xu{border-color:var(--accent-border);background:color-mix(in srgb,var(--accent) 8%,transparent);color:var(--text-0)}.live-dot.svelte-h6u4xu{width:6px;height:6px;border-radius:50%;background:var(--text-2);flex-shrink:0;transition:background .15s}.live-dot.active.svelte-h6u4xu{background:var(--accent);animation:pulse 2s infinite}.divider.svelte-c707oo{display:flex;align-items:center;gap:12px;margin:20px 0 16px}.line.svelte-c707oo{flex:1;border-top:1px solid var(--border)}.label.svelte-c707oo{font-size:11px;color:var(--text-2);white-space:nowrap;display:flex;align-items:center;gap:6px}.session-id.svelte-c707oo{color:var(--text-1);font-weight:600}.sep.svelte-c707oo{color:var(--border-bright)}.history.svelte-i5te79{display:flex;flex-direction:column;height:100%;overflow:hidden;position:relative}.timeline.svelte-i5te79{flex:1;overflow:auto;padding-top:8px}.timeline-rail.svelte-i5te79{position:relative;padding-left:4px;margin-left:3px}.timeline-rail.svelte-i5te79:before{content:"";position:absolute;left:2px;top:0;bottom:0;width:2px;background:var(--timeline-rail)}.error.svelte-i5te79{color:var(--red);text-align:center;padding:40px;font-size:13px}.empty.svelte-i5te79{color:var(--text-2);text-align:center;padding:40px;font-size:13px}.load-older.svelte-i5te79{padding:8px 0 16px;text-align:center}.load-older-btn.svelte-i5te79{padding:4px 14px;background:var(--bg-3);color:var(--text-1);border-radius:var(--radius);font-size:11px}.loading-more.svelte-i5te79{text-align:center;color:var(--text-2);font-size:12px;padding:12px;animation:pulse 1.5s infinite}.jump-btn.svelte-i5te79{position:absolute;bottom:16px;left:50%;transform:translate(-50%);padding:6px 16px;background:var(--accent-dim);color:var(--accent);border-radius:var(--radius);font-size:12px;animation:fadeIn .2s ease both;z-index:10}.modal-body.svelte-l4ioia{flex:1;overflow:auto;padding:8px 16px 16px}.error.svelte-l4ioia{color:var(--red);padding:8px 0;font-size:12px}.empty.svelte-l4ioia{color:var(--text-2);padding:24px;text-align:center;font-size:13px}.skill-list.svelte-l4ioia{display:flex;flex-direction:column}.skill-row.svelte-l4ioia{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0;border-bottom:1px solid var(--border)}.skill-row.svelte-l4ioia:last-child{border-bottom:none}.skill-info.svelte-l4ioia{flex:1;min-width:0}.skill-name.svelte-l4ioia{font-size:13px;font-weight:500;color:var(--text-0)}.skill-desc.svelte-l4ioia{font-size:12px;color:var(--text-1);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.skill-meta.svelte-l4ioia{font-size:11px;color:var(--text-2);margin-top:2px}.skill-actions.svelte-l4ioia{flex-shrink:0}.installed-tag.svelte-l4ioia{font-size:11px;color:var(--text-2);font-style:italic}.action-btn.svelte-l4ioia{padding:4px 10px;font-size:11px;border-radius:var(--radius);font-weight:500}.action-btn.svelte-l4ioia:disabled{opacity:.5}.install-btn.svelte-l4ioia{background:var(--accent-dim);color:var(--accent)}.error.svelte-jfofjj{color:var(--red);padding:8px 12px;font-size:12px}.empty.svelte-jfofjj{color:var(--text-2);padding:24px;text-align:center;font-size:13px}.section-header.svelte-jfofjj{display:flex;align-items:center;justify-content:space-between;padding:8px 12px}.section-title.svelte-jfofjj{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-2)}.add-btn.svelte-jfofjj{padding:4px 12px;font-size:11px;border-radius:var(--radius);background:var(--accent-dim);color:var(--accent);font-weight:500}.skill-list.svelte-jfofjj{display:flex;flex-direction:column}.skill-row.svelte-jfofjj{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border-bottom:1px solid var(--border)}.skill-row.svelte-jfofjj:last-child{border-bottom:none}.skill-row.svelte-jfofjj:hover{background:var(--bg-2)}.skill-info.svelte-jfofjj{flex:1;min-width:0}.skill-name.svelte-jfofjj{font-size:13px;font-weight:500;color:var(--text-0);display:flex;align-items:center;gap:8px}.skill-desc.svelte-jfofjj{font-size:12px;color:var(--text-1);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.skill-meta.svelte-jfofjj{font-size:11px;color:var(--text-2);margin-top:2px}.update-badge.svelte-jfofjj{font-size:10px;padding:1px 6px;border-radius:8px;background:var(--accent-dim);color:var(--accent);font-weight:500}.upstream-tag.svelte-jfofjj{color:var(--text-2)}.local-tag.svelte-jfofjj{font-style:italic;color:var(--text-2)}.skill-actions.svelte-jfofjj{display:flex;gap:4px;flex-shrink:0}.action-btn.svelte-jfofjj{padding:4px 10px;font-size:11px;border-radius:var(--radius);font-weight:500}.action-btn.svelte-jfofjj:disabled{opacity:.5}.update-btn.svelte-jfofjj{background:var(--accent-dim);color:var(--accent)}.publish-btn.svelte-jfofjj{background:var(--bg-3);color:var(--text-1)}.remove-btn.svelte-jfofjj{background:var(--bg-3);color:var(--text-2)}.remove-btn.svelte-jfofjj:hover{color:var(--red)}.error.svelte-16y8q82{color:var(--red);padding:16px}.empty.svelte-16y8q82{color:var(--text-2);padding:24px;text-align:center}.table-wrap.svelte-16y8q82{overflow:auto}.variant-table.svelte-16y8q82{width:100%;border-collapse:collapse;font-size:13px}.variant-table.svelte-16y8q82 th:where(.svelte-16y8q82){text-align:left;color:var(--text-2);font-size:11px;text-transform:uppercase;letter-spacing:.04em;padding:8px 12px;border-bottom:1px solid var(--border);font-weight:500}.variant-row.svelte-16y8q82{animation:fadeIn .2s ease both}.variant-row.svelte-16y8q82 td:where(.svelte-16y8q82){padding:10px 12px;border-bottom:1px solid var(--border)}.name-cell.svelte-16y8q82{color:var(--text-0);font-weight:500}.branch-cell.svelte-16y8q82{color:var(--text-1)}.port-cell.svelte-16y8q82{color:var(--text-2)}.modal-header.svelte-5k8fm{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--border);padding:0 16px;flex-shrink:0}.header-left.svelte-5k8fm{display:flex;align-items:center;gap:10px}.mind-name.svelte-5k8fm{font-size:14px;font-weight:600;color:var(--text-0)}.header-right.svelte-5k8fm{display:flex;align-items:center;gap:0}.close-btn.svelte-5k8fm{background:none;color:var(--text-2);font-size:14px;padding:4px 8px;margin-left:8px}.close-btn.svelte-5k8fm:hover{color:var(--text-0)}.modal-body.svelte-5k8fm{flex:1;overflow:auto;padding:16px}.error-msg.svelte-5k8fm{color:var(--red);margin-bottom:12px;font-size:13px}.action-btn.svelte-5k8fm{padding:4px 12px;border-radius:var(--radius);font-size:11px;font-weight:500;transition:opacity .15s}.start-btn.svelte-5k8fm{background:var(--accent-dim);color:var(--accent)}.stop-btn.svelte-5k8fm{background:var(--red-dim);color:var(--red)}.connections-empty.svelte-5k8fm{color:var(--text-2);padding:24px;text-align:center}.connections-list.svelte-5k8fm{padding:8px 0;display:flex;flex-direction:column;gap:12px}.connection-card.svelte-5k8fm{display:flex;align-items:flex-start;gap:16px;padding:16px;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius-lg)}.connection-icon.svelte-5k8fm{width:40px;height:40px;border-radius:var(--radius);background:var(--bg-3);display:flex;align-items:center;justify-content:center;font-size:18px;color:var(--accent);flex-shrink:0}.connection-info.svelte-5k8fm{flex:1;min-width:0}.connection-header.svelte-5k8fm{display:flex;align-items:center;gap:8px;margin-bottom:6px}.connection-name.svelte-5k8fm{font-weight:600;color:var(--text-0)}.connection-bot.svelte-5k8fm{font-size:13px;color:var(--text-1);margin-bottom:4px}.bot-name.svelte-5k8fm{color:var(--text-0)}.connection-time.svelte-5k8fm{font-size:11px;color:var(--text-2)}.modal-content.svelte-sa0ylk{padding:20px;display:flex;flex-direction:column;gap:12px;max-height:60vh;overflow:auto}.modal-title.svelte-sa0ylk{font-weight:600;color:var(--text-0);font-size:14px}.title-input.svelte-sa0ylk{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px;color:var(--text-0);font-size:12px;outline:none;font-family:var(--mono)}.hint.svelte-sa0ylk{color:var(--text-2);font-size:11px;padding:8px}.error.svelte-sa0ylk{color:var(--red);font-size:11px}.tag-input-wrapper.svelte-sa0ylk{position:relative}.tag-input.svelte-sa0ylk{display:flex;flex-wrap:wrap;align-items:center;gap:4px;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:6px 8px;min-height:32px;cursor:text}.tag-input.svelte-sa0ylk:focus-within{border-color:var(--accent)}.tag.svelte-sa0ylk{display:flex;align-items:center;gap:4px;background:var(--bg-3);border-radius:3px;padding:2px 6px;font-size:11px;color:var(--text-0);white-space:nowrap}.tag-name.svelte-sa0ylk{line-height:1}.tag-remove.svelte-sa0ylk{cursor:pointer;color:var(--text-2);font-size:13px;line-height:1;margin-left:2px}.tag-remove.svelte-sa0ylk:hover{color:var(--text-0)}.dot.svelte-sa0ylk{width:6px;height:6px;border-radius:50%;flex-shrink:0}.tag-text-input.svelte-sa0ylk{flex:1;min-width:60px;background:none;border:none;outline:none;color:var(--text-0);font-size:12px;padding:2px 0;font-family:var(--mono)}.tag-text-input.svelte-sa0ylk::placeholder{color:var(--text-2)}.dropdown.svelte-sa0ylk{position:absolute;top:100%;left:0;right:0;margin-top:4px;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius);max-height:200px;overflow:auto;z-index:10}.dropdown-item.svelte-sa0ylk{display:flex;align-items:center;gap:8px;padding:6px 10px;cursor:pointer;font-size:12px;color:var(--text-0)}.dropdown-item.svelte-sa0ylk:hover{background:var(--bg-2)}.item-name.svelte-sa0ylk{flex:1;overflow:hidden;text-overflow:ellipsis}.item-badge.svelte-sa0ylk{color:var(--accent);font-size:10px;flex-shrink:0}.actions.svelte-sa0ylk{display:flex;gap:8px;justify-content:flex-end}.cancel-btn.svelte-sa0ylk{padding:6px 14px;background:var(--bg-2);color:var(--text-1);border-radius:var(--radius);font-size:12px;border:1px solid var(--border)}.create-btn.svelte-sa0ylk{padding:6px 14px;background:var(--accent-dim);color:var(--accent);border-radius:var(--radius);font-size:12px;font-weight:500}.modal-content.svelte-esytdb{padding:24px;display:flex;flex-direction:column;gap:14px}.modal-title.svelte-esytdb{font-weight:600;color:var(--text-0);font-size:14px}.field.svelte-esytdb{display:flex;flex-direction:column;gap:4px}.label.svelte-esytdb{color:var(--text-2);font-size:11px}.input.svelte-esytdb{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px;color:var(--text-0);font-size:13px;outline:none;font-family:var(--mono)}.select.svelte-esytdb{appearance:auto}.error.svelte-esytdb{color:var(--red);font-size:11px}.actions.svelte-esytdb{display:flex;gap:8px;justify-content:flex-end}.cancel-btn.svelte-esytdb{padding:6px 14px;background:var(--bg-2);color:var(--text-1);border-radius:var(--radius);font-size:12px;border:1px solid var(--border)}.plant-btn.svelte-esytdb{padding:6px 14px;background:var(--yellow);color:var(--bg-0);border-radius:var(--radius);font-size:12px;font-weight:600}.advanced-toggle.svelte-esytdb{background:transparent;color:var(--text-2);font-size:11px;font-family:var(--mono);border:none;cursor:pointer;padding:0;display:flex;align-items:center;gap:4px;transition:color .15s}.advanced-toggle.svelte-esytdb:hover{color:var(--text-1)}.caret.svelte-esytdb{font-size:8px}.textarea.svelte-esytdb{resize:vertical;min-height:80px;font-size:12px;line-height:1.5}.hint.svelte-esytdb{color:var(--text-2);font-size:10px;font-family:var(--mono)}.conv-list.svelte-2bx51q{display:flex;flex-direction:column}.section-header.svelte-2bx51q{display:flex;align-items:center;justify-content:space-between;padding:10px 12px 4px;font-size:10px;font-weight:600;color:var(--text-2);letter-spacing:.05em;text-transform:uppercase}.browse-btn.svelte-2bx51q{font-size:10px;color:var(--accent);background:none;padding:0;text-transform:lowercase;letter-spacing:0;font-weight:500}.conv-item.svelte-2bx51q{padding:6px 12px;margin:0 4px;cursor:pointer;border-radius:var(--radius);display:flex;flex-direction:column;gap:2px;transition:background .1s}.conv-item.svelte-2bx51q:hover{background:var(--bg-2)}.conv-item.active.svelte-2bx51q{background:var(--bg-3)}.conv-item-header.svelte-2bx51q{display:flex;align-items:center;justify-content:space-between;gap:4px}.conv-item-label.svelte-2bx51q{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:var(--text-1);display:flex;align-items:center;gap:6px}.conv-item-label.active.svelte-2bx51q{color:var(--text-0)}.conv-label-text.svelte-2bx51q{overflow:hidden;text-overflow:ellipsis}.seed-tag.svelte-2bx51q{font-size:9px;color:var(--yellow);flex-shrink:0}.delete-btn.svelte-2bx51q{background:transparent;color:var(--text-2);font-size:11px;padding:0 4px;flex-shrink:0}.menu-btn.svelte-2bx51q{background:transparent;color:var(--text-2);font-size:11px;padding:0 4px;flex-shrink:0;opacity:0;transition:opacity .1s;letter-spacing:1px}.conv-item.svelte-2bx51q:hover .menu-btn:where(.svelte-2bx51q),.menu-btn.visible.svelte-2bx51q{opacity:1}.menu-btn.svelte-2bx51q:hover{color:var(--text-0)}.member-count.svelte-2bx51q{font-size:10px;color:var(--text-2);padding-left:1px}.status-dot.svelte-2bx51q{width:7px;height:7px;border-radius:50%;flex-shrink:0;border:none;padding:0;cursor:pointer}.status-dot.svelte-2bx51q:hover{transform:scale(1.3)}.empty.svelte-2bx51q{color:var(--text-2);font-size:11px;padding:8px 12px;text-align:center}.context-menu.svelte-2bx51q{position:fixed;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius);padding:4px 0;z-index:200;min-width:120px;box-shadow:0 4px 12px #0000004d}.context-item.svelte-2bx51q{display:block;width:100%;padding:6px 12px;background:none;color:var(--text-1);font-size:12px;text-align:left;white-space:nowrap}.context-item.svelte-2bx51q:hover{background:var(--bg-2);color:var(--text-0)}.pages-list.svelte-5tasjp{display:flex;flex-direction:column}.page-item.svelte-5tasjp{display:flex;justify-content:space-between;align-items:center;padding:6px 12px;margin:0 4px;font-size:11px;color:var(--text-1);border-radius:var(--radius);transition:background .1s;cursor:pointer;background:none;text-align:left}.page-item.svelte-5tasjp:hover{background:var(--bg-2)}.page-mind.svelte-5tasjp{color:var(--text-2)}.page-time.svelte-5tasjp{color:var(--text-2);font-size:10px;flex-shrink:0}.empty.svelte-5tasjp{color:var(--text-2);font-size:11px;padding:8px 12px}.sidebar-inner.svelte-k3swf5{display:flex;flex-direction:column;height:100%;overflow:hidden}.sections.svelte-k3swf5{flex:1;overflow-y:auto;overflow-x:hidden;padding-top:4px}.section.svelte-k3swf5{margin-bottom:2px}.section-header-row.svelte-k3swf5{display:flex;align-items:center;padding-right:8px}.section-toggle.svelte-k3swf5{display:flex;align-items:center;gap:4px;flex:1;padding:6px 12px;background:none;color:var(--text-2);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;text-align:left}.section-toggle.svelte-k3swf5:hover{color:var(--text-1)}.toggle-icon.svelte-k3swf5{font-size:9px;width:10px}.section-add.svelte-k3swf5{background:none;color:var(--text-2);font-size:14px;padding:2px 6px;border-radius:var(--radius);flex-shrink:0}.section-add.svelte-k3swf5:hover{color:var(--text-0);background:var(--bg-2)}.status-bar.svelte-cuxhxk{height:28px;display:flex;align-items:center;justify-content:space-between;padding:0 12px;background:var(--bg-1);border-top:1px solid var(--border);font-size:11px;color:var(--text-2);flex-shrink:0}.status-left.svelte-cuxhxk,.status-right.svelte-cuxhxk{display:flex;align-items:center;gap:8px}.dot.svelte-cuxhxk{width:6px;height:6px;border-radius:50%;background:var(--accent);display:inline-block;flex-shrink:0}.dot.disconnected.svelte-cuxhxk{background:var(--red)}.sep.svelte-cuxhxk{color:var(--border)}.menu-anchor.svelte-cuxhxk{position:relative}.status-btn.svelte-cuxhxk{background:none;color:var(--text-2);font-size:11px;padding:2px 4px;display:flex;align-items:center;gap:5px;border-radius:3px}.status-btn.svelte-cuxhxk:hover{color:var(--text-0);background:var(--bg-2)}.username-btn.svelte-cuxhxk{color:var(--text-1)}.dropdown.svelte-cuxhxk{position:absolute;bottom:calc(100% + 4px);left:0;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);min-width:120px;padding:4px 0;z-index:100;box-shadow:0 -2px 8px #0000004d}.dropdown.right.svelte-cuxhxk{left:auto;right:0}.dropdown-item.svelte-cuxhxk{display:block;width:100%;text-align:left;padding:6px 12px;background:none;color:var(--text-1);font-size:11px;white-space:nowrap}.dropdown-item.svelte-cuxhxk:hover{background:var(--bg-3);color:var(--text-0)}.minds-dropdown.svelte-cuxhxk{min-width:160px}.mind-item.svelte-cuxhxk{display:flex;align-items:center;gap:8px}.mind-dot.svelte-cuxhxk{width:6px;height:6px;border-radius:50%;flex-shrink:0}.dropdown-divider.svelte-cuxhxk{height:1px;background:var(--border);margin:4px 0}.seed-item.svelte-cuxhxk{color:var(--accent)}.banner.svelte-h3c10m{display:flex;align-items:center;justify-content:center;gap:12px;padding:6px 16px;background:var(--accent-bg);border-bottom:1px solid var(--accent-dim);color:var(--accent);font-size:12px;font-family:var(--mono);flex-shrink:0}.update-btn.svelte-h3c10m{background:var(--accent-dim);color:var(--accent);border:1px solid var(--accent);border-radius:var(--radius);padding:2px 10px;font-size:11px;font-family:var(--mono);cursor:pointer}.dismiss-btn.svelte-h3c10m{background:transparent;color:var(--accent);border:none;font-size:16px;line-height:1;cursor:pointer;padding:0 4px}.error.svelte-h3c10m{color:var(--red)}.updating.svelte-h3c10m{animation:pulse 1.5s ease-in-out infinite}.modal-body.svelte-1453wyc{padding:16px}.section-title.svelte-1453wyc{font-size:12px;font-weight:600;color:var(--text-1);margin:0 0 12px}.field.svelte-1453wyc{display:block;margin-bottom:10px}.label.svelte-1453wyc{display:block;font-size:11px;color:var(--text-2);margin-bottom:4px}input.svelte-1453wyc{width:100%;padding:6px 10px;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-0);font-size:12px;font-family:var(--mono);box-sizing:border-box}input.svelte-1453wyc:focus{outline:none;border-color:var(--accent)}.save-btn.svelte-1453wyc{margin-top:4px;padding:6px 14px;background:var(--accent-dim);color:var(--accent);border-radius:var(--radius);font-size:11px;font-weight:500}.save-btn.svelte-1453wyc:hover:not(:disabled){background:var(--accent);color:var(--bg-0)}.save-btn.svelte-1453wyc:disabled{opacity:.5}.message.svelte-1453wyc{font-size:11px;padding:6px 10px;border-radius:var(--radius);margin-bottom:10px}.message.error.svelte-1453wyc{color:var(--red);background:var(--red-bg)}.message.success.svelte-1453wyc{color:var(--accent);background:var(--accent-dim)}.loading.svelte-14lg4b7{color:var(--text-2);padding:24px;text-align:center}.full-height.svelte-14lg4b7{height:100%}.shell.svelte-14lg4b7{height:100%;display:flex;flex-direction:column}.shell-body.svelte-14lg4b7{flex:1;display:flex;overflow:hidden}.sidebar.svelte-14lg4b7{display:flex;flex-direction:column;flex-shrink:0;border-right:1px solid var(--border);background:var(--bg-1);overflow:hidden}.resize-handle.svelte-14lg4b7{width:4px;cursor:col-resize;flex-shrink:0;background:transparent;transition:background .15s}.resize-handle.svelte-14lg4b7:hover{background:var(--border)}.main-frame.svelte-14lg4b7{flex:1;overflow:hidden;min-width:0}:root{--bg-0: #0a0c0f;--bg-1: #11141a;--bg-2: #181c24;--bg-3: #1f2430;--border: #2a3040;--border-bright: #3a4560;--text-0: #e8ecf4;--text-1: #a0aabb;--text-2: #6a7588;--accent: #4ade80;--accent-dim: #22613e;--accent-bg: rgba(74, 222, 128, .08);--red: #f87171;--red-dim: #7f1d1d;--yellow: #fbbf24;--yellow-dim: #78350f;--blue: #60a5fa;--purple: #c084fc;--overlay: rgba(0, 0, 0, .6);--yellow-bg: rgba(251, 191, 36, .08);--blue-bg: rgba(96, 165, 250, .08);--red-bg: rgba(248, 113, 113, .08);--muted-bg: rgba(106, 117, 136, .08);--red-border: rgba(248, 113, 113, .2);--accent-border: rgba(74, 222, 128, .2);--timeline-rail: #333;--mono: "IBM Plex Mono", "SF Mono", "Fira Code", monospace;--radius: 6px;--radius-lg: 10px}*{margin:0;padding:0;box-sizing:border-box}html,body,#root{height:100%;background:var(--bg-0);color:var(--text-0);font-family:var(--mono);font-size:13px;line-height:1.6;-webkit-font-smoothing:antialiased}::selection{background:var(--accent-dim);color:var(--accent)}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--border-bright)}a{color:inherit;text-decoration:none}button{font-family:var(--mono);cursor:pointer;border:none}button:focus{outline:none}button:focus-visible{outline:1px solid var(--accent);outline-offset:2px}a:focus-visible{outline:1px solid var(--accent);outline-offset:2px}.app{height:100%;display:flex;flex-direction:column}@keyframes fadeIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes slideIn{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}.markdown-body{word-break:break-word;color:var(--text-0);line-height:1.6}.markdown-body p{margin:0 0 8px}.markdown-body p:last-child{margin-bottom:0}.markdown-body pre{background:var(--bg-3);border:1px solid var(--border);border-radius:var(--radius);padding:10px 12px;overflow-x:auto;margin:8px 0;font-size:12px;line-height:1.5}.markdown-body code{font-family:var(--mono);font-size:12px;background:var(--bg-3);padding:1px 4px;border-radius:3px}.markdown-body pre code{background:none;padding:0}.markdown-body a{color:var(--blue);text-decoration:underline}.markdown-body ul,.markdown-body ol{margin:4px 0;padding-left:20px}.markdown-body li{margin:2px 0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin:12px 0 6px;font-weight:600;color:var(--text-0)}.markdown-body h1{font-size:18px}.markdown-body h2{font-size:16px}.markdown-body h3{font-size:14px}.markdown-body blockquote{border-left:3px solid var(--border-bright);margin:8px 0;padding:4px 12px;color:var(--text-1)}.markdown-body table{border-collapse:collapse;margin:8px 0}.markdown-body th,.markdown-body td{border:1px solid var(--border);padding:6px 10px;font-size:12px}.markdown-body th{background:var(--bg-3);font-weight:600}.markdown-body hr{border:none;border-top:1px solid var(--border);margin:12px 0}
|