@auxiora/runtime 1.10.0 → 1.10.5

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 (57) hide show
  1. package/dist/__tests__/telemetry-wiring.test.d.ts +2 -0
  2. package/dist/__tests__/telemetry-wiring.test.d.ts.map +1 -0
  3. package/dist/__tests__/telemetry-wiring.test.js +61 -0
  4. package/dist/__tests__/telemetry-wiring.test.js.map +1 -0
  5. package/dist/confidence.d.ts +46 -0
  6. package/dist/confidence.d.ts.map +1 -0
  7. package/dist/confidence.js +112 -0
  8. package/dist/confidence.js.map +1 -0
  9. package/dist/enrichment/__tests__/integration.test.js +10 -0
  10. package/dist/enrichment/__tests__/integration.test.js.map +1 -1
  11. package/dist/enrichment/__tests__/telemetry-stage.test.d.ts +2 -0
  12. package/dist/enrichment/__tests__/telemetry-stage.test.d.ts.map +1 -0
  13. package/dist/enrichment/__tests__/telemetry-stage.test.js +61 -0
  14. package/dist/enrichment/__tests__/telemetry-stage.test.js.map +1 -0
  15. package/dist/enrichment/index.d.ts +5 -0
  16. package/dist/enrichment/index.d.ts.map +1 -1
  17. package/dist/enrichment/index.js +3 -0
  18. package/dist/enrichment/index.js.map +1 -1
  19. package/dist/enrichment/stages/group-context-stage.d.ts +8 -0
  20. package/dist/enrichment/stages/group-context-stage.d.ts.map +1 -0
  21. package/dist/enrichment/stages/group-context-stage.js +24 -0
  22. package/dist/enrichment/stages/group-context-stage.js.map +1 -0
  23. package/dist/enrichment/stages/learning-stage.d.ts +17 -0
  24. package/dist/enrichment/stages/learning-stage.d.ts.map +1 -0
  25. package/dist/enrichment/stages/learning-stage.js +37 -0
  26. package/dist/enrichment/stages/learning-stage.js.map +1 -0
  27. package/dist/enrichment/stages/telemetry-stage.d.ts +18 -0
  28. package/dist/enrichment/stages/telemetry-stage.d.ts.map +1 -0
  29. package/dist/enrichment/stages/telemetry-stage.js +39 -0
  30. package/dist/enrichment/stages/telemetry-stage.js.map +1 -0
  31. package/dist/enrichment/types.d.ts +6 -0
  32. package/dist/enrichment/types.d.ts.map +1 -1
  33. package/dist/index.d.ts +12 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +288 -26
  36. package/dist/index.js.map +1 -1
  37. package/dist/queue-wiring.d.ts +73 -0
  38. package/dist/queue-wiring.d.ts.map +1 -0
  39. package/dist/queue-wiring.js +71 -0
  40. package/dist/queue-wiring.js.map +1 -0
  41. package/dist/response-provenance.d.ts +70 -0
  42. package/dist/response-provenance.d.ts.map +1 -0
  43. package/dist/response-provenance.js +115 -0
  44. package/dist/response-provenance.js.map +1 -0
  45. package/dist/source-attribution.d.ts +55 -0
  46. package/dist/source-attribution.d.ts.map +1 -0
  47. package/dist/source-attribution.js +107 -0
  48. package/dist/source-attribution.js.map +1 -0
  49. package/dist/telemetry-wiring.d.ts +28 -0
  50. package/dist/telemetry-wiring.d.ts.map +1 -0
  51. package/dist/telemetry-wiring.js +31 -0
  52. package/dist/telemetry-wiring.js.map +1 -0
  53. package/dist/user-model-export.d.ts +109 -0
  54. package/dist/user-model-export.d.ts.map +1 -0
  55. package/dist/user-model-export.js +88 -0
  56. package/dist/user-model-export.js.map +1 -0
  57. package/package.json +77 -72
