@mcp-graph-workflow/mcp-graph 4.1.0 → 4.2.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/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +24 -0
- package/dist/api/router.js.map +1 -1
- package/dist/api/routes/logs.d.ts +3 -0
- package/dist/api/routes/logs.d.ts.map +1 -0
- package/dist/api/routes/logs.js +38 -0
- package/dist/api/routes/logs.js.map +1 -0
- package/dist/core/events/event-types.d.ts +10 -1
- package/dist/core/events/event-types.d.ts.map +1 -1
- package/dist/core/utils/logger.d.ts +4 -0
- package/dist/core/utils/logger.d.ts.map +1 -1
- package/dist/core/utils/logger.js +34 -0
- package/dist/core/utils/logger.js.map +1 -1
- package/dist/schemas/log.schema.d.ts +24 -0
- package/dist/schemas/log.schema.d.ts.map +1 -0
- package/dist/schemas/log.schema.js +10 -0
- package/dist/schemas/log.schema.js.map +1 -0
- package/dist/web/dashboard/dist/assets/{benchmark-tab-CESZcCtO.js → benchmark-tab-5xQOEgKI.js} +1 -1
- package/dist/web/dashboard/dist/assets/{gitnexus-tab-ClNGphK5.js → gitnexus-tab-DiextoFD.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-tab-BUAkTto0.js → graph-tab-BWyH2uGm.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-utils-M7iOhRI-.js → graph-utils-CwfVyQ0x.js} +1 -1
- package/dist/web/dashboard/dist/assets/index-BYepgmDE.css +1 -0
- package/dist/web/dashboard/dist/assets/{index-D9i2aVjo.js → index-DSExqypu.js} +15 -15
- package/dist/web/dashboard/dist/assets/{insights-tab-CWUU6eDi.js → insights-tab-CncahgJb.js} +1 -1
- package/dist/web/dashboard/dist/assets/logs-tab-sUqUxW7O.js +2 -0
- package/dist/web/dashboard/dist/assets/{prd-backlog-tab-DAHBiRO-.js → prd-backlog-tab-wbCrJ8KJ.js} +1 -1
- package/dist/web/dashboard/dist/assets/{serena-tab-DwiZ6Jm3.js → serena-tab-C5Gk0M6t.js} +1 -1
- package/dist/web/dashboard/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/web/dashboard/dist/assets/index-BnLPCC8R.css +0 -1
package/dist/api/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/api/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/api/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAwBjE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,cAAc,EAAE,WAAW,GAAG,gBAAgB,GAAG,MAAM,CAuDtF"}
|
package/dist/api/router.js
CHANGED
|
@@ -17,8 +17,10 @@ import { createGitNexusRouter } from "./routes/gitnexus.js";
|
|
|
17
17
|
import { createRagRouter } from "./routes/rag.js";
|
|
18
18
|
import { createKnowledgeRouter } from "./routes/knowledge.js";
|
|
19
19
|
import { createBenchmarkRouter } from "./routes/benchmark.js";
|
|
20
|
+
import { createLogsRouter } from "./routes/logs.js";
|
|
20
21
|
import { errorHandler } from "./middleware/error-handler.js";
|
|
21
22
|
import { requestLogger } from "./middleware/request-logger.js";
|
|
23
|
+
import { setLogListener } from "../core/utils/logger.js";
|
|
22
24
|
export function createApiRouter(storeOrOptions) {
|
|
23
25
|
const store = "store" in storeOrOptions ? storeOrOptions.store : storeOrOptions;
|
|
24
26
|
const basePath = "basePath" in storeOrOptions ? (storeOrOptions.basePath ?? process.cwd()) : process.cwd();
|
|
@@ -42,8 +44,30 @@ export function createApiRouter(storeOrOptions) {
|
|
|
42
44
|
router.use("/rag", createRagRouter(store));
|
|
43
45
|
router.use("/knowledge", createKnowledgeRouter(store));
|
|
44
46
|
router.use("/benchmark", createBenchmarkRouter(store));
|
|
47
|
+
router.use("/logs", createLogsRouter());
|
|
45
48
|
if (eventBus) {
|
|
46
49
|
router.use("/events", createEventsRouter(eventBus));
|
|
50
|
+
let emitting = false;
|
|
51
|
+
setLogListener((entry) => {
|
|
52
|
+
if (emitting)
|
|
53
|
+
return;
|
|
54
|
+
emitting = true;
|
|
55
|
+
try {
|
|
56
|
+
eventBus.emit({
|
|
57
|
+
type: "log:entry",
|
|
58
|
+
timestamp: entry.timestamp,
|
|
59
|
+
payload: {
|
|
60
|
+
id: entry.id,
|
|
61
|
+
level: entry.level,
|
|
62
|
+
message: entry.message,
|
|
63
|
+
...(entry.context ? { context: entry.context } : {}),
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
emitting = false;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
47
71
|
}
|
|
48
72
|
router.use(errorHandler);
|
|
49
73
|
return router;
|
package/dist/api/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/api/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/api/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../src/api/routes/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,wBAAgB,gBAAgB,IAAI,MAAM,CA0CzC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Router } from "express";
|
|
2
|
+
import { getLogBuffer, clearLogBuffer } from "../../core/utils/logger.js";
|
|
3
|
+
export function createLogsRouter() {
|
|
4
|
+
const router = Router();
|
|
5
|
+
/**
|
|
6
|
+
* GET /logs
|
|
7
|
+
* Returns buffered log entries with optional filters.
|
|
8
|
+
* Query params: level, since (id), search (text)
|
|
9
|
+
*/
|
|
10
|
+
router.get("/", (req, res) => {
|
|
11
|
+
let logs = getLogBuffer();
|
|
12
|
+
const { level, since, search } = req.query;
|
|
13
|
+
if (typeof level === "string" && level.length > 0) {
|
|
14
|
+
logs = logs.filter((entry) => entry.level === level);
|
|
15
|
+
}
|
|
16
|
+
if (typeof since === "string" && since.length > 0) {
|
|
17
|
+
const sinceId = Number(since);
|
|
18
|
+
if (!Number.isNaN(sinceId)) {
|
|
19
|
+
logs = logs.filter((entry) => entry.id > sinceId);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (typeof search === "string" && search.length > 0) {
|
|
23
|
+
const term = search.toLowerCase();
|
|
24
|
+
logs = logs.filter((entry) => entry.message.toLowerCase().includes(term));
|
|
25
|
+
}
|
|
26
|
+
res.json({ logs, total: logs.length });
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* DELETE /logs
|
|
30
|
+
* Clears the in-memory log buffer.
|
|
31
|
+
*/
|
|
32
|
+
router.delete("/", (_req, res) => {
|
|
33
|
+
clearLogBuffer();
|
|
34
|
+
res.status(204).end();
|
|
35
|
+
});
|
|
36
|
+
return router;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/api/routes/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE1E,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB;;;;OAIG;IACH,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC3B,IAAI,IAAI,GAAG,YAAY,EAAE,CAAC;QAE1B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;QAE3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YAClC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC/B,cAAc,EAAE,CAAC;QACjB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type GraphEventType = "node:created" | "node:updated" | "node:deleted" | "edge:created" | "edge:deleted" | "import:completed" | "bulk:updated" | "knowledge:indexed" | "knowledge:deleted";
|
|
1
|
+
export type GraphEventType = "node:created" | "node:updated" | "node:deleted" | "edge:created" | "edge:deleted" | "import:completed" | "bulk:updated" | "knowledge:indexed" | "knowledge:deleted" | "log:entry";
|
|
2
2
|
export interface GraphEvent {
|
|
3
3
|
type: GraphEventType;
|
|
4
4
|
timestamp: string;
|
|
@@ -68,4 +68,13 @@ export interface KnowledgeDeletedEvent extends GraphEvent {
|
|
|
68
68
|
documentsDeleted: number;
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
|
+
export interface LogEntryEvent extends GraphEvent {
|
|
72
|
+
type: "log:entry";
|
|
73
|
+
payload: {
|
|
74
|
+
id: number;
|
|
75
|
+
level: string;
|
|
76
|
+
message: string;
|
|
77
|
+
context?: Record<string, unknown>;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
71
80
|
//# sourceMappingURL=event-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-types.d.ts","sourceRoot":"","sources":["../../../src/core/events/event-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,kBAAkB,GAClB,cAAc,GACd,mBAAmB,GACnB,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"event-types.d.ts","sourceRoot":"","sources":["../../../src/core/events/event-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,kBAAkB,GAClB,cAAc,GACd,mBAAmB,GACnB,mBAAmB,GACnB,WAAW,CAAC;AAEhB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9D;AAED,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC/C;AAED,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7E;AAED,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,IAAI,EAAE,kBAAkB,CAAC;IACzB,OAAO,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,MAAM,WAAW,qBAAsB,SAAQ,UAAU;IACvD,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,WAAW,qBAAsB,SAAQ,UAAU;IACvD,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC5F"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import type { LogEntry } from "../../schemas/log.schema.js";
|
|
2
|
+
export declare function getLogBuffer(): LogEntry[];
|
|
3
|
+
export declare function clearLogBuffer(): void;
|
|
4
|
+
export declare function setLogListener(listener: ((entry: LogEntry) => void) | null): void;
|
|
1
5
|
export declare const logger: {
|
|
2
6
|
info(msg: string, ctx?: Record<string, unknown>): void;
|
|
3
7
|
warn(msg: string, ctx?: Record<string, unknown>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/core/utils/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/core/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,6BAA6B,CAAC;AA4BtE,wBAAgB,YAAY,IAAI,QAAQ,EAAE,CAEzC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAEjF;AAYD,eAAO,MAAM,MAAM;cACP,MAAM,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;cAI5C,MAAM,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;eAI3C,MAAM,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;iBAI1C,MAAM,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;eAI9C,MAAM,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAMxD,CAAC"}
|
|
@@ -1,3 +1,32 @@
|
|
|
1
|
+
const MAX_BUFFER_SIZE = 1000;
|
|
2
|
+
const logBuffer = [];
|
|
3
|
+
let nextId = 1;
|
|
4
|
+
let logListener = null;
|
|
5
|
+
function appendToBuffer(level, message, context) {
|
|
6
|
+
const entry = {
|
|
7
|
+
id: nextId++,
|
|
8
|
+
level,
|
|
9
|
+
message,
|
|
10
|
+
timestamp: new Date().toISOString(),
|
|
11
|
+
...(context && Object.keys(context).length > 0 ? { context } : {}),
|
|
12
|
+
};
|
|
13
|
+
logBuffer.push(entry);
|
|
14
|
+
if (logBuffer.length > MAX_BUFFER_SIZE) {
|
|
15
|
+
logBuffer.splice(0, logBuffer.length - MAX_BUFFER_SIZE);
|
|
16
|
+
}
|
|
17
|
+
if (logListener) {
|
|
18
|
+
logListener(entry);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function getLogBuffer() {
|
|
22
|
+
return [...logBuffer];
|
|
23
|
+
}
|
|
24
|
+
export function clearLogBuffer() {
|
|
25
|
+
logBuffer.length = 0;
|
|
26
|
+
}
|
|
27
|
+
export function setLogListener(listener) {
|
|
28
|
+
logListener = listener;
|
|
29
|
+
}
|
|
1
30
|
function formatCtx(ctx) {
|
|
2
31
|
if (!ctx || Object.keys(ctx).length === 0)
|
|
3
32
|
return "";
|
|
@@ -8,19 +37,24 @@ function formatCtx(ctx) {
|
|
|
8
37
|
}
|
|
9
38
|
export const logger = {
|
|
10
39
|
info(msg, ctx) {
|
|
40
|
+
appendToBuffer("info", msg, ctx);
|
|
11
41
|
console.error(`[INFO] ${msg}${formatCtx(ctx)}`);
|
|
12
42
|
},
|
|
13
43
|
warn(msg, ctx) {
|
|
44
|
+
appendToBuffer("warn", msg, ctx);
|
|
14
45
|
console.error(`[WARN] ${msg}${formatCtx(ctx)}`);
|
|
15
46
|
},
|
|
16
47
|
error(msg, ctx) {
|
|
48
|
+
appendToBuffer("error", msg, ctx);
|
|
17
49
|
console.error(`[ERROR] ${msg}${formatCtx(ctx)}`);
|
|
18
50
|
},
|
|
19
51
|
success(msg, ctx) {
|
|
52
|
+
appendToBuffer("success", msg, ctx);
|
|
20
53
|
console.error(`[OK] ${msg}${formatCtx(ctx)}`);
|
|
21
54
|
},
|
|
22
55
|
debug(msg, ctx) {
|
|
23
56
|
if (process.env.MCP_GRAPH_DEBUG) {
|
|
57
|
+
appendToBuffer("debug", msg, ctx);
|
|
24
58
|
console.error(`[DEBUG] ${msg}${formatCtx(ctx)}`);
|
|
25
59
|
}
|
|
26
60
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/core/utils/logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/core/utils/logger.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,MAAM,SAAS,GAAe,EAAE,CAAC;AACjC,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,IAAI,WAAW,GAAuC,IAAI,CAAC;AAE3D,SAAS,cAAc,CAAC,KAAe,EAAE,OAAe,EAAE,OAAiC;IACzF,MAAM,KAAK,GAAa;QACtB,EAAE,EAAE,MAAM,EAAE;QACZ,KAAK;QACL,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC;IAEF,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEtB,IAAI,SAAS,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QACvC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAA4C;IACzE,WAAW,GAAG,QAAQ,CAAC;AACzB,CAAC;AAED,SAAS,SAAS,CAAC,GAA6B;IAC9C,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrD,OAAO,CACL,GAAG;QACH,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;aAChB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;aACtC,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,CAAC,GAAW,EAAE,GAA6B;QAC7C,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,CAAC,GAAW,EAAE,GAA6B;QAC7C,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,KAAK,CAAC,GAAW,EAAE,GAA6B;QAC9C,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,CAAC,GAAW,EAAE,GAA6B;QAChD,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,KAAK,CAAC,GAAW,EAAE,GAA6B;QAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;YAChC,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod/v4";
|
|
2
|
+
export declare const LogLevelSchema: z.ZodEnum<{
|
|
3
|
+
info: "info";
|
|
4
|
+
warn: "warn";
|
|
5
|
+
error: "error";
|
|
6
|
+
success: "success";
|
|
7
|
+
debug: "debug";
|
|
8
|
+
}>;
|
|
9
|
+
export declare const LogEntrySchema: z.ZodObject<{
|
|
10
|
+
id: z.ZodNumber;
|
|
11
|
+
level: z.ZodEnum<{
|
|
12
|
+
info: "info";
|
|
13
|
+
warn: "warn";
|
|
14
|
+
error: "error";
|
|
15
|
+
success: "success";
|
|
16
|
+
debug: "debug";
|
|
17
|
+
}>;
|
|
18
|
+
message: z.ZodString;
|
|
19
|
+
context: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
20
|
+
timestamp: z.ZodString;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
export type LogLevel = z.infer<typeof LogLevelSchema>;
|
|
23
|
+
export type LogEntry = z.infer<typeof LogEntrySchema>;
|
|
24
|
+
//# sourceMappingURL=log.schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.schema.d.ts","sourceRoot":"","sources":["../../src/schemas/log.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,eAAO,MAAM,cAAc;;;;;;EAAwD,CAAC;AAEpF,eAAO,MAAM,cAAc;;;;;;;;;;;;iBAMzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from "zod/v4";
|
|
2
|
+
export const LogLevelSchema = z.enum(["info", "warn", "error", "success", "debug"]);
|
|
3
|
+
export const LogEntrySchema = z.object({
|
|
4
|
+
id: z.number().int(),
|
|
5
|
+
level: LogLevelSchema,
|
|
6
|
+
message: z.string(),
|
|
7
|
+
context: z.record(z.string(), z.unknown()).optional(),
|
|
8
|
+
timestamp: z.string(),
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=log.schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.schema.js","sourceRoot":"","sources":["../../src/schemas/log.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACpB,KAAK,EAAE,cAAc;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IACrD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC"}
|
package/dist/web/dashboard/dist/assets/{benchmark-tab-CESZcCtO.js → benchmark-tab-5xQOEgKI.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as i,a as x,j as e}from"./index-
|
|
1
|
+
import{r as i,a as x,j as e}from"./index-DSExqypu.js";function m(){const[r,n]=i.useState(null),[c,s]=i.useState(!0),[o,d]=i.useState(null);return i.useEffect(()=>{async function t(){try{const l=await x.request("/benchmark");n(l)}catch(l){d(l instanceof Error?l.message:"Failed to load benchmark data")}finally{s(!1)}}t()},[]),{data:r,loading:c,error:o}}function h(){const{data:r,loading:n,error:c}=m();if(n)return e.jsx("div",{className:"flex items-center justify-center h-full text-[var(--color-text-muted)]",children:"Loading benchmark data..."});if(c)return e.jsxs("div",{className:"flex items-center justify-center h-full text-[var(--color-danger)]",children:["Failed to load: ",c]});if(!r)return e.jsx("div",{});const{tokenEconomy:s,dependencyIntelligence:o,formulas:d}=r;return e.jsxs("div",{className:"p-6 max-w-5xl mx-auto space-y-6 overflow-y-auto h-full",children:[e.jsxs("section",{children:[e.jsx("h3",{className:"text-sm font-semibold mb-3",children:"Token Economy"}),e.jsxs("div",{className:"grid grid-cols-4 gap-3 mb-4",children:[e.jsx(a,{value:`${s.avgCompressionPercent}%`,label:"Avg Compress"}),e.jsx(a,{value:s.avgTokensPerTask.toLocaleString(),label:"Tokens Saved/Task"}),e.jsx(a,{value:s.totalNodes,label:"Nodes"}),e.jsx(a,{value:s.totalEdges,label:"Edges"})]}),s.perTaskMetrics.length>0&&e.jsxs("div",{children:[e.jsx("h4",{className:"text-xs font-medium text-[var(--color-text-muted)] mb-2",children:"Context Compression per Task"}),e.jsx("div",{className:"space-y-1.5","data-testid":"compression-bars",children:s.perTaskMetrics.slice(0,15).map(t=>e.jsxs("div",{className:"flex items-center gap-2 text-xs",children:[e.jsx("span",{className:"w-32 truncate",title:t.title,children:t.title}),e.jsx("div",{className:"flex-1 h-3 bg-[var(--color-bg-tertiary)] rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full rounded-full bg-[var(--color-accent)]",style:{width:`${Math.min(t.compressionPercent,100)}%`}})}),e.jsxs("span",{className:"text-[var(--color-text-muted)] w-24 text-right",children:[t.compressionPercent,"% (",t.estimatedTokens," tok)"]})]},t.id))})]})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-sm font-semibold mb-3",children:"Dependency Intelligence"}),e.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[e.jsx(a,{value:o.inferredDeps,label:"Auto Inferred"}),e.jsx(a,{value:`${o.blockedTasks}/${s.totalNodes}`,label:"Blocked Detected"}),e.jsx(a,{value:o.cycles,label:"Cycles Detected"})]})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-sm font-semibold mb-3",children:"Formulas & Justification"}),e.jsx("div",{className:"px-3 py-2 rounded-lg bg-[var(--color-bg-secondary)] border border-[var(--color-border)] text-xs space-y-1","data-testid":"formulas-section",children:Object.entries(d).map(([t,l])=>e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("span",{className:"text-[var(--color-text-muted)] font-mono w-40 shrink-0",children:[t,":"]}),e.jsx("span",{children:l})]},t))})]}),e.jsxs("section",{children:[e.jsx("h3",{className:"text-sm font-semibold mb-3",children:"Cost Savings per Task"}),e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(a,{value:`$${s.costSavings.opusPerTask.toFixed(3)}`,label:"Opus Input"}),e.jsx(a,{value:`$${s.costSavings.sonnetPerTask.toFixed(3)}`,label:"Sonnet Input"})]})]})]})}function a({value:r,label:n}){return e.jsxs("div",{className:"p-3 rounded-lg bg-[var(--color-bg-secondary)] border border-[var(--color-border)] text-center","data-testid":"metric-card",children:[e.jsx("div",{className:"text-xl font-bold",children:r}),e.jsx("div",{className:"text-[10px] text-[var(--color-text-muted)] uppercase",children:n})]})}export{h as BenchmarkTab};
|