@devflow-tools/server 0.6.1 → 0.7.1

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.
Files changed (84) hide show
  1. package/README.md +1 -1
  2. package/dist/app.module.d.ts.map +1 -1
  3. package/dist/app.module.js +10 -0
  4. package/dist/app.module.js.map +1 -1
  5. package/dist/benchmark/benchmark.controller.d.ts +18 -4
  6. package/dist/benchmark/benchmark.controller.d.ts.map +1 -1
  7. package/dist/benchmark/benchmark.controller.js +20 -12
  8. package/dist/benchmark/benchmark.controller.js.map +1 -1
  9. package/dist/benchmark/benchmark.service.d.ts +23 -5
  10. package/dist/benchmark/benchmark.service.d.ts.map +1 -1
  11. package/dist/benchmark/benchmark.service.js +82 -19
  12. package/dist/benchmark/benchmark.service.js.map +1 -1
  13. package/dist/context/context.controller.d.ts +4 -0
  14. package/dist/context/context.controller.d.ts.map +1 -1
  15. package/dist/context/context.controller.js +6 -1
  16. package/dist/context/context.controller.js.map +1 -1
  17. package/dist/context/context.controller.spec.d.ts +2 -0
  18. package/dist/context/context.controller.spec.d.ts.map +1 -0
  19. package/dist/context/context.controller.spec.js +191 -0
  20. package/dist/context/context.controller.spec.js.map +1 -0
  21. package/dist/context/context.module.d.ts.map +1 -1
  22. package/dist/context/context.module.js +2 -1
  23. package/dist/context/context.module.js.map +1 -1
  24. package/dist/context/context.service.d.ts +18 -1
  25. package/dist/context/context.service.d.ts.map +1 -1
  26. package/dist/context/context.service.js +35 -4
  27. package/dist/context/context.service.js.map +1 -1
  28. package/dist/data/data.controller.d.ts +19 -0
  29. package/dist/data/data.controller.d.ts.map +1 -0
  30. package/dist/data/data.controller.js +78 -0
  31. package/dist/data/data.controller.js.map +1 -0
  32. package/dist/data/data.controller.spec.d.ts +2 -0
  33. package/dist/data/data.controller.spec.d.ts.map +1 -0
  34. package/dist/data/data.controller.spec.js +85 -0
  35. package/dist/data/data.controller.spec.js.map +1 -0
  36. package/dist/data/data.module.d.ts +3 -0
  37. package/dist/data/data.module.d.ts.map +1 -0
  38. package/dist/data/data.module.js +22 -0
  39. package/dist/data/data.module.js.map +1 -0
  40. package/dist/data/data.service.d.ts +54 -0
  41. package/dist/data/data.service.d.ts.map +1 -0
  42. package/dist/data/data.service.js +99 -0
  43. package/dist/data/data.service.js.map +1 -0
  44. package/dist/data/data.service.spec.d.ts +2 -0
  45. package/dist/data/data.service.spec.d.ts.map +1 -0
  46. package/dist/data/data.service.spec.js +148 -0
  47. package/dist/data/data.service.spec.js.map +1 -0
  48. package/dist/main.js +1 -1
  49. package/dist/main.js.map +1 -1
  50. package/dist/projects/projects.controller.d.ts +1 -0
  51. package/dist/projects/projects.controller.d.ts.map +1 -1
  52. package/dist/projects/projects.controller.js +14 -1
  53. package/dist/projects/projects.controller.js.map +1 -1
  54. package/dist/projects/projects.controller.spec.d.ts +2 -0
  55. package/dist/projects/projects.controller.spec.d.ts.map +1 -0
  56. package/dist/projects/projects.controller.spec.js +81 -0
  57. package/dist/projects/projects.controller.spec.js.map +1 -0
  58. package/dist/projects/projects.service.d.ts +1 -0
  59. package/dist/projects/projects.service.d.ts.map +1 -1
  60. package/dist/projects/projects.service.js +12 -0
  61. package/dist/projects/projects.service.js.map +1 -1
  62. package/dist/registry/registry.controller.d.ts +1 -0
  63. package/dist/registry/registry.controller.d.ts.map +1 -1
  64. package/dist/registry/registry.controller.js +10 -0
  65. package/dist/registry/registry.controller.js.map +1 -1
  66. package/dist/registry/registry.module.d.ts.map +1 -1
  67. package/dist/registry/registry.module.js +2 -1
  68. package/dist/registry/registry.module.js.map +1 -1
  69. package/dist/registry/registry.service.d.ts +12 -2
  70. package/dist/registry/registry.service.d.ts.map +1 -1
  71. package/dist/registry/registry.service.js +87 -6
  72. package/dist/registry/registry.service.js.map +1 -1
  73. package/dist/telemetry/telemetry.controller.d.ts.map +1 -1
  74. package/dist/telemetry/telemetry.controller.js +9 -5
  75. package/dist/telemetry/telemetry.controller.js.map +1 -1
  76. package/dist/telemetry/telemetry.service.d.ts +56 -2
  77. package/dist/telemetry/telemetry.service.d.ts.map +1 -1
  78. package/dist/telemetry/telemetry.service.js +217 -3
  79. package/dist/telemetry/telemetry.service.js.map +1 -1
  80. package/dist/workflow/workflow.service.d.ts +3 -1
  81. package/dist/workflow/workflow.service.d.ts.map +1 -1
  82. package/dist/workflow/workflow.service.js +18 -0
  83. package/dist/workflow/workflow.service.js.map +1 -1
  84. package/package.json +11 -10