@@ -0,0 +1,73 @@
1
+ /** Payload for a queued ReAct job */
2
+ export interface QueuedReActPayload {
3
+ goal: string;
4
+ sessionId: string;
5
+ config?: {
6
+ maxSteps?: number;
7
+ maxTokenBudget?: number;
8
+ timeoutMs?: number;
9
+ allowedTools?: string[];
10
+ deniedTools?: string[];
11
+ };
12
+ }
13
+ /** Payload for a queued orchestration job */
14
+ export interface QueuedWorkflowPayload {
15
+ workflowId: string;
16
+ pattern: string;
17
+ tasks: Array<{
18
+ id: string;
19
+ name: string;
20
+ provider: string;
21
+ systemPrompt: string;
22
+ userPrompt: string;
23
+ model?: string;
24
+ maxTokens?: number;
25
+ temperature?: number;
26
+ timeout?: number;
27
+ }>;
28
+ synthesisPrompt?: string;
29
+ }
30
+ /** Structural type for JobContext (avoids direct import) */
31
+ export interface JobContextLike {
32
+ jobId: string;
33
+ attempt: number;
34
+ signal: AbortSignal;
35
+ checkpoint: (data: unknown) => void;
36
+ getCheckpoint: <T = unknown>() => T | undefined;
37
+ }
38
+ /** Structural type for ReActLoop (avoids direct import) */
39
+ export interface ReActLoopLike {
40
+ run(goal: string, resumeFrom?: unknown): Promise<{
41
+ status: string;
42
+ steps: unknown[];
43
+ answer?: string;
44
+ totalTokens: number;
45
+ totalDurationMs: number;
46
+ error?: string;
47
+ }>;
48
+ }
49
+ /** Factory function type for creating ReActLoop instances */
50
+ export type ReActLoopFactory = (config: QueuedReActPayload['config'] & {
51
+ sessionId: string;
52
+ checkpointHandler?: {
53
+ save: (cp: unknown) => Promise<void>;
54
+ load: (id: string) => Promise<unknown | undefined>;
55
+ };
56
+ }) => ReActLoopLike;
57
+ /**
58
+ * Create a job handler for ReAct loops.
59
+ * The handler checkpoints after each step for crash recovery.
60
+ */
61
+ export declare function createReActJobHandler(loopFactory: ReActLoopFactory): (payload: QueuedReActPayload, ctx: JobContextLike) => Promise<unknown>;
62
+ /** Structural type for orchestration engine */
63
+ export interface OrchestrationEngineLike {
64
+ execute(workflow: unknown): AsyncGenerator<unknown, unknown, unknown>;
65
+ }
66
+ /** Factory for creating orchestration engine instances */
67
+ export type OrchestrationFactory = () => OrchestrationEngineLike;
68
+ /**
69
+ * Create a job handler for orchestration workflows.
70
+ * The handler checkpoints after each task completion.
71
+ */
72
+ export declare function createWorkflowJobHandler(engineFactory: OrchestrationFactory): (payload: QueuedWorkflowPayload, ctx: JobContextLike) => Promise<unknown>;
73
+ //# sourceMappingURL=queue-wiring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-wiring.d.ts","sourceRoot":"","sources":["../src/queue-wiring.ts"],"names":[],"mappings":"AAIA,qCAAqC;AACrC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;CACH;AAED,6CAA6C;AAC7C,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,4DAA4D;AAC5D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,aAAa,EAAE,CAAC,CAAC,GAAG,OAAO,OAAO,CAAC,GAAG,SAAS,CAAC;CACjD;AAED,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;QAC/C,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAED,6DAA6D;AAC7D,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,GAAG;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE;QAClB,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;KACpD,CAAC;CACH,KAAK,aAAa,CAAC;AAEpB;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,gBAAgB,GAC5B,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAkCxE;AAED,+CAA+C;AAC/C,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;CACvE;AAED,0DAA0D;AAC1D,MAAM,MAAM,oBAAoB,GAAG,MAAM,uBAAuB,CAAC;AAEjE;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,oBAAoB,GAClC,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAmC3E"}
@@ -0,0 +1,71 @@
1
+ import { getLogger } from '@auxiora/logger';
2
+ const logger = getLogger('runtime:queue-wiring');
3
+ /**
4
+ * Create a job handler for ReAct loops.
5
+ * The handler checkpoints after each step for crash recovery.
6
+ */
7
+ export function createReActJobHandler(loopFactory) {
8
+ return async (payload, ctx) => {
9
+ logger.info('Starting queued ReAct job', { jobId: ctx.jobId, goal: payload.goal, attempt: ctx.attempt });
10
+ // Create checkpoint handler that bridges to job queue
11
+ const checkpointHandler = {
12
+ save: async (cp) => {
13
+ ctx.checkpoint(cp);
14
+ },
15
+ load: async (_id) => {
16
+ return ctx.getCheckpoint();
17
+ },
18
+ };
19
+ // Resume from checkpoint if this is a retry
20
+ const savedCheckpoint = ctx.attempt > 1 ? ctx.getCheckpoint() : undefined;
21
+ const loop = loopFactory({
22
+ ...payload.config,
23
+ sessionId: payload.sessionId,
24
+ checkpointHandler,
25
+ });
26
+ const result = await loop.run(payload.goal, savedCheckpoint);
27
+ logger.info('ReAct job completed', {
28
+ jobId: ctx.jobId,
29
+ status: result.status,
30
+ steps: result.steps.length,
31
+ tokens: result.totalTokens,
32
+ });
33
+ return result;
34
+ };
35
+ }
36
+ /**
37
+ * Create a job handler for orchestration workflows.
38
+ * The handler checkpoints after each task completion.
39
+ */
40
+ export function createWorkflowJobHandler(engineFactory) {
41
+ return async (payload, ctx) => {
42
+ logger.info('Starting queued workflow job', { jobId: ctx.jobId, workflowId: payload.workflowId, attempt: ctx.attempt });
43
+ const engine = engineFactory();
44
+ const workflow = {
45
+ id: payload.workflowId,
46
+ pattern: payload.pattern,
47
+ tasks: payload.tasks,
48
+ synthesisPrompt: payload.synthesisPrompt,
49
+ };
50
+ // Consume the async generator
51
+ const generator = engine.execute(workflow);
52
+ let lastEvent;
53
+ let result;
54
+ while (true) {
55
+ const next = await generator.next();
56
+ if (next.done) {
57
+ result = next.value;
58
+ break;
59
+ }
60
+ lastEvent = next.value;
61
+ // Checkpoint progress events
62
+ const event = lastEvent;
63
+ if (event && (event.type === 'task_progress' || event.type === 'agent_completed')) {
64
+ ctx.checkpoint({ lastEvent: event, workflowId: payload.workflowId });
65
+ }
66
+ }
67
+ logger.info('Workflow job completed', { jobId: ctx.jobId, workflowId: payload.workflowId });
68
+ return result;
69
+ };
70
+ }
71
+ //# sourceMappingURL=queue-wiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-wiring.js","sourceRoot":"","sources":["../src/queue-wiring.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ export interface ProvenanceEntry {
2
+ /** Unique response ID */
3
+ responseId: string;
4
+ /** Session ID */
5
+ sessionId: string;
6
+ /** Timestamp */
7
+ timestamp: number;
8
+ /** Memory IDs that were retrieved for context */
9
+ memoryIds: string[];
10
+ /** Context signals that influenced the response */
11
+ contextSignals: ContextSignalRecord[];
12
+ /** Tools that were called during response generation */
13
+ toolCalls: ToolCallRecord[];
14
+ /** Enrichment stages that ran */
15
+ enrichmentStages: string[];
16
+ /** Model and provider used */
17
+ model: {
18
+ provider: string;
19
+ model: string;
20
+ };
21
+ /** Token usage */
22
+ tokenUsage: {
23
+ input: number;
24
+ output: number;
25
+ };
26
+ }
27
+ export interface ContextSignalRecord {
28
+ name: string;
29
+ type: string;
30
+ value: string;
31
+ confidence?: number;
32
+ }
33
+ export interface ToolCallRecord {
34
+ toolName: string;
35
+ durationMs: number;
36
+ success: boolean;
37
+ }
38
+ export interface ProvenanceSummary {
39
+ /** Human-readable explanation of where the response came from */
40
+ explanation: string;
41
+ /** List of contributing sources */
42
+ sources: Array<{
43
+ type: string;
44
+ label: string;
45
+ detail?: string;
46
+ }>;
47
+ /** Whether the response was grounded in user data */
48
+ groundedInUserData: boolean;
49
+ /** Whether external tools/searches were used */
50
+ usedExternalSources: boolean;
51
+ }
52
+ export declare class ResponseProvenanceTracker {
53
+ private entries;
54
+ private maxEntries;
55
+ constructor(maxEntries?: number);
56
+ /** Record provenance for a response */
57
+ record(entry: ProvenanceEntry): void;
58
+ /** Get provenance for a specific response */
59
+ get(responseId: string): ProvenanceEntry | undefined;
60
+ /** Get a human-readable summary explaining why a response was generated */
61
+ explain(responseId: string): ProvenanceSummary | undefined;
62
+ /** List recent response IDs for a session */
63
+ listBySession(sessionId: string, limit?: number): string[];
64
+ /** Get count of tracked responses */
65
+ get size(): number;
66
+ /** Clear all entries */
67
+ clear(): void;
68
+ private findOldest;
69
+ }
70
+ //# sourceMappingURL=response-provenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-provenance.d.ts","sourceRoot":"","sources":["../src/response-provenance.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,mDAAmD;IACnD,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC,wDAAwD;IACxD,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,8BAA8B;IAC9B,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,kBAAkB;IAClB,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,qDAAqD;IACrD,kBAAkB,EAAE,OAAO,CAAC;IAC5B,gDAAgD;IAChD,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,qBAAa,yBAAyB;IACpC,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,SAAM;IAI5B,uCAAuC;IACvC,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAepC,6CAA6C;IAC7C,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD,2EAA2E;IAC3E,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAoE1D,6CAA6C;IAC7C,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,EAAE;IAQtD,qCAAqC;IACrC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,wBAAwB;IACxB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,UAAU;CAWnB"}
@@ -0,0 +1,115 @@
1
+ import { getLogger } from '@auxiora/logger';
2
+ const logger = getLogger('runtime:response-provenance');
3
+ export class ResponseProvenanceTracker {
4
+ entries = new Map();
5
+ maxEntries;
6
+ constructor(maxEntries = 500) {
7
+ this.maxEntries = maxEntries;
8
+ }
9
+ /** Record provenance for a response */
10
+ record(entry) {
11
+ // Enforce max size
12
+ if (this.entries.size >= this.maxEntries) {
13
+ const oldest = this.findOldest();
14
+ if (oldest)
15
+ this.entries.delete(oldest);
16
+ }
17
+ this.entries.set(entry.responseId, entry);
18
+ logger.debug('Provenance recorded', {
19
+ responseId: entry.responseId,
20
+ memoryCount: entry.memoryIds.length,
21
+ toolCount: entry.toolCalls.length,
22
+ });
23
+ }
24
+ /** Get provenance for a specific response */
25
+ get(responseId) {
26
+ return this.entries.get(responseId);
27
+ }
28
+ /** Get a human-readable summary explaining why a response was generated */
29
+ explain(responseId) {
30
+ const entry = this.entries.get(responseId);
31
+ if (!entry)
32
+ return undefined;
33
+ const sources = [];
34
+ const parts = [];
35
+ // Memories
36
+ if (entry.memoryIds.length > 0) {
37
+ sources.push({
38
+ type: 'memory',
39
+ label: `${entry.memoryIds.length} memories`,
40
+ detail: entry.memoryIds.join(', '),
41
+ });
42
+ parts.push(`${entry.memoryIds.length} stored memories`);
43
+ }
44
+ // Context signals
45
+ if (entry.contextSignals.length > 0) {
46
+ for (const signal of entry.contextSignals) {
47
+ sources.push({
48
+ type: 'context_signal',
49
+ label: signal.name,
50
+ detail: signal.value,
51
+ });
52
+ }
53
+ parts.push(`${entry.contextSignals.length} context signals`);
54
+ }
55
+ // Tools
56
+ if (entry.toolCalls.length > 0) {
57
+ for (const tool of entry.toolCalls) {
58
+ sources.push({
59
+ type: 'tool',
60
+ label: tool.toolName,
61
+ detail: tool.success ? `completed in ${tool.durationMs}ms` : 'failed',
62
+ });
63
+ }
64
+ parts.push(`${entry.toolCalls.length} tool calls`);
65
+ }
66
+ // Enrichment
67
+ if (entry.enrichmentStages.length > 0) {
68
+ sources.push({
69
+ type: 'enrichment',
70
+ label: `${entry.enrichmentStages.length} enrichment stages`,
71
+ detail: entry.enrichmentStages.join(', '),
72
+ });
73
+ }
74
+ // Model
75
+ sources.push({
76
+ type: 'model',
77
+ label: `${entry.model.provider}/${entry.model.model}`,
78
+ });
79
+ const groundedInUserData = entry.memoryIds.length > 0 || entry.contextSignals.length > 0;
80
+ const usedExternalSources = entry.toolCalls.some(t => t.toolName.includes('search') || t.toolName.includes('web') || t.toolName.includes('fetch'));
81
+ const explanation = parts.length > 0
82
+ ? `This response was informed by ${parts.join(', ')}, processed through ${entry.enrichmentStages.length} enrichment stages, and generated by ${entry.model.provider}/${entry.model.model}.`
83
+ : `This response was generated by ${entry.model.provider}/${entry.model.model} without specific user data.`;
84
+ return { explanation, sources, groundedInUserData, usedExternalSources };
85
+ }
86
+ /** List recent response IDs for a session */
87
+ listBySession(sessionId, limit = 20) {
88
+ const ids = [];
89
+ for (const [id, entry] of this.entries) {
90
+ if (entry.sessionId === sessionId)
91
+ ids.push(id);
92
+ }
93
+ return ids.slice(-limit);
94
+ }
95
+ /** Get count of tracked responses */
96
+ get size() {
97
+ return this.entries.size;
98
+ }
99
+ /** Clear all entries */
100
+ clear() {
101
+ this.entries.clear();
102
+ }
103
+ findOldest() {
104
+ let oldestId;
105
+ let oldestTime = Infinity;
106
+ for (const [id, entry] of this.entries) {
107
+ if (entry.timestamp < oldestTime) {
108
+ oldestTime = entry.timestamp;
109
+ oldestId = id;
110
+ }
111
+ }
112
+ return oldestId;
113
+ }
114
+ }
115
+ //# sourceMappingURL=response-provenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-provenance.js","sourceRoot":"","sources":["../src/response-provenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ export type SourceType = 'user_data' | 'web_search' | 'knowledge_graph' | 'model_generation' | 'tool_output' | 'memory';
2
+ export interface Attribution {
3
+ /** What type of source this came from */
4
+ sourceType: SourceType;
5
+ /** Human-readable label */
6
+ label: string;
7
+ /** Reference to the specific source (memory ID, URL, tool name, etc.) */
8
+ reference?: string;
9
+ /** Confidence that this attribution is correct (0-1) */
10
+ confidence: number;
11
+ }
12
+ export interface AttributedSegment {
13
+ /** The text content */
14
+ content: string;
15
+ /** Attribution for this segment */
16
+ attribution: Attribution;
17
+ }
18
+ export interface ResponseAttribution {
19
+ /** Original full response text */
20
+ fullResponse: string;
21
+ /** Segments with attribution */
22
+ segments: AttributedSegment[];
23
+ /** Summary of sources used */
24
+ sourcesSummary: Record<SourceType, number>;
25
+ /** Overall confidence score */
26
+ overallConfidence: number;
27
+ }
28
+ /** Source that was available during response generation */
29
+ export interface AttributionSource {
30
+ type: SourceType;
31
+ label: string;
32
+ /** The actual content from this source */
33
+ content?: string;
34
+ /** Reference identifier (memory ID, URL, etc.) */
35
+ reference?: string;
36
+ /** How confident we are this source was used */
37
+ confidence?: number;
38
+ }
39
+ export declare class SourceAttributor {
40
+ /**
41
+ * Attribute a response based on the context that produced it.
42
+ * Takes the response text and the sources that were available during generation.
43
+ */
44
+ attribute(response: string, sources: AttributionSource[]): ResponseAttribution;
45
+ /**
46
+ * Create a simple attribution for a fully-generated response (no specific sources).
47
+ */
48
+ attributeGenerated(response: string): ResponseAttribution;
49
+ /**
50
+ * Simple substring match finder (case-insensitive, whitespace-normalized).
51
+ * Returns the start index or -1 if not found.
52
+ */
53
+ private findMatch;
54
+ }
55
+ //# sourceMappingURL=source-attribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-attribution.d.ts","sourceRoot":"","sources":["../src/source-attribution.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,YAAY,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,aAAa,GAAG,QAAQ,CAAC;AAExH,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,UAAU,EAAE,UAAU,CAAC;IACvB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC3C,+BAA+B;IAC/B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,2DAA2D;AAC3D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAgB;IAC3B;;;OAGG;IACH,SAAS,CACP,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,EAAE,GAC3B,mBAAmB;IA0EtB;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB;IAYzD;;;OAGG;IACH,OAAO,CAAC,SAAS;CAiBlB"}
@@ -0,0 +1,107 @@
1
+ import { getLogger } from '@auxiora/logger';
2
+ const logger = getLogger('runtime:source-attribution');
3
+ export class SourceAttributor {
4
+ /**
5
+ * Attribute a response based on the context that produced it.
6
+ * Takes the response text and the sources that were available during generation.
7
+ */
8
+ attribute(response, sources) {
9
+ const segments = [];
10
+ let remainingText = response;
11
+ const sourcesSummary = {};
12
+ // Match response segments to known sources
13
+ for (const source of sources) {
14
+ if (!source.content)
15
+ continue;
16
+ // Find if any source content appears (or closely matches) in the response
17
+ const matchIndex = this.findMatch(remainingText, source.content);
18
+ if (matchIndex >= 0) {
19
+ const matchLength = Math.min(source.content.length, remainingText.length - matchIndex);
20
+ // Add pre-match text as model generation
21
+ if (matchIndex > 0) {
22
+ const preText = remainingText.slice(0, matchIndex);
23
+ segments.push({
24
+ content: preText,
25
+ attribution: { sourceType: 'model_generation', label: 'AI generated', confidence: 0.5 },
26
+ });
27
+ }
28
+ // Add matched segment
29
+ const matchedText = remainingText.slice(matchIndex, matchIndex + matchLength);
30
+ const attr = {
31
+ sourceType: source.type,
32
+ label: source.label,
33
+ reference: source.reference,
34
+ confidence: source.confidence ?? 0.8,
35
+ };
36
+ segments.push({ content: matchedText, attribution: attr });
37
+ sourcesSummary[source.type] = (sourcesSummary[source.type] ?? 0) + 1;
38
+ remainingText = remainingText.slice(matchIndex + matchLength);
39
+ }
40
+ }
41
+ // Any remaining text is model generation
42
+ if (remainingText.length > 0) {
43
+ segments.push({
44
+ content: remainingText,
45
+ attribution: { sourceType: 'model_generation', label: 'AI generated', confidence: 0.5 },
46
+ });
47
+ sourcesSummary['model_generation'] = (sourcesSummary['model_generation'] ?? 0) + 1;
48
+ }
49
+ // If no specific sources matched, the whole thing is model generation
50
+ if (segments.length === 0) {
51
+ segments.push({
52
+ content: response,
53
+ attribution: { sourceType: 'model_generation', label: 'AI generated', confidence: 0.5 },
54
+ });
55
+ sourcesSummary['model_generation'] = 1;
56
+ }
57
+ const confidences = segments.map(s => s.attribution.confidence);
58
+ const overallConfidence = confidences.length > 0
59
+ ? confidences.reduce((a, b) => a + b, 0) / confidences.length
60
+ : 0.5;
61
+ logger.debug('Response attributed', {
62
+ segmentCount: segments.length,
63
+ sourceTypes: Object.keys(sourcesSummary),
64
+ });
65
+ return {
66
+ fullResponse: response,
67
+ segments,
68
+ sourcesSummary: sourcesSummary,
69
+ overallConfidence,
70
+ };
71
+ }
72
+ /**
73
+ * Create a simple attribution for a fully-generated response (no specific sources).
74
+ */
75
+ attributeGenerated(response) {
76
+ return {
77
+ fullResponse: response,
78
+ segments: [{
79
+ content: response,
80
+ attribution: { sourceType: 'model_generation', label: 'AI generated', confidence: 0.5 },
81
+ }],
82
+ sourcesSummary: { model_generation: 1 },
83
+ overallConfidence: 0.5,
84
+ };
85
+ }
86
+ /**
87
+ * Simple substring match finder (case-insensitive, whitespace-normalized).
88
+ * Returns the start index or -1 if not found.
89
+ */
90
+ findMatch(text, source) {
91
+ const normalizedText = text.toLowerCase().replace(/\s+/g, ' ');
92
+ const normalizedSource = source.toLowerCase().replace(/\s+/g, ' ');
93
+ // Try exact substring first
94
+ const idx = normalizedText.indexOf(normalizedSource);
95
+ if (idx >= 0)
96
+ return idx;
97
+ // Try first 50 chars of source for partial match
98
+ if (normalizedSource.length > 50) {
99
+ const partial = normalizedSource.slice(0, 50);
100
+ const partialIdx = normalizedText.indexOf(partial);
101
+ if (partialIdx >= 0)
102
+ return partialIdx;
103
+ }
104
+ return -1;
105
+ }
106
+ }
107
+ //# sourceMappingURL=source-attribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-attribution.js","sourceRoot":"","sources":["../src/source-attribution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,GAAG,SAAS,CAAC,4BAA4B,CAAC,CAAC;AA6CvD,MAAM,OAAO,gBAAgB;IAC3B;;;OAGG;IACH,SAAS,CACP,QAAgB,EAChB,OAA4B;QAE5B,MAAM,QAAQ,GAAwB,EAAE,CAAC;QACzC,IAAI,aAAa,GAAG,QAAQ,CAAC;QAC7B,MAAM,cAAc,GAA2B,EAAE,CAAC;QAElD,2CAA2C;QAC3C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,SAAS;YAE9B,0EAA0E;YAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACjE,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;gBACpB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;gBAEvF,yCAAyC;gBACzC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oBACnB,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;oBACnD,QAAQ,CAAC,IAAI,CAAC;wBACZ,OAAO,EAAE,OAAO;wBAChB,WAAW,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE;qBACxF,CAAC,CAAC;gBACL,CAAC;gBAED,sBAAsB;gBACtB,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,WAAW,CAAC,CAAC;gBAC9E,MAAM,IAAI,GAAgB;oBACxB,UAAU,EAAE,MAAM,CAAC,IAAI;oBACvB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,GAAG;iBACrC,CAAC;gBACF,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3D,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAErE,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC;gBACZ,OAAO,EAAE,aAAa;gBACtB,WAAW,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE;aACxF,CAAC,CAAC;YACH,cAAc,CAAC,kBAAkB,CAAC,GAAG,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACrF,CAAC;QAED,sEAAsE;QACtE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC;gBACZ,OAAO,EAAE,QAAQ;gBACjB,WAAW,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE;aACxF,CAAC,CAAC;YACH,cAAc,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAChE,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;YAC9C,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM;YAC7D,CAAC,CAAC,GAAG,CAAC;QAER,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE;YAClC,YAAY,EAAE,QAAQ,CAAC,MAAM;YAC7B,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;SACzC,CAAC,CAAC;QAEH,OAAO;YACL,YAAY,EAAE,QAAQ;YACtB,QAAQ;YACR,cAAc,EAAE,cAA4C;YAC5D,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,QAAgB;QACjC,OAAO;YACL,YAAY,EAAE,QAAQ;YACtB,QAAQ,EAAE,CAAC;oBACT,OAAO,EAAE,QAAQ;oBACjB,WAAW,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE;iBACxF,CAAC;YACF,cAAc,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAgC;YACrE,iBAAiB,EAAE,GAAG;SACvB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,SAAS,CAAC,IAAY,EAAE,MAAc;QAC5C,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAEnE,4BAA4B;QAC5B,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACrD,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC;QAEzB,iDAAiD;QACjD,IAAI,gBAAgB,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9C,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,UAAU,IAAI,CAAC;gBAAE,OAAO,UAAU,CAAC;QACzC,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ /** Structural types to avoid direct imports */
2
+ interface TelemetryTrackerLike {
3
+ recordJob(outcome: {
4
+ type: string;
5
+ success: boolean;
6
+ durationMs: number;
7
+ jobId: string;
8
+ error?: string;
9
+ }): void;
10
+ }
11
+ interface JobEmitterLike {
12
+ on(event: string, listener: (data: unknown) => void): void;
13
+ }
14
+ interface LearningStoreLike {
15
+ extractAndStore(output: string, jobId: string, jobType: string): number;
16
+ }
17
+ /**
18
+ * Wire job queue events to telemetry tracker.
19
+ *
20
+ * Listens to job:completed, job:failed, job:dead events and records
21
+ * them for operational telemetry and self-improvement loops.
22
+ *
23
+ * When a LearningStoreLike is provided, completed job results are
24
+ * passed through learning extraction so insights can be persisted.
25
+ */
26
+ export declare function wireTelemetry(emitter: JobEmitterLike, tracker: TelemetryTrackerLike, learningStore?: LearningStoreLike): void;
27
+ export {};
28
+ //# sourceMappingURL=telemetry-wiring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-wiring.d.ts","sourceRoot":"","sources":["../src/telemetry-wiring.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,UAAU,oBAAoB;IAC5B,SAAS,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACjH;AAED,UAAU,cAAc;IACtB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;CAC5D;AAED,UAAU,iBAAiB;IACzB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CACzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,oBAAoB,EAC7B,aAAa,CAAC,EAAE,iBAAiB,GAChC,IAAI,CA0BN"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Wire job queue events to telemetry tracker.
3
+ *
4
+ * Listens to job:completed, job:failed, job:dead events and records
5
+ * them for operational telemetry and self-improvement loops.
6
+ *
7
+ * When a LearningStoreLike is provided, completed job results are
8
+ * passed through learning extraction so insights can be persisted.
9
+ */
10
+ export function wireTelemetry(emitter, tracker, learningStore) {
11
+ emitter.on('job:completed', (data) => {
12
+ const { job, result } = data;
13
+ const durationMs = (job.completedAt ?? Date.now()) - job.createdAt;
14
+ tracker.recordJob({ type: job.type, success: true, durationMs, jobId: job.id });
15
+ if (learningStore && result != null) {
16
+ const output = typeof result === 'string' ? result : JSON.stringify(result);
17
+ learningStore.extractAndStore(output, job.id, job.type);
18
+ }
19
+ });
20
+ emitter.on('job:failed', (data) => {
21
+ const { job, error } = data;
22
+ const durationMs = (job.completedAt ?? Date.now()) - job.createdAt;
23
+ tracker.recordJob({ type: job.type, success: false, durationMs, jobId: job.id, error: error?.message });
24
+ });
25
+ emitter.on('job:dead', (data) => {
26
+ const { job, error } = data;
27
+ const durationMs = (job.completedAt ?? Date.now()) - job.createdAt;
28
+ tracker.recordJob({ type: job.type, success: false, durationMs, jobId: job.id, error: error?.message ?? 'dead letter' });
29
+ });
30
+ }
31
+ //# sourceMappingURL=telemetry-wiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-wiring.js","sourceRoot":"","sources":["../src/telemetry-wiring.ts"],"names":[],"mappings":"AAaA;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAuB,EACvB,OAA6B,EAC7B,aAAiC;IAEjC,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,IAAa,EAAE,EAAE;QAC5C,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAGvB,CAAC;QACF,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC;QACnE,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAEhF,IAAI,aAAa,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC5E,aAAa,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,IAAa,EAAE,EAAE;QACzC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAqG,CAAC;QAC7H,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC;QACnE,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1G,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,IAAa,EAAE,EAAE;QACvC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAqG,CAAC;QAC7H,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC;QACnE,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,CAAC,CAAC;IAC3H,CAAC,CAAC,CAAC;AACL,CAAC"}