@mcp-graph-workflow/mcp-graph 5.1.4 → 5.1.5
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 +1 -0
- package/dist/api/router.d.ts.map +1 -1
- package/dist/api/router.js +3 -2
- package/dist/api/router.js.map +1 -1
- package/dist/api/routes/folder.d.ts +4 -1
- package/dist/api/routes/folder.d.ts.map +1 -1
- package/dist/api/routes/folder.js +20 -1
- package/dist/api/routes/folder.js.map +1 -1
- package/dist/api/routes/gitnexus.d.ts.map +1 -1
- package/dist/api/routes/gitnexus.js +3 -1
- package/dist/api/routes/gitnexus.js.map +1 -1
- package/dist/core/integrations/gitnexus-launcher.d.ts +5 -0
- package/dist/core/integrations/gitnexus-launcher.d.ts.map +1 -1
- package/dist/core/integrations/gitnexus-launcher.js +30 -3
- package/dist/core/integrations/gitnexus-launcher.js.map +1 -1
- package/dist/core/planner/lifecycle-phase.d.ts +26 -3
- package/dist/core/planner/lifecycle-phase.d.ts.map +1 -1
- package/dist/core/planner/lifecycle-phase.js +167 -3
- package/dist/core/planner/lifecycle-phase.js.map +1 -1
- package/dist/core/utils/errors.d.ts +7 -0
- package/dist/core/utils/errors.d.ts.map +1 -1
- package/dist/core/utils/errors.js +14 -0
- package/dist/core/utils/errors.js.map +1 -1
- package/dist/mcp/app-factory.d.ts +1 -0
- package/dist/mcp/app-factory.d.ts.map +1 -1
- package/dist/mcp/app-factory.js +2 -2
- package/dist/mcp/app-factory.js.map +1 -1
- package/dist/mcp/lifecycle-wrapper.d.ts +5 -4
- package/dist/mcp/lifecycle-wrapper.d.ts.map +1 -1
- package/dist/mcp/lifecycle-wrapper.js +79 -5
- package/dist/mcp/lifecycle-wrapper.js.map +1 -1
- package/dist/mcp/server.js +3 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/set-phase.d.ts.map +1 -1
- package/dist/mcp/tools/set-phase.js +49 -6
- package/dist/mcp/tools/set-phase.js.map +1 -1
- package/dist/web/dashboard/dist/assets/{benchmark-tab-CuZsNkbP.js → benchmark-tab-DzYj_lJO.js} +1 -1
- package/dist/web/dashboard/dist/assets/gitnexus-tab-B16kDpcc.js +312 -0
- package/dist/web/dashboard/dist/assets/{graph-tab-Dp7PfUEJ.js → graph-tab-bgRao3Qi.js} +1 -1
- package/dist/web/dashboard/dist/assets/{graph-utils-D5iPoiPD.js → graph-utils-CETPf3Qj.js} +1 -1
- package/dist/web/dashboard/dist/assets/index-D4nxPvv8.css +1 -0
- package/dist/web/dashboard/dist/assets/{index-CN9Wi5mu.js → index-DLehETrJ.js} +2 -2
- package/dist/web/dashboard/dist/assets/{insights-tab-CLA0OIxd.js → insights-tab-MkpvetqF.js} +1 -1
- package/dist/web/dashboard/dist/assets/{logs-tab-CSYlvuCu.js → logs-tab-BPDyVj2B.js} +1 -1
- package/dist/web/dashboard/dist/assets/{prd-backlog-tab-BBLpErTk.js → prd-backlog-tab-DbnFo6Ve.js} +1 -1
- package/dist/web/dashboard/dist/assets/{serena-tab-BxYP8nU5.js → serena-tab-CLJOpG5i.js} +1 -1
- package/dist/web/dashboard/dist/index.html +2 -2
- package/package.json +1 -1
- package/dist/web/dashboard/dist/assets/gitnexus-tab-D7If6lxT.js +0 -312
- package/dist/web/dashboard/dist/assets/index-BUl7yWBP.css +0 -1
|
@@ -17,4 +17,11 @@ export declare class ValidationError extends McpGraphError {
|
|
|
17
17
|
export declare class SnapshotNotFoundError extends McpGraphError {
|
|
18
18
|
constructor(id: number);
|
|
19
19
|
}
|
|
20
|
+
export declare class LifecycleGateError extends McpGraphError {
|
|
21
|
+
readonly toolName: string;
|
|
22
|
+
readonly currentPhase: string;
|
|
23
|
+
readonly reason: string;
|
|
24
|
+
readonly unmetConditions: string[];
|
|
25
|
+
constructor(toolName: string, currentPhase: string, reason: string, unmetConditions: string[]);
|
|
26
|
+
}
|
|
20
27
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,IAAI,EAAE,MAAM;CAIzB;AAED,qBAAa,wBAAyB,SAAQ,aAAa;;CAK1D;AAED,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,eAAgB,SAAQ,aAAa;aACH,MAAM,EAAE,OAAO,EAAE;gBAAlD,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,OAAO,EAAE;CAI/D;AAED,qBAAa,qBAAsB,SAAQ,aAAa;gBAC1C,EAAE,EAAE,MAAM;CAIvB"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,IAAI,EAAE,MAAM;CAIzB;AAED,qBAAa,wBAAyB,SAAQ,aAAa;;CAK1D;AAED,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,eAAgB,SAAQ,aAAa;aACH,MAAM,EAAE,OAAO,EAAE;gBAAlD,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,OAAO,EAAE;CAI/D;AAED,qBAAa,qBAAsB,SAAQ,aAAa;gBAC1C,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,kBAAmB,SAAQ,aAAa;aAEjC,QAAQ,EAAE,MAAM;aAChB,YAAY,EAAE,MAAM;aACpB,MAAM,EAAE,MAAM;aACd,eAAe,EAAE,MAAM,EAAE;gBAHzB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE;CAK5C"}
|
|
@@ -36,4 +36,18 @@ export class SnapshotNotFoundError extends McpGraphError {
|
|
|
36
36
|
this.name = "SnapshotNotFoundError";
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
+
export class LifecycleGateError extends McpGraphError {
|
|
40
|
+
toolName;
|
|
41
|
+
currentPhase;
|
|
42
|
+
reason;
|
|
43
|
+
unmetConditions;
|
|
44
|
+
constructor(toolName, currentPhase, reason, unmetConditions) {
|
|
45
|
+
super(`Lifecycle gate: "${toolName}" blocked in ${currentPhase} — ${reason}`);
|
|
46
|
+
this.toolName = toolName;
|
|
47
|
+
this.currentPhase = currentPhase;
|
|
48
|
+
this.reason = reason;
|
|
49
|
+
this.unmetConditions = unmetConditions;
|
|
50
|
+
this.name = "LifecycleGateError";
|
|
51
|
+
}
|
|
52
|
+
}
|
|
39
53
|
//# sourceMappingURL=errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,IAAY;QACtB,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,aAAa;IACzD;QACE,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,EAAU;QACpB,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,aAAa;IACH;IAA7C,YAAY,OAAe,EAAkB,MAAiB;QAC5D,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QADI,WAAM,GAAN,MAAM,CAAW;QAE5D,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,aAAa;IACtD,YAAY,EAAU;QACpB,KAAK,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,IAAY;QACtB,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,aAAa;IACzD;QACE,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,EAAU;QACpB,KAAK,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,aAAa;IACH;IAA7C,YAAY,OAAe,EAAkB,MAAiB;QAC5D,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;QADI,WAAM,GAAN,MAAM,CAAW;QAE5D,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,aAAa;IACtD,YAAY,EAAU;QACpB,KAAK,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IAEjC;IACA;IACA;IACA;IAJlB,YACkB,QAAgB,EAChB,YAAoB,EACpB,MAAc,EACd,eAAyB;QAEzC,KAAK,CAAC,oBAAoB,QAAQ,gBAAgB,YAAY,MAAM,MAAM,EAAE,CAAC,CAAC;QAL9D,aAAQ,GAAR,QAAQ,CAAQ;QAChB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,WAAM,GAAN,MAAM,CAAQ;QACd,oBAAe,GAAf,eAAe,CAAU;QAGzC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -9,6 +9,7 @@ export interface AppFactoryOptions {
|
|
|
9
9
|
eventBus: GraphEventBus;
|
|
10
10
|
mcp?: McpServer;
|
|
11
11
|
storeManager?: StoreManager;
|
|
12
|
+
gitnexusPort?: number;
|
|
12
13
|
}
|
|
13
14
|
export declare function createApp(options: AppFactoryOptions): Express;
|
|
14
15
|
//# sourceMappingURL=app-factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-factory.d.ts","sourceRoot":"","sources":["../../src/mcp/app-factory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAMjE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"app-factory.d.ts","sourceRoot":"","sources":["../../src/mcp/app-factory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAMjE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CA6B7D"}
|
package/dist/mcp/app-factory.js
CHANGED
|
@@ -6,7 +6,7 @@ import { createApiRouter } from "../api/router.js";
|
|
|
6
6
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
7
|
const publicDir = path.join(__dirname, "..", "web", "dashboard", "dist");
|
|
8
8
|
export function createApp(options) {
|
|
9
|
-
const { store, basePath, eventBus, mcp, storeManager } = options;
|
|
9
|
+
const { store, basePath, eventBus, mcp, storeManager, gitnexusPort } = options;
|
|
10
10
|
const app = express();
|
|
11
11
|
app.use(express.json());
|
|
12
12
|
// MCP HTTP transport (optional — only when MCP server is provided)
|
|
@@ -20,7 +20,7 @@ export function createApp(options) {
|
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
// REST API
|
|
23
|
-
app.use("/api/v1", createApiRouter({ store, basePath, eventBus, storeManager }));
|
|
23
|
+
app.use("/api/v1", createApiRouter({ store, basePath, eventBus, storeManager, gitnexusPort }));
|
|
24
24
|
// Static files (dashboard)
|
|
25
25
|
app.use(express.static(publicDir));
|
|
26
26
|
// Health check
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-factory.js","sourceRoot":"","sources":["../../src/mcp/app-factory.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAInG,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"app-factory.js","sourceRoot":"","sources":["../../src/mcp/app-factory.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAInG,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AAWzE,MAAM,UAAU,SAAS,CAAC,OAA0B;IAClD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IAE/E,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,mEAAmE;IACnE,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAClC,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC;gBAClD,kBAAkB,EAAE,SAAS;aAC9B,CAAC,CAAC;YACH,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7B,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;IACX,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IAE/F,2BAA2B;IAC3B,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnC,eAAe;IACf,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { SqliteStore } from "../core/store/sqlite-store.js";
|
|
3
3
|
import type { GraphDocument } from "../core/graph/graph-types.js";
|
|
4
|
-
import { type LifecyclePhase, type LifecycleWarning, type McpAgentSuggestion } from "../core/planner/lifecycle-phase.js";
|
|
4
|
+
import { type LifecyclePhase, type LifecycleWarning, type McpAgentSuggestion, type StrictnessMode } from "../core/planner/lifecycle-phase.js";
|
|
5
5
|
export interface LifecycleBlock {
|
|
6
6
|
phase: LifecyclePhase;
|
|
7
7
|
reminder: string;
|
|
@@ -14,6 +14,7 @@ export interface LifecycleBlockOptions {
|
|
|
14
14
|
toolName?: string;
|
|
15
15
|
hasSnapshots?: boolean;
|
|
16
16
|
phaseOverride?: LifecyclePhase | null;
|
|
17
|
+
mode?: StrictnessMode;
|
|
17
18
|
}
|
|
18
19
|
/**
|
|
19
20
|
* Build the _lifecycle block to append to MCP tool responses.
|
|
@@ -25,9 +26,9 @@ export declare function buildLifecycleBlock(doc: GraphDocument, options?: Lifecy
|
|
|
25
26
|
*/
|
|
26
27
|
export declare function appendLifecycleToResponse(responseJson: string, doc: GraphDocument): string;
|
|
27
28
|
/**
|
|
28
|
-
* Wrap all registered MCP tool handlers to append
|
|
29
|
-
*
|
|
30
|
-
*
|
|
29
|
+
* Wrap all registered MCP tool handlers to enforce lifecycle gates and append lifecycle context.
|
|
30
|
+
* Pre-execution: checks tool gates and status gates (blocks in strict mode).
|
|
31
|
+
* Post-execution: appends _lifecycle block to responses.
|
|
31
32
|
*/
|
|
32
33
|
export declare function wrapToolsWithLifecycle(server: McpServer, store: SqliteStore): void;
|
|
33
34
|
//# sourceMappingURL=lifecycle-wrapper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-wrapper.d.ts","sourceRoot":"","sources":["../../src/mcp/lifecycle-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"lifecycle-wrapper.d.ts","sourceRoot":"","sources":["../../src/mcp/lifecycle-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,oCAAoC,CAAC;AAG5C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,kBAAkB,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACtC,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,cAAc,CAoBvG;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAU1F;AA6DD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAiFlF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { detectCurrentPhase, getPhaseGuidance, detectWarnings } from "../core/planner/lifecycle-phase.js";
|
|
1
|
+
import { detectCurrentPhase, getPhaseGuidance, detectWarnings, checkToolGate, checkStatusGate, } from "../core/planner/lifecycle-phase.js";
|
|
2
2
|
import { logger } from "../core/utils/logger.js";
|
|
3
3
|
/**
|
|
4
4
|
* Build the _lifecycle block to append to MCP tool responses.
|
|
@@ -10,7 +10,7 @@ export function buildLifecycleBlock(doc, options) {
|
|
|
10
10
|
});
|
|
11
11
|
const guidance = getPhaseGuidance(phase);
|
|
12
12
|
const warnings = options?.toolName
|
|
13
|
-
? detectWarnings(doc, phase, options.toolName)
|
|
13
|
+
? detectWarnings(doc, phase, options.toolName, options?.mode)
|
|
14
14
|
: [];
|
|
15
15
|
return {
|
|
16
16
|
phase,
|
|
@@ -40,9 +40,48 @@ export function appendLifecycleToResponse(responseJson, doc) {
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
/**
|
|
43
|
-
*
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
* Build a blocked response for when a tool is gated by lifecycle enforcement.
|
|
44
|
+
*/
|
|
45
|
+
function buildBlockedResponse(toolName, phase, warnings) {
|
|
46
|
+
const errorWarnings = warnings.filter((w) => w.severity === "error");
|
|
47
|
+
return {
|
|
48
|
+
content: [{
|
|
49
|
+
type: "text",
|
|
50
|
+
text: JSON.stringify({
|
|
51
|
+
error: "lifecycle_gate_blocked",
|
|
52
|
+
phase,
|
|
53
|
+
tool: toolName,
|
|
54
|
+
reason: errorWarnings.map((w) => w.message).join("; "),
|
|
55
|
+
warnings: errorWarnings,
|
|
56
|
+
hint: "Use set_phase com force:true para bypass, ou mude para mode:'advisory' com set_phase({phase:'auto', mode:'advisory'})",
|
|
57
|
+
}, null, 2),
|
|
58
|
+
}],
|
|
59
|
+
isError: true,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Extract node ID and new status from tool call args for status gate checks.
|
|
64
|
+
*/
|
|
65
|
+
function extractStatusArgs(toolName, args) {
|
|
66
|
+
if (toolName !== "update_status" && toolName !== "bulk_update_status") {
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
// MCP tool args are passed as the first argument (an object)
|
|
70
|
+
const toolArgs = args[0];
|
|
71
|
+
if (!toolArgs)
|
|
72
|
+
return {};
|
|
73
|
+
if (toolName === "update_status") {
|
|
74
|
+
return {
|
|
75
|
+
nodeId: toolArgs.nodeId,
|
|
76
|
+
newStatus: toolArgs.status,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return {};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Wrap all registered MCP tool handlers to enforce lifecycle gates and append lifecycle context.
|
|
83
|
+
* Pre-execution: checks tool gates and status gates (blocks in strict mode).
|
|
84
|
+
* Post-execution: appends _lifecycle block to responses.
|
|
46
85
|
*/
|
|
47
86
|
export function wrapToolsWithLifecycle(server, store) {
|
|
48
87
|
const registeredTools = server._registeredTools;
|
|
@@ -53,15 +92,50 @@ export function wrapToolsWithLifecycle(server, store) {
|
|
|
53
92
|
for (const [name, tool] of Object.entries(registeredTools)) {
|
|
54
93
|
const originalHandler = tool.handler;
|
|
55
94
|
tool.handler = async (...args) => {
|
|
95
|
+
// ── Pre-execution gate check ──
|
|
96
|
+
try {
|
|
97
|
+
const doc = store.toGraphDocument();
|
|
98
|
+
const phaseOverrideValue = store.getProjectSetting("lifecycle_phase_override");
|
|
99
|
+
const snapshots = store.listSnapshots();
|
|
100
|
+
const modeValue = store.getProjectSetting("lifecycle_strictness_mode");
|
|
101
|
+
const mode = (modeValue === "strict" || modeValue === "advisory") ? modeValue : "strict";
|
|
102
|
+
const phase = detectCurrentPhase(doc, {
|
|
103
|
+
hasSnapshots: snapshots.length > 0,
|
|
104
|
+
phaseOverride: phaseOverrideValue ? phaseOverrideValue : null,
|
|
105
|
+
});
|
|
106
|
+
// Check tool gate
|
|
107
|
+
const gateWarnings = checkToolGate(doc, phase, name, mode);
|
|
108
|
+
// Check status-specific gate for update_status / bulk_update_status
|
|
109
|
+
const statusArgs = extractStatusArgs(name, args);
|
|
110
|
+
if (statusArgs.nodeId && statusArgs.newStatus) {
|
|
111
|
+
const statusResult = checkStatusGate(doc, phase, statusArgs.nodeId, statusArgs.newStatus, mode);
|
|
112
|
+
gateWarnings.push(...statusResult.warnings);
|
|
113
|
+
}
|
|
114
|
+
// If any warning has severity "error" → block execution
|
|
115
|
+
const hasErrors = gateWarnings.some((w) => w.severity === "error");
|
|
116
|
+
if (hasErrors) {
|
|
117
|
+
logger.warn("lifecycle-wrapper: tool blocked by gate", { tool: name, phase, mode });
|
|
118
|
+
return buildBlockedResponse(name, phase, gateWarnings);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// If store has no project loaded (e.g., for `init`), skip gate check
|
|
123
|
+
logger.debug("lifecycle-wrapper: skipped gate check for tool", { tool: name });
|
|
124
|
+
}
|
|
125
|
+
// ── Execute original handler ──
|
|
56
126
|
const result = await originalHandler(...args);
|
|
127
|
+
// ── Post-execution: append _lifecycle block ──
|
|
57
128
|
try {
|
|
58
129
|
const doc = store.toGraphDocument();
|
|
59
130
|
const phaseOverrideValue = store.getProjectSetting("lifecycle_phase_override");
|
|
60
131
|
const snapshots = store.listSnapshots();
|
|
132
|
+
const modeValue = store.getProjectSetting("lifecycle_strictness_mode");
|
|
133
|
+
const mode = (modeValue === "strict" || modeValue === "advisory") ? modeValue : "strict";
|
|
61
134
|
const lifecycleBlock = buildLifecycleBlock(doc, {
|
|
62
135
|
toolName: name,
|
|
63
136
|
hasSnapshots: snapshots.length > 0,
|
|
64
137
|
phaseOverride: phaseOverrideValue ? phaseOverrideValue : null,
|
|
138
|
+
mode,
|
|
65
139
|
});
|
|
66
140
|
// Append lifecycle as an additional text content item
|
|
67
141
|
if (result && Array.isArray(result.content)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-wrapper.js","sourceRoot":"","sources":["../../src/mcp/lifecycle-wrapper.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"lifecycle-wrapper.js","sourceRoot":"","sources":["../../src/mcp/lifecycle-wrapper.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -19,14 +19,15 @@ registerAllTools(mcp, storeManager.store);
|
|
|
19
19
|
// ── Express app ──────────────────────────────────────────
|
|
20
20
|
const app = createApp({
|
|
21
21
|
store: storeManager.store,
|
|
22
|
-
basePath:
|
|
22
|
+
basePath: storeManager.basePath,
|
|
23
23
|
eventBus,
|
|
24
24
|
mcp,
|
|
25
25
|
storeManager,
|
|
26
|
+
gitnexusPort: config.integrations.gitnexusPort,
|
|
26
27
|
});
|
|
27
28
|
// ── GitNexus auto-start ──────────────────────────────────
|
|
28
29
|
if (config.integrations.gitnexusAutoStart) {
|
|
29
|
-
const basePath =
|
|
30
|
+
const basePath = storeManager.basePath;
|
|
30
31
|
const gitnexusPort = config.integrations.gitnexusPort;
|
|
31
32
|
ensureGitNexusAnalyzed(basePath).then(() => {
|
|
32
33
|
return startGitNexusServe(basePath, gitnexusPort);
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACrH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;AAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;AAEzB,4DAA4D;AAC5D,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACxD,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;AACrC,YAAY,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAEvC,4DAA4D;AAC5D,MAAM,GAAG,GAAG,IAAI,SAAS,CACvB,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EACvC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;AAEF,gBAAgB,CAAC,GAAG,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;AAE1C,4DAA4D;AAC5D,MAAM,GAAG,GAAG,SAAS,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC,KAAK;IACzB,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-phase.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/set-phase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAMpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"set-phase.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/set-phase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAMpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAyG5E"}
|
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
import { z } from "zod/v4";
|
|
2
|
-
import { detectCurrentPhase, getPhaseGuidance } from "../../core/planner/lifecycle-phase.js";
|
|
2
|
+
import { detectCurrentPhase, getPhaseGuidance, validatePhaseTransition } from "../../core/planner/lifecycle-phase.js";
|
|
3
3
|
import { logger } from "../../core/utils/logger.js";
|
|
4
4
|
const VALID_PHASES = ["ANALYZE", "DESIGN", "PLAN", "IMPLEMENT", "VALIDATE", "REVIEW", "HANDOFF", "LISTENING", "auto"];
|
|
5
5
|
export function registerSetPhase(server, store) {
|
|
6
|
-
server.tool("set_phase", "Override lifecycle phase detection or reset to auto-detection", {
|
|
6
|
+
server.tool("set_phase", "Override lifecycle phase detection or reset to auto-detection. Use mode to switch between strict/advisory enforcement.", {
|
|
7
7
|
phase: z.enum(VALID_PHASES).describe("Lifecycle phase to force, or 'auto' to reset to automatic detection"),
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
force: z.boolean().optional().describe("Force phase transition even if gate conditions are not met (strict mode only)"),
|
|
9
|
+
mode: z.enum(["strict", "advisory"]).optional().describe("Set lifecycle enforcement mode: 'strict' blocks tools, 'advisory' only warns"),
|
|
10
|
+
}, async ({ phase, force, mode }) => {
|
|
11
|
+
logger.debug("tool:set_phase", { phase, force, mode });
|
|
12
|
+
// Persist strictness mode if provided
|
|
13
|
+
if (mode) {
|
|
14
|
+
store.setProjectSetting("lifecycle_strictness_mode", mode);
|
|
15
|
+
logger.info("tool:set_phase:mode_changed", { mode });
|
|
16
|
+
}
|
|
10
17
|
if (phase === "auto") {
|
|
11
18
|
store.setProjectSetting("lifecycle_phase_override", "");
|
|
12
19
|
const doc = store.toGraphDocument();
|
|
13
20
|
const detectedPhase = detectCurrentPhase(doc);
|
|
14
21
|
const guidance = getPhaseGuidance(detectedPhase);
|
|
15
|
-
|
|
22
|
+
const currentMode = mode ?? store.getProjectSetting("lifecycle_strictness_mode") ?? "strict";
|
|
23
|
+
logger.info("tool:set_phase:ok", { action: "auto", detectedPhase, mode: currentMode });
|
|
16
24
|
return {
|
|
17
25
|
content: [
|
|
18
26
|
{
|
|
@@ -21,15 +29,49 @@ export function registerSetPhase(server, store) {
|
|
|
21
29
|
ok: true,
|
|
22
30
|
action: "reset_to_auto",
|
|
23
31
|
detectedPhase,
|
|
32
|
+
mode: currentMode,
|
|
24
33
|
reminder: guidance.reminder,
|
|
25
34
|
}, null, 2),
|
|
26
35
|
},
|
|
27
36
|
],
|
|
28
37
|
};
|
|
29
38
|
}
|
|
39
|
+
// Validate phase transition gate
|
|
40
|
+
const doc = store.toGraphDocument();
|
|
41
|
+
const currentPhaseOverride = store.getProjectSetting("lifecycle_phase_override");
|
|
42
|
+
const currentPhase = currentPhaseOverride
|
|
43
|
+
? currentPhaseOverride
|
|
44
|
+
: detectCurrentPhase(doc);
|
|
45
|
+
const currentMode = mode ?? store.getProjectSetting("lifecycle_strictness_mode") ?? "strict";
|
|
46
|
+
if (currentPhase !== phase) {
|
|
47
|
+
const gateResult = validatePhaseTransition(doc, currentPhase, phase);
|
|
48
|
+
if (!gateResult.allowed && currentMode === "strict" && !force) {
|
|
49
|
+
logger.warn("tool:set_phase:gate_blocked", { from: currentPhase, to: phase, unmetConditions: gateResult.unmetConditions });
|
|
50
|
+
return {
|
|
51
|
+
content: [
|
|
52
|
+
{
|
|
53
|
+
type: "text",
|
|
54
|
+
text: JSON.stringify({
|
|
55
|
+
ok: false,
|
|
56
|
+
error: "phase_gate_blocked",
|
|
57
|
+
from: currentPhase,
|
|
58
|
+
to: phase,
|
|
59
|
+
reason: gateResult.reason,
|
|
60
|
+
unmetConditions: gateResult.unmetConditions,
|
|
61
|
+
hint: "Use force:true para bypass, ou complete as condições listadas",
|
|
62
|
+
}, null, 2),
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
isError: true,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (!gateResult.allowed && force) {
|
|
69
|
+
logger.warn("tool:set_phase:forced", { from: currentPhase, to: phase, unmetConditions: gateResult.unmetConditions });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
30
72
|
store.setProjectSetting("lifecycle_phase_override", phase);
|
|
31
73
|
const guidance = getPhaseGuidance(phase);
|
|
32
|
-
logger.info("tool:set_phase:ok", { action: "override", phase });
|
|
74
|
+
logger.info("tool:set_phase:ok", { action: "override", phase, mode: currentMode });
|
|
33
75
|
return {
|
|
34
76
|
content: [
|
|
35
77
|
{
|
|
@@ -38,6 +80,7 @@ export function registerSetPhase(server, store) {
|
|
|
38
80
|
ok: true,
|
|
39
81
|
action: "override",
|
|
40
82
|
phase,
|
|
83
|
+
mode: currentMode,
|
|
41
84
|
reminder: guidance.reminder,
|
|
42
85
|
}, null, 2),
|
|
43
86
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-phase.js","sourceRoot":"","sources":["../../../src/mcp/tools/set-phase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAG3B,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"set-phase.js","sourceRoot":"","sources":["../../../src/mcp/tools/set-phase.ts"],"names":[],"mappings":"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"}
|
package/dist/web/dashboard/dist/assets/{benchmark-tab-CuZsNkbP.js → benchmark-tab-DzYj_lJO.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-DLehETrJ.js";function m(){const[r,o]=i.useState(null),[c,s]=i.useState(!0),[n,d]=i.useState(null);return i.useEffect(()=>{async function t(){try{const l=await x.request("/benchmark");o(l)}catch(l){d(l instanceof Error?l.message:"Failed to load benchmark data")}finally{s(!1)}}t()},[]),{data:r,loading:c,error:n}}function h(){const{data:r,loading:o,error:c}=m();if(o)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:n,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.sampleSize>0?Math.round(s.totalTokensSaved/s.sampleSize).toLocaleString():"0",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:n.inferredDeps,label:"Auto Inferred"}),e.jsx(a,{value:`${n.blockedTasks}/${s.totalNodes}`,label:"Blocked Detected"}),e.jsx(a,{value:n.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:o}){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:o})]})}export{h as BenchmarkTab};
|