@devflow-tools/server 0.17.7 → 0.18.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.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -2
  3. package/dist/context/context.service.d.ts +1 -1
  4. package/dist/context/context.service.d.ts.map +1 -1
  5. package/dist/context/context.service.js +8 -2
  6. package/dist/context/context.service.js.map +1 -1
  7. package/dist/governance/governance.service.js +1 -1
  8. package/dist/governance/governance.service.js.map +1 -1
  9. package/dist/graph/graph.service.js +1 -1
  10. package/dist/graph/graph.service.js.map +1 -1
  11. package/dist/knowledge/knowledge.service.d.ts.map +1 -1
  12. package/dist/knowledge/knowledge.service.js +8 -4
  13. package/dist/knowledge/knowledge.service.js.map +1 -1
  14. package/dist/main.d.ts.map +1 -1
  15. package/dist/main.js +19 -13
  16. package/dist/main.js.map +1 -1
  17. package/dist/memory/memory.controller.d.ts +1 -2
  18. package/dist/memory/memory.controller.d.ts.map +1 -1
  19. package/dist/memory/memory.controller.js.map +1 -1
  20. package/dist/memory/memory.service.d.ts +2 -2
  21. package/dist/memory/memory.service.d.ts.map +1 -1
  22. package/dist/memory/memory.service.js +14 -8
  23. package/dist/memory/memory.service.js.map +1 -1
  24. package/dist/telemetry/telemetry.service.d.ts +3 -3
  25. package/dist/telemetry/telemetry.service.d.ts.map +1 -1
  26. package/dist/telemetry/telemetry.service.js +24 -18
  27. package/dist/telemetry/telemetry.service.js.map +1 -1
  28. package/dist/workflow/workflow.controller.d.ts +4 -4
  29. package/dist/workflow/workflow.service.d.ts +4 -4
  30. package/package.json +26 -17
  31. package/dist/common/response.interceptor.test.d.ts +0 -2
  32. package/dist/common/response.interceptor.test.d.ts.map +0 -1
  33. package/dist/common/response.interceptor.test.js +0 -23
  34. package/dist/common/response.interceptor.test.js.map +0 -1
  35. package/dist/context/context.controller.spec.d.ts +0 -2
  36. package/dist/context/context.controller.spec.d.ts.map +0 -1
  37. package/dist/context/context.controller.spec.js +0 -193
  38. package/dist/context/context.controller.spec.js.map +0 -1
  39. package/dist/live/live.controller.spec.d.ts +0 -2
  40. package/dist/live/live.controller.spec.d.ts.map +0 -1
  41. package/dist/live/live.controller.spec.js +0 -25
  42. package/dist/live/live.controller.spec.js.map +0 -1
  43. package/dist/projects/projects.controller.spec.d.ts +0 -2
  44. package/dist/projects/projects.controller.spec.d.ts.map +0 -1
  45. package/dist/projects/projects.controller.spec.js +0 -124
  46. package/dist/projects/projects.controller.spec.js.map +0 -1
  47. package/dist/projects/projects.service.spec.d.ts +0 -2
  48. package/dist/projects/projects.service.spec.d.ts.map +0 -1
  49. package/dist/projects/projects.service.spec.js +0 -99
  50. package/dist/projects/projects.service.spec.js.map +0 -1
  51. package/dist/retrieval-contract.spec.d.ts +0 -2
  52. package/dist/retrieval-contract.spec.d.ts.map +0 -1
  53. package/dist/retrieval-contract.spec.js +0 -53
  54. package/dist/retrieval-contract.spec.js.map +0 -1
  55. package/dist/telemetry/telemetry.controller.spec.d.ts +0 -2
  56. package/dist/telemetry/telemetry.controller.spec.d.ts.map +0 -1
  57. package/dist/telemetry/telemetry.controller.spec.js +0 -84
  58. package/dist/telemetry/telemetry.controller.spec.js.map +0 -1
@@ -1,124 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi } from 'vitest';
2
- import { Test } from '@nestjs/testing';
3
- import { BadRequestException, GoneException } from '@nestjs/common';
4
- import { ProjectsController } from './projects.controller.js';
5
- import { ProjectsService } from './projects.service.js';
6
- describe('ProjectsController', () => {
7
- let controller;
8
- let service;
9
- const mockService = {
10
- list: vi.fn().mockResolvedValue([]),
11
- getById: vi.fn().mockResolvedValue({
12
- id: 'proj_1',
13
- name: 'test',
14
- rootPath: '/test/project',
15
- createdAt: Date.now(),
16
- }),
17
- getOnboardingPack: vi.fn().mockResolvedValue({
18
- projectName: 'test',
19
- createdAt: new Date().toISOString(),
20
- rootPath: '/test/project',
21
- projectHash: '0123456789abcdef',
22
- stats: { files: 1, symbols: 1, graphNodes: 1 },
23
- stack: { languages: [], frameworks: [], buildTools: [], testTools: [] },
24
- keyModules: [],
25
- keyFiles: [],
26
- keySymbols: [],
27
- architectureLayers: [],
28
- recommendedPlugins: [],
29
- recommendedWorkflows: [],
30
- recommendedQueries: [],
31
- }),
32
- refreshOnboardingPack: vi.fn().mockResolvedValue({ projectName: 'refreshed' }),
33
- create: vi.fn().mockResolvedValue({
34
- id: 'proj_1',
35
- name: 'test',
36
- rootPath: '/test/project',
37
- createdAt: Date.now(),
38
- }),
39
- setActiveProject: vi.fn(),
40
- getActiveProjectRoot: vi.fn().mockReturnValue('/test/project'),
41
- delete: vi.fn().mockResolvedValue(undefined),
42
- };
43
- beforeEach(async () => {
44
- vi.clearAllMocks();
45
- mockService.getActiveProjectRoot.mockReturnValue('/test/project');
46
- mockService.getById.mockResolvedValue({
47
- id: 'proj_1',
48
- name: 'test',
49
- rootPath: '/test/project with spaces',
50
- createdAt: Date.now(),
51
- });
52
- const module = await Test.createTestingModule({
53
- controllers: [ProjectsController],
54
- providers: [
55
- {
56
- provide: ProjectsService,
57
- useValue: mockService,
58
- },
59
- ],
60
- }).compile();
61
- controller = module.get(ProjectsController);
62
- service = module.get(ProjectsService);
63
- });
64
- it('should be defined', () => {
65
- expect(controller).toBeDefined();
66
- });
67
- describe('GET /projects/onboarding-pack', () => {
68
- it('prefers query rootPath over header and active project', async () => {
69
- const rootPath = '/test/project';
70
- mockService.getOnboardingPack.mockResolvedValue({
71
- projectName: 'test',
72
- });
73
- const result = await controller.getOnboardingPackByRoot(rootPath, '/header/project');
74
- expect(service.getOnboardingPack).toHaveBeenCalledWith(rootPath);
75
- expect(result).toEqual({ projectName: 'test' });
76
- });
77
- it('falls back to x-devflow-project header', async () => {
78
- await controller.getOnboardingPackByRoot(undefined, '/header/project');
79
- expect(service.getOnboardingPack).toHaveBeenCalledWith('/header/project');
80
- });
81
- it('falls back to the active project root', async () => {
82
- await controller.getOnboardingPackByRoot(undefined, undefined);
83
- expect(service.getOnboardingPack).toHaveBeenCalledWith('/test/project');
84
- });
85
- it('throws BadRequestException when no rootPath can be resolved', async () => {
86
- mockService.getActiveProjectRoot.mockReturnValue(null);
87
- await expect(controller.getOnboardingPackByRoot(undefined, undefined)).rejects.toThrow(BadRequestException);
88
- expect(service.getOnboardingPack).not.toHaveBeenCalled();
89
- });
90
- });
91
- describe('GET /projects/:id/onboarding-pack', () => {
92
- it('returns 410 Gone with replacement guidance and Location for a resolvable project', async () => {
93
- const response = { header: vi.fn() };
94
- let error;
95
- try {
96
- await controller.getOnboardingPack('proj_1', response);
97
- }
98
- catch (caught) {
99
- error = caught;
100
- }
101
- expect(error).toBeInstanceOf(GoneException);
102
- expect(error?.getStatus()).toBe(410);
103
- expect(error?.getResponse()).toMatchObject({
104
- message: expect.stringContaining('Use GET /api/projects/onboarding-pack?rootPath='),
105
- replacement: 'GET /api/projects/onboarding-pack?rootPath=<path>',
106
- });
107
- expect(response.header).toHaveBeenCalledWith('Location', '/api/projects/onboarding-pack?rootPath=%2Ftest%2Fproject%20with%20spaces');
108
- expect(service.getOnboardingPack).not.toHaveBeenCalled();
109
- });
110
- });
111
- describe('POST /projects/onboarding-pack/refresh', () => {
112
- it('rebuilds by explicit rootPath', async () => {
113
- const result = await controller.refreshOnboardingPack({ rootPath: '/fresh/project' }, '/header/project');
114
- expect(service.refreshOnboardingPack).toHaveBeenCalledWith('/fresh/project');
115
- expect(result).toEqual({ projectName: 'refreshed' });
116
- });
117
- it('rejects refresh when no project root can be resolved', async () => {
118
- mockService.getActiveProjectRoot.mockReturnValue(null);
119
- await expect(controller.refreshOnboardingPack({}, undefined)).rejects.toThrow(BadRequestException);
120
- expect(service.refreshOnboardingPack).not.toHaveBeenCalled();
121
- });
122
- });
123
- });
124
- //# sourceMappingURL=projects.controller.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects.controller.spec.js","sourceRoot":"","sources":["../../src/projects/projects.controller.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=projects.service.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects.service.spec.d.ts","sourceRoot":"","sources":["../../src/projects/projects.service.spec.ts"],"names":[],"mappings":""}
@@ -1,99 +0,0 @@
1
- import { BadRequestException, InternalServerErrorException, NotFoundException, } from "@nestjs/common";
2
- import { OnboardingPackBuildError } from "@devflow-tools/context-engine";
3
- import { describe, expect, it, vi } from "vitest";
4
- import { ErrorCode } from "../common/error-codes.js";
5
- import { ProjectsService } from "./projects.service.js";
6
- const pack = {
7
- projectName: "test",
8
- createdAt: new Date(0).toISOString(),
9
- rootPath: "/test/project",
10
- projectHash: "0123456789abcdef",
11
- stats: { files: 1, symbols: 2, graphNodes: 2 },
12
- stack: { languages: [], frameworks: [], buildTools: [], testTools: [] },
13
- keyModules: [],
14
- keyFiles: [],
15
- keySymbols: [],
16
- architectureLayers: [],
17
- recommendedPlugins: [],
18
- recommendedWorkflows: [],
19
- recommendedQueries: [],
20
- };
21
- function createService(build) {
22
- return new ProjectsService(undefined, { build });
23
- }
24
- describe("ProjectsService onboarding packs", () => {
25
- it("builds the onboarding pack by rootPath", async () => {
26
- const build = vi.fn().mockResolvedValue(pack);
27
- const service = createService(build);
28
- await expect(service.getOnboardingPack("/test/project")).resolves.toEqual(pack);
29
- expect(build).toHaveBeenCalledWith("/test/project");
30
- });
31
- it.each([
32
- {
33
- code: "ROOT_PATH_REQUIRED",
34
- message: "rootPath is required",
35
- exception: BadRequestException,
36
- status: 400,
37
- errorCode: ErrorCode.BAD_REQUEST,
38
- },
39
- {
40
- code: "ROOT_NOT_FOUND",
41
- message: "Project root does not exist: /missing.",
42
- exception: NotFoundException,
43
- status: 404,
44
- errorCode: ErrorCode.PROJECT_NOT_FOUND,
45
- },
46
- {
47
- code: "ROOT_NOT_DIRECTORY",
48
- message: "Project root is not a directory: /file.",
49
- exception: BadRequestException,
50
- status: 400,
51
- errorCode: ErrorCode.BAD_REQUEST,
52
- },
53
- {
54
- code: "CODEGRAPH_NOT_INITIALIZED",
55
- message: "CodeGraph is not initialized at /project. Run `devflow init` first.",
56
- exception: BadRequestException,
57
- status: 400,
58
- errorCode: ErrorCode.BAD_REQUEST,
59
- },
60
- ])("maps $code to an actionable $status response", async ({ code, message, exception, status, errorCode }) => {
61
- const buildError = new OnboardingPackBuildError(code, message, "/project");
62
- const service = createService(vi.fn().mockRejectedValue(buildError));
63
- let caught;
64
- try {
65
- await service.getOnboardingPack("/project");
66
- }
67
- catch (error) {
68
- caught = error;
69
- }
70
- expect(caught).toBeInstanceOf(exception);
71
- expect(caught.getStatus()).toBe(status);
72
- expect(caught.getResponse()).toEqual({
73
- error: { code: errorCode, message, details: { rootPath: "/project" } },
74
- });
75
- });
76
- it("maps persistence failures to an explicit actionable 500 response", async () => {
77
- const message = "Failed to persist onboarding pack at /project/.devflow/onboarding-pack.json. Check directory write permissions and available disk space.";
78
- const buildError = new OnboardingPackBuildError("PERSISTENCE_FAILED", message, "/project");
79
- const service = createService(vi.fn().mockRejectedValue(buildError));
80
- let caught;
81
- try {
82
- await service.getOnboardingPack("/project");
83
- }
84
- catch (error) {
85
- caught = error;
86
- }
87
- expect(caught).toBeInstanceOf(InternalServerErrorException);
88
- expect(caught.getStatus()).toBe(500);
89
- expect(caught.getResponse()).toEqual({
90
- error: { code: ErrorCode.INTERNAL_ERROR, message, details: { rootPath: "/project" } },
91
- });
92
- });
93
- it("preserves unexpected errors for the global 500 handler", async () => {
94
- const failure = new Error("unexpected database corruption");
95
- const service = createService(vi.fn().mockRejectedValue(failure));
96
- await expect(service.getOnboardingPack("/project")).rejects.toBe(failure);
97
- });
98
- });
99
- //# sourceMappingURL=projects.service.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects.service.spec.js","sourceRoot":"","sources":["../../src/projects/projects.service.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=retrieval-contract.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retrieval-contract.spec.d.ts","sourceRoot":"","sources":["../src/retrieval-contract.spec.ts"],"names":[],"mappings":""}
@@ -1,53 +0,0 @@
1
- import { BadRequestException } from '@nestjs/common';
2
- import { describe, expect, it, vi } from 'vitest';
3
- import { KnowledgeController } from './knowledge/knowledge.controller.js';
4
- import { MemoryController } from './memory/memory.controller.js';
5
- describe('HTTP canonical retrieval contracts', () => {
6
- it('forwards memory query options without changing their shape', async () => {
7
- const query = vi.fn(async () => ({
8
- memories: [],
9
- budgetTokens: 500,
10
- tokenCount: 0,
11
- truncatedCount: 0,
12
- project: { stack: [], conventions: [], metadata: {} },
13
- user: { preferences: {}, stack: [] },
14
- _devflow_unique: { memory_version: 1 },
15
- _accuracy: { data_freshness_ms: 0, source_layer: 'memory', degradation: 'none' },
16
- }));
17
- const controller = new MemoryController({ query }, { getActiveProjectRoot: () => '/project' });
18
- const result = await controller.query(undefined, {
19
- query: 'startup',
20
- purpose: 'session_bootstrap',
21
- budgetTokens: 500,
22
- scopes: ['project'],
23
- });
24
- expect(query).toHaveBeenCalledWith('/project', {
25
- query: 'startup',
26
- purpose: 'session_bootstrap',
27
- budgetTokens: 500,
28
- scopes: ['project'],
29
- });
30
- expect(result._accuracy.source_layer).toBe('memory');
31
- });
32
- it('requires a query and forwards the canonical knowledge budget', async () => {
33
- const query = vi.fn(async () => ({
34
- results: [],
35
- warnings: [],
36
- budgetTokens: 700,
37
- truncatedCount: 0,
38
- _devflow_unique: { search_scope: 'react' },
39
- _accuracy: { data_freshness_ms: 0, source_layer: 'knowledge', degradation: 'none' },
40
- }));
41
- const controller = new KnowledgeController({ query }, { getActiveProjectRoot: () => '/project' });
42
- await expect(controller.query({ query: ' ' }))
43
- .rejects.toBeInstanceOf(BadRequestException);
44
- const result = await controller.query({
45
- query: 'hooks',
46
- scope: 'react',
47
- budgetTokens: 700,
48
- });
49
- expect(query).toHaveBeenCalledWith('/project', 'hooks', 'react', 700);
50
- expect(result._accuracy.source_layer).toBe('knowledge');
51
- });
52
- });
53
- //# sourceMappingURL=retrieval-contract.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retrieval-contract.spec.js","sourceRoot":"","sources":["../src/retrieval-contract.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=telemetry.controller.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"telemetry.controller.spec.d.ts","sourceRoot":"","sources":["../../src/telemetry/telemetry.controller.spec.ts"],"names":[],"mappings":""}
@@ -1,84 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi } from 'vitest';
2
- import { Test } from '@nestjs/testing';
3
- import { TelemetryController } from './telemetry.controller.js';
4
- import { TelemetryService } from './telemetry.service.js';
5
- describe('TelemetryController - Skill Executions', () => {
6
- let controller;
7
- let service;
8
- const mockService = {
9
- endRun: vi.fn().mockResolvedValue(undefined),
10
- getRunEvents: vi.fn().mockResolvedValue([{ id: 'event_001' }]),
11
- recordExecutionStart: vi.fn().mockResolvedValue(undefined),
12
- recordToolCall: vi.fn().mockResolvedValue(undefined),
13
- recordExecutionComplete: vi.fn().mockResolvedValue(undefined),
14
- getExecutions: vi.fn().mockResolvedValue([]),
15
- getExecutionEvents: vi.fn().mockResolvedValue([]),
16
- getMcpCompliance: vi.fn().mockResolvedValue({ overall: 0, bySkill: {}, missedTools: [] }),
17
- };
18
- beforeEach(async () => {
19
- vi.clearAllMocks();
20
- const module = await Test.createTestingModule({
21
- controllers: [TelemetryController],
22
- providers: [{ provide: TelemetryService, useValue: mockService }],
23
- }).compile();
24
- controller = module.get(TelemetryController);
25
- service = module.get(TelemetryService);
26
- });
27
- it('should be defined', () => {
28
- expect(controller).toBeDefined();
29
- });
30
- it('completes a run without invoking retired memory extraction', async () => {
31
- await expect(controller.completeRun('run_001')).resolves.toEqual({ extracted: 0 });
32
- expect(service.endRun).toHaveBeenCalledWith('run_001', { status: 'success' });
33
- });
34
- it('should start a skill execution', async () => {
35
- const body = { executionId: 'exec_001', skillName: 'devflow:react', startedAt: Date.now() };
36
- const result = await controller.startSkillExecution(body);
37
- expect(service.recordExecutionStart).toHaveBeenCalledWith(body);
38
- expect(result).toEqual({ executionId: 'exec_001' });
39
- });
40
- it('should record a tool call', async () => {
41
- const event = {
42
- eventId: 'evt_001', executionId: 'exec_001', timestamp: Date.now(),
43
- toolName: 'Read', toolType: 'direct', isMcpTool: false,
44
- mcpEnforced: false, mcpFallback: false,
45
- input: {}, tokensUsed: 0, duration: 0, blocked: false,
46
- };
47
- const result = await controller.recordToolCall(event);
48
- expect(service.recordToolCall).toHaveBeenCalledWith(event);
49
- expect(result).toEqual({ eventId: 'evt_001' });
50
- });
51
- it('should complete a skill execution', async () => {
52
- const body = {
53
- executionId: 'exec_001', finishedAt: Date.now(),
54
- status: 'completed',
55
- summary: { totalToolCalls: 5, mcpToolCalls: 3, directToolCalls: 2, subagentCount: 0, totalTokens: 1000, totalDuration: 5000, mcpComplianceRate: 60 },
56
- };
57
- const result = await controller.completeSkillExecution(body);
58
- expect(service.recordExecutionComplete).toHaveBeenCalledWith(body);
59
- expect(result).toEqual({});
60
- });
61
- it('should list executions', async () => {
62
- mockService.getExecutions.mockResolvedValue([
63
- { executionId: 'exec_001', skillName: 'devflow:react', status: 'completed' },
64
- ]);
65
- const result = await controller.getExecutions('20', 'devflow:react');
66
- expect(service.getExecutions).toHaveBeenCalledWith(20, 'devflow:react');
67
- expect(result).toEqual([{ executionId: 'exec_001', skillName: 'devflow:react', status: 'completed' }]);
68
- });
69
- it('should get execution events', async () => {
70
- mockService.getExecutionEvents.mockResolvedValue([
71
- { eventId: 'evt_001', toolName: 'Read' },
72
- ]);
73
- const result = await controller.getExecutionEvents('exec_001');
74
- expect(service.getExecutionEvents).toHaveBeenCalledWith('exec_001');
75
- expect(result).toEqual([{ eventId: 'evt_001', toolName: 'Read' }]);
76
- });
77
- it('should get MCP compliance', async () => {
78
- mockService.getMcpCompliance.mockResolvedValue({ overall: 75, bySkill: { 'devflow:react': 66.7 }, missedTools: [] });
79
- const result = await controller.getMcpCompliance();
80
- expect(service.getMcpCompliance).toHaveBeenCalled();
81
- expect(result.overall).toBe(75);
82
- });
83
- });
84
- //# sourceMappingURL=telemetry.controller.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"telemetry.controller.spec.js","sourceRoot":"","sources":["../../src/telemetry/telemetry.controller.spec.ts"],"names":[],"mappings":"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"}