Spaces:
Running
Running
| import { buildAgentRequestDiagnostics, buildPageRequestDiagnostics } from './agent-request-diagnostics'; | |
| import type { AppLogEntry } from './app-logger'; | |
| import assert from 'node:assert/strict'; | |
| import { describe, it } from 'node:test'; | |
| describe('buildPageRequestDiagnostics', () => { | |
| it('exposes only typed diagnostic context fields', () => { | |
| const logs: AppLogEntry[] = [ | |
| { | |
| id: 1, | |
| at: '2026-06-11T00:00:00.000Z', | |
| level: 'info', | |
| message: 'stream diagnostics', | |
| clientRequestId: 'request-a', | |
| filenames: ['image-a.png'], | |
| context: JSON.stringify({ | |
| providerDialect: 'sdk_parsed_fallback', | |
| normalizedEventCount: 1, | |
| reason: 123, | |
| image_backend: 'images-api', | |
| partialImages: '2', | |
| partial_images: 2, | |
| upstream_status: 200, | |
| transport_error: true, | |
| apiKey: 'sk-secret' | |
| }) | |
| } | |
| ]; | |
| const diagnostics = buildPageRequestDiagnostics({ | |
| logs, | |
| clientRequestId: 'request-a' | |
| }); | |
| assert.deepEqual(diagnostics.events[0]?.diagnostics, { | |
| providerDialect: 'sdk_parsed_fallback', | |
| normalizedEventCount: 1, | |
| image_backend: 'images-api', | |
| partial_images: 2, | |
| upstream_status: 200, | |
| transport_error: true | |
| }); | |
| }); | |
| }); | |
| describe('buildAgentRequestDiagnostics', () => { | |
| it('summarizes Agent state without exposing raw request JSON or image payloads', () => { | |
| const diagnostics = buildAgentRequestDiagnostics({ | |
| env: { | |
| AGENT_STATE_BACKEND: 'memory', | |
| AGENT_REQUEST_TTL_SECONDS: '120' | |
| }, | |
| record: { | |
| requestId: 'request-1', | |
| idempotencyKey: 'idem-1', | |
| requestHash: 'hash-1', | |
| mode: 'generate', | |
| status: 'succeeded', | |
| requestJson: { | |
| prompt: 'secret prompt text', | |
| api_key: 'sk-secret' | |
| }, | |
| responseJson: { | |
| request_id: 'request-1', | |
| idempotency_key: 'idem-1', | |
| cached: false, | |
| images: [ | |
| { | |
| id: 'artifact-1', | |
| filename: 'image.png', | |
| content_url: '/api/agent/artifacts/artifact-1/content', | |
| metadata_url: '/api/agent/artifacts/artifact-1', | |
| output_format: 'png', | |
| mime_type: 'image/png', | |
| size_bytes: 67, | |
| width: 1, | |
| height: 1, | |
| b64_json: 'raw-image-base64' | |
| } | |
| ], | |
| created_at: '2026-06-11T00:00:05.000Z', | |
| timing: { | |
| started_at: '2026-06-11T00:00:00.000Z', | |
| completed_at: '2026-06-11T00:00:05.000Z', | |
| elapsed_ms: 5000, | |
| server_elapsed_ms: 5000 | |
| }, | |
| execution: { | |
| transport: 'agent_json', | |
| endpoint: '/api/agent/images/generate', | |
| route_mode: 'agent', | |
| operation: 'generate', | |
| image_backend: 'images-api', | |
| stream_mode: 'non_stream', | |
| streaming_strategy: 'auto', | |
| selected_channel_id: 'default', | |
| upstream_host: 'example.test', | |
| request_headers: { | |
| user_agent_effective: 'visual-journal/2.2.0', | |
| has_extra_headers: false, | |
| allowed_header_names: ['user-agent'], | |
| configured_header_names: [] | |
| } | |
| } | |
| }, | |
| createdAt: '2026-06-11T00:00:00.000Z', | |
| updatedAt: '2026-06-11T00:00:05.000Z', | |
| expiresAt: '2026-06-11T00:02:00.000Z' | |
| }, | |
| artifacts: [ | |
| { | |
| id: 'artifact-1', | |
| requestId: 'request-1', | |
| filename: 'image.png', | |
| filepath: '/private/generated-images/image.png', | |
| contentUrl: '/api/agent/artifacts/artifact-1/content', | |
| metadataUrl: '/api/agent/artifacts/artifact-1', | |
| outputFormat: 'png', | |
| mimeType: 'image/png', | |
| sizeBytes: 67, | |
| width: 1, | |
| height: 1, | |
| model: 'gpt-image-2', | |
| promptHash: 'prompt-hash', | |
| createdAt: '2026-06-11T00:00:05.000Z' | |
| } | |
| ] | |
| }); | |
| assert.equal(diagnostics.request.request_id, 'request-1'); | |
| assert.equal(diagnostics.request.status, 'succeeded'); | |
| assert.equal(diagnostics.response?.image_count, 1); | |
| assert.deepEqual(diagnostics.response?.artifact_ids, ['artifact-1']); | |
| assert.equal(diagnostics.state_backend, 'memory'); | |
| assert.equal(diagnostics.diagnostics_retention.ttl_seconds, 120); | |
| assert.equal(diagnostics.diagnostics_boundary.raw_request_json_redacted, true); | |
| const serialized = JSON.stringify(diagnostics); | |
| assert.equal(serialized.includes('secret prompt text'), false); | |
| assert.equal(serialized.includes('sk-secret'), false); | |
| assert.equal(serialized.includes('raw-image-base64'), false); | |
| assert.equal(serialized.includes('/private/generated-images/image.png'), false); | |
| }); | |
| }); | |