@devflow-tools/server 0.8.10 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -19
- package/dist/app.module.d.ts.map +1 -1
- package/dist/app.module.js +1 -7
- package/dist/app.module.js.map +1 -1
- package/dist/database/database.module.d.ts.map +1 -1
- package/dist/database/database.module.js +4 -2
- package/dist/database/database.module.js.map +1 -1
- package/dist/knowledge/knowledge.service.d.ts +1 -0
- package/dist/knowledge/knowledge.service.d.ts.map +1 -1
- package/dist/knowledge/knowledge.service.js +7 -2
- package/dist/knowledge/knowledge.service.js.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/memory/memory.service.d.ts +1 -0
- package/dist/memory/memory.service.d.ts.map +1 -1
- package/dist/memory/memory.service.js +22 -4
- package/dist/memory/memory.service.js.map +1 -1
- package/dist/telemetry/auto-checker.d.ts +23 -0
- package/dist/telemetry/auto-checker.d.ts.map +1 -0
- package/dist/telemetry/auto-checker.js +121 -0
- package/dist/telemetry/auto-checker.js.map +1 -0
- package/dist/telemetry/telemetry.controller.d.ts +101 -43
- package/dist/telemetry/telemetry.controller.d.ts.map +1 -1
- package/dist/telemetry/telemetry.controller.js +198 -9
- package/dist/telemetry/telemetry.controller.js.map +1 -1
- package/dist/telemetry/telemetry.service.d.ts +137 -84
- package/dist/telemetry/telemetry.service.d.ts.map +1 -1
- package/dist/telemetry/telemetry.service.js +439 -455
- package/dist/telemetry/telemetry.service.js.map +1 -1
- package/dist/workflow/workflow.controller.d.ts +4 -4
- package/dist/workflow/workflow.service.d.ts +6 -4
- package/dist/workflow/workflow.service.d.ts.map +1 -1
- package/dist/workflow/workflow.service.js +46 -4
- package/dist/workflow/workflow.service.js.map +1 -1
- package/package.json +11 -11
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @devflow-tools/server
|
|
2
2
|
|
|
3
|
-
DevFlow REST API
|
|
3
|
+
DevFlow REST API 服务端 — 平台后端核心。基于 NestJS + Fastify 构建。
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -11,38 +11,49 @@ npm install @devflow-tools/server
|
|
|
11
11
|
## Quick Start
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
#
|
|
14
|
+
# 通过 CLI 启动
|
|
15
15
|
npx devflow server start
|
|
16
16
|
|
|
17
|
-
#
|
|
17
|
+
# 或直接启动
|
|
18
18
|
node node_modules/@devflow-tools/server/dist/main.js
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
服务端启动在 `http://localhost:13337`,API 前缀 `/api`。
|
|
22
22
|
|
|
23
23
|
## API Modules
|
|
24
24
|
|
|
25
|
-
|
|
|
26
|
-
|
|
27
|
-
| Projects | `/api/projects` |
|
|
28
|
-
| Context | `/api/context/build` |
|
|
29
|
-
|
|
|
30
|
-
|
|
|
31
|
-
|
|
|
32
|
-
|
|
|
33
|
-
|
|
|
34
|
-
|
|
|
35
|
-
|
|
|
25
|
+
| 模块 | 基础端点 | 说明 |
|
|
26
|
+
|------|---------|------|
|
|
27
|
+
| Projects | `/api/projects` | 项目 CRUD + Onboarding Pack |
|
|
28
|
+
| Context | `/api/context/build` | 上下文检索(通用 / 任务模式) |
|
|
29
|
+
| Context | `/api/context/feedback` | 上下文反馈(hit/partial/miss) |
|
|
30
|
+
| Graph | `/api/graph` | 依赖图谱查询(节点展开、路径查询) |
|
|
31
|
+
| Workflows | `/api/workflows/:type/run` | 工作流启动 + SSE 实时流 |
|
|
32
|
+
| Workflows | `/api/workflows/runs/:id/approve` | 审批门禁(approve/reject) |
|
|
33
|
+
| Memory | `/api/memory` | 项目记忆管理 |
|
|
34
|
+
| Memory | `/api/memory/candidates/:id/approve` | 候选记忆审核 |
|
|
35
|
+
| Memory | `/api/memory/events` | Tool call event 记录 |
|
|
36
|
+
| Knowledge | `/api/knowledge/search` | 文档搜索 |
|
|
37
|
+
| Knowledge | `/api/knowledge/sync` | 知识源同步 |
|
|
38
|
+
| Knowledge | `/api/knowledge/sources` | 知识源状态查询 |
|
|
39
|
+
| Telemetry | `/api/telemetry/executions` | Skill 执行历史 |
|
|
40
|
+
| Telemetry | `/api/telemetry/mcp-compliance` | MCP 合规率统计 |
|
|
41
|
+
| Telemetry | `/api/telemetry/roi-summary` | ROI 汇总 |
|
|
42
|
+
| Telemetry | `/api/telemetry/cleanup` | 过期数据清理 |
|
|
43
|
+
| Benchmark | `/api/benchmark/run` | 基准测试运行 |
|
|
44
|
+
| Benchmark | `/api/benchmark/reports` | 报告列表 |
|
|
45
|
+
| Registry | `/api/registry/plugins` | 插件注册与查询 |
|
|
36
46
|
|
|
37
47
|
## Authentication
|
|
38
48
|
|
|
39
|
-
|
|
49
|
+
所有端点需要 `X-API-Key` 请求头。默认密钥:`dev-key-000000`
|
|
40
50
|
|
|
41
51
|
## Environment Variables
|
|
42
52
|
|
|
43
|
-
|
|
|
44
|
-
|
|
45
|
-
| `DEVFLOW_API_KEYS` | `dev-key-000000` |
|
|
53
|
+
| 变量 | 默认值 | 说明 |
|
|
54
|
+
|------|--------|------|
|
|
55
|
+
| `DEVFLOW_API_KEYS` | `dev-key-000000` | 逗号分隔的 API 密钥列表 |
|
|
56
|
+
| `PORT` | `13337` | 服务端口 |
|
|
46
57
|
|
|
47
58
|
## License
|
|
48
59
|
|
package/dist/app.module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.module.d.ts","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.module.d.ts","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":"AAcA,qBAiBa,SAAS;CAAG"}
|
package/dist/app.module.js
CHANGED
|
@@ -11,12 +11,9 @@ import { ProjectsModule } from "./projects/projects.module.js";
|
|
|
11
11
|
import { ContextModule } from "./context/context.module.js";
|
|
12
12
|
import { GraphModule } from "./graph/graph.module.js";
|
|
13
13
|
import { WorkflowModule } from "./workflow/workflow.module.js";
|
|
14
|
-
import { MemoryModule } from "./memory/memory.module.js";
|
|
15
14
|
import { KnowledgeModule } from "./knowledge/knowledge.module.js";
|
|
16
|
-
import { TelemetryModule } from "./telemetry/telemetry.module.js";
|
|
17
15
|
import { BenchmarkModule } from "./benchmark/benchmark.module.js";
|
|
18
16
|
import { RegistryModule } from "./registry/registry.module.js";
|
|
19
|
-
import { DataModule } from "./data/data.module.js";
|
|
20
17
|
import { DatabaseModule } from "./database/database.module.js";
|
|
21
18
|
import { ResponseInterceptor } from "./common/response.interceptor.js";
|
|
22
19
|
import { ServerController } from "./server.controller.js";
|
|
@@ -30,13 +27,10 @@ AppModule = __decorate([
|
|
|
30
27
|
ProjectsModule,
|
|
31
28
|
ContextModule,
|
|
32
29
|
GraphModule,
|
|
33
|
-
WorkflowModule,
|
|
34
|
-
MemoryModule,
|
|
35
30
|
KnowledgeModule,
|
|
36
|
-
|
|
31
|
+
WorkflowModule,
|
|
37
32
|
BenchmarkModule,
|
|
38
33
|
RegistryModule,
|
|
39
|
-
DataModule,
|
|
40
34
|
],
|
|
41
35
|
controllers: [ServerController],
|
|
42
36
|
providers: [
|
package/dist/app.module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAmBnD,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,SAAS;IAjBrB,MAAM,CAAC;QACN,OAAO,EAAE;YACP,cAAc;YACd,UAAU;YACV,cAAc;YACd,aAAa;YACb,WAAW;YACX,eAAe;YACf,cAAc;YACd,eAAe;YACf,cAAc;SACf;QACD,WAAW,EAAE,CAAC,gBAAgB,CAAC;QAC/B,SAAS,EAAE;YACT,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,mBAAmB,EAAE;SAC5D;KACF,CAAC;GACW,SAAS,CAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.module.d.ts","sourceRoot":"","sources":["../../src/database/database.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"database.module.d.ts","sourceRoot":"","sources":["../../src/database/database.module.ts"],"names":[],"mappings":"AAaA,qBAKa,cAAc;CAAG"}
|
|
@@ -6,11 +6,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { Global, Module } from "@nestjs/common";
|
|
8
8
|
import { DevFlowDatabase } from "@devflow-tools/database";
|
|
9
|
+
import { join } from "path";
|
|
10
|
+
import { homedir } from "os";
|
|
9
11
|
const databaseProvider = {
|
|
10
12
|
provide: 'DATABASE',
|
|
11
13
|
useFactory: () => {
|
|
12
|
-
const
|
|
13
|
-
return new DevFlowDatabase(
|
|
14
|
+
const stateDir = process.env.DEVFLOW_STATE_DIR ?? join(homedir(), '.devflow', 'global');
|
|
15
|
+
return new DevFlowDatabase(stateDir);
|
|
14
16
|
},
|
|
15
17
|
};
|
|
16
18
|
let DatabaseModule = class DatabaseModule {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.module.js","sourceRoot":"","sources":["../../src/database/database.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"database.module.js","sourceRoot":"","sources":["../../src/database/database.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,gBAAgB,GAAG;IACvB,OAAO,EAAE,UAAU;IACnB,UAAU,EAAE,GAAG,EAAE;QACf,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACxF,OAAO,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;CACF,CAAC;AAOK,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,cAAc;IAL1B,MAAM,EAAE;IACR,MAAM,CAAC;QACN,SAAS,EAAE,CAAC,gBAAgB,CAAC;QAC7B,OAAO,EAAE,CAAC,gBAAgB,CAAC;KAC5B,CAAC;GACW,cAAc,CAAG"}
|
|
@@ -6,6 +6,7 @@ export declare class KnowledgeService implements OnModuleInit {
|
|
|
6
6
|
constructor(projectsService: ProjectsService);
|
|
7
7
|
private getEngine;
|
|
8
8
|
onModuleInit(): Promise<void>;
|
|
9
|
+
private _initKnowledge;
|
|
9
10
|
search(rootPath: string, query: string, scope?: string): Promise<KnowledgeEntry[]>;
|
|
10
11
|
sync(rootPath: string, pluginName?: string): Promise<SyncResult[]>;
|
|
11
12
|
getSources(rootPath: string): Promise<KnowledgeSourceStatus[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge.service.d.ts","sourceRoot":"","sources":["../../src/knowledge/knowledge.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGlE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,qBAAqB,EAAmB,MAAM,oBAAoB,CAAC;AAE7G,qBACa,gBAAiB,YAAW,YAAY;IACd,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,EAAE,eAAe;IAEtF,OAAO,CAAC,SAAS;IAIX,YAAY;
|
|
1
|
+
{"version":3,"file":"knowledge.service.d.ts","sourceRoot":"","sources":["../../src/knowledge/knowledge.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGlE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,qBAAqB,EAAmB,MAAM,oBAAoB,CAAC;AAE7G,qBACa,gBAAiB,YAAW,YAAY;IACd,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,EAAE,eAAe;IAEtF,OAAO,CAAC,SAAS;IAIX,YAAY;YAQJ,cAAc;IA4BtB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAMlF,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAIlE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;CAGrE"}
|
|
@@ -22,10 +22,16 @@ let KnowledgeService = class KnowledgeService {
|
|
|
22
22
|
return new KnowledgeEngine({ projectRoot: rootPath });
|
|
23
23
|
}
|
|
24
24
|
async onModuleInit() {
|
|
25
|
+
// Fire-and-forget: don't block server startup on knowledge sync.
|
|
26
|
+
// Plugin registration and stale-source sync can take minutes with many
|
|
27
|
+
// URLs + Playwright browser launches, and the catch block above would
|
|
28
|
+
// swallow the error but the `await` still holds app.listen().
|
|
29
|
+
void this._initKnowledge();
|
|
30
|
+
}
|
|
31
|
+
async _initKnowledge() {
|
|
25
32
|
const projectRoot = this.projectsService.getActiveProjectRoot() ?? process.env.DEVFLOW_PROJECT_ROOT ?? process.cwd();
|
|
26
33
|
try {
|
|
27
34
|
const engine = this.getEngine(projectRoot);
|
|
28
|
-
// Register plugin knowledge sources
|
|
29
35
|
const pluginMap = await loadPlugins();
|
|
30
36
|
const plugins = Array.from(pluginMap.values());
|
|
31
37
|
for (const plugin of plugins) {
|
|
@@ -36,7 +42,6 @@ let KnowledgeService = class KnowledgeService {
|
|
|
36
42
|
});
|
|
37
43
|
}
|
|
38
44
|
}
|
|
39
|
-
// Auto-sync stale sources
|
|
40
45
|
const sources = await engine.getSources();
|
|
41
46
|
const weekAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;
|
|
42
47
|
for (const s of sources) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge.service.js","sourceRoot":"","sources":["../../src/knowledge/knowledge.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAgB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAI3D,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YAAsD,eAAgC;QAAhC,oBAAe,GAAf,eAAe,CAAiB;IAAG,CAAC;IAElF,SAAS,CAAC,QAAgB;QAChC,OAAO,IAAI,eAAe,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,oBAAoB,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACrH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAE3C,
|
|
1
|
+
{"version":3,"file":"knowledge.service.js","sourceRoot":"","sources":["../../src/knowledge/knowledge.service.ts"],"names":[],"mappings":"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"}
|
package/dist/main.js
CHANGED
|
@@ -22,7 +22,7 @@ export async function bootstrap() {
|
|
|
22
22
|
}
|
|
23
23
|
return payload;
|
|
24
24
|
});
|
|
25
|
-
await app.listen({ port: parseInt(process.env.PORT || "13337", 10), host: "
|
|
25
|
+
await app.listen({ port: parseInt(process.env.PORT || "13337", 10), host: "127.0.0.1" });
|
|
26
26
|
return app;
|
|
27
27
|
}
|
|
28
28
|
if (process.argv[1]?.endsWith("main.js") ||
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EACL,cAAc,GAEf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,CAClC,SAAS,EACT,OAAO,CACR,CAAC;IACF,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3B,GAAG,CAAC,gBAAgB,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;IAChD,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,wEAAwE;IACxE,2EAA2E;IAC3E,kDAAkD;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACtC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;QAC3D,IAAI,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EACL,cAAc,GAEf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,CAClC,SAAS,EACT,OAAO,CACR,CAAC;IACF,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3B,GAAG,CAAC,gBAAgB,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;IAChD,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,wEAAwE;IACxE,2EAA2E;IAC3E,kDAAkD;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACtC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;QAC3D,IAAI,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,GAAG,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACzF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,IACE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,EACtC,CAAC;IACD,SAAS,EAAE,CAAC;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.service.d.ts","sourceRoot":"","sources":["../../src/memory/memory.service.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,MAAM,EAAE;QACN,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,OAAO,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC;CACH;AAED,qBACa,aAAa;IACxB,OAAO,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"memory.service.d.ts","sourceRoot":"","sources":["../../src/memory/memory.service.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,MAAM,EAAE;QACN,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,OAAO,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC;CACH;AAED,qBACa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAmE;IAClF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAE7C,OAAO,CAAC,SAAS;IAqBX,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAqB7C,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAOlF,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAInG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAInC,aAAa,CAAC,QAAQ,EAAE,MAAM;IAI9B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAI7C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAI5C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;IAKxF,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIhE,eAAe;;;;;;;IAKf,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IASzF,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;;;;IAuB/J,oBAAoB,CAAC,QAAQ,EAAE,MAAM;;;;;CAI5C"}
|
|
@@ -10,12 +10,30 @@ import { checkOllama, getOllamaInfoMessage } from "@devflow-tools/memory-engine"
|
|
|
10
10
|
let MemoryService = class MemoryService {
|
|
11
11
|
constructor() {
|
|
12
12
|
this.engines = new Map();
|
|
13
|
+
this.ENGINE_TTL = 60 * 60 * 1000; // 1 hour
|
|
13
14
|
}
|
|
14
15
|
getEngine(rootPath) {
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
// Cleanup expired engines
|
|
17
|
+
const now = Date.now();
|
|
18
|
+
for (const [key, entry] of this.engines) {
|
|
19
|
+
if (now - entry.lastAccess > this.ENGINE_TTL) {
|
|
20
|
+
try {
|
|
21
|
+
entry.engine.close?.();
|
|
22
|
+
}
|
|
23
|
+
catch { }
|
|
24
|
+
this.engines.delete(key);
|
|
25
|
+
}
|
|
17
26
|
}
|
|
18
|
-
|
|
27
|
+
const normalized = rootPath.replace(/\/+$/, '');
|
|
28
|
+
let entry = this.engines.get(normalized);
|
|
29
|
+
if (!entry) {
|
|
30
|
+
entry = { engine: new MemoryEngine(normalized), lastAccess: now };
|
|
31
|
+
this.engines.set(normalized, entry);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
entry.lastAccess = now;
|
|
35
|
+
}
|
|
36
|
+
return entry.engine;
|
|
19
37
|
}
|
|
20
38
|
async getAll(rootPath) {
|
|
21
39
|
const engine = this.getEngine(rootPath);
|
|
@@ -73,7 +91,7 @@ let MemoryService = class MemoryService {
|
|
|
73
91
|
if (layer === "user")
|
|
74
92
|
return;
|
|
75
93
|
await this.getEngine(rootPath).addMemory({
|
|
76
|
-
category: '
|
|
94
|
+
category: 'semantic',
|
|
77
95
|
content: `${key}: ${JSON.stringify(value)}`,
|
|
78
96
|
source: 'manual', confidence: 1, scope: key,
|
|
79
97
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.service.js","sourceRoot":"","sources":["../../src/memory/memory.service.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AA0B1E,IAAM,aAAa,GAAnB,MAAM,aAAa;IAAnB;QACG,YAAO,GAAG,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"memory.service.js","sourceRoot":"","sources":["../../src/memory/memory.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface CheckResult {
|
|
2
|
+
name: string;
|
|
3
|
+
severity: 'ok' | 'warning' | 'error';
|
|
4
|
+
detail: string;
|
|
5
|
+
value?: number;
|
|
6
|
+
threshold?: number;
|
|
7
|
+
}
|
|
8
|
+
interface DevFlowDB {
|
|
9
|
+
all(sql: string, ...params: any[]): any[];
|
|
10
|
+
get(sql: string, ...params: any[]): any;
|
|
11
|
+
}
|
|
12
|
+
export declare class AutoChecker {
|
|
13
|
+
private db;
|
|
14
|
+
constructor(db: DevFlowDB);
|
|
15
|
+
checkAll(): CheckResult[];
|
|
16
|
+
private checkMemorySemanticDupes;
|
|
17
|
+
private checkMemoryPendingBacklog;
|
|
18
|
+
private checkKnowledgeEmptyResults;
|
|
19
|
+
private checkCodeGraphLowConfidence;
|
|
20
|
+
private checkOutputCaptureRate;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=auto-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-checker.d.ts","sourceRoot":"","sources":["../../src/telemetry/auto-checker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,SAAS;IACjB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;IAC1C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;CACzC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAY;gBAEV,EAAE,EAAE,SAAS;IAIzB,QAAQ,IAAI,WAAW,EAAE;IAUzB,OAAO,CAAC,wBAAwB;IAoBhC,OAAO,CAAC,yBAAyB;IAqBjC,OAAO,CAAC,0BAA0B;IAwBlC,OAAO,CAAC,2BAA2B;IA+BnC,OAAO,CAAC,sBAAsB;CAuB/B"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
export class AutoChecker {
|
|
2
|
+
constructor(db) {
|
|
3
|
+
this.db = db;
|
|
4
|
+
}
|
|
5
|
+
checkAll() {
|
|
6
|
+
return [
|
|
7
|
+
...this.checkMemorySemanticDupes(),
|
|
8
|
+
...this.checkMemoryPendingBacklog(),
|
|
9
|
+
...this.checkKnowledgeEmptyResults(),
|
|
10
|
+
...this.checkCodeGraphLowConfidence(),
|
|
11
|
+
...this.checkOutputCaptureRate(),
|
|
12
|
+
];
|
|
13
|
+
}
|
|
14
|
+
checkMemorySemanticDupes() {
|
|
15
|
+
try {
|
|
16
|
+
const count = this.db.get("SELECT COUNT(*) as c FROM tool_metrics WHERE engine = 'memory'")?.c ?? 0;
|
|
17
|
+
if (count === 0) {
|
|
18
|
+
return [{ name: 'memory-semantic-dupes', severity: 'ok', detail: 'No memory tool calls — semantic dedup check skipped' }];
|
|
19
|
+
}
|
|
20
|
+
// Semantic dupes are caught at write time by the dedup logic in memory-engine.
|
|
21
|
+
// This check verifies the pipeline is active.
|
|
22
|
+
return [{
|
|
23
|
+
name: 'memory-semantic-dupes',
|
|
24
|
+
severity: 'ok',
|
|
25
|
+
detail: 'Semantic dedup active — checked at write time by memory-engine',
|
|
26
|
+
}];
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return [{ name: 'memory-semantic-dupes', severity: 'ok', detail: 'Check skipped — embedding data not available' }];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
checkMemoryPendingBacklog() {
|
|
33
|
+
try {
|
|
34
|
+
const pending = this.db.get("SELECT COUNT(*) as c FROM tool_metrics WHERE engine = 'memory'")?.c ?? 0;
|
|
35
|
+
if (pending === 0) {
|
|
36
|
+
return [{ name: 'memory-pending-backlog', severity: 'ok', detail: 'No memory calls recorded yet' }];
|
|
37
|
+
}
|
|
38
|
+
return [{
|
|
39
|
+
name: 'memory-pending-backlog',
|
|
40
|
+
severity: 'ok',
|
|
41
|
+
detail: `${pending} memory tool calls recorded`,
|
|
42
|
+
value: pending,
|
|
43
|
+
}];
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return [{ name: 'memory-pending-backlog', severity: 'ok', detail: 'Check skipped' }];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
checkKnowledgeEmptyResults() {
|
|
50
|
+
try {
|
|
51
|
+
const total = this.db.get("SELECT COUNT(*) as c FROM tool_metrics WHERE tool_name = 'get_knowledge'")?.c ?? 0;
|
|
52
|
+
if (total === 0)
|
|
53
|
+
return [{ name: 'knowledge-empty-results', severity: 'ok', detail: 'No get_knowledge calls yet' }];
|
|
54
|
+
const empty = this.db.get("SELECT COUNT(*) as c FROM tool_metrics WHERE tool_name = 'get_knowledge' AND result_count = 0")?.c ?? 0;
|
|
55
|
+
const rate = total > 0 ? Math.round((empty / total) * 100) : 0;
|
|
56
|
+
return [{
|
|
57
|
+
name: 'knowledge-empty-results',
|
|
58
|
+
severity: rate > 50 ? 'warning' : 'ok',
|
|
59
|
+
detail: `${rate}% empty result rate for get_knowledge (${empty}/${total})`,
|
|
60
|
+
value: rate,
|
|
61
|
+
threshold: 50,
|
|
62
|
+
}];
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return [{ name: 'knowledge-empty-results', severity: 'ok', detail: 'Check skipped' }];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
checkCodeGraphLowConfidence() {
|
|
69
|
+
try {
|
|
70
|
+
const total = this.db.get("SELECT COUNT(*) as c FROM accuracy_queries WHERE engine = 'codegraph'")?.c ?? 0;
|
|
71
|
+
if (total === 0)
|
|
72
|
+
return [{ name: 'codegraph-low-confidence', severity: 'ok', detail: 'No codegraph queries yet' }];
|
|
73
|
+
const rows = this.db.all("SELECT top_k_results FROM accuracy_queries WHERE engine = 'codegraph' ORDER BY created_at DESC LIMIT 100");
|
|
74
|
+
let lowConf = 0;
|
|
75
|
+
for (const r of rows) {
|
|
76
|
+
try {
|
|
77
|
+
const results = JSON.parse(r.top_k_results);
|
|
78
|
+
if (results.length === 0) {
|
|
79
|
+
lowConf++;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const avgScore = results.reduce((s, x) => s + (x.score ?? 0.5), 0) / results.length;
|
|
83
|
+
if (avgScore < 0.3)
|
|
84
|
+
lowConf++;
|
|
85
|
+
}
|
|
86
|
+
catch { /* skip malformed JSON */ }
|
|
87
|
+
}
|
|
88
|
+
const rate = total > 0 ? Math.round((lowConf / Math.min(total, 100)) * 100) : 0;
|
|
89
|
+
return [{
|
|
90
|
+
name: 'codegraph-low-confidence',
|
|
91
|
+
severity: rate > 30 ? 'warning' : 'ok',
|
|
92
|
+
detail: `${rate}% of recent codegraph queries have low confidence (avg score < 0.3)`,
|
|
93
|
+
value: rate,
|
|
94
|
+
threshold: 30,
|
|
95
|
+
}];
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return [{ name: 'codegraph-low-confidence', severity: 'ok', detail: 'Check skipped' }];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
checkOutputCaptureRate() {
|
|
102
|
+
try {
|
|
103
|
+
const total = this.db.get("SELECT COUNT(*) as c FROM tool_call_events WHERE is_mcp_tool = 1")?.c ?? 0;
|
|
104
|
+
if (total === 0)
|
|
105
|
+
return [{ name: 'output-capture-rate', severity: 'ok', detail: 'No MCP tool calls yet' }];
|
|
106
|
+
const withOutput = this.db.get("SELECT COUNT(*) as c FROM tool_call_events WHERE is_mcp_tool = 1 AND output IS NOT NULL")?.c ?? 0;
|
|
107
|
+
const rate = total > 0 ? Math.round((withOutput / total) * 100) : 0;
|
|
108
|
+
return [{
|
|
109
|
+
name: 'output-capture-rate',
|
|
110
|
+
severity: rate < 80 ? 'error' : rate < 95 ? 'warning' : 'ok',
|
|
111
|
+
detail: `${rate}% of MCP tool calls have output captured (${withOutput}/${total})`,
|
|
112
|
+
value: rate,
|
|
113
|
+
threshold: 95,
|
|
114
|
+
}];
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return [{ name: 'output-capture-rate', severity: 'ok', detail: 'Check skipped' }];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=auto-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-checker.js","sourceRoot":"","sources":["../../src/telemetry/auto-checker.ts"],"names":[],"mappings":"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"}
|