feat: enhance workflow mutation telemetry for better AI responses

Improve workflow mutation tracking to capture comprehensive data that helps provide better responses when users update workflows. This enhancement collects workflow state, user intent, and operation details to enable more context-aware assistance.

Key improvements:
- Reduce auto-flush threshold from 5 to 2 for more reliable mutation tracking
- Add comprehensive workflow and credential sanitization to mutation tracker
- Document intent parameter in workflow update tools for better UX
- Fix mutation queue handling in telemetry manager (flush now handles 3 queues)
- Add extensive unit tests for mutation tracking and validation (35 new tests)

Technical changes:
- mutation-tracker.ts: Multi-layer sanitization (workflow, node, parameter levels)
- batch-processor.ts: Support mutation data flushing to Supabase
- telemetry-manager.ts: Auto-flush mutations at threshold 2, track mutations queue
- handlers-workflow-diff.ts: Track workflow mutations with sanitized data
- Tests: 13 tests for mutation-tracker, 22 tests for mutation-validator

The intent parameter messaging emphasizes user benefit ("helps to return better response") rather than technical implementation details.

Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
czlonkowski
2025-11-13 13:39:52 +01:00
parent 6719628350
commit 7ac748e73f
9 changed files with 1291 additions and 24 deletions

View File

@@ -70,13 +70,18 @@ describe('TelemetryManager', () => {
updateToolSequence: vi.fn(),
getEventQueue: vi.fn().mockReturnValue([]),
getWorkflowQueue: vi.fn().mockReturnValue([]),
getMutationQueue: vi.fn().mockReturnValue([]),
clearEventQueue: vi.fn(),
clearWorkflowQueue: vi.fn(),
clearMutationQueue: vi.fn(),
enqueueMutation: vi.fn(),
getMutationQueueSize: vi.fn().mockReturnValue(0),
getStats: vi.fn().mockReturnValue({
rateLimiter: { currentEvents: 0, droppedEvents: 0 },
validator: { successes: 0, errors: 0 },
eventQueueSize: 0,
workflowQueueSize: 0,
mutationQueueSize: 0,
performanceMetrics: {}
})
};
@@ -317,17 +322,21 @@ describe('TelemetryManager', () => {
it('should flush events and workflows', async () => {
const mockEvents = [{ user_id: 'user1', event: 'test', properties: {} }];
const mockWorkflows = [{ user_id: 'user1', workflow_hash: 'hash1' }];
const mockMutations: any[] = [];
mockEventTracker.getEventQueue.mockReturnValue(mockEvents);
mockEventTracker.getWorkflowQueue.mockReturnValue(mockWorkflows);
mockEventTracker.getMutationQueue.mockReturnValue(mockMutations);
await manager.flush();
expect(mockEventTracker.getEventQueue).toHaveBeenCalled();
expect(mockEventTracker.getWorkflowQueue).toHaveBeenCalled();
expect(mockEventTracker.getMutationQueue).toHaveBeenCalled();
expect(mockEventTracker.clearEventQueue).toHaveBeenCalled();
expect(mockEventTracker.clearWorkflowQueue).toHaveBeenCalled();
expect(mockBatchProcessor.flush).toHaveBeenCalledWith(mockEvents, mockWorkflows);
expect(mockEventTracker.clearMutationQueue).toHaveBeenCalled();
expect(mockBatchProcessor.flush).toHaveBeenCalledWith(mockEvents, mockWorkflows, mockMutations);
});
it('should not flush when disabled', async () => {