@@ -1,4 +1,5 @@
1
1
  import type { ContextResult, TaskContextResult } from "@devflow-tools/sdk";
2
+ import { DataService } from "../data/data.service.js";
2
3
  export interface IndexStatus {
3
4
  totalFiles: number;
4
5
  totalSymbols: number;
@@ -11,14 +12,30 @@ export interface FeedbackEntry {
11
12
  timestamp: number;
12
13
  projectRoot: string;
13
14
  }
15
+ export interface FeedbackInput {
16
+ projectRoot: string;
17
+ query: string;
18
+ taskType?: string;
19
+ feedback: "hit" | "partial" | "miss";
20
+ contextMode?: "general" | "task";
21
+ runId?: string;
22
+ tokenCount?: number;
23
+ }
14
24
  export declare class ContextService {
25
+ private readonly dataService?;
15
26
  private feedbackEntries;
27
+ constructor(dataService?: DataService | undefined);
16
28
  indexProject(rootPath: string): Promise<IndexStatus>;
17
29
  getStatus(rootPath: string): Promise<IndexStatus>;
18
30
  buildContext(rootPath: string, query: string, mode: "fast" | "deep", maxTokens?: number): Promise<ContextResult>;
19
31
  buildTaskContext(rootPath: string, query: string, mode: "fast" | "deep", maxTokens?: number): Promise<TaskContextResult>;
20
32
  findSymbol(rootPath: string, name: string): Promise<import("@devflow-tools/sdk").SymbolEntry[]>;
21
- recordFeedback(rootPath: string, query: string, feedback: "hit" | "partial" | "miss"): Promise<FeedbackEntry>;
33
+ recordFeedback(rootPath: string, query: string, feedback: "hit" | "partial" | "miss", extra?: {
34
+ taskType?: string;
35
+ contextMode?: "general" | "task";
36
+ runId?: string;
37
+ tokenCount?: number;
38
+ }): Promise<FeedbackEntry>;
22
39
  getFeedbackSummaries(): Promise<{
23
40
  total: number;
24
41
  hits: number;
@@ -1 +1 @@
1
- {"version":3,"file":"context.service.d.ts","sourceRoot":"","sources":["../../src/context/context.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBACa,cAAc;IACzB,OAAO,CAAC,eAAe,CAAuB;IAExC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAYpD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBjD,YAAY,CAChB,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GACzE,OAAO,CAAC,aAAa,CAAC;IAKnB,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GACzE,OAAO,CAAC,iBAAiB,CAAC;IAKvB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAKzC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAM7G,oBAAoB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAO1H"}
1
+ {"version":3,"file":"context.service.d.ts","sourceRoot":"","sources":["../../src/context/context.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;IACrC,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBACa,cAAc;IAIU,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAHhE,OAAO,CAAC,eAAe,CAAuB;gBAGM,WAAW,CAAC,EAAE,WAAW,YAAA;IAGvE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAYpD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBjD,YAAY,CAChB,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GACzE,OAAO,CAAC,aAAa,CAAC;IAKnB,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GACzE,OAAO,CAAC,iBAAiB,CAAC;IAKvB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAKzC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IA4BnN,oBAAoB,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAO1H"}
@@ -4,10 +4,18 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { Injectable } from "@nestjs/common";
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Injectable, Inject, Optional } from "@nestjs/common";
8
14
  import { createEngines } from "@devflow-tools/context-engine";
15
+ import { DataService } from "../data/data.service.js";
9
16
  let ContextService = class ContextService {
10
- constructor() {
17
+ constructor(dataService) {
18
+ this.dataService = dataService;
11
19
  this.feedbackEntries = [];
12
20
  }
13
21
  async indexProject(rootPath) {
@@ -53,9 +61,29 @@ let ContextService = class ContextService {
53
61
  const { indexer } = await createEngines(rootPath);
54
62
  return indexer.findSymbol(name);
55
63
  }
56
- async recordFeedback(rootPath, query, feedback) {
64
+ async recordFeedback(rootPath, query, feedback, extra) {
57
65
  const entry = { query, feedback, timestamp: Date.now(), projectRoot: rootPath };
58
66
  this.feedbackEntries.push(entry);
67
+ // Record as telemetry event so it enters the telemetry/ROI pipeline
68
+ if (this.dataService) {
69
+ await this.dataService.recordTelemetryEvent({
70
+ toolName: "context_feedback",
71
+ args: {
72
+ query,
73
+ feedback,
74
+ taskType: extra?.taskType,
75
+ contextMode: extra?.contextMode,
76
+ projectRoot: rootPath,
77
+ },
78
+ durationMs: 0,
79
+ success: true,
80
+ metadata: {
81
+ projectRoot: rootPath,
82
+ query,
83
+ taskType: extra?.taskType,
84
+ },
85
+ });
86
+ }
59
87
  return entry;
60
88
  }
61
89
  async getFeedbackSummaries() {
@@ -67,7 +95,10 @@ let ContextService = class ContextService {
67
95
  }
68
96
  };
69
97
  ContextService = __decorate([
70
- Injectable()
98
+ Injectable(),
99
+ __param(0, Optional()),
100
+ __param(0, Inject(DataService)),
101
+ __metadata("design:paramtypes", [DataService])
71
102
  ], ContextService);
72
103
  export { ContextService };
73
104
  //# sourceMappingURL=context.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.service.js","sourceRoot":"","sources":["../../src/context/context.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.service.js","sourceRoot":"","sources":["../../src/context/context.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { DataService, TelemetryEventInput, BenchmarkRunResult } from './data.service.js';
2
+ export declare class DataController {
3
+ private readonly dataService;
4
+ constructor(dataService: DataService);
5
+ recordTelemetryEvent(event: TelemetryEventInput): Promise<{
6
+ eventId: string;
7
+ success: boolean;
8
+ }>;
9
+ getProjectStats(rootPath: string): Promise<import("./data.service.js").ProjectStats | null>;
10
+ updateProjectStats(body: {
11
+ projectRoot: string;
12
+ stats: any;
13
+ }): Promise<import("./data.service.js").ProjectStats>;
14
+ recordBenchmarkResult(result: BenchmarkRunResult): {
15
+ success: boolean;
16
+ };
17
+ getBenchmarkResults(projectRoot?: string): BenchmarkRunResult[];
18
+ }
19
+ //# sourceMappingURL=data.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.controller.d.ts","sourceRoot":"","sources":["../../src/data/data.controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEzF,qBACa,cAAc;IACQ,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,WAAW;IAGpE,oBAAoB,CAAS,KAAK,EAAE,mBAAmB;;;;IAMvD,eAAe,CAAoB,QAAQ,EAAE,MAAM;IAKnD,kBAAkB,CAAS,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE;IAK1E,qBAAqB,CAAS,MAAM,EAAE,kBAAkB;;;IAMxD,mBAAmB,CAAuB,WAAW,CAAC,EAAE,MAAM;CAG/D"}
@@ -0,0 +1,78 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Controller, Post, Get, Body, Query, Inject } from '@nestjs/common';
14
+ import { DataService } from './data.service.js';
15
+ let DataController = class DataController {
16
+ constructor(dataService) {
17
+ this.dataService = dataService;
18
+ }
19
+ async recordTelemetryEvent(event) {
20
+ const result = await this.dataService.recordTelemetryEvent(event);
21
+ return { success: true, ...result };
22
+ }
23
+ async getProjectStats(rootPath) {
24
+ return this.dataService.getProjectStats(rootPath);
25
+ }
26
+ async updateProjectStats(body) {
27
+ return this.dataService.updateProjectStats(body.projectRoot, body.stats);
28
+ }
29
+ recordBenchmarkResult(result) {
30
+ this.dataService.recordBenchmarkResult(result);
31
+ return { success: true };
32
+ }
33
+ getBenchmarkResults(projectRoot) {
34
+ return this.dataService.getBenchmarkResults(projectRoot);
35
+ }
36
+ };
37
+ __decorate([
38
+ Post('telemetry/event'),
39
+ __param(0, Body()),
40
+ __metadata("design:type", Function),
41
+ __metadata("design:paramtypes", [Object]),
42
+ __metadata("design:returntype", Promise)
43
+ ], DataController.prototype, "recordTelemetryEvent", null);
44
+ __decorate([
45
+ Get('project/stats'),
46
+ __param(0, Query('rootPath')),
47
+ __metadata("design:type", Function),
48
+ __metadata("design:paramtypes", [String]),
49
+ __metadata("design:returntype", Promise)
50
+ ], DataController.prototype, "getProjectStats", null);
51
+ __decorate([
52
+ Post('project/stats'),
53
+ __param(0, Body()),
54
+ __metadata("design:type", Function),
55
+ __metadata("design:paramtypes", [Object]),
56
+ __metadata("design:returntype", Promise)
57
+ ], DataController.prototype, "updateProjectStats", null);
58
+ __decorate([
59
+ Post('benchmark/result'),
60
+ __param(0, Body()),
61
+ __metadata("design:type", Function),
62
+ __metadata("design:paramtypes", [Object]),
63
+ __metadata("design:returntype", void 0)
64
+ ], DataController.prototype, "recordBenchmarkResult", null);
65
+ __decorate([
66
+ Get('benchmark/results'),
67
+ __param(0, Query('projectRoot')),
68
+ __metadata("design:type", Function),
69
+ __metadata("design:paramtypes", [String]),
70
+ __metadata("design:returntype", void 0)
71
+ ], DataController.prototype, "getBenchmarkResults", null);
72
+ DataController = __decorate([
73
+ Controller('data'),
74
+ __param(0, Inject(DataService)),
75
+ __metadata("design:paramtypes", [DataService])
76
+ ], DataController);
77
+ export { DataController };
78
+ //# sourceMappingURL=data.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.controller.js","sourceRoot":"","sources":["../../src/data/data.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAA2C,MAAM,mBAAmB,CAAC;AAGlF,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAAkD,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAAG,CAAC;IAGxE,AAAN,KAAK,CAAC,oBAAoB,CAAS,KAA0B;QAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAClE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IACtC,CAAC;IAGK,AAAN,KAAK,CAAC,eAAe,CAAoB,QAAgB;QACvD,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAGK,AAAN,KAAK,CAAC,kBAAkB,CAAS,IAAyC;QACxE,OAAO,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3E,CAAC;IAGD,qBAAqB,CAAS,MAA0B;QACtD,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAGD,mBAAmB,CAAuB,WAAoB;QAC5D,OAAO,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC3D,CAAC;CACF,CAAA;AAzBO;IADL,IAAI,CAAC,iBAAiB,CAAC;IACI,WAAA,IAAI,EAAE,CAAA;;;;0DAGjC;AAGK;IADL,GAAG,CAAC,eAAe,CAAC;IACE,WAAA,KAAK,CAAC,UAAU,CAAC,CAAA;;;;qDAEvC;AAGK;IADL,IAAI,CAAC,eAAe,CAAC;IACI,WAAA,IAAI,EAAE,CAAA;;;;wDAE/B;AAGD;IADC,IAAI,CAAC,kBAAkB,CAAC;IACF,WAAA,IAAI,EAAE,CAAA;;;;2DAG5B;AAGD;IADC,GAAG,CAAC,mBAAmB,CAAC;IACJ,WAAA,KAAK,CAAC,aAAa,CAAC,CAAA;;;;yDAExC;AA5BU,cAAc;IAD1B,UAAU,CAAC,MAAM,CAAC;IAEJ,WAAA,MAAM,CAAC,WAAW,CAAC,CAAA;qCAA+B,WAAW;GAD/D,cAAc,CA6B1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data.controller.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.controller.spec.d.ts","sourceRoot":"","sources":["../../src/data/data.controller.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { Test } from '@nestjs/testing';
3
+ import { DataController } from './data.controller.js';
4
+ import { DataService } from './data.service.js';
5
+ describe('DataController', () => {
6
+ let controller;
7
+ let service;
8
+ const mockService = {
9
+ recordTelemetryEvent: vi.fn().mockResolvedValue({ eventId: 'evt_123' }),
10
+ getProjectStats: vi.fn().mockResolvedValue({ projectRoot: '/test', totalRuns: 5 }),
11
+ updateProjectStats: vi.fn().mockResolvedValue({ projectRoot: '/test', totalRuns: 6 }),
12
+ recordBenchmarkResult: vi.fn(),
13
+ getBenchmarkResults: vi.fn().mockReturnValue([]),
14
+ };
15
+ beforeEach(async () => {
16
+ vi.clearAllMocks();
17
+ const module = await Test.createTestingModule({
18
+ controllers: [DataController],
19
+ providers: [
20
+ {
21
+ provide: DataService,
22
+ useValue: mockService,
23
+ },
24
+ ],
25
+ }).compile();
26
+ controller = module.get(DataController);
27
+ service = module.get(DataService);
28
+ });
29
+ it('should be defined', () => {
30
+ expect(controller).toBeDefined();
31
+ });
32
+ describe('POST /api/data/telemetry/event', () => {
33
+ it('should record telemetry event', async () => {
34
+ const event = {
35
+ toolName: 'test_tool',
36
+ args: {},
37
+ durationMs: 100,
38
+ success: true,
39
+ };
40
+ const result = await controller.recordTelemetryEvent(event);
41
+ expect(result).toEqual({ success: true, eventId: 'evt_123' });
42
+ expect(service.recordTelemetryEvent).toHaveBeenCalledWith(event);
43
+ });
44
+ });
45
+ describe('GET /api/data/project/stats', () => {
46
+ it('should get project stats', async () => {
47
+ const result = await controller.getProjectStats('/test');
48
+ expect(service.getProjectStats).toHaveBeenCalledWith('/test');
49
+ expect(result).toEqual({ projectRoot: '/test', totalRuns: 5 });
50
+ });
51
+ });
52
+ describe('POST /api/data/project/stats', () => {
53
+ it('should update project stats', async () => {
54
+ const body = { projectRoot: '/test', stats: { totalRuns: 6 } };
55
+ const result = await controller.updateProjectStats(body);
56
+ expect(service.updateProjectStats).toHaveBeenCalledWith('/test', { totalRuns: 6 });
57
+ expect(result).toEqual({ projectRoot: '/test', totalRuns: 6 });
58
+ });
59
+ });
60
+ describe('POST /api/data/benchmark/result', () => {
61
+ it('should record benchmark result', () => {
62
+ const result = {
63
+ scenarioId: 'scenario-1',
64
+ mode: 'devflow',
65
+ prepTimeMs: 100,
66
+ tokenCount: 500,
67
+ firstPassSuccess: true,
68
+ reworkCount: 0,
69
+ durationMs: 2000,
70
+ timestamp: Date.now(),
71
+ };
72
+ const response = controller.recordBenchmarkResult(result);
73
+ expect(response).toEqual({ success: true });
74
+ expect(service.recordBenchmarkResult).toHaveBeenCalledWith(result);
75
+ });
76
+ });
77
+ describe('GET /api/data/benchmark/results', () => {
78
+ it('should get benchmark results', () => {
79
+ const result = controller.getBenchmarkResults('/test');
80
+ expect(service.getBenchmarkResults).toHaveBeenCalledWith('/test');
81
+ expect(result).toEqual([]);
82
+ });
83
+ });
84
+ });
85
+ //# sourceMappingURL=data.controller.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.controller.spec.js","sourceRoot":"","sources":["../../src/data/data.controller.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAiB,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,UAA0B,CAAC;IAC/B,IAAI,OAAoB,CAAC;IAEzB,MAAM,WAAW,GAAG;QAClB,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QACvE,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QAClF,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACrF,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE;QAC9B,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;KACjD,CAAC;IAEF,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,EAAE,CAAC,aAAa,EAAE,CAAC;QAEnB,MAAM,MAAM,GAAkB,MAAM,IAAI,CAAC,mBAAmB,CAAC;YAC3D,WAAW,EAAE,CAAC,cAAc,CAAC;YAC7B,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,WAAW;oBACpB,QAAQ,EAAE,WAAW;iBACtB;aACF;SACF,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,UAAU,GAAG,MAAM,CAAC,GAAG,CAAiB,cAAc,CAAC,CAAC;QACxD,OAAO,GAAG,MAAM,CAAC,GAAG,CAAc,WAAW,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC9C,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,KAAK,GAAG;gBACZ,QAAQ,EAAE,WAAW;gBACrB,IAAI,EAAE,EAAE;gBACR,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,IAAI;aACd,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YAC9D,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,IAAI,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;YACnF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAG;gBACb,UAAU,EAAE,YAAY;gBACxB,IAAI,EAAE,SAAkB;gBACxB,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,GAAG;gBACf,gBAAgB,EAAE,IAAI;gBACtB,WAAW,EAAE,CAAC;gBACd,UAAU,EAAE,IAAI;gBAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YACF,MAAM,QAAQ,GAAG,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAC1D,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC/C,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,UAAU,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare class DataModule {
2
+ }
3
+ //# sourceMappingURL=data.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.module.d.ts","sourceRoot":"","sources":["../../src/data/data.module.ts"],"names":[],"mappings":"AAKA,qBAMa,UAAU;CAAG"}
@@ -0,0 +1,22 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Module } from '@nestjs/common';
8
+ import { DataService } from './data.service.js';
9
+ import { DataController } from './data.controller.js';
10
+ import { TelemetryModule } from '../telemetry/telemetry.module.js';
11
+ let DataModule = class DataModule {
12
+ };
13
+ DataModule = __decorate([
14
+ Module({
15
+ imports: [TelemetryModule],
16
+ controllers: [DataController],
17
+ providers: [DataService],
18
+ exports: [DataService],
19
+ })
20
+ ], DataModule);
21
+ export { DataModule };
22
+ //# sourceMappingURL=data.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.module.js","sourceRoot":"","sources":["../../src/data/data.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAQ5D,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,UAAU;IANtB,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,eAAe,CAAC;QAC1B,WAAW,EAAE,CAAC,cAAc,CAAC;QAC7B,SAAS,EAAE,CAAC,WAAW,CAAC;QACxB,OAAO,EAAE,CAAC,WAAW,CAAC;KACvB,CAAC;GACW,UAAU,CAAG"}
@@ -0,0 +1,54 @@
1
+ import { TelemetryService } from '../telemetry/telemetry.service.js';
2
+ import { DevFlowDatabase } from '@devflow-tools/database';
3
+ export interface TelemetryEventInput {
4
+ toolName: string;
5
+ args: Record<string, unknown>;
6
+ durationMs: number;
7
+ success: boolean;
8
+ error?: string;
9
+ pluginName?: string;
10
+ metadata?: {
11
+ taskType?: string;
12
+ query?: string;
13
+ projectRoot?: string;
14
+ runId?: string;
15
+ };
16
+ }
17
+ export interface ProjectStats {
18
+ projectRoot: string;
19
+ totalRuns: number;
20
+ successfulRuns: number;
21
+ totalTokens: number;
22
+ lastActiveAt: number;
23
+ topTools: Array<{
24
+ toolName: string;
25
+ count: number;
26
+ }>;
27
+ }
28
+ export interface BenchmarkRunResult {
29
+ scenarioId: string;
30
+ mode: 'baseline' | 'devflow';
31
+ prepTimeMs: number;
32
+ tokenCount: number;
33
+ firstPassSuccess: boolean;
34
+ reworkCount: number;
35
+ durationMs: number;
36
+ notes?: string;
37
+ timestamp: number;
38
+ }
39
+ export declare class DataService {
40
+ private telemetryService;
41
+ private database?;
42
+ private projectStats;
43
+ private benchmarkResults;
44
+ constructor(telemetryService: TelemetryService, database?: DevFlowDatabase | undefined);
45
+ recordTelemetryEvent(event: TelemetryEventInput): Promise<{
46
+ eventId: string;
47
+ }>;
48
+ getProjectStats(projectRoot: string): Promise<ProjectStats | null>;
49
+ updateProjectStats(projectRoot: string, updates: Partial<ProjectStats>): Promise<ProjectStats>;
50
+ recordBenchmarkResult(result: BenchmarkRunResult): void;
51
+ getBenchmarkResults(projectRoot?: string): BenchmarkRunResult[];
52
+ getPluginEffectiveness(pluginName?: string): Promise<any[]>;
53
+ }
54
+ //# sourceMappingURL=data.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.service.d.ts","sourceRoot":"","sources":["../../src/data/data.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBACa,WAAW;IAKM,OAAO,CAAC,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC;IALnD,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,gBAAgB,CAA4B;gBAGhB,gBAAgB,EAAE,gBAAgB,EAC5B,QAAQ,CAAC,EAAE,eAAe,YAAA;IAG9D,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA2B9E,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAOlE,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAC7B,OAAO,CAAC,YAAY,CAAC;IA8BxB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAIvD,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAOzD,sBAAsB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAIlE"}
@@ -0,0 +1,99 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Injectable, Inject, Optional } from '@nestjs/common';
14
+ import { TelemetryService } from '../telemetry/telemetry.service.js';
15
+ import { DevFlowDatabase } from '@devflow-tools/database';
16
+ let DataService = class DataService {
17
+ constructor(telemetryService, database) {
18
+ this.telemetryService = telemetryService;
19
+ this.database = database;
20
+ this.projectStats = new Map();
21
+ this.benchmarkResults = [];
22
+ }
23
+ async recordTelemetryEvent(event) {
24
+ const eventId = `evt_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`;
25
+ const kind = event.toolName ? 'tool_use' : 'step_end';
26
+ const telemetryEvent = {
27
+ id: eventId,
28
+ runId: event.metadata?.runId ?? `event_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`,
29
+ stepId: eventId,
30
+ kind,
31
+ timestamp: Date.now(),
32
+ duration: event.durationMs,
33
+ data: {
34
+ toolName: event.toolName,
35
+ toolInput: event.args,
36
+ errorMessage: event.error,
37
+ },
38
+ metadata: {
39
+ source: 'claude-code',
40
+ },
41
+ };
42
+ await this.telemetryService.recordEvent(telemetryEvent);
43
+ return { eventId };
44
+ }
45
+ async getProjectStats(projectRoot) {
46
+ if (this.database) {
47
+ return this.database.getProjectStats(projectRoot);
48
+ }
49
+ return this.projectStats.get(projectRoot) ?? null;
50
+ }
51
+ async updateProjectStats(projectRoot, updates) {
52
+ if (this.database) {
53
+ const current = (await this.getProjectStats(projectRoot)) ?? {
54
+ projectRoot,
55
+ totalRuns: 0,
56
+ successfulRuns: 0,
57
+ totalTokens: 0,
58
+ lastActiveAt: Date.now(),
59
+ topTools: [],
60
+ };
61
+ const updated = { ...current, ...updates, lastActiveAt: Date.now() };
62
+ await this.database.upsertProjectStats(updated);
63
+ return updated;
64
+ }
65
+ const existing = this.projectStats.get(projectRoot) ?? {
66
+ projectRoot,
67
+ totalRuns: 0,
68
+ successfulRuns: 0,
69
+ totalTokens: 0,
70
+ lastActiveAt: Date.now(),
71
+ topTools: [],
72
+ };
73
+ const updated = { ...existing, ...updates, lastActiveAt: Date.now() };
74
+ this.projectStats.set(projectRoot, updated);
75
+ return updated;
76
+ }
77
+ recordBenchmarkResult(result) {
78
+ this.benchmarkResults.push(result);
79
+ }
80
+ getBenchmarkResults(projectRoot) {
81
+ if (!projectRoot)
82
+ return this.benchmarkResults;
83
+ return this.benchmarkResults.filter((r) => this.projectStats.get(r.scenarioId)?.projectRoot === projectRoot);
84
+ }
85
+ async getPluginEffectiveness(pluginName) {
86
+ // Stub - actual implementation in Task 11
87
+ return [];
88
+ }
89
+ };
90
+ DataService = __decorate([
91
+ Injectable(),
92
+ __param(0, Inject(TelemetryService)),
93
+ __param(1, Optional()),
94
+ __param(1, Inject('DATABASE')),
95
+ __metadata("design:paramtypes", [TelemetryService,
96
+ DevFlowDatabase])
97
+ ], DataService);
98
+ export { DataService };
99
+ //# sourceMappingURL=data.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.service.js","sourceRoot":"","sources":["../../src/data/data.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data.service.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.service.spec.d.ts","sourceRoot":"","sources":["../../src/data/data.service.spec.ts"],"names":[],"mappings":""}