@vheins/local-memory-mcp 0.7.3 → 0.7.4
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/{chunk-ZCK6RZFX.js → chunk-BSASVWKJ.js} +44 -22
- package/dist/dashboard/public/assets/{index-Bd8FKzVy.js → index-CkSUOqPH.js} +1 -1
- package/dist/dashboard/public/assets/index-OXSJZbwn.css +1 -0
- package/dist/dashboard/public/index.html +2 -2
- package/dist/dashboard/server.js +52 -3
- package/dist/mcp/server.js +151 -23
- package/package.json +1 -1
- package/dist/dashboard/public/assets/index-Bd7v94SO.css +0 -1
package/dist/dashboard/server.js
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
TOOL_DEFINITIONS,
|
|
7
7
|
listResources,
|
|
8
8
|
logger
|
|
9
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-BSASVWKJ.js";
|
|
10
10
|
|
|
11
11
|
// src/dashboard/server.ts
|
|
12
12
|
import express from "express";
|
|
@@ -845,11 +845,60 @@ app.use((req, res, next) => {
|
|
|
845
845
|
next();
|
|
846
846
|
});
|
|
847
847
|
app.use("/api", routes_default);
|
|
848
|
-
|
|
848
|
+
function getStaticRoot() {
|
|
849
|
+
const possibleRoots = [
|
|
850
|
+
path3.join(__dirname3, "public"),
|
|
851
|
+
// Production bundled path
|
|
852
|
+
path3.join(process.cwd(), "dist", "dashboard", "public"),
|
|
853
|
+
// Root-relative dist path
|
|
854
|
+
path3.join(process.cwd(), "src", "dashboard", "public")
|
|
855
|
+
// Source path (unbuilt)
|
|
856
|
+
];
|
|
857
|
+
for (const root of possibleRoots) {
|
|
858
|
+
if (fs3.existsSync(path3.join(root, "index.html"))) {
|
|
859
|
+
return root;
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
return possibleRoots[0];
|
|
863
|
+
}
|
|
864
|
+
var staticRoot = getStaticRoot();
|
|
865
|
+
logger.debug("Dashboard serving assets from", { staticRoot });
|
|
849
866
|
app.use(express.static(staticRoot));
|
|
850
867
|
app.use((req, res, next) => {
|
|
851
868
|
if (req.path.startsWith("/api")) return next();
|
|
852
|
-
|
|
869
|
+
const indexPath = path3.join(staticRoot, "index.html");
|
|
870
|
+
if (fs3.existsSync(indexPath)) {
|
|
871
|
+
res.sendFile(indexPath);
|
|
872
|
+
} else {
|
|
873
|
+
logger.warn("Dashboard index.html not found", { path: indexPath });
|
|
874
|
+
res.status(404).send(`
|
|
875
|
+
<!DOCTYPE html>
|
|
876
|
+
<html lang="en">
|
|
877
|
+
<head>
|
|
878
|
+
<meta charset="UTF-8">
|
|
879
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
880
|
+
<title>Dashboard Not Built - Local Memory MCP</title>
|
|
881
|
+
<style>
|
|
882
|
+
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 40px auto; padding: 20px; text-align: center; }
|
|
883
|
+
h1 { color: #e53e3e; }
|
|
884
|
+
code { background: #f7fafc; padding: 2px 4px; border-radius: 4px; border: 1px solid #edf2f7; font-family: monospace; }
|
|
885
|
+
.container { border: 1px solid #e2e8f0; border-radius: 8px; padding: 30px; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1); }
|
|
886
|
+
.footer { margin-top: 30px; font-size: 0.8rem; color: #718096; }
|
|
887
|
+
</style>
|
|
888
|
+
</head>
|
|
889
|
+
<body>
|
|
890
|
+
<div class="container">
|
|
891
|
+
<h1>Dashboard Assets Not Found</h1>
|
|
892
|
+
<p>The dashboard frontend has not been built yet or assets are missing at:</p>
|
|
893
|
+
<code>${indexPath}</code>
|
|
894
|
+
<p style="margin-top: 20px;">To fix this, please run the build command in the repository root:</p>
|
|
895
|
+
<code>npm run build</code>
|
|
896
|
+
</div>
|
|
897
|
+
<div class="footer">Local Memory MCP v${pkg2.version}</div>
|
|
898
|
+
</body>
|
|
899
|
+
</html>
|
|
900
|
+
`);
|
|
901
|
+
}
|
|
853
902
|
});
|
|
854
903
|
if (process.env.DASHBOARD_ENABLE_MCP === "true") {
|
|
855
904
|
mcpClient.start().catch((e) => logger.error("MCP Client failed", { error: e.message }));
|
package/dist/mcp/server.js
CHANGED
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
setLogLevel,
|
|
43
43
|
updateSessionFromInitialize,
|
|
44
44
|
updateSessionRoots
|
|
45
|
-
} from "../chunk-
|
|
45
|
+
} from "../chunk-BSASVWKJ.js";
|
|
46
46
|
|
|
47
47
|
// src/mcp/server.ts
|
|
48
48
|
import readline from "readline";
|
|
@@ -214,7 +214,7 @@ function createMcpResponse(data, summary, options) {
|
|
|
214
214
|
resourceLinks,
|
|
215
215
|
structuredContentPathHint,
|
|
216
216
|
contentSummary,
|
|
217
|
-
includeSerializedStructuredContent =
|
|
217
|
+
includeSerializedStructuredContent = false
|
|
218
218
|
} = options || {};
|
|
219
219
|
void includeSerializedStructuredContent;
|
|
220
220
|
let finalData = data;
|
|
@@ -411,11 +411,12 @@ async function handleMemoryStore(params, db2, vectors2) {
|
|
|
411
411
|
{
|
|
412
412
|
contentSummary: `Stored [${entry.code}] "${entry.title}" in repo "${entry.scope.repo}".`,
|
|
413
413
|
structuredContentPathHint: "code",
|
|
414
|
+
includeSerializedStructuredContent: validated.structured,
|
|
414
415
|
resourceLinks: [
|
|
415
416
|
{
|
|
416
417
|
uri: `memory://${entry.id}`,
|
|
417
418
|
name: entry.title,
|
|
418
|
-
description: `Stored memory in repo ${entry.scope.repo}`,
|
|
419
|
+
description: `Stored memory [${entry.code}] in repo ${entry.scope.repo}`,
|
|
419
420
|
mimeType: "application/json",
|
|
420
421
|
annotations: {
|
|
421
422
|
audience: ["assistant"],
|
|
@@ -489,11 +490,12 @@ async function handleMemoryUpdate(params, db2, vectors2) {
|
|
|
489
490
|
`Updated memory ${validated.id} in repo "${existing.scope.repo}". Fields: ${Object.keys(updates).join(", ") || "none"}.`,
|
|
490
491
|
{
|
|
491
492
|
structuredContentPathHint: "updatedFields",
|
|
493
|
+
includeSerializedStructuredContent: validated.structured,
|
|
492
494
|
resourceLinks: [
|
|
493
495
|
{
|
|
494
496
|
uri: `memory://${validated.id}`,
|
|
495
497
|
name: existing.title || validated.id,
|
|
496
|
-
description: `Updated memory in repo ${existing.scope.repo}`,
|
|
498
|
+
description: `Updated memory [${existing.code}] in repo ${existing.scope.repo}`,
|
|
497
499
|
mimeType: "application/json",
|
|
498
500
|
annotations: {
|
|
499
501
|
audience: ["assistant"],
|
|
@@ -675,7 +677,7 @@ async function handleMemorySummarize(params, db2) {
|
|
|
675
677
|
${fullSummary}`;
|
|
676
678
|
return createMcpResponse(null, content, {
|
|
677
679
|
contentSummary: content,
|
|
678
|
-
includeSerializedStructuredContent:
|
|
680
|
+
includeSerializedStructuredContent: validated.structured
|
|
679
681
|
});
|
|
680
682
|
}
|
|
681
683
|
|
|
@@ -902,7 +904,7 @@ async function handleTaskList(args, storage) {
|
|
|
902
904
|
query,
|
|
903
905
|
limit,
|
|
904
906
|
offset,
|
|
905
|
-
structured: isStructuredRequest
|
|
907
|
+
structured: isStructuredRequest = false
|
|
906
908
|
} = validated;
|
|
907
909
|
let statuses = [];
|
|
908
910
|
if (status !== "all") {
|
|
@@ -942,7 +944,19 @@ async function handleTaskList(args, storage) {
|
|
|
942
944
|
}
|
|
943
945
|
return createMcpResponse(structuredData, contentSummary || "", {
|
|
944
946
|
contentSummary,
|
|
945
|
-
includeSerializedStructuredContent: isStructuredRequest
|
|
947
|
+
includeSerializedStructuredContent: isStructuredRequest,
|
|
948
|
+
resourceLinks: [
|
|
949
|
+
{
|
|
950
|
+
uri: `repository://${encodeURIComponent(repo)}/tasks`,
|
|
951
|
+
name: `Task Index (${repo})`,
|
|
952
|
+
description: `Repository task index for ${repo}`,
|
|
953
|
+
mimeType: "application/json",
|
|
954
|
+
annotations: {
|
|
955
|
+
audience: ["assistant"],
|
|
956
|
+
priority: 0.6
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
]
|
|
946
960
|
});
|
|
947
961
|
}
|
|
948
962
|
async function handleTaskCreate(args, storage) {
|
|
@@ -979,10 +993,10 @@ async function handleTaskCreate(args, storage) {
|
|
|
979
993
|
}
|
|
980
994
|
}
|
|
981
995
|
const statusTimestamps2 = deriveTaskStatusTimestamps(normalizedStatus, now2);
|
|
982
|
-
const
|
|
996
|
+
const tags = [...taskData.tags || []];
|
|
983
997
|
const phaseTag2 = `phase:${taskData.phase}`;
|
|
984
|
-
if (!
|
|
985
|
-
|
|
998
|
+
if (!tags.includes(phaseTag2)) {
|
|
999
|
+
tags.push(phaseTag2);
|
|
986
1000
|
}
|
|
987
1001
|
const task2 = {
|
|
988
1002
|
id: randomUUID2(),
|
|
@@ -1002,17 +1016,52 @@ async function handleTaskCreate(args, storage) {
|
|
|
1002
1016
|
finished_at: statusTimestamps2.finished_at,
|
|
1003
1017
|
canceled_at: statusTimestamps2.canceled_at,
|
|
1004
1018
|
est_tokens: taskData.est_tokens ?? 0,
|
|
1005
|
-
tags
|
|
1019
|
+
tags,
|
|
1006
1020
|
metadata: taskData.metadata || {},
|
|
1007
1021
|
parent_id: taskData.parent_id || null,
|
|
1008
1022
|
depends_on: taskData.depends_on || null
|
|
1009
1023
|
};
|
|
1010
1024
|
storage.tasks.insertTask(task2);
|
|
1011
1025
|
createdTasks.push(task2.task_code);
|
|
1026
|
+
task2._temp_id = task2.id;
|
|
1012
1027
|
}
|
|
1028
|
+
const resourceLinks = bulkTasks.slice(0, 10).map((t) => {
|
|
1029
|
+
const taskCode = t.task_code;
|
|
1030
|
+
const taskId2 = t._temp_id;
|
|
1031
|
+
return {
|
|
1032
|
+
uri: `task://${taskId2}`,
|
|
1033
|
+
name: `Task [${taskCode}]`,
|
|
1034
|
+
description: `Created task [${taskCode}] in repo ${repo}`,
|
|
1035
|
+
mimeType: "application/json",
|
|
1036
|
+
annotations: {
|
|
1037
|
+
audience: ["assistant"],
|
|
1038
|
+
priority: 0.9
|
|
1039
|
+
}
|
|
1040
|
+
};
|
|
1041
|
+
});
|
|
1042
|
+
resourceLinks.push({
|
|
1043
|
+
uri: `repository://${encodeURIComponent(repo)}/tasks`,
|
|
1044
|
+
name: `Task Index (${repo})`,
|
|
1045
|
+
description: `Repository task index for ${repo}`,
|
|
1046
|
+
mimeType: "application/json",
|
|
1047
|
+
annotations: {
|
|
1048
|
+
audience: ["assistant"],
|
|
1049
|
+
priority: 0.6
|
|
1050
|
+
}
|
|
1051
|
+
});
|
|
1013
1052
|
return createMcpResponse(
|
|
1014
1053
|
{ success: true, repo, createdCount: bulkTasks.length, taskCodes: createdTasks },
|
|
1015
|
-
`Created ${bulkTasks.length} tasks in repo "${repo}"
|
|
1054
|
+
`Created ${bulkTasks.length} tasks in repo "${repo}".`,
|
|
1055
|
+
{
|
|
1056
|
+
includeSerializedStructuredContent: parsed.structured || false,
|
|
1057
|
+
resourceLinks: resourceLinks.map((link) => ({
|
|
1058
|
+
...link,
|
|
1059
|
+
annotations: {
|
|
1060
|
+
...link.annotations,
|
|
1061
|
+
audience: link.annotations.audience
|
|
1062
|
+
}
|
|
1063
|
+
}))
|
|
1064
|
+
}
|
|
1016
1065
|
);
|
|
1017
1066
|
}
|
|
1018
1067
|
const {
|
|
@@ -1025,7 +1074,6 @@ async function handleTaskCreate(args, storage) {
|
|
|
1025
1074
|
agent,
|
|
1026
1075
|
role,
|
|
1027
1076
|
doc_path,
|
|
1028
|
-
tags,
|
|
1029
1077
|
metadata,
|
|
1030
1078
|
parent_id,
|
|
1031
1079
|
depends_on,
|
|
@@ -1090,7 +1138,32 @@ async function handleTaskCreate(args, storage) {
|
|
|
1090
1138
|
priority: task.priority,
|
|
1091
1139
|
depends_on: task.depends_on
|
|
1092
1140
|
},
|
|
1093
|
-
`Created task [${task.task_code}] ${task.title} in repo "${task.repo}" with status "${task.status}"
|
|
1141
|
+
`Created task [${task.task_code}] ${task.title} in repo "${task.repo}" with status "${task.status}".`,
|
|
1142
|
+
{
|
|
1143
|
+
includeSerializedStructuredContent: parsed.structured || false,
|
|
1144
|
+
resourceLinks: [
|
|
1145
|
+
{
|
|
1146
|
+
uri: `task://${task.id}`,
|
|
1147
|
+
name: `Task [${task.task_code}]`,
|
|
1148
|
+
description: `Created task [${task.task_code}] in repo ${task.repo}`,
|
|
1149
|
+
mimeType: "application/json",
|
|
1150
|
+
annotations: {
|
|
1151
|
+
audience: ["assistant"],
|
|
1152
|
+
priority: 0.9
|
|
1153
|
+
}
|
|
1154
|
+
},
|
|
1155
|
+
{
|
|
1156
|
+
uri: `repository://${encodeURIComponent(task.repo)}/tasks`,
|
|
1157
|
+
name: `Task Index (${task.repo})`,
|
|
1158
|
+
description: `Repository task index for ${task.repo}`,
|
|
1159
|
+
mimeType: "application/json",
|
|
1160
|
+
annotations: {
|
|
1161
|
+
audience: ["assistant"],
|
|
1162
|
+
priority: 0.6
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
]
|
|
1166
|
+
}
|
|
1094
1167
|
);
|
|
1095
1168
|
}
|
|
1096
1169
|
async function handleTaskCreateInteractive(args, storage, options = {}) {
|
|
@@ -1199,6 +1272,7 @@ async function handleTaskUpdate(args, storage, vectors2) {
|
|
|
1199
1272
|
throw new Error("Either 'id' or 'ids' must be provided for update");
|
|
1200
1273
|
}
|
|
1201
1274
|
let updatedCount = 0;
|
|
1275
|
+
const updatedTasks = [];
|
|
1202
1276
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
1203
1277
|
const isStatusChangingGlobal = updates.status !== void 0;
|
|
1204
1278
|
for (const targetId of targetIds) {
|
|
@@ -1260,8 +1334,29 @@ async function handleTaskUpdate(args, storage, vectors2) {
|
|
|
1260
1334
|
if (updates.status === "completed" && existingTask.status !== "completed") {
|
|
1261
1335
|
await archiveTaskToMemory(targetId, repo, storage, vectors2);
|
|
1262
1336
|
}
|
|
1337
|
+
updatedTasks.push({ id: targetId, code: updates.task_code || existingTask.task_code });
|
|
1263
1338
|
updatedCount++;
|
|
1264
1339
|
}
|
|
1340
|
+
const resourceLinks = updatedTasks.slice(0, 10).map((t) => ({
|
|
1341
|
+
uri: `task://${t.id}`,
|
|
1342
|
+
name: `Task [${t.code}]`,
|
|
1343
|
+
description: `Updated task [${t.code}] in repo ${repo}`,
|
|
1344
|
+
mimeType: "application/json",
|
|
1345
|
+
annotations: {
|
|
1346
|
+
audience: ["assistant"],
|
|
1347
|
+
priority: 0.9
|
|
1348
|
+
}
|
|
1349
|
+
}));
|
|
1350
|
+
resourceLinks.push({
|
|
1351
|
+
uri: `repository://${encodeURIComponent(repo)}/tasks`,
|
|
1352
|
+
name: `Task Index (${repo})`,
|
|
1353
|
+
description: `Repository task index for ${repo}`,
|
|
1354
|
+
mimeType: "application/json",
|
|
1355
|
+
annotations: {
|
|
1356
|
+
audience: ["assistant"],
|
|
1357
|
+
priority: 0.6
|
|
1358
|
+
}
|
|
1359
|
+
});
|
|
1265
1360
|
return createMcpResponse(
|
|
1266
1361
|
{
|
|
1267
1362
|
success: true,
|
|
@@ -1272,11 +1367,22 @@ async function handleTaskUpdate(args, storage, vectors2) {
|
|
|
1272
1367
|
updatedCount,
|
|
1273
1368
|
updatedFields: Object.keys(updates)
|
|
1274
1369
|
},
|
|
1275
|
-
`Updated ${updatedCount} task(s) in repo "${repo}"
|
|
1370
|
+
`Updated ${updatedCount} task(s) in repo "${repo}".`,
|
|
1371
|
+
{
|
|
1372
|
+
includeSerializedStructuredContent: updateData.structured,
|
|
1373
|
+
resourceLinks: resourceLinks.map((link) => ({
|
|
1374
|
+
...link,
|
|
1375
|
+
annotations: {
|
|
1376
|
+
...link.annotations,
|
|
1377
|
+
audience: link.annotations.audience
|
|
1378
|
+
}
|
|
1379
|
+
}))
|
|
1380
|
+
}
|
|
1276
1381
|
);
|
|
1277
1382
|
}
|
|
1278
1383
|
async function handleTaskDelete(args, storage) {
|
|
1279
|
-
const
|
|
1384
|
+
const validated = TaskDeleteSchema.parse(args);
|
|
1385
|
+
const { repo, id, ids } = validated;
|
|
1280
1386
|
const targetIds = ids || (id ? [id] : []);
|
|
1281
1387
|
if (targetIds.length === 0) {
|
|
1282
1388
|
throw new Error("Either 'id' or 'ids' must be provided for deletion");
|
|
@@ -1292,7 +1398,22 @@ async function handleTaskDelete(args, storage) {
|
|
|
1292
1398
|
repo,
|
|
1293
1399
|
deletedCount: targetIds.length
|
|
1294
1400
|
},
|
|
1295
|
-
`Deleted ${targetIds.length} task(s) from repo "${repo}"
|
|
1401
|
+
`Deleted ${targetIds.length} task(s) from repo "${repo}".`,
|
|
1402
|
+
{
|
|
1403
|
+
includeSerializedStructuredContent: validated.structured,
|
|
1404
|
+
resourceLinks: [
|
|
1405
|
+
{
|
|
1406
|
+
uri: `repository://${encodeURIComponent(repo)}/tasks`,
|
|
1407
|
+
name: `Task Index (${repo})`,
|
|
1408
|
+
description: `Repository task index for ${repo}`,
|
|
1409
|
+
mimeType: "application/json",
|
|
1410
|
+
annotations: {
|
|
1411
|
+
audience: ["assistant"],
|
|
1412
|
+
priority: 0.6
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
]
|
|
1416
|
+
}
|
|
1296
1417
|
);
|
|
1297
1418
|
}
|
|
1298
1419
|
|
|
@@ -1406,7 +1527,8 @@ ${contextBlock || "No additional context provided."}`
|
|
|
1406
1527
|
},
|
|
1407
1528
|
`Synthesized answer for "${validated.objective}" using repository "${repo}".`,
|
|
1408
1529
|
{
|
|
1409
|
-
structuredContentPathHint: "answer"
|
|
1530
|
+
structuredContentPathHint: "answer",
|
|
1531
|
+
includeSerializedStructuredContent: validated.structured
|
|
1410
1532
|
}
|
|
1411
1533
|
);
|
|
1412
1534
|
}
|
|
@@ -1528,12 +1650,14 @@ async function executeSamplingTool(toolName, rawInput, db2, vectors2) {
|
|
|
1528
1650
|
|
|
1529
1651
|
// src/mcp/tools/memory.delete.ts
|
|
1530
1652
|
async function handleMemoryDelete(params, db2, vectors2, onProgress) {
|
|
1531
|
-
const
|
|
1653
|
+
const validated = MemoryDeleteSchema.parse(params);
|
|
1654
|
+
const { id, ids, repo, structured } = validated;
|
|
1532
1655
|
const targetIds = ids || (id ? [id] : []);
|
|
1533
1656
|
if (targetIds.length === 0) {
|
|
1534
1657
|
throw new Error("Either 'id' or 'ids' must be provided for deletion");
|
|
1535
1658
|
}
|
|
1536
1659
|
let deletedCount = 0;
|
|
1660
|
+
const deletedCodes = [];
|
|
1537
1661
|
let lastRepo = repo || "unknown";
|
|
1538
1662
|
const total = targetIds.length;
|
|
1539
1663
|
let progress = 0;
|
|
@@ -1544,6 +1668,7 @@ async function handleMemoryDelete(params, db2, vectors2, onProgress) {
|
|
|
1544
1668
|
const existing = db2.memories.getById(targetId);
|
|
1545
1669
|
if (existing) {
|
|
1546
1670
|
lastRepo = existing.scope.repo;
|
|
1671
|
+
deletedCodes.push(existing.code || existing.id);
|
|
1547
1672
|
db2.memories.delete(targetId);
|
|
1548
1673
|
await vectors2.remove(targetId);
|
|
1549
1674
|
deletedCount++;
|
|
@@ -1562,11 +1687,13 @@ async function handleMemoryDelete(params, db2, vectors2, onProgress) {
|
|
|
1562
1687
|
id: id || void 0,
|
|
1563
1688
|
ids: ids || void 0,
|
|
1564
1689
|
repo: lastRepo,
|
|
1565
|
-
deletedCount
|
|
1690
|
+
deletedCount,
|
|
1691
|
+
deletedCodes: deletedCount > 10 ? [...deletedCodes.slice(0, 10), "..."] : deletedCodes
|
|
1566
1692
|
},
|
|
1567
|
-
`Deleted ${deletedCount} memory entry(ies) from repo "${lastRepo}".`,
|
|
1693
|
+
`Deleted ${deletedCount} memory entry(ies) ${deletedCount > 0 ? `([${deletedCodes.slice(0, 10).join(", ")}${deletedCount > 10 ? ", ..." : ""}]) ` : ""}from repo "${lastRepo}".`,
|
|
1568
1694
|
{
|
|
1569
1695
|
structuredContentPathHint: "deletedCount",
|
|
1696
|
+
includeSerializedStructuredContent: structured,
|
|
1570
1697
|
resourceLinks: [
|
|
1571
1698
|
{
|
|
1572
1699
|
uri: `repository://${encodeURIComponent(lastRepo)}/memories`,
|
|
@@ -1607,9 +1734,10 @@ async function handleMemoryAcknowledge(params, db2) {
|
|
|
1607
1734
|
id: memory.id,
|
|
1608
1735
|
status: validated.status
|
|
1609
1736
|
},
|
|
1610
|
-
`Acknowledged memory ${memory.
|
|
1737
|
+
`Acknowledged memory [${memory.code}] as "${validated.status}".`,
|
|
1611
1738
|
{
|
|
1612
|
-
structuredContentPathHint: "status"
|
|
1739
|
+
structuredContentPathHint: "status",
|
|
1740
|
+
includeSerializedStructuredContent: validated.structured
|
|
1613
1741
|
}
|
|
1614
1742
|
);
|
|
1615
1743
|
}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@import "https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;700&display=swap";:root{--glass-bg:#ffffff85;--glass-bg-strong:#ffffffb8;--glass-bg-ultra:#ffffffe0;--glass-border:#fff6;--glass-border-inner:#ffffffb3;--glass-shadow:0 20px 70px #0f172a1a, 0 4px 16px #0f172a0f;--glass-shadow-elevated:0 32px 96px #0f172a29, 0 8px 32px #0f172a14;--glass-blur:blur(28px) saturate(1.2);--panel-dark:#060c1cb3;--panel-dark-strong:#040916e0;--panel-dark-ultra:#020610f5;--panel-dark-border:#94a3b81a;--panel-dark-border-glow:#38bdf833;--panel-dark-shadow:0 28px 90px #02061799, inset 0 1px 0 #94a3b80f;--glow-primary:#0ea5e959;--glow-accent:#6366f159;--glow-success:#10b98159;--glow-danger:#ef444459;--glow-purple:#a855f759;--glow-cyan:#06b6d459;--sidebar-width:280px;--sidebar-collapsed-width:72px;--header-height:60px;--radius-sm:8px;--radius-md:12px;--radius-lg:16px;--radius-xl:20px;--radius-2xl:24px;--color-bg:#f0f8ff;--color-surface:#fff;--color-border:#e1ecf7;--color-text:#0a1628;--color-text-muted:#556f8a;--color-text-faint:#8faec4;--color-primary:#0ea5e9;--color-primary-dark:#0284c7;--color-primary-light:#38bdf8;--color-accent:#6366f1;--color-accent-dark:#4f46e5;--color-success:#10b981;--color-warning:#f59e0b;--color-danger:#ef4444;--color-purple:#a855f7;--ease-spring:cubic-bezier(.34, 1.56, .64, 1);--ease-smooth:cubic-bezier(.4, 0, .2, 1);--ease-expo:cubic-bezier(.16, 1, .3, 1);--duration-fast:.15s;--duration-base:.25s;--duration-slow:.4s}.dark{--color-bg:#010c1e;--color-surface:#070f1f;--color-border:#94a3b81a;--color-text:#e9f1fa;--color-text-muted:#7fa3be;--color-text-faint:#4a6782;--color-primary:#38bdf8;--color-primary-dark:#0ea5e9;--color-primary-light:#7dd3fc}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:radial-gradient(at 8% 10%,#38bdf847 0%,#0000 38%),radial-gradient(at 92% 8%,#6366f12e 0%,#0000 32%),radial-gradient(at 75% 88%,#a855f71f 0%,#0000 28%),radial-gradient(at 20% 75%,#0ea5e91a 0%,#0000 26%),linear-gradient(160deg,#eef8ff 0%,#f0f4ff 45%,#f5f0ff 100%) fixed;min-height:100vh;font-family:Inter,system-ui,sans-serif;font-size:16px;line-height:1.5;transition:background .5s}html.dark{background:radial-gradient(at 8% 10%,#0ea5e924 0%,#0000 38%),radial-gradient(at 92% 8%,#4338ca1f 0%,#0000 32%),radial-gradient(at 75% 88%,#581c871a 0%,#0000 28%),radial-gradient(at 20% 75%,#0ea5e90f 0%,#0000 26%),linear-gradient(160deg,#010c1e 0%,#040d1e 45%,#050c1a 100%) fixed}body{min-height:100vh;color:var(--color-text);transition:color var(--duration-base) ease;background:0 0;overflow-x:hidden}h1,h2,h3,h4,h5,h6{font-weight:700;line-height:1.3}code,pre{font-family:JetBrains Mono,Fira Code,monospace}a{color:var(--color-primary);text-decoration:none}a:hover{color:var(--color-primary-dark)}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#94a3b840;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:#94a3b873}.dark ::-webkit-scrollbar-thumb{background:#3341558c}.glass{background:var(--glass-bg);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow);-webkit-backdrop-filter:var(--glass-blur);position:relative}.glass:before{content:"";border-radius:inherit;border:1px solid var(--glass-border-inner);opacity:.6;pointer-events:none;z-index:0;border-bottom-color:#0000;border-right-color:#0000;position:absolute;inset:0}.dark .glass{background:var(--panel-dark);border-color:var(--panel-dark-border);box-shadow:var(--panel-dark-shadow)}.dark .glass:before{opacity:.8;border-color:#94a3b812 #0000 #0000 #94a3b812}.glass-strong{background:var(--glass-bg-strong)!important}.dark .glass-strong{background:var(--panel-dark-strong)!important}.glass-card{border-radius:var(--radius-lg);padding:20px;position:relative;overflow:hidden}.glass-card:after{content:"";border-radius:inherit;pointer-events:none;z-index:0;background:linear-gradient(135deg,#ffffff14 0%,#0000 60%);position:absolute;inset:0}.dark .glass-card:after{background:linear-gradient(135deg,#94a3b80a 0%,#0000 60%)}.app-layout{min-height:100vh;display:flex}.sidebar{width:var(--sidebar-width);height:100dvh;transition:width .3s var(--ease-smooth);z-index:40;position:fixed;top:0;left:0;overflow:hidden}.sidebar.collapsed{width:var(--sidebar-collapsed-width)}.main-content{min-width:0;margin-left:var(--sidebar-width);transition:margin-left .3s var(--ease-smooth);flex:1}.sidebar.collapsed~.main-content,.main-content.sidebar-collapsed{margin-left:var(--sidebar-collapsed-width)}@media (width<=1024px){.sidebar{display:none}.main-content{margin-left:0!important}}.top-bar{z-index:30;position:sticky;top:0}.tab-nav{border-radius:var(--radius-md);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background:#f1f5f9b3;border:1px solid #e2e8f0cc;gap:3px;padding:4px;display:flex}.dark .tab-nav{background:#0f172a99;border-color:#94a3b81a}.tab-btn{color:var(--color-text-muted);transition:all var(--duration-base) var(--ease-smooth);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:9px;align-items:center;gap:6px;padding:7px 14px;font-size:.8rem;font-weight:600;display:flex;position:relative;overflow:hidden}.tab-btn:after{content:"";opacity:0;transition:opacity var(--duration-base) ease;pointer-events:none;background:radial-gradient(circle,#0ea5e91f,#0000 70%);position:absolute;inset:0}.tab-btn:hover{color:var(--color-text)}.tab-btn:hover:after{opacity:1}.dark .tab-btn:hover{color:var(--color-text)}.tab-btn.active{color:var(--color-primary);background:#fff;box-shadow:0 2px 10px #00000012,0 1px 3px #0000000d}.tab-btn.active:after{opacity:0}.dark .tab-btn.active{color:#7dd3fc;background:#0a1226f2;box-shadow:0 0 0 1px #38bdf833,0 4px 12px #00000059}.btn{border-radius:var(--radius-md);transition:all var(--duration-base) var(--ease-smooth);cursor:pointer;white-space:nowrap;border:1px solid #0000;align-items:center;gap:6px;padding:8px 16px;font-size:.8rem;font-weight:600;display:inline-flex;position:relative;overflow:hidden}.btn:after{content:"";opacity:0;transition:opacity var(--duration-fast) ease;pointer-events:none;background:linear-gradient(135deg,#ffffff26 0%,#0000 100%);position:absolute;inset:0}.btn:hover:after{opacity:1}.btn:active{transform:scale(.97)}.btn-primary{background:linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-dark) 100%);color:#fff;box-shadow:0 4px 14px var(--glow-primary), inset 0 1px 0 #fff3;border-color:#0284c780}.btn-primary:hover{box-shadow:0 6px 20px var(--glow-primary), inset 0 1px 0 #fff3;transform:translateY(-1px)}.dark .btn-primary{color:#7dd3fc;background:linear-gradient(135deg,#0ea5e933 0%,#0284c71f 100%);border-color:#0ea5e966;box-shadow:inset 0 0 0 1px #0ea5e926,0 4px 14px #0ea5e92e}.dark .btn-primary:hover{color:#bae6fd;background:linear-gradient(135deg,#0ea5e94d 0%,#0284c733 100%);box-shadow:inset 0 0 0 1px #38bdf840,0 6px 20px #0ea5e947}.btn-accent{background:linear-gradient(135deg, var(--color-accent) 0%, var(--color-accent-dark) 100%);color:#fff;box-shadow:0 4px 14px var(--glow-accent), inset 0 1px 0 #fff3;border-color:#4f46e580}.btn-accent:hover{box-shadow:0 6px 20px var(--glow-accent), inset 0 1px 0 #fff3;transform:translateY(-1px)}.dark .btn-accent{color:#a5b4fc;background:linear-gradient(135deg,#6366f138 0%,#4f46e524 100%);border-color:#6366f16b;box-shadow:inset 0 0 0 1px #6366f126}.dark .btn-accent:hover{color:#c7d2fe;background:linear-gradient(135deg,#6366f152 0%,#4f46e538 100%);box-shadow:inset 0 0 0 1px #818cf84d,0 6px 20px #6366f147}.btn-ghost{color:var(--color-text-muted);border-color:var(--color-border);background:0 0}.btn-ghost:hover{color:var(--color-text);background:#f1f5f9cc;border-color:#0ea5e933}.dark .btn-ghost:hover{background:#1e293bb3;border-color:#94a3b833}.btn-sm{padding:5px 10px;font-size:.72rem}.btn-icon{border-radius:var(--radius-sm);padding:7px}.btn-icon-lg{border-radius:var(--radius-md);padding:9px}.form-input,.form-select,.form-textarea{border-radius:var(--radius-md);border:1px solid var(--color-border);width:100%;color:var(--color-text);transition:all var(--duration-base) var(--ease-smooth);background:#ffffffa6;outline:none;padding:8px 12px;font-family:inherit;font-size:.85rem}.form-input:focus,.form-select:focus,.form-textarea:focus{border-color:var(--color-primary);background:#ffffffd9;box-shadow:0 0 0 3px #0ea5e924,0 2px 8px #0ea5e914}.dark .form-input,.dark .form-select,.dark .form-textarea{color:var(--color-text);background:#0a1226a6;border-color:#94a3b82e}.dark .form-input:focus,.dark .form-select:focus,.dark .form-textarea:focus{background:#0a1226d9;border-color:#38bdf880;box-shadow:0 0 0 3px #38bdf81f,0 0 16px #38bdf814}.card{border-radius:var(--radius-lg);padding:20px}.stat-card{border-radius:var(--radius-md);transition:transform var(--duration-base) var(--ease-spring), box-shadow var(--duration-base) ease;padding:12px 14px}.stat-card:hover{box-shadow:var(--glass-shadow-elevated);transform:translateY(-3px)}.dark .stat-card:hover{box-shadow:0 32px 96px #020617b3,0 0 24px #38bdf80f}.type-chip{text-transform:uppercase;letter-spacing:.07em;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);transition:all var(--duration-base) ease;border:1px solid #0000;border-radius:9999px;align-items:center;gap:4px;padding:.2rem .6rem;font-size:.62rem;font-weight:700;display:inline-flex}.type-decision{color:#1565c0;background:linear-gradient(135deg,#2196f324,#1976d214);border-color:#2196f34d}.type-mistake{color:#c62828;background:linear-gradient(135deg,#f4433624,#d32f2f14);border-color:#f443364d}.type-code_fact{color:#6a1b9a;background:linear-gradient(135deg,#9c27b024,#7b1fa214);border-color:#9c27b04d}.type-pattern{color:#1b5e20;background:linear-gradient(135deg,#388e3c24,#1b5e2014);border-color:#388e3c4d}.type-agent_handoff{color:#e65100;background:linear-gradient(135deg,#ff980024,#f57c0014);border-color:#ff98004d}.type-agent_registered{color:#33691e;background:linear-gradient(135deg,#9ccc6524,#8bc34a14);border-color:#9ccc654d}.type-file_claim{color:#006064;background:linear-gradient(135deg,#00bcd424,#0097a714);border-color:#00bcd44d}.type-task_archive{color:#3e2723;background:linear-gradient(135deg,#79554824,#5d403714);border-color:#7955484d}.dark .type-decision{color:#7dd3fc;background:linear-gradient(135deg,#38bdf833,#0ea5e914);border-color:#38bdf852}.dark .type-mistake{color:#fda4af;background:linear-gradient(135deg,#fb718533,#f43f5e14);border-color:#fb718552}.dark .type-code_fact{color:#d8b4fe;background:linear-gradient(135deg,#c084fc33,#a78bfa14);border-color:#c084fc52}.dark .type-pattern{color:#6ee7b7;background:linear-gradient(135deg,#34d39933,#10b98114);border-color:#34d39952}.dark .type-agent_handoff{color:#fdba74;background:linear-gradient(135deg,#fb923c33,#f9731614);border-color:#fb923c52}.dark .type-agent_registered{color:#bef264;background:linear-gradient(135deg,#a3e63533,#84cc1614);border-color:#a3e63552}.dark .type-file_claim{color:#67e8f9;background:linear-gradient(135deg,#22d3ee33,#06b6d414);border-color:#22d3ee52}.dark .type-task_archive{color:#d4a08a;background:linear-gradient(135deg,#b4786433,#965a4614);border-color:#b4786452}.status-chip{text-transform:uppercase;letter-spacing:.05em;transition:all var(--duration-base) ease;border-radius:9999px;align-items:center;gap:4px;padding:2px 10px;font-size:.62rem;font-weight:700;display:inline-flex}.status-chip:before{content:"";background:currentColor;border-radius:50%;flex-shrink:0;width:5px;height:5px;display:inline-block}.status-backlog{color:#64748b;background:#64748b1f;border:1px solid #64748b47}.status-pending{color:#475569;background:#94a3b81f;border:1px solid #94a3b847}.status-inprogress{color:#0284c7;background:#38bdf81f;border:1px solid #38bdf847}.status-completed{color:#059669;background:#10b9811f;border:1px solid #10b98147}.status-blocked{color:#dc2626;background:#ef44441f;border:1px solid #ef444447}.status-canceled{color:#9ca3af;background:#9ca3af14;border:1px solid #9ca3af2e}.status-default{color:#94a3b8;background:#cbd5e11f;border:1px solid #cbd5e147}.dark .status-backlog{color:#94a3b8;background:#64748b2e}.dark .status-pending{color:#cbd5e1;background:#94a3b82e}.dark .status-inprogress{color:#7dd3fc;background:#38bdf82e}.dark .status-completed{color:#6ee7b7;background:#10b9812e}.dark .status-blocked{color:#fca5a5;background:#ef44442e}.dark .status-canceled{color:#6b7280;background:#9ca3af1f}.repo-item{border-radius:var(--radius-md);cursor:pointer;transition:all var(--duration-base) var(--ease-smooth);border:1px solid #0000;align-items:center;gap:10px;padding:9px 11px;display:flex;position:relative;overflow:hidden}.repo-item:before{content:"";opacity:0;transition:opacity var(--duration-base) ease;pointer-events:none;background:linear-gradient(90deg,#0ea5e90f 0%,#0000 100%);position:absolute;inset:0}.repo-item:hover:before{opacity:1}.repo-item:hover{border-color:#0ea5e91f}.dark .repo-item:hover{background:#0ea5e90a;border-color:#38bdf824}.repo-item.active{background:#ffffffe6;border-color:#0ea5e938;box-shadow:0 4px 14px #0f172a0f,inset 0 1px #fffc}.dark .repo-item.active{background:#0ea5e912;border-color:#38bdf847;box-shadow:inset 0 0 0 1px #38bdf81a,0 4px 16px #0ea5e914}.repo-avatar{border-radius:var(--radius-sm);color:#fff;width:34px;height:34px;transition:box-shadow var(--duration-base) ease, transform var(--duration-base) var(--ease-spring);background:linear-gradient(135deg,#0ea5e9 0%,#6366f1 100%);flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:800;display:flex;position:relative;box-shadow:0 4px 12px #0ea5e947}.repo-item:hover .repo-avatar{transform:scale(1.06);box-shadow:0 4px 16px #0ea5e966}.repo-active-indicator{background:linear-gradient(180deg, var(--color-primary-light) 0%, var(--color-primary) 100%);width:3px;height:22px;box-shadow:2px 0 8px var(--glow-primary);border-radius:0 4px 4px 0;position:absolute;top:50%;left:0;transform:translateY(-50%)}.repo-item.collapsed{justify-content:center;padding:8px}.stat-number{letter-spacing:-.03em;font-size:1.75rem;font-weight:900;line-height:1}.stat-label{text-transform:uppercase;letter-spacing:.07em;color:var(--color-text-muted);font-size:.68rem;font-weight:700}.kanban-board{grid-template-columns:repeat(4,minmax(260px,1fr));gap:16px;padding-bottom:8px;display:grid;overflow-x:auto}@media (width<=900px){.kanban-board{scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;grid-template-columns:repeat(4,280px)}}.kanban-col{border-radius:var(--radius-lg);flex-direction:column;min-height:200px;display:flex}@media (width<=900px){.kanban-col{scroll-snap-align:center}}.task-card{border-radius:var(--radius-md);border:1px solid var(--color-border);cursor:pointer;transition:all var(--duration-base) var(--ease-smooth);background:#ffffff9e;flex-shrink:0;padding:14px;position:relative;overflow:hidden}.task-card:before{content:"";background:linear-gradient(90deg, var(--color-primary), var(--color-accent));opacity:0;height:2px;transition:opacity var(--duration-base) ease;position:absolute;top:0;left:0;right:0}.task-card:hover:before{opacity:1}.dark .task-card{background:#0a122a8c;border-color:#94a3b81a}.task-card:hover{border-color:#0ea5e938;transform:translateY(-3px);box-shadow:0 10px 28px #0000001a,0 0 0 1px #0ea5e92e}.dark .task-card:hover{border-color:#38bdf83d;transform:translateY(-3px);box-shadow:0 10px 28px #00000059,0 0 0 1px #38bdf838}.markdown-body{color:#374151;word-break:break-word;font-size:.875rem;line-height:1.75}.dark .markdown-body{color:#d1d5db}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{color:#111827;margin:1.2em 0 .5em;font-weight:700;line-height:1.3}.dark .markdown-body h1,.dark .markdown-body h2,.dark .markdown-body h3,.dark .markdown-body h4{color:#f9fafb}.markdown-body h1{border-bottom:2px solid #e5e7eb;padding-bottom:.4rem;font-size:1.25rem}.markdown-body h2{border-bottom:1px solid #e5e7eb;padding-bottom:.3rem;font-size:1.1rem}.markdown-body h3{font-size:.95rem}.markdown-body p{margin:.6em 0}.markdown-body ul,.markdown-body ol{margin:.5em 0;padding-left:1.5rem}.markdown-body ul{list-style-type:disc}.markdown-body ol{list-style-type:decimal}.markdown-body li{margin:.25em 0}.markdown-body code{color:#6d28d9;background:#f3f4f6;border:1px solid #e5e7eb;border-radius:5px;padding:.15em .4em;font-family:JetBrains Mono,monospace;font-size:.8rem}.dark .markdown-body code{color:#c4b5fd;background:#8b5cf624;border-color:#8b5cf638}.markdown-body pre{background:#f8fafc;border:1px solid #e5e7eb;border-radius:10px;margin:.75em 0;padding:1rem;overflow-x:auto}.dark .markdown-body pre{background:#0a121e;border-color:#1e2d40}.markdown-body pre code{color:inherit;background:0 0;border:none;padding:0;font-size:.82rem}.markdown-body blockquote{color:#4b5563;background:#0ea5e90d;border-left:3px solid #0ea5e9;border-radius:0 8px 8px 0;margin:.75em 0;padding:.5rem 1rem;font-style:italic}.dark .markdown-body blockquote{color:#9ca3af;background:#0ea5e914}.markdown-body a{color:#0ea5e9;text-underline-offset:2px;text-decoration:underline}.markdown-body strong{color:#111827;font-weight:700}.dark .markdown-body strong{color:#f9fafb}.markdown-body table{border-collapse:collapse;width:100%;margin:.75em 0;font-size:.8rem}.markdown-body th{text-align:left;background:#f1f5f9;border:1px solid #e5e7eb;padding:.5rem .75rem;font-weight:700}.dark .markdown-body th{background:#1e293b;border-color:#334155}.markdown-body td{border:1px solid #e5e7eb;padding:.4rem .75rem}.dark .markdown-body td{border-color:#334155}.markdown-body tr:nth-child(2n){background:#f8fafc}.dark .markdown-body tr:nth-child(2n){background:#1e293b66}.chat-bubble{border-radius:1.25rem;max-width:85%;padding:.75rem 1rem;font-size:.875rem;line-height:1.5;box-shadow:0 2px 8px #0000000f}.chat-bubble-agent{color:#fff;border-bottom-right-radius:.25rem;align-self:flex-end}.chat-bubble-mcp{color:#1e293b;background:#f1f5f9e6;border:1px solid #e2e8f0;border-bottom-left-radius:.25rem;align-self:flex-start}.dark .chat-bubble-mcp{color:#f1f5f9;background:#1e293bd9;border-color:#334155b3}.skeleton{background:linear-gradient(90deg,#f1f5f9 25%,#e8ecf0 50%,#f1f5f9 75%) 0 0/200% 100%;border-radius:8px;animation:1.8s ease-in-out infinite skeleton-pulse}.dark .skeleton{background:linear-gradient(90deg,#12213a 25%,#1a2f4a 50%,#12213a 75%) 0 0/200% 100%}@keyframes skeleton-pulse{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes fade-in-up{0%{opacity:0;transform:translateY(14px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in-scale{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}@keyframes slide-in-right{0%{opacity:0;transform:translate(20px)}to{opacity:1;transform:translate(0)}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes pulse-glow{0%,to{box-shadow:0 0 6px #0ea5e94d}50%{box-shadow:0 0 18px #0ea5e999,0 0 30px #0ea5e933}}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-4px)}}@keyframes status-blink{0%,to{opacity:1}50%{opacity:.4}}@keyframes orbit-glow{0%{transform:translate(-50%,-50%)rotate(0)translate(12px)rotate(0)}to{transform:translate(-50%,-50%)rotate(360deg)translate(12px)rotate(-360deg)}}.animate-fade-in{animation:fade-in-up var(--duration-slow) var(--ease-expo)}.animate-fade-in-scale{animation:fade-in-scale var(--duration-slow) var(--ease-expo)}.animate-slide-in{animation:slide-in-right var(--duration-slow) var(--ease-expo)}.animate-spin{animation:.8s linear infinite spin}.animate-float{animation:3s ease-in-out infinite float}.animate-pulse-glow{animation:2s ease-in-out infinite pulse-glow}.animate-status-blink{animation:1.8s ease-in-out infinite status-blink}.stagger-item:first-child{animation-delay:0s}.stagger-item:nth-child(2){animation-delay:50ms}.stagger-item:nth-child(3){animation-delay:.1s}.stagger-item:nth-child(4){animation-delay:.15s}.stagger-item:nth-child(5){animation-delay:.2s}.stagger-item:nth-child(n+6){animation-delay:.25s}.drawer-overlay{z-index:50;-webkit-backdrop-filter:blur(6px);background:#010c1e8c;position:fixed;inset:0}.drawer-panel{-webkit-backdrop-filter:blur(20px);z-index:51;background:#fffffff5;border-left:1px solid #e2e8f0cc;flex-direction:column;width:min(620px,95vw);height:100dvh;display:flex;position:fixed;top:0;right:0;overflow:hidden;box-shadow:-20px 0 60px #00000024,-1px 0 #0ea5e914}.dark .drawer-panel{background:#060c1cf5;border-color:#94a3b81a;box-shadow:-20px 0 60px #00000080,-1px 0 #38bdf81f}.dark table thead tr{background:#0a1226e6!important}.dark table th{color:var(--color-text-muted);border-bottom-color:#94a3b81f!important}.dark table td{color:var(--color-text);border-bottom-color:#94a3b812!important}.dark table tbody tr:hover td{background:#0ea5e90a}.dark table tbody tr:nth-child(2n) td{background:#080f2059}.dark table tbody tr:nth-child(2n):hover td{background:#0ea5e90f}.dark table input[type=checkbox]{accent-color:#0ea5e9}.badge{letter-spacing:.03em;border-radius:9999px;align-items:center;padding:1px 8px;font-size:.62rem;font-weight:700;display:inline-flex}.section-label{text-transform:uppercase;letter-spacing:.08em;color:var(--color-text-muted);font-size:.68rem;font-weight:700}.status-dot{border-radius:9999px;flex-shrink:0;width:8px;height:8px}.status-dot-online{background:#10b981;animation:2.4s ease-in-out infinite pulse-glow;box-shadow:0 0 0 3px #10b9812e}.icon-btn{border-radius:var(--radius-sm);width:32px;height:32px;color:var(--color-text-muted);cursor:pointer;transition:all var(--duration-base) var(--ease-smooth);background:0 0;border:none;justify-content:center;align-items:center;display:inline-flex}.icon-btn:hover{color:var(--color-text);background:#f1f5f9e6;transform:scale(1.1)}.dark .icon-btn:hover{background:#1e293bcc}.icon-btn svg{transition:transform var(--duration-base) var(--ease-spring)}.icon-btn:hover svg{transform:scale(1.05)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.min-w-0{min-width:0}.flex{display:flex}.flex-col{flex-direction:column}.flex-1{flex:1}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:4px}.gap-2{gap:8px}.gap-3{gap:12px}.gap-4{gap:16px}.gap-5{gap:20px}.p-2{padding:8px}.p-3{padding:12px}.p-4{padding:16px}.p-5{padding:20px}.px-3{padding-left:12px;padding-right:12px}.px-4{padding-left:16px;padding-right:16px}.py-2{padding-top:8px;padding-bottom:8px}.py-3{padding-top:12px;padding-bottom:12px}.mt-1{margin-top:4px}.mt-2{margin-top:8px}.mt-3{margin-top:12px}.mt-4{margin-top:16px}.mb-1{margin-bottom:4px}.mb-2{margin-bottom:8px}.mb-3{margin-bottom:12px}.mb-4{margin-bottom:16px}.text-sm{font-size:.875rem}.text-xs{font-size:.75rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.w-full{width:100%}.h-full{height:100%}.overflow-hidden{overflow:hidden}.overflow-auto{overflow:auto}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:12px}.rounded-xl{border-radius:16px}.relative{position:relative}.absolute{position:absolute}.inset-0{inset:0}.z-10{z-index:10}.z-50{z-index:50}.hidden{display:none}.grid{display:grid}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;user-select:none}.pointer-events-none{pointer-events:none}.shrink-0{flex-shrink:0}.text-center{text-align:center}.priority-dot{border-radius:9999px;flex-shrink:0;width:8px;height:8px}.priority-1{background:#94a3b8}.priority-2{background:#3b82f6;box-shadow:0 0 6px #3b82f680}.priority-3{background:#f59e0b;box-shadow:0 0 6px #f59e0b80}.priority-4{background:#f97316;box-shadow:0 0 6px #f9731680}.priority-5{background:#ef4444;animation:2s ease-in-out infinite pulse-glow;box-shadow:0 0 8px #ef444499}.divider{background:var(--color-border);height:1px;margin:12px 0}.dark .divider{background:#94a3b81a}.hover-glow{transition:box-shadow var(--duration-base) ease}.hover-glow:hover{box-shadow:var(--glass-shadow-elevated), 0 0 24px #0ea5e914}.dark .hover-glow:hover{box-shadow:var(--panel-dark-shadow), 0 0 24px #38bdf814}.text-success{color:var(--color-success)!important}.text-danger{color:var(--color-danger)!important}.text-primary{color:var(--color-primary)!important}.text-accent{color:var(--color-accent)!important}.btn-icon:hover{background:#0ea5e914;transform:scale(1.1)}.sidebar-header.svelte-vbr9x3{justify-content:space-between;align-items:center;min-height:60px;padding:14px 16px;display:flex}.brand-icon.svelte-vbr9x3{color:#fff;background:linear-gradient(135deg,#0ea5e9,#6366f1);border-radius:9px;flex-shrink:0;justify-content:center;align-items:center;width:30px;height:30px;transition:box-shadow .2s,transform .2s;display:flex;box-shadow:0 4px 12px #0ea5e94d}.brand-icon.svelte-vbr9x3:hover{transform:scale(1.05);box-shadow:0 4px 18px #0ea5e980}.collapse-btn.svelte-vbr9x3{flex-shrink:0}.search-wrapper.svelte-vbr9x3{position:relative}.search-icon.svelte-vbr9x3{color:var(--color-text-muted);pointer-events:none;display:flex;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.search-input.svelte-vbr9x3{background:#ffffff80;padding-left:32px;font-size:.8rem}html.dark .search-input.svelte-vbr9x3{background:#0a122680}.group-label.svelte-vbr9x3{text-transform:uppercase;letter-spacing:.07em;color:var(--color-text-muted);opacity:.75;align-items:center;gap:5px;padding:6px 10px 4px;font-size:.6rem;font-weight:700;display:flex}.repo-count-chip.svelte-vbr9x3{color:#0ea5e9;background:#0ea5e91f;border:1px solid #0ea5e938;border-radius:9999px;padding:1px 7px;font-size:.62rem;font-weight:700}.pin-star.svelte-vbr9x3{color:#fff;background:#0ea5e9;border-radius:9999px;justify-content:center;align-items:center;width:14px;height:14px;font-size:8px;line-height:1;display:flex;position:absolute;top:-4px;right:-4px;box-shadow:0 2px 6px #0ea5e966}.task-badges.svelte-vbr9x3{flex-wrap:wrap;gap:3px;margin-top:4px;display:flex}.task-badge.svelte-vbr9x3{white-space:nowrap;border:1px solid #0000;border-radius:9999px;align-items:center;gap:2px;padding:1px 5px;font-size:.6rem;font-weight:700;transition:all .15s;display:inline-flex}.task-badge.active.svelte-vbr9x3{color:#a855f7;background:#a855f71f;border-color:#a855f740}.task-badge.todo.svelte-vbr9x3{color:#0ea5e9;background:#0ea5e91f;border-color:#0ea5e940}.task-badge.blocked.svelte-vbr9x3{color:#ef4444;background:#ef44441f;border-color:#ef444440}.task-badge.backlog.svelte-vbr9x3{color:#64748b;background:#64748b1f;border-color:#64748b40}html.dark .task-badge.active.svelte-vbr9x3{color:#c084fc;background:#a855f72e}html.dark .task-badge.todo.svelte-vbr9x3{color:#7dd3fc;background:#38bdf82e}html.dark .task-badge.blocked.svelte-vbr9x3{color:#fca5a5;background:#fca5a52e}html.dark .task-badge.backlog.svelte-vbr9x3{color:#94a3b8;background:#94a3b82e}.pin-btn.svelte-vbr9x3{opacity:0;color:var(--color-text-muted);cursor:pointer;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;padding:5px;transition:opacity .15s,transform .15s,color .15s;display:flex}.repo-item.svelte-vbr9x3:hover .pin-btn:where(.svelte-vbr9x3){opacity:1}.pin-btn.svelte-vbr9x3:hover{color:#0ea5e9;background:#0ea5e91a;transform:scale(1.15)}@media (width<=1024px){#mobileMenuBtn.svelte-2va9hf{display:flex!important}}.ext-links-group.svelte-2va9hf{border:1px solid var(--color-border);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#f1f5f9bf;border-radius:10px;align-items:center;gap:0;display:flex;overflow:hidden}html.dark .ext-links-group.svelte-2va9hf{background:#0f172abf;border-color:#94a3b81f}.ext-link-btn.svelte-2va9hf{color:var(--color-text-muted);white-space:nowrap;align-items:center;gap:5px;padding:5px 10px;font-size:.72rem;font-weight:600;line-height:1;text-decoration:none;transition:background .15s,color .15s;display:flex}.ext-link-btn.svelte-2va9hf:hover{color:var(--color-text);background:#0ea5e914}html.dark .ext-link-btn.svelte-2va9hf:hover{background:#0ea5e91f}.ext-link-star.svelte-2va9hf:hover{color:#ca8a04!important;background:#eab3081a!important}html.dark .ext-link-star.svelte-2va9hf:hover{color:#fbbf24!important;background:#eab3081f!important}.ext-link-npm.svelte-2va9hf:hover{color:#cb2431!important;background:#cb243114!important}html.dark .ext-link-npm.svelte-2va9hf:hover{color:#f87171!important;background:#cb24311f!important}.ext-link-divider.svelte-2va9hf{background:var(--color-border);opacity:.6;flex-shrink:0;width:1px;height:20px}.ext-link-label.svelte-2va9hf{font-size:.7rem}.npm-dl-badge.svelte-2va9hf{color:inherit;align-items:center;gap:3px;display:flex}.npm-dl-skeleton.svelte-2va9hf{background:#94a3b82e;border-radius:4px;width:36px;height:10px;animation:1.4s ease-in-out infinite svelte-2va9hf-skeleton-pulse;display:inline-block}@keyframes svelte-2va9hf-skeleton-pulse{0%,to{opacity:1}50%{opacity:.4}}.countdown-bar.svelte-2va9hf{border:1px solid var(--color-border);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#f1f5f9bf;border-radius:10px;align-items:center;gap:6px;padding:5px 10px;display:flex}html.dark .countdown-bar.svelte-2va9hf{background:#0f172abf;border-color:#94a3b81f}.countdown-track.svelte-2va9hf{background:#94a3b82e;border-radius:9999px;width:52px;height:3px;overflow:hidden}.countdown-fill.svelte-2va9hf{border-radius:9999px;height:100%;transition:width 1s linear,background .3s}.countdown-label.svelte-2va9hf{width:26px;font-size:.65rem;font-weight:600;transition:color .3s}.btn.refreshing.svelte-2va9hf{color:var(--color-primary)}@media (width<=640px){.ext-links-group.svelte-2va9hf{display:none}}.priority-bar.svelte-1797zcc{opacity:0;border-radius:12px 12px 0 0;height:2px;transition:opacity .2s;position:absolute;top:0;left:0;right:0}.task-card.svelte-1797zcc:hover .priority-bar:where(.svelte-1797zcc){opacity:1}.card-header.svelte-1797zcc{justify-content:space-between;align-items:center;gap:6px;margin-bottom:7px;display:flex}.code-row.svelte-1797zcc{flex:1;align-items:center;gap:4px;min-width:0;display:flex}.status-icon-dot.svelte-1797zcc{opacity:.85;flex-shrink:0;display:inline-flex}.task-code-text.svelte-1797zcc{color:var(--color-text-muted);white-space:nowrap;text-overflow:ellipsis;max-width:110px;font-family:JetBrains Mono,monospace;font-size:.64rem;font-weight:700;overflow:hidden}.task-title.svelte-1797zcc{color:var(--color-text);-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;margin-bottom:4px;font-size:.82rem;font-weight:600;line-height:1.35;display:-webkit-box;overflow:hidden}.task-desc.svelte-1797zcc{color:var(--color-text-muted);-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;margin-bottom:12px;font-size:.72rem;line-height:1.4;display:-webkit-box;overflow:hidden}.phase-chip.svelte-1797zcc{color:#6366f1;letter-spacing:.02em;white-space:nowrap;background:#6366f11a;border:1px solid #6366f133;border-radius:9999px;flex-shrink:0;padding:2px 6px;font-size:.58rem;font-weight:700}html.dark .phase-chip.svelte-1797zcc{color:#a5b4fc;background:#818cf826;border-color:#818cf840}.card-footer.svelte-1797zcc{justify-content:space-between;align-items:center;margin-top:8px;display:flex}.agent-row.svelte-1797zcc{align-items:center;gap:4px;display:flex}.agent-avatar.svelte-1797zcc{color:#fff;background:linear-gradient(135deg,#6366f1,#0ea5e9);border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;width:18px;height:18px;display:flex}.agent-name.svelte-1797zcc{color:var(--color-text-muted);text-overflow:ellipsis;white-space:nowrap;max-width:80px;font-size:.64rem;overflow:hidden}.time-row.svelte-1797zcc{color:var(--color-text-faint);align-items:center;gap:3px;font-size:.62rem;display:flex}.token-row.svelte-1797zcc{margin-top:6px}.token-badge.svelte-1797zcc{color:#0ea5e9;background:#38bdf81a;border:1px solid #38bdf833;border-radius:9999px;align-items:center;gap:3px;padding:2px 7px;font-size:.6rem;font-weight:600;display:inline-flex}html.dark .token-badge.svelte-1797zcc{color:#7dd3fc;background:#38bdf81f;border-color:#38bdf838}.search-wrap.svelte-173w724{position:relative}.search-icon-inner.svelte-173w724{color:var(--color-text-muted);pointer-events:none;display:flex;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.col-count.svelte-173w724{border-radius:9999px;padding:1px 8px;font-size:.65rem;font-weight:700}.empty-col.svelte-173w724{text-align:center;flex-direction:column;align-items:center;padding:28px 8px;display:flex}.drag-over.svelte-173w724{border-color:var(--color-accent)!important;background:#6366f11a!important}.glassy-badge.svelte-1imzu92{-webkit-backdrop-filter:blur(12px);border:1px solid var(--badge-color);cursor:default;background:#ffffff0a;border-radius:9999px;padding:4px 12px;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:0 4px 12px #0000000d,inset 0 0 0 1px #ffffff0d}html.dark .glassy-badge.svelte-1imzu92{box-shadow:0 8px 16px #0003, inset 0 0 0 1px var(--badge-color);background:#0003;border-color:#ffffff1a}.glassy-badge.svelte-1imzu92:hover{box-shadow:0 6px 16px #00000014, inset 0 0 0 1px var(--badge-color);background:#ffffff14;transform:translateY(-1px)}.indicator-dot.svelte-1imzu92{background:var(--badge-color);width:6px;height:6px;box-shadow:0 0 10px var(--badge-color);border-radius:9999px;position:relative}.indicator-dot.svelte-1imzu92:after{content:"";border:1px solid var(--badge-color);opacity:0;border-radius:9999px;animation:2s infinite svelte-1imzu92-pulse;position:absolute;inset:-2px}@keyframes svelte-1imzu92-pulse{0%{opacity:.5;transform:scale(1)}70%{opacity:0;transform:scale(3)}to{opacity:0;transform:scale(3)}}.count.svelte-1imzu92{color:var(--badge-color);letter-spacing:-.01em;font-size:.75rem;font-weight:900}.label.svelte-1imzu92{color:var(--color-text);text-transform:uppercase;letter-spacing:.06em;opacity:.7;font-size:.62rem;font-weight:700}.mem-table-wrap.svelte-83aj9g{border:1px solid var(--color-border);border-radius:14px;overflow-x:auto}.mem-table.svelte-83aj9g{border-collapse:collapse;width:100%;min-width:600px}.mem-thead-row.svelte-83aj9g{border-bottom:1px solid var(--color-border);background:#f8fafce6}html.dark .mem-thead-row.svelte-83aj9g{background:#0a1226d9}.mem-th.svelte-83aj9g{text-align:left;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);white-space:nowrap;-webkit-user-select:none;user-select:none;padding:10px 12px;font-size:.7rem;font-weight:700}.mem-th.sortable.svelte-83aj9g{cursor:pointer}.mem-th.sortable.svelte-83aj9g:hover{color:var(--color-text)}.mem-td.svelte-83aj9g{border-bottom:1px solid var(--color-border);padding:10px 12px}html.dark .mem-td.svelte-83aj9g{border-color:#94a3b814}.mem-row.svelte-83aj9g{cursor:pointer;transition:background .15s}.mem-row.svelte-83aj9g:hover{background:#f1f5f9b3}html.dark .mem-row.svelte-83aj9g:hover,.mem-row.selected.svelte-83aj9g{background:#0ea5e90d}html.dark .mem-row.selected.svelte-83aj9g{background:#0ea5e914}.mem-row.svelte-83aj9g:last-child .mem-td:where(.svelte-83aj9g){border-bottom:none}.row-actions.svelte-83aj9g{opacity:0;white-space:nowrap;align-items:center;gap:4px;transition:opacity .15s;display:flex}.mem-row.svelte-83aj9g:hover .row-actions:where(.svelte-83aj9g){opacity:1}.row-action-btn.svelte-83aj9g{cursor:pointer;width:28px;height:28px;color:var(--color-text-muted);background:0 0;border:none;border-radius:7px;justify-content:center;align-items:center;transition:background .15s,color .15s;display:inline-flex}.edit-btn.svelte-83aj9g:hover{color:#0ea5e9;background:#0ea5e91a}html.dark .edit-btn.svelte-83aj9g:hover{color:#38bdf8;background:#0ea5e926}.delete-btn.svelte-83aj9g:hover{color:#ef4444;background:#ef44441a}html.dark .delete-btn.svelte-83aj9g:hover{color:#fca5a5;background:#ef444426}.bulk-actions-bar.svelte-83aj9g{-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);z-index:1000;color:#fff;background:#1e293bf2;border:1px solid #ffffff1a;border-radius:9999px;align-items:center;gap:8px;padding:10px 16px;font-size:.85rem;animation:.3s cubic-bezier(.16,1,.3,1) forwards svelte-83aj9g-slideUp;display:flex;position:fixed;bottom:32px;left:50%;transform:translate(-50%);box-shadow:0 10px 30px #0000004d}html:not(.dark) .bulk-actions-bar.svelte-83aj9g{color:var(--color-text);border-color:var(--color-border);background:#fffffff2;box-shadow:0 10px 30px #0000001a}@keyframes svelte-83aj9g-slideUp{0%{opacity:0;transform:translate(-50%,20px)scale(.95)}to{opacity:1;transform:translate(-50%)scale(1)}}.markdown-body.svelte-d5v60e{line-height:1.6}.markdown-body.svelte-d5v60e p:where(.svelte-d5v60e){margin-bottom:1em}.markdown-body.svelte-d5v60e code:where(.svelte-d5v60e){background-color:#0000000d;border-radius:3px;padding:.2em .4em;font-family:monospace}.markdown-body.svelte-d5v60e pre:where(.svelte-d5v60e){background-color:#0000000d;border-radius:5px;padding:1em;overflow:auto}.markdown-body.svelte-d5v60e table:where(.svelte-d5v60e){border-collapse:collapse;width:100%;margin-bottom:1em}.markdown-body.svelte-d5v60e th:where(.svelte-d5v60e),.markdown-body.svelte-d5v60e td:where(.svelte-d5v60e){text-align:left;border:1px solid #ddd;padding:8px}.markdown-body.svelte-d5v60e blockquote:where(.svelte-d5v60e){color:#666;border-left:4px solid #ddd;margin:1em 0;padding-left:1em}.chat-container-viewport.svelte-h6z84x{scroll-behavior:smooth;background:#00000005;flex-direction:column;flex:1;padding:24px 32px;display:flex;overflow-y:auto}html.dark .chat-container-viewport.svelte-h6z84x{background-color:#0b141a;background-image:radial-gradient(#ffffff08 1px,#0000 1px);background-size:20px 20px}.chat-container.svelte-h6z84x{flex-direction:column;gap:12px;min-height:min-content;padding-bottom:20px;display:flex}.date-header.svelte-h6z84x{z-index:10;justify-content:center;margin:24px 0 12px;display:flex;position:sticky;top:-12px}.date-header.svelte-h6z84x span:where(.svelte-h6z84x){-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:#54656f;text-transform:uppercase;letter-spacing:.06em;background:#fffffff2;border:1px solid #0000000d;border-radius:10px;padding:6px 14px;font-size:.7rem;font-weight:700;box-shadow:0 1px 3px #00000014}html.dark .date-header.svelte-h6z84x span:where(.svelte-h6z84x){color:#8696a0;background:#182229}.bubble-row.svelte-h6z84x{align-items:flex-end;gap:8px;width:100%;margin-bottom:4px;display:flex}.bubble-row-right.svelte-h6z84x{justify-content:flex-end}.bubble-row-left.svelte-h6z84x{justify-content:flex-start}.bubble-wrap.svelte-h6z84x{max-width:80%;position:relative}.chat-bubble.svelte-h6z84x{border-radius:12px;padding:8px 10px 18px;font-size:.875rem;line-height:1.4;transition:transform .2s;position:relative;box-shadow:0 1px .5px #00000021}.chat-bubble-action.svelte-h6z84x{background:var(--bubble-bg-light);color:#111b21;border-top-right-radius:0}.chat-bubble-mcp.svelte-h6z84x{background:var(--bubble-bg-light);color:#111b21;border-top-left-radius:0}html.dark .chat-bubble-action.svelte-h6z84x,html.dark .chat-bubble-mcp.svelte-h6z84x{background:var(--bubble-bg-dark);color:#e9edef}.tail.svelte-h6z84x{width:12px;height:12px;position:absolute;top:0}.tail-right.svelte-h6z84x{background:radial-gradient(circle at 100% 0,#0000 8px,#dcf8c6 8px);right:-8px}.tail-left.svelte-h6z84x{background:radial-gradient(circle at 0 0,#0000 8px,#fff 8px);left:-8px}html.dark .chat-bubble-action.svelte-h6z84x{--bubble-bg-dark:#056162}html.dark .tail-right.svelte-h6z84x{background:radial-gradient(circle at 100% 0,#0000 8px,#056162 8px)}html.dark .tail-left.svelte-h6z84x{background:radial-gradient(circle at 0 0,#0000 8px,#202c33 8px)}.chat-avatar.svelte-h6z84x{border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;display:flex;box-shadow:0 2px 8px #0000001a}.agent-avatar.svelte-h6z84x{color:#fff;background:linear-gradient(135deg,#0ea5e9,#6366f1)}.mcp-avatar.svelte-h6z84x{color:#54656f;background:#f0f2f5}html.dark .mcp-avatar.svelte-h6z84x{color:#8696a0;background:#182229}.action-badge.svelte-h6z84x{text-transform:uppercase;letter-spacing:.05em;border-radius:4px;align-items:center;gap:4px;margin-bottom:4px;padding:2px 6px;font-size:.62rem;font-weight:800;display:inline-flex}.action-main.svelte-h6z84x{color:inherit;word-break:break-word;font-weight:600}.action-sub.svelte-h6z84x{opacity:.7;margin-top:2px;font-size:.75rem}.mcp-sender.svelte-h6z84x{color:#34b7f1;text-transform:uppercase;letter-spacing:.04em;align-items:center;gap:4px;margin-bottom:6px;font-size:.72rem;font-weight:800;display:flex}.read-more-btn.svelte-h6z84x{color:#34b7f1;cursor:pointer;text-align:left;background:0 0;border:none;width:100%;margin-top:4px;padding:4px 0;font-size:.75rem;font-weight:700;display:block}.read-more-btn.svelte-h6z84x:hover{text-decoration:underline}.bubble-meta.svelte-h6z84x{pointer-events:none;align-items:center;gap:3px;display:flex;position:absolute;bottom:4px;right:7px}.bubble-time.svelte-h6z84x{color:#667781;font-size:.65rem}html.dark .bubble-time.svelte-h6z84x{color:#ffffff80}.bubble-status.svelte-h6z84x{color:#53bdeb;display:flex}.load-more-spinner.svelte-h6z84x{color:var(--color-text-muted);opacity:.8;justify-content:center;align-items:center;gap:8px;padding:12px;font-size:.75rem;font-weight:600;display:flex}@keyframes svelte-h6z84x-slideInRight{0%{opacity:0;transform:translate(20px)}to{opacity:1;transform:translate(0)}}@keyframes svelte-h6z84x-slideInLeft{0%{opacity:0;transform:translate(-20px)}to{opacity:1;transform:translate(0)}}.animate-slide-in-right.svelte-h6z84x{animation:.3s ease-out forwards svelte-h6z84x-slideInRight}.animate-slide-in-left.svelte-h6z84x{animation:.3s ease-out forwards svelte-h6z84x-slideInLeft}.drawer-header.svelte-9n99wb{border-bottom:1px solid var(--color-border);flex-shrink:0;justify-content:space-between;align-items:flex-start;gap:12px;padding:20px;display:flex}.drawer-title.svelte-9n99wb{color:var(--color-text);font-size:1rem;font-weight:700;line-height:1.3}.editable-title.svelte-9n99wb{cursor:pointer;border-radius:6px;align-items:center;gap:6px;margin:-2px -4px;padding:2px 4px;transition:background .15s;display:flex}.editable-title.svelte-9n99wb:hover{background:#6366f112}.edit-hint.svelte-9n99wb{opacity:0;font-size:.7rem;transition:opacity .15s}.editable-title.svelte-9n99wb:hover .edit-hint:where(.svelte-9n99wb){opacity:1}.drawer-body.svelte-9n99wb{flex:1;padding:20px;overflow-y:auto}.meta-grid.svelte-9n99wb{grid-template-columns:1fr 1fr;gap:10px;display:grid}.meta-cell.svelte-9n99wb{border:1px solid var(--color-border);background:#f1f5f9cc;border-radius:10px;padding:10px}.dark .meta-cell.svelte-9n99wb{background:#1e293bcc}.meta-label.svelte-9n99wb{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:2px;font-size:.65rem;font-weight:700}.meta-value.svelte-9n99wb{color:var(--color-text);font-size:.85rem;font-weight:600}.section-label.svelte-9n99wb{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:8px;font-size:.65rem;font-weight:700}.tag-chip.svelte-9n99wb{color:#6366f1;background:#6366f11a;border:1px solid #6366f133;border-radius:9999px;padding:2px 10px;font-size:.72rem}.md-card.svelte-9n99wb{border:1px solid var(--color-border);background:#f8fafccc;border-radius:12px;padding:16px}.dark .md-card.svelte-9n99wb{background:#0f172acc}.json-pre.svelte-9n99wb{border:1px solid var(--color-border);color:var(--color-text);background:#f8fafccc;border-radius:12px;padding:12px;font-family:JetBrains Mono,monospace;font-size:.75rem;overflow-x:auto}.dark .json-pre.svelte-9n99wb{background:#0f172acc}.comment-card.svelte-9n99wb{border:1px solid var(--color-border);background:#f1f5f980;border-radius:10px;padding:10px 14px}.dark .comment-card.svelte-9n99wb{background:#1e293b80}.comment-avatar.svelte-9n99wb{color:#fff;background:linear-gradient(135deg,#6366f1,#0ea5e9);border-radius:9999px;justify-content:center;align-items:center;width:20px;height:20px;font-size:9px;font-weight:700;display:flex}.comment-compose.svelte-9n99wb{border:1px solid var(--color-border);background:#f1f5f980;border-radius:10px;padding:12px}.dark .comment-compose.svelte-9n99wb{background:#1e293b66}.drawer-header.svelte-17ad9lv{border-bottom:1px solid var(--color-border);flex-shrink:0;justify-content:space-between;align-items:flex-start;gap:12px;padding:20px;display:flex}.drawer-title.svelte-17ad9lv{color:var(--color-text);word-break:break-all;font-size:1rem;font-weight:700;line-height:1.3}.type-chip.svelte-17ad9lv{text-transform:uppercase;letter-spacing:.05em;color:#0ea5e9;background:#0ea5e91a;border-radius:20px;padding:3px 8px;font-size:.7rem;font-weight:700}.drawer-body.svelte-17ad9lv{flex-direction:column;gap:20px;padding:20px 24px;display:flex;overflow-y:auto}.drawer-section.svelte-17ad9lv{flex-direction:column;gap:8px;display:flex}.section-label.svelte-17ad9lv{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:4px;font-size:.75rem;font-weight:700}.md-card.svelte-17ad9lv{border:1px solid var(--color-border);background:#f8fafccc;border-radius:12px;padding:16px}.dark .md-card.svelte-17ad9lv{background:#0f172acc}.mem-header.svelte-intd6h{border-bottom:1px solid var(--color-border);flex-shrink:0;justify-content:space-between;align-items:flex-start;gap:12px;padding:20px;display:flex}.mem-header-actions.svelte-intd6h{flex-shrink:0;align-items:center;gap:6px;display:flex}.mem-title-input.svelte-intd6h{padding:6px 10px;font-size:.95rem;font-weight:700}.mem-error.svelte-intd6h{color:#ef4444;background:#ef444414;border:1px solid #ef444438;border-radius:10px;margin-bottom:14px;padding:10px 14px;font-size:.8rem}.mem-form.svelte-intd6h{flex-direction:column;gap:14px;display:flex}.form-row-2.svelte-intd6h{grid-template-columns:1fr 1fr;gap:12px;display:grid}.form-label.svelte-intd6h{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);align-items:center;gap:6px;margin-bottom:5px;font-size:.68rem;font-weight:700;display:flex}.importance-badge.svelte-intd6h{border-radius:9999px;margin-left:4px;padding:1px 7px;font-size:.72rem;font-weight:800}.importance-slider.svelte-intd6h{cursor:pointer;background:0 0;border:none;border-radius:9999px;outline:none;width:100%;height:4px;padding:0}.importance-ticks.svelte-intd6h{color:var(--color-text-muted);justify-content:space-between;margin-top:2px;padding:0 2px;font-size:.6rem;display:flex}.importance-ticks.svelte-intd6h span:where(.svelte-intd6h){font-weight:600;transition:color .2s}.importance-ticks.svelte-intd6h span.active:where(.svelte-intd6h){color:var(--color-text)}.mem-footer.svelte-intd6h{border-top:1px solid var(--color-border);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#f8fafc99;flex-shrink:0;justify-content:flex-end;gap:8px;padding:14px 20px;display:flex}html.dark .mem-footer.svelte-intd6h{background:#050c1999}.drawer-title.svelte-intd6h{color:var(--color-text);font-size:1rem;font-weight:700;line-height:1.3}.drawer-body.svelte-intd6h{flex:1;padding:20px;overflow-y:auto}.meta-grid.svelte-intd6h{grid-template-columns:1fr 1fr;gap:10px;display:grid}.meta-cell.svelte-intd6h{border:1px solid var(--color-border);background:#f1f5f9cc;border-radius:10px;padding:10px}html.dark .meta-cell.svelte-intd6h{background:#1e293bcc}.meta-label.svelte-intd6h{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:2px;font-size:.65rem;font-weight:700}.meta-value.svelte-intd6h{color:var(--color-text);font-size:.85rem;font-weight:600}.section-label.svelte-intd6h{text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:8px;font-size:.65rem;font-weight:700}.tag-chip.svelte-intd6h{color:#6366f1;background:#6366f11a;border:1px solid #6366f133;border-radius:9999px;padding:2px 10px;font-size:.72rem}html.dark .tag-chip.svelte-intd6h{color:#a5b4fc;background:#6366f12e;border-color:#6366f14d}.md-card.svelte-intd6h{border:1px solid var(--color-border);background:#f8fafccc;border-radius:12px;padding:16px}html.dark .md-card.svelte-intd6h{background:#0f172acc}.json-pre.svelte-intd6h{border:1px solid var(--color-border);color:var(--color-text);background:#f8fafccc;border-radius:12px;padding:12px;font-family:JetBrains Mono,monospace;font-size:.75rem;overflow-x:auto}html.dark .json-pre.svelte-intd6h{background:#0f172acc}.modal-backdrop.svelte-lenod{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:2000;background:#0009;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal-content.svelte-lenod{background:var(--color-bg);border:1px solid var(--color-border);border-radius:20px;flex-direction:column;width:700px;max-width:95vw;max-height:90vh;display:flex;overflow:hidden;box-shadow:0 30px 60px #00000080}.modal-header.svelte-lenod{border-bottom:1px solid var(--color-border);background:linear-gradient(90deg,#0ea5e914,#0000);justify-content:space-between;align-items:center;padding:20px 24px;display:flex}.header-icon.svelte-lenod{background:#0ea5e91a;border-radius:8px;justify-content:center;align-items:center;width:32px;height:32px;display:flex}.modal-header.svelte-lenod h3:where(.svelte-lenod){color:var(--color-text);margin:0;font-size:1.15rem;font-weight:700}.close-btn.svelte-lenod{opacity:.6;transition:opacity .2s}.close-btn.svelte-lenod:hover{opacity:1}.drop-zone.svelte-lenod{border:2px dashed var(--color-border);background:#f1f5f908;border-radius:16px;justify-content:center;align-items:center;width:100%;height:240px;transition:all .3s;display:flex}.drop-zone.svelte-lenod:hover{background:#0ea5e908;border-color:#0ea5e9}.drop-zone-content.svelte-lenod{text-align:center;flex-direction:column;align-items:center;gap:12px;display:flex}.drop-zone-content.svelte-lenod p:where(.svelte-lenod){color:var(--color-text);margin:0;font-size:.95rem}.preview-container.svelte-lenod{border:1px solid var(--color-border);background:var(--color-bg-secondary);border-radius:12px;overflow:hidden}.preview-header.svelte-lenod{color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--color-border);background:#0000000d;padding:8px 12px;font-size:.75rem;font-weight:700}.table-wrapper.svelte-lenod{max-height:200px;overflow-y:auto}table.svelte-lenod{border-collapse:collapse;width:100%;font-size:.75rem}th.svelte-lenod{text-align:left;color:var(--color-text-muted);border-bottom:1px solid var(--color-border);z-index:1;background:#00000005;padding:8px 12px;font-weight:600;position:sticky;top:0}td.svelte-lenod{border-bottom:1px solid var(--color-border);color:var(--color-text);white-space:nowrap;text-overflow:ellipsis;max-width:200px;padding:8px 12px;overflow:hidden}tr.svelte-lenod:last-child td:where(.svelte-lenod){border-bottom:none}.modal-footer.svelte-lenod{border-top:1px solid var(--color-border);background:#00000005;justify-content:flex-end;gap:12px;padding:16px 24px;display:flex}.error-msg.svelte-lenod{color:#f87171;background:#ef444414;border:1px solid #ef444433;border-radius:8px;margin-top:16px;padding:10px 14px;font-size:.8rem;font-weight:500}.spinner.svelte-lenod{border:2px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:16px;height:16px;animation:.8s linear infinite svelte-lenod-spin}@keyframes svelte-lenod-spin{to{transform:rotate(360deg)}}.hidden.svelte-lenod{display:none}.ref-header.svelte-w0wd5z{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;display:flex}.ref-total-badge.svelte-w0wd5z{color:#0ea5e9;background:#0ea5e91a;border:1px solid #0ea5e933;border-radius:9999px;padding:2px 8px;font-size:.62rem;font-weight:700}.ref-search-wrap.svelte-w0wd5z{flex:1;max-width:300px;position:relative}.ref-search-icon.svelte-w0wd5z{color:var(--color-text-muted);pointer-events:none;display:flex;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.ref-search-input.svelte-w0wd5z{width:100%;padding-left:32px;padding-right:28px;font-size:.8rem}.ref-clear-btn.svelte-w0wd5z{cursor:pointer;color:var(--color-text-muted);background:0 0;border:none;border-radius:4px;padding:2px;transition:color .15s;display:flex;position:absolute;top:50%;right:8px;transform:translateY(-50%)}.ref-clear-btn.svelte-w0wd5z:hover{color:var(--color-text)}.ref-body.svelte-w0wd5z{grid-template-columns:160px 1fr;align-items:start;gap:16px;display:grid}@media (width<=700px){.ref-body.svelte-w0wd5z{grid-template-columns:1fr}}.ref-sidebar.svelte-w0wd5z{border:1px solid var(--color-border);border-radius:16px;flex-direction:column;gap:3px;padding:12px;display:flex;position:sticky;top:80px}.ref-sidebar-label.svelte-w0wd5z{text-transform:uppercase;letter-spacing:.07em;color:var(--color-text-muted);padding:4px 8px 8px;font-size:.6rem;font-weight:700}.ref-cat-btn.svelte-w0wd5z{color:var(--color-text-muted);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:9px;align-items:center;gap:7px;width:100%;padding:7px 10px;font-size:.8rem;font-weight:600;transition:all .15s;display:flex}.ref-cat-btn.svelte-w0wd5z:hover{color:var(--color-text);background:#0ea5e90f}.ref-cat-btn.active.svelte-w0wd5z{color:#0ea5e9;background:#0ea5e91a;border:1px solid #0ea5e933}html.dark .ref-cat-btn.active.svelte-w0wd5z{color:#38bdf8;background:#0ea5e926;border-color:#38bdf840}.ref-cat-count.svelte-w0wd5z{color:var(--color-text-muted);background:#64748b1f;border-radius:9999px;margin-left:auto;padding:1px 6px;font-size:.62rem;font-weight:700}.ref-main.svelte-w0wd5z{flex-direction:column;display:flex}.ref-section-header.svelte-w0wd5z{text-transform:uppercase;letter-spacing:.07em;color:var(--color-text-muted);align-items:center;gap:6px;margin-bottom:10px;font-size:.72rem;font-weight:700;display:flex}.ref-section-count.svelte-w0wd5z{color:var(--color-text-muted);background:#64748b1a;border-radius:9999px;padding:1px 6px;font-size:.6rem;font-weight:700}.ref-grid.svelte-w0wd5z{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px;display:grid}.ref-card.svelte-w0wd5z{cursor:pointer;background:#fff;border:1px solid #0000000f;border-radius:16px;flex-direction:column;gap:8px;padding:18px 20px;transition:all .2s cubic-bezier(.4,0,.2,1);display:flex;position:relative;overflow:hidden;box-shadow:0 4px 6px -1px #0000000d,0 2px 4px -2px #00000008}.ref-card.svelte-w0wd5z:before{content:"";background:0 0;height:3px;transition:all .2s;position:absolute;top:0;left:0;right:0}.ref-card.svelte-w0wd5z:hover{border-color:#00000014;transform:translateY(-2px);box-shadow:0 12px 24px -4px #00000014,0 8px 12px -6px #0000000a}html.dark .ref-card.svelte-w0wd5z{background:#0a1226cc;border:1px solid #ffffff14;box-shadow:0 4px 12px #0003}html.dark .ref-card.svelte-w0wd5z:hover{border-color:#ffffff26;box-shadow:0 10px 30px #0006}.ref-card-tool.svelte-w0wd5z:hover:before{background:linear-gradient(90deg,#6366f1,#a855f7)}.ref-card-prompt.svelte-w0wd5z:hover:before{background:linear-gradient(90deg,#a855f7,#ec4899)}.ref-card-resource.svelte-w0wd5z:hover:before{background:linear-gradient(90deg,#10b981,#3b82f6)}.ref-card-top.svelte-w0wd5z{align-items:center;gap:6px;display:flex}.ref-type-badge.svelte-w0wd5z{text-transform:uppercase;letter-spacing:.06em;border:1px solid #0000;border-radius:9999px;align-items:center;gap:4px;padding:2px 7px;font-size:.6rem;font-weight:700;display:inline-flex}.ref-type-tool.svelte-w0wd5z{color:#6366f1;background:#6366f11a;border-color:#6366f133}.ref-type-prompt.svelte-w0wd5z{color:#a855f7;background:#a855f71a;border-color:#a855f733}html.dark .ref-type-tool.svelte-w0wd5z{color:#818cf8}html.dark .ref-type-prompt.svelte-w0wd5z{color:#c084fc}.ref-card-name.svelte-w0wd5z{color:var(--color-text);word-break:break-word;font-size:.82rem;font-weight:700}.ref-card-desc.svelte-w0wd5z{color:var(--color-text-muted);font-size:.72rem;line-height:1.55}.ref-params.svelte-w0wd5z{flex-wrap:wrap;gap:4px;margin-top:4px;display:flex}.ref-param-tag.svelte-w0wd5z{color:#0ea5e9;background:#0ea5e914;border:1px solid #0ea5e92e;border-radius:5px;padding:1px 6px;font-family:JetBrains Mono,Fira Code,monospace;font-size:.65rem}.ref-param-more.svelte-w0wd5z{color:var(--color-text-muted);background:#64748b1a;border-color:#64748b33}html.dark .ref-param-tag.svelte-w0wd5z{color:#38bdf8;background:#0ea5e91f;border-color:#38bdf833}@media (width<=900px){.dashboard-grid.svelte-1m88iwd{grid-template-columns:1fr!important}}
|