@devflow-tools/server 0.17.8 → 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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/dist/context/context.service.d.ts +1 -1
  3. package/dist/context/context.service.d.ts.map +1 -1
  4. package/dist/context/context.service.js +8 -2
  5. package/dist/context/context.service.js.map +1 -1
  6. package/dist/governance/governance.service.js +1 -1
  7. package/dist/governance/governance.service.js.map +1 -1
  8. package/dist/graph/graph.service.js +1 -1
  9. package/dist/graph/graph.service.js.map +1 -1
  10. package/dist/knowledge/knowledge.service.d.ts.map +1 -1
  11. package/dist/knowledge/knowledge.service.js +8 -4
  12. package/dist/knowledge/knowledge.service.js.map +1 -1
  13. package/dist/main.d.ts.map +1 -1
  14. package/dist/main.js +19 -13
  15. package/dist/main.js.map +1 -1
  16. package/dist/memory/memory.controller.d.ts +1 -2
  17. package/dist/memory/memory.controller.d.ts.map +1 -1
  18. package/dist/memory/memory.controller.js.map +1 -1
  19. package/dist/memory/memory.service.d.ts +2 -2
  20. package/dist/memory/memory.service.d.ts.map +1 -1
  21. package/dist/memory/memory.service.js +14 -8
  22. package/dist/memory/memory.service.js.map +1 -1
  23. package/dist/workflow/workflow.controller.d.ts +4 -4
  24. package/dist/workflow/workflow.service.d.ts +4 -4
  25. package/package.json +26 -17
  26. package/dist/common/response.interceptor.test.d.ts +0 -2
  27. package/dist/common/response.interceptor.test.d.ts.map +0 -1
  28. package/dist/common/response.interceptor.test.js +0 -23
  29. package/dist/common/response.interceptor.test.js.map +0 -1
  30. package/dist/context/context.controller.spec.d.ts +0 -2
  31. package/dist/context/context.controller.spec.d.ts.map +0 -1
  32. package/dist/context/context.controller.spec.js +0 -193
  33. package/dist/context/context.controller.spec.js.map +0 -1
  34. package/dist/live/live.controller.spec.d.ts +0 -2
  35. package/dist/live/live.controller.spec.d.ts.map +0 -1
  36. package/dist/live/live.controller.spec.js +0 -25
  37. package/dist/live/live.controller.spec.js.map +0 -1
  38. package/dist/projects/projects.controller.spec.d.ts +0 -2
  39. package/dist/projects/projects.controller.spec.d.ts.map +0 -1
  40. package/dist/projects/projects.controller.spec.js +0 -124
  41. package/dist/projects/projects.controller.spec.js.map +0 -1
  42. package/dist/projects/projects.service.spec.d.ts +0 -2
  43. package/dist/projects/projects.service.spec.d.ts.map +0 -1
  44. package/dist/projects/projects.service.spec.js +0 -99
  45. package/dist/projects/projects.service.spec.js.map +0 -1
  46. package/dist/retrieval-contract.spec.d.ts +0 -2
  47. package/dist/retrieval-contract.spec.d.ts.map +0 -1
  48. package/dist/retrieval-contract.spec.js +0 -53
  49. package/dist/retrieval-contract.spec.js.map +0 -1
  50. package/dist/telemetry/telemetry.controller.spec.d.ts +0 -2
  51. package/dist/telemetry/telemetry.controller.spec.d.ts.map +0 -1
  52. package/dist/telemetry/telemetry.controller.spec.js +0 -84
  53. package/dist/telemetry/telemetry.controller.spec.js.map +0 -1
@@ -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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"}