@qodo/sdk 0.7.0 → 0.8.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 (148) hide show
  1. package/.claude/skills/qodo-agent/SKILL.md +233 -3
  2. package/.claude/skills/qodo-agent/assets/programmatic-agent.ts +74 -1
  3. package/.claude/skills/qodo-agent/references/common-issues.md +79 -0
  4. package/dist/api/agent.d.ts.map +1 -1
  5. package/dist/api/agent.js +13 -8
  6. package/dist/api/agent.js.map +1 -1
  7. package/dist/api/http.d.ts.map +1 -1
  8. package/dist/api/http.js +5 -2
  9. package/dist/api/http.js.map +1 -1
  10. package/dist/api/websocket.d.ts.map +1 -1
  11. package/dist/api/websocket.js +6 -3
  12. package/dist/api/websocket.js.map +1 -1
  13. package/dist/auth/index.d.ts +18 -0
  14. package/dist/auth/index.d.ts.map +1 -1
  15. package/dist/auth/index.js +69 -10
  16. package/dist/auth/index.js.map +1 -1
  17. package/dist/context/messageManager.d.ts +1 -1
  18. package/dist/context/messageManager.d.ts.map +1 -1
  19. package/dist/context/messageManager.js +1 -1
  20. package/dist/context/messageManager.js.map +1 -1
  21. package/dist/index.d.ts +21 -2
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +18 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/mcp/MCPManager.js +2 -2
  26. package/dist/mcp/MCPManager.js.map +1 -1
  27. package/dist/mcp/baseServer.js +1 -1
  28. package/dist/mcp/baseServer.js.map +1 -1
  29. package/dist/mcp/servers/ripgrep.d.ts.map +1 -1
  30. package/dist/mcp/servers/ripgrep.js +6 -2
  31. package/dist/mcp/servers/ripgrep.js.map +1 -1
  32. package/dist/mcp/servers/shell.js +1 -1
  33. package/dist/mcp/servers/shell.js.map +1 -1
  34. package/dist/mcp/serversRegistry.d.ts.map +1 -1
  35. package/dist/mcp/serversRegistry.js +7 -1
  36. package/dist/mcp/serversRegistry.js.map +1 -1
  37. package/dist/mcp/toolProcessor.d.ts +44 -4
  38. package/dist/mcp/toolProcessor.d.ts.map +1 -1
  39. package/dist/mcp/toolProcessor.js +255 -20
  40. package/dist/mcp/toolProcessor.js.map +1 -1
  41. package/dist/messages/index.d.ts +8 -0
  42. package/dist/messages/index.d.ts.map +1 -0
  43. package/dist/messages/index.js +7 -0
  44. package/dist/messages/index.js.map +1 -0
  45. package/dist/messages/openai.d.ts +26 -0
  46. package/dist/messages/openai.d.ts.map +1 -0
  47. package/dist/messages/openai.js +55 -0
  48. package/dist/messages/openai.js.map +1 -0
  49. package/dist/messages/types.d.ts +73 -0
  50. package/dist/messages/types.d.ts.map +1 -0
  51. package/dist/messages/types.js +78 -0
  52. package/dist/messages/types.js.map +1 -0
  53. package/dist/parser/index.js +3 -3
  54. package/dist/parser/index.js.map +1 -1
  55. package/dist/sdk/QodoSDK.d.ts +30 -10
  56. package/dist/sdk/QodoSDK.d.ts.map +1 -1
  57. package/dist/sdk/QodoSDK.js +165 -33
  58. package/dist/sdk/QodoSDK.js.map +1 -1
  59. package/dist/sdk/artifacts.d.ts +156 -0
  60. package/dist/sdk/artifacts.d.ts.map +1 -0
  61. package/dist/sdk/artifacts.js +166 -0
  62. package/dist/sdk/artifacts.js.map +1 -0
  63. package/dist/sdk/bootstrap.d.ts.map +1 -1
  64. package/dist/sdk/bootstrap.js +11 -4
  65. package/dist/sdk/bootstrap.js.map +1 -1
  66. package/dist/sdk/discovery.js +1 -1
  67. package/dist/sdk/discovery.js.map +1 -1
  68. package/dist/sdk/events.d.ts +46 -1
  69. package/dist/sdk/events.d.ts.map +1 -1
  70. package/dist/sdk/events.js +6 -0
  71. package/dist/sdk/events.js.map +1 -1
  72. package/dist/sdk/middleware.d.ts +59 -0
  73. package/dist/sdk/middleware.d.ts.map +1 -0
  74. package/dist/sdk/middleware.js +69 -0
  75. package/dist/sdk/middleware.js.map +1 -0
  76. package/dist/sdk/pipeline/PipelineBuilder.d.ts +61 -0
  77. package/dist/sdk/pipeline/PipelineBuilder.d.ts.map +1 -0
  78. package/dist/sdk/pipeline/PipelineBuilder.js +91 -0
  79. package/dist/sdk/pipeline/PipelineBuilder.js.map +1 -0
  80. package/dist/sdk/pipeline/PipelineRunner.d.ts +28 -0
  81. package/dist/sdk/pipeline/PipelineRunner.d.ts.map +1 -0
  82. package/dist/sdk/pipeline/PipelineRunner.js +210 -0
  83. package/dist/sdk/pipeline/PipelineRunner.js.map +1 -0
  84. package/dist/sdk/pipeline/compiler.d.ts +24 -0
  85. package/dist/sdk/pipeline/compiler.d.ts.map +1 -0
  86. package/dist/sdk/pipeline/compiler.js +197 -0
  87. package/dist/sdk/pipeline/compiler.js.map +1 -0
  88. package/dist/sdk/pipeline/declarative.d.ts +34 -0
  89. package/dist/sdk/pipeline/declarative.d.ts.map +1 -0
  90. package/dist/sdk/pipeline/declarative.js +9 -0
  91. package/dist/sdk/pipeline/declarative.js.map +1 -0
  92. package/dist/sdk/pipeline/index.d.ts +20 -0
  93. package/dist/sdk/pipeline/index.d.ts.map +1 -0
  94. package/dist/sdk/pipeline/index.js +19 -0
  95. package/dist/sdk/pipeline/index.js.map +1 -0
  96. package/dist/sdk/pipeline/types.d.ts +75 -0
  97. package/dist/sdk/pipeline/types.d.ts.map +1 -0
  98. package/dist/sdk/pipeline/types.js +10 -0
  99. package/dist/sdk/pipeline/types.js.map +1 -0
  100. package/dist/sdk/policies.d.ts +163 -0
  101. package/dist/sdk/policies.d.ts.map +1 -0
  102. package/dist/sdk/policies.js +243 -0
  103. package/dist/sdk/policies.js.map +1 -0
  104. package/dist/sdk/runner/AgentRunner.js +5 -5
  105. package/dist/sdk/runner/AgentRunner.js.map +1 -1
  106. package/dist/sdk/runner/finalize.d.ts +47 -0
  107. package/dist/sdk/runner/finalize.d.ts.map +1 -1
  108. package/dist/sdk/runner/finalize.js +42 -2
  109. package/dist/sdk/runner/finalize.js.map +1 -1
  110. package/dist/sdk/runner/formats.d.ts +1 -1
  111. package/dist/sdk/runner/formats.d.ts.map +1 -1
  112. package/dist/sdk/runner/formats.js +22 -37
  113. package/dist/sdk/runner/formats.js.map +1 -1
  114. package/dist/sdk/runner/progress.d.ts +1 -1
  115. package/dist/sdk/runner/progress.d.ts.map +1 -1
  116. package/dist/sdk/runner/progress.js +1 -1
  117. package/dist/sdk/runner/progress.js.map +1 -1
  118. package/dist/session/SessionContext.d.ts +1 -0
  119. package/dist/session/SessionContext.d.ts.map +1 -1
  120. package/dist/session/SessionContext.js +3 -0
  121. package/dist/session/SessionContext.js.map +1 -1
  122. package/dist/session/environment.d.ts +16 -6
  123. package/dist/session/environment.d.ts.map +1 -1
  124. package/dist/session/environment.js.map +1 -1
  125. package/dist/session/serverData.d.ts.map +1 -1
  126. package/dist/session/serverData.js +21 -3
  127. package/dist/session/serverData.js.map +1 -1
  128. package/dist/tracing/PipelineTracer.d.ts +37 -0
  129. package/dist/tracing/PipelineTracer.d.ts.map +1 -0
  130. package/dist/tracing/PipelineTracer.js +64 -0
  131. package/dist/tracing/PipelineTracer.js.map +1 -0
  132. package/dist/tracing/SdkTracer.d.ts +91 -0
  133. package/dist/tracing/SdkTracer.d.ts.map +1 -0
  134. package/dist/tracing/SdkTracer.js +243 -0
  135. package/dist/tracing/SdkTracer.js.map +1 -0
  136. package/dist/tracing/index.d.ts +6 -0
  137. package/dist/tracing/index.d.ts.map +1 -0
  138. package/dist/tracing/index.js +3 -0
  139. package/dist/tracing/index.js.map +1 -0
  140. package/dist/tracing/pipelineHelpers.d.ts +20 -0
  141. package/dist/tracing/pipelineHelpers.d.ts.map +1 -0
  142. package/dist/tracing/pipelineHelpers.js +140 -0
  143. package/dist/tracing/pipelineHelpers.js.map +1 -0
  144. package/dist/tracing/types.d.ts +46 -0
  145. package/dist/tracing/types.d.ts.map +1 -0
  146. package/dist/tracing/types.js +9 -0
  147. package/dist/tracing/types.js.map +1 -0
  148. package/package.json +10 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineTracer.d.ts","sourceRoot":"","sources":["../../src/tracing/PipelineTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAuC,MAAM,mBAAmB,CAAC;AACtF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAW,MAAM,0BAA0B,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAyB,MAAM,YAAY,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CAC5D;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAChH,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,EACjC,YAAY,EAAE,KAAK,EACnB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAkDjC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Pipeline-level tracing adapter.
3
+ *
4
+ * Creates a parent span for the entire pipeline execution, with
5
+ * child spans for each step (sequential or parallel). Tool-level
6
+ * spans from SdkTracer nest inside the step spans automatically
7
+ * when using OTel context propagation.
8
+ *
9
+ * Usage:
10
+ *
11
+ * import * as otel from '@opentelemetry/api';
12
+ * import { createSdkTracer, tracePipeline } from '@qodo/sdk';
13
+ *
14
+ * const result = await tracePipeline(otel, sdk, pipeline, initialState);
15
+ */
16
+ /**
17
+ * Execute a pipeline with OTel tracing.
18
+ *
19
+ * Creates a root span for the pipeline, and child spans for each step.
20
+ * This is a convenience wrapper around runPipeline that adds tracing.
21
+ */
22
+ export async function tracePipeline(otel, sdk, pipeline, initialState, options) {
23
+ // Lazy import to avoid circular dependency
24
+ const { runPipeline: runPipelineFn } = await import('../sdk/pipeline/PipelineRunner.js');
25
+ const { isParallelGroup, executeStepWithTracing, executeParallelGroupWithTracing } = await import('./pipelineHelpers.js');
26
+ const tracer = otel.trace.getTracer(options?.tracerName ?? '@qodo/sdk');
27
+ const rootSpan = tracer.startSpan('qodo.pipeline', {
28
+ attributes: {
29
+ 'qodo.pipeline.step_count': pipeline.entries.length,
30
+ ...(options?.rootAttributes ?? {}),
31
+ },
32
+ });
33
+ const rootContext = otel.trace.setSpan(otel.context.active(), rootSpan);
34
+ try {
35
+ // State starts as TInit and accumulates step outputs to become TState at runtime
36
+ let state = { ...initialState };
37
+ const stepLogs = [];
38
+ for (const entry of pipeline.entries) {
39
+ if (isParallelGroup(entry)) {
40
+ const { newState, logs } = await executeParallelGroupWithTracing(otel, tracer, rootContext, sdk, entry, state);
41
+ state = { ...state, ...newState };
42
+ stepLogs.push(...logs);
43
+ }
44
+ else {
45
+ const { newState, log } = await executeStepWithTracing(otel, tracer, rootContext, sdk, entry, state);
46
+ state = { ...state, ...newState };
47
+ stepLogs.push(log);
48
+ }
49
+ }
50
+ rootSpan.setAttribute('qodo.pipeline.success', true);
51
+ rootSpan.setStatus({ code: otel.SpanStatusCode.OK });
52
+ rootSpan.end();
53
+ return { state, steps: stepLogs };
54
+ }
55
+ catch (err) {
56
+ rootSpan.setAttribute('qodo.pipeline.success', false);
57
+ const message = err instanceof Error ? err.message : String(err);
58
+ rootSpan.setStatus({ code: otel.SpanStatusCode.ERROR, message });
59
+ rootSpan.recordException(err instanceof Error ? err : new Error(message));
60
+ rootSpan.end();
61
+ throw err;
62
+ }
63
+ }
64
+ //# sourceMappingURL=PipelineTracer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineTracer.js","sourceRoot":"","sources":["../../src/tracing/PipelineTracer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * OpenTelemetry tracing adapter for @qodo/sdk.
3
+ *
4
+ * Consumes the SDK event stream and produces OTel spans:
5
+ *
6
+ * - One root span per sdk.run() / pipeline execution
7
+ * - Child spans per tool call (ToolRequested -> ToolExecuted)
8
+ * - Error recording on sdk.error and tool failures
9
+ * - Span attributes: tool_name, server_name, approved, dry_run, model, etc.
10
+ *
11
+ * Usage:
12
+ *
13
+ * import * as otel from '@opentelemetry/api';
14
+ * import { createSdkTracer } from '@qodo/sdk';
15
+ *
16
+ * const tracer = createSdkTracer(otel);
17
+ *
18
+ * for await (const ev of sdk.stream('review')) {
19
+ * tracer.onEvent(ev);
20
+ * }
21
+ * // Or use the stream wrapper:
22
+ * for await (const ev of tracer.wrapStream(sdk.stream('review'))) {
23
+ * // events pass through unchanged
24
+ * }
25
+ */
26
+ import type { QodoSdkEvent } from '../sdk/events.js';
27
+ import type { OTelAPI } from './types.js';
28
+ export interface SdkTracerOptions {
29
+ /**
30
+ * Custom tracer name (default: '@qodo/sdk').
31
+ */
32
+ tracerName?: string;
33
+ /**
34
+ * Tracer version (default: SDK version from events).
35
+ */
36
+ tracerVersion?: string;
37
+ /**
38
+ * Additional attributes to add to every root span.
39
+ */
40
+ rootAttributes?: Record<string, string | number | boolean>;
41
+ }
42
+ /**
43
+ * Stateful tracing adapter. Tracks in-flight spans by run_id and tool_call_id.
44
+ */
45
+ export declare class SdkTracer {
46
+ private readonly otel;
47
+ private readonly tracer;
48
+ private readonly rootAttributes;
49
+ private readonly runSpans;
50
+ private readonly toolSpans;
51
+ constructor(otel: OTelAPI, options?: SdkTracerOptions);
52
+ /**
53
+ * Process a single SDK event and update tracing state.
54
+ *
55
+ * Call this for each event from sdk.stream() or as an event handler.
56
+ */
57
+ onEvent(ev: QodoSdkEvent): void;
58
+ /**
59
+ * Wrap an async generator, processing each event for tracing and yielding it unchanged.
60
+ *
61
+ * This is the recommended way to integrate tracing with sdk.stream():
62
+ *
63
+ * for await (const ev of tracer.wrapStream(sdk.stream('cmd'))) {
64
+ * // process events as usual
65
+ * }
66
+ */
67
+ wrapStream(stream: AsyncGenerator<QodoSdkEvent, void, unknown>): AsyncGenerator<QodoSdkEvent, void, unknown>;
68
+ /**
69
+ * End all in-flight spans. Call this if you need to force-close tracing
70
+ * (e.g., on process exit or error recovery).
71
+ */
72
+ flush(): void;
73
+ private onRunStarted;
74
+ private onToolRequested;
75
+ private onToolApproved;
76
+ private onToolExecuted;
77
+ private onError;
78
+ private onFinal;
79
+ }
80
+ /**
81
+ * Factory function to create an SdkTracer.
82
+ *
83
+ * Usage:
84
+ * import * as otel from '@opentelemetry/api';
85
+ * import { createSdkTracer } from '@qodo/sdk';
86
+ *
87
+ * const tracer = createSdkTracer(otel);
88
+ * for await (const ev of tracer.wrapStream(sdk.stream('review'))) { ... }
89
+ */
90
+ export declare function createSdkTracer(otel: OTelAPI, options?: SdkTracerOptions): SdkTracer;
91
+ //# sourceMappingURL=SdkTracer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SdkTracer.d.ts","sourceRoot":"","sources":["../../src/tracing/SdkTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAqC,MAAM,YAAY,CAAC;AAI7E,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CAC5D;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAU;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4C;IAG3E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+D;IAGxF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;gBAE7C,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,gBAAgB;IASrD;;;;OAIG;IACH,OAAO,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAwB/B;;;;;;;;OAQG;IACI,UAAU,CACf,MAAM,EAAE,cAAc,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,GAClD,cAAc,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC;IAY9C;;;OAGG;IACH,KAAK,IAAI,IAAI;IAkBb,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,OAAO;CAgChB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAEpF"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * OpenTelemetry tracing adapter for @qodo/sdk.
3
+ *
4
+ * Consumes the SDK event stream and produces OTel spans:
5
+ *
6
+ * - One root span per sdk.run() / pipeline execution
7
+ * - Child spans per tool call (ToolRequested -> ToolExecuted)
8
+ * - Error recording on sdk.error and tool failures
9
+ * - Span attributes: tool_name, server_name, approved, dry_run, model, etc.
10
+ *
11
+ * Usage:
12
+ *
13
+ * import * as otel from '@opentelemetry/api';
14
+ * import { createSdkTracer } from '@qodo/sdk';
15
+ *
16
+ * const tracer = createSdkTracer(otel);
17
+ *
18
+ * for await (const ev of sdk.stream('review')) {
19
+ * tracer.onEvent(ev);
20
+ * }
21
+ * // Or use the stream wrapper:
22
+ * for await (const ev of tracer.wrapStream(sdk.stream('review'))) {
23
+ * // events pass through unchanged
24
+ * }
25
+ */
26
+ import { SdkEventType } from '../sdk/events.js';
27
+ const TRACER_NAME = '@qodo/sdk';
28
+ /**
29
+ * Stateful tracing adapter. Tracks in-flight spans by run_id and tool_call_id.
30
+ */
31
+ export class SdkTracer {
32
+ otel;
33
+ tracer;
34
+ rootAttributes;
35
+ // Active root spans keyed by run_id
36
+ runSpans = new Map();
37
+ // Active tool spans keyed by `${run_id}:${tool_call_id}`
38
+ toolSpans = new Map();
39
+ constructor(otel, options) {
40
+ this.otel = otel;
41
+ this.tracer = otel.trace.getTracer(options?.tracerName ?? TRACER_NAME, options?.tracerVersion);
42
+ this.rootAttributes = options?.rootAttributes ?? {};
43
+ }
44
+ /**
45
+ * Process a single SDK event and update tracing state.
46
+ *
47
+ * Call this for each event from sdk.stream() or as an event handler.
48
+ */
49
+ onEvent(ev) {
50
+ switch (ev.type) {
51
+ case SdkEventType.RunStarted:
52
+ this.onRunStarted(ev);
53
+ break;
54
+ case SdkEventType.ToolRequested:
55
+ this.onToolRequested(ev);
56
+ break;
57
+ case SdkEventType.ToolApproved:
58
+ this.onToolApproved(ev);
59
+ break;
60
+ case SdkEventType.ToolExecuted:
61
+ this.onToolExecuted(ev);
62
+ break;
63
+ case SdkEventType.Error:
64
+ this.onError(ev);
65
+ break;
66
+ case SdkEventType.Final:
67
+ this.onFinal(ev);
68
+ break;
69
+ // Init, MessageDelta, MessageFull, Progress: no tracing action needed
70
+ }
71
+ }
72
+ /**
73
+ * Wrap an async generator, processing each event for tracing and yielding it unchanged.
74
+ *
75
+ * This is the recommended way to integrate tracing with sdk.stream():
76
+ *
77
+ * for await (const ev of tracer.wrapStream(sdk.stream('cmd'))) {
78
+ * // process events as usual
79
+ * }
80
+ */
81
+ async *wrapStream(stream) {
82
+ try {
83
+ for await (const ev of stream) {
84
+ this.onEvent(ev);
85
+ yield ev;
86
+ }
87
+ }
88
+ finally {
89
+ // Ensure any orphaned spans are cleaned up
90
+ this.flush();
91
+ }
92
+ }
93
+ /**
94
+ * End all in-flight spans. Call this if you need to force-close tracing
95
+ * (e.g., on process exit or error recovery).
96
+ */
97
+ flush() {
98
+ for (const span of this.toolSpans.values()) {
99
+ span.setStatus({ code: this.otel.SpanStatusCode.ERROR, message: 'orphaned' });
100
+ span.end();
101
+ }
102
+ this.toolSpans.clear();
103
+ for (const { span } of this.runSpans.values()) {
104
+ span.setStatus({ code: this.otel.SpanStatusCode.ERROR, message: 'orphaned' });
105
+ span.end();
106
+ }
107
+ this.runSpans.clear();
108
+ }
109
+ // ---------------------------------------------------------------------------
110
+ // Event handlers
111
+ // ---------------------------------------------------------------------------
112
+ onRunStarted(ev) {
113
+ const attrs = {
114
+ 'qodo.run_id': ev.run_id,
115
+ 'qodo.session_id': ev.session_id,
116
+ 'qodo.command': ev.data.command || '(prompt)',
117
+ 'qodo.prompt_mode': ev.data.prompt_mode,
118
+ 'qodo.tools_auto_approved': ev.data.tools_auto_approved,
119
+ 'qodo.cwd': ev.data.cwd,
120
+ 'qodo.agent.source': ev.data.agent.source,
121
+ ...this.rootAttributes,
122
+ };
123
+ if (ev.data.agent.path) {
124
+ attrs['qodo.agent.path'] = ev.data.agent.path;
125
+ }
126
+ if (ev.data.dry_run) {
127
+ attrs['qodo.dry_run'] = true;
128
+ }
129
+ const span = this.tracer.startSpan(`qodo.run ${ev.data.command || 'prompt'}`, {
130
+ attributes: attrs,
131
+ startTime: ev.timestamp,
132
+ });
133
+ const context = this.otel.trace.setSpan(this.otel.context.active(), span);
134
+ this.runSpans.set(ev.run_id, { span, context });
135
+ }
136
+ onToolRequested(ev) {
137
+ const parentCtx = this.runSpans.get(ev.run_id);
138
+ const toolKey = `${ev.run_id}:${ev.data.tool_call_id}`;
139
+ const attrs = {
140
+ 'qodo.tool.call_id': ev.data.tool_call_id,
141
+ 'qodo.tool.server_name': ev.data.server_name,
142
+ 'qodo.tool.name': ev.data.tool_name,
143
+ 'qodo.tool.pending_approval': ev.data.pending_approval,
144
+ };
145
+ if (ev.data.reasoning) {
146
+ // Truncate reasoning to avoid huge span attributes
147
+ attrs['qodo.tool.reasoning'] = ev.data.reasoning.slice(0, 500);
148
+ }
149
+ const span = this.tracer.startSpan(`tool ${ev.data.server_name}/${ev.data.tool_name}`, { attributes: attrs, startTime: ev.timestamp }, parentCtx?.context);
150
+ this.toolSpans.set(toolKey, span);
151
+ }
152
+ onToolApproved(ev) {
153
+ const toolKey = `${ev.run_id}:${ev.data.tool_call_id}`;
154
+ const span = this.toolSpans.get(toolKey);
155
+ if (!span)
156
+ return;
157
+ span.setAttribute('qodo.tool.approved', ev.data.approved);
158
+ if (ev.data.reason) {
159
+ span.setAttribute('qodo.tool.approval_reason', ev.data.reason);
160
+ }
161
+ // If not approved, end the span immediately
162
+ if (!ev.data.approved) {
163
+ span.setStatus({ code: this.otel.SpanStatusCode.OK, message: 'declined' });
164
+ span.end(ev.timestamp);
165
+ this.toolSpans.delete(toolKey);
166
+ }
167
+ }
168
+ onToolExecuted(ev) {
169
+ const toolKey = `${ev.run_id}:${ev.data.tool_call_id}`;
170
+ const span = this.toolSpans.get(toolKey);
171
+ if (!span)
172
+ return;
173
+ span.setAttribute('qodo.tool.is_error', ev.data.result.isError);
174
+ if (ev.data.dry_run) {
175
+ span.setAttribute('qodo.tool.dry_run', true);
176
+ }
177
+ if (ev.data.result.isError) {
178
+ const errorContent = typeof ev.data.result.content === 'string'
179
+ ? ev.data.result.content
180
+ : JSON.stringify(ev.data.result.content);
181
+ span.setStatus({ code: this.otel.SpanStatusCode.ERROR, message: errorContent.slice(0, 500) });
182
+ span.recordException(errorContent.slice(0, 1000));
183
+ }
184
+ else {
185
+ span.setStatus({ code: this.otel.SpanStatusCode.OK });
186
+ }
187
+ span.end(ev.timestamp);
188
+ this.toolSpans.delete(toolKey);
189
+ }
190
+ onError(ev) {
191
+ const runEntry = this.runSpans.get(ev.run_id);
192
+ if (!runEntry)
193
+ return;
194
+ runEntry.span.recordException(ev.data.message);
195
+ runEntry.span.addEvent('sdk.error', {
196
+ 'error.message': ev.data.message,
197
+ });
198
+ }
199
+ onFinal(ev) {
200
+ const runEntry = this.runSpans.get(ev.run_id);
201
+ if (!runEntry)
202
+ return;
203
+ const { span } = runEntry;
204
+ span.setAttribute('qodo.success', ev.data.success);
205
+ if (ev.data.model) {
206
+ span.setAttribute('qodo.model', ev.data.model);
207
+ }
208
+ if (ev.data.meta?.timed_out) {
209
+ span.setAttribute('qodo.timed_out', true);
210
+ }
211
+ if (ev.data.meta?.dry_run) {
212
+ span.setAttribute('qodo.dry_run', true);
213
+ }
214
+ if (ev.data.success) {
215
+ span.setStatus({ code: this.otel.SpanStatusCode.OK });
216
+ }
217
+ else {
218
+ span.setStatus({
219
+ code: this.otel.SpanStatusCode.ERROR,
220
+ message: ev.data.error || 'run failed',
221
+ });
222
+ if (ev.data.error) {
223
+ span.recordException(ev.data.error);
224
+ }
225
+ }
226
+ span.end(ev.timestamp);
227
+ this.runSpans.delete(ev.run_id);
228
+ }
229
+ }
230
+ /**
231
+ * Factory function to create an SdkTracer.
232
+ *
233
+ * Usage:
234
+ * import * as otel from '@opentelemetry/api';
235
+ * import { createSdkTracer } from '@qodo/sdk';
236
+ *
237
+ * const tracer = createSdkTracer(otel);
238
+ * for await (const ev of tracer.wrapStream(sdk.stream('review'))) { ... }
239
+ */
240
+ export function createSdkTracer(otel, options) {
241
+ return new SdkTracer(otel, options);
242
+ }
243
+ //# sourceMappingURL=SdkTracer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SdkTracer.js","sourceRoot":"","sources":["../../src/tracing/SdkTracer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { SdkTracer, createSdkTracer } from './SdkTracer.js';
2
+ export type { SdkTracerOptions } from './SdkTracer.js';
3
+ export { tracePipeline } from './PipelineTracer.js';
4
+ export type { TracePipelineOptions } from './PipelineTracer.js';
5
+ export type { OTelAPI, OTelSpan, OTelTracer, OTelContext, OTelContextAPI, OTelTraceAPI } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { SdkTracer, createSdkTracer } from './SdkTracer.js';
2
+ export { tracePipeline } from './PipelineTracer.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Internal helpers for pipeline tracing.
3
+ *
4
+ * Separated from PipelineTracer to keep the main file focused on the
5
+ * public API and to allow independent testing.
6
+ */
7
+ import type { QodoSDK } from '../sdk/QodoSDK.js';
8
+ import type { PipelineStep, ParallelGroup, StepLog } from '../sdk/pipeline/types.js';
9
+ import type { PipelineEntry } from '../sdk/pipeline/types.js';
10
+ import type { OTelAPI, OTelTracer, OTelContext } from './types.js';
11
+ export declare function isParallelGroup<T>(entry: PipelineEntry<T>): entry is ParallelGroup<T>;
12
+ export declare function executeStepWithTracing<TState extends Record<string, any>>(otel: OTelAPI, tracer: OTelTracer, parentContext: OTelContext, sdk: QodoSDK, step: PipelineStep<TState>, state: TState): Promise<{
13
+ newState: Record<string, any>;
14
+ log: StepLog;
15
+ }>;
16
+ export declare function executeParallelGroupWithTracing<TState extends Record<string, any>>(otel: OTelAPI, tracer: OTelTracer, parentContext: OTelContext, sdk: QodoSDK, group: ParallelGroup<TState>, state: TState): Promise<{
17
+ newState: Record<string, any>;
18
+ logs: StepLog[];
19
+ }>;
20
+ //# sourceMappingURL=pipelineHelpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipelineHelpers.d.ts","sourceRoot":"","sources":["../../src/tracing/pipelineHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAuC,MAAM,mBAAmB,CAAC;AACtF,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAe,MAAM,0BAA0B,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAY,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE7E,wBAAgB,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC,CAErF;AAED,wBAAsB,sBAAsB,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7E,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,WAAW,EAC1B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC,CAsG1D;AAED,wBAAsB,+BAA+B,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtF,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,WAAW,EAC1B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAC5B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,CAAC,CAiD7D"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Internal helpers for pipeline tracing.
3
+ *
4
+ * Separated from PipelineTracer to keep the main file focused on the
5
+ * public API and to allow independent testing.
6
+ */
7
+ export function isParallelGroup(entry) {
8
+ return entry.kind === 'parallel';
9
+ }
10
+ export async function executeStepWithTracing(otel, tracer, parentContext, sdk, step, state) {
11
+ const stepSpan = tracer.startSpan(`qodo.pipeline.step ${step.name}`, {
12
+ attributes: {
13
+ 'qodo.pipeline.step.name': step.name,
14
+ 'qodo.pipeline.step.has_gate': !!step.gate,
15
+ },
16
+ }, parentContext);
17
+ const start = Date.now();
18
+ // Evaluate gate
19
+ if (step.gate) {
20
+ let pass;
21
+ try {
22
+ pass = await step.gate(state);
23
+ }
24
+ catch {
25
+ pass = false;
26
+ }
27
+ if (!pass) {
28
+ stepSpan.setAttribute('qodo.pipeline.step.status', 'skipped');
29
+ stepSpan.setAttribute('qodo.pipeline.step.skip_reason', 'gate');
30
+ stepSpan.setStatus({ code: otel.SpanStatusCode.OK, message: 'skipped by gate' });
31
+ stepSpan.end();
32
+ return {
33
+ newState: {},
34
+ log: { name: step.name, status: 'skipped', durationMs: Date.now() - start },
35
+ };
36
+ }
37
+ }
38
+ const ctx = {
39
+ state,
40
+ run: (commandOrPrompt, options) => {
41
+ return sdk.run(commandOrPrompt, options);
42
+ },
43
+ stepName: step.name,
44
+ };
45
+ try {
46
+ const output = await step.fn(ctx);
47
+ const durationMs = Date.now() - start;
48
+ stepSpan.setAttribute('qodo.pipeline.step.status', 'completed');
49
+ stepSpan.setAttribute('qodo.pipeline.step.duration_ms', durationMs);
50
+ stepSpan.setStatus({ code: otel.SpanStatusCode.OK });
51
+ stepSpan.end();
52
+ return {
53
+ newState: output ?? {},
54
+ log: { name: step.name, status: 'completed', durationMs },
55
+ };
56
+ }
57
+ catch (err) {
58
+ const error = err instanceof Error ? err : new Error(String(err));
59
+ const durationMs = Date.now() - start;
60
+ if (step.onError === 'skip') {
61
+ stepSpan.setAttribute('qodo.pipeline.step.status', 'skipped');
62
+ stepSpan.setAttribute('qodo.pipeline.step.skip_reason', 'error');
63
+ stepSpan.addEvent('step.error.skipped', { 'error.message': error.message });
64
+ stepSpan.setStatus({ code: otel.SpanStatusCode.OK, message: 'error skipped' });
65
+ stepSpan.end();
66
+ return {
67
+ newState: {},
68
+ log: { name: step.name, status: 'skipped', durationMs, error: error.message },
69
+ };
70
+ }
71
+ if (typeof step.onError === 'function') {
72
+ try {
73
+ const recovered = await step.onError(error, state);
74
+ stepSpan.setAttribute('qodo.pipeline.step.status', 'recovered');
75
+ stepSpan.addEvent('step.error.recovered', { 'error.message': error.message });
76
+ stepSpan.setStatus({ code: otel.SpanStatusCode.OK });
77
+ stepSpan.end();
78
+ return {
79
+ newState: recovered ?? {},
80
+ log: { name: step.name, status: 'completed', durationMs: Date.now() - start },
81
+ };
82
+ }
83
+ catch (recoveryErr) {
84
+ stepSpan.setAttribute('qodo.pipeline.step.status', 'error');
85
+ stepSpan.recordException(recoveryErr instanceof Error ? recoveryErr : new Error(String(recoveryErr)));
86
+ stepSpan.setStatus({ code: otel.SpanStatusCode.ERROR, message: 'recovery failed' });
87
+ stepSpan.end();
88
+ const { PipelineExecutionError } = await import('../sdk/pipeline/PipelineRunner.js');
89
+ throw new PipelineExecutionError(`Step "${step.name}" recovery failed: ${recoveryErr?.message || recoveryErr}`, step.name, recoveryErr instanceof Error ? recoveryErr : undefined);
90
+ }
91
+ }
92
+ // 'throw' (default)
93
+ stepSpan.setAttribute('qodo.pipeline.step.status', 'error');
94
+ stepSpan.recordException(error);
95
+ stepSpan.setStatus({ code: otel.SpanStatusCode.ERROR, message: error.message });
96
+ stepSpan.end();
97
+ const { PipelineExecutionError } = await import('../sdk/pipeline/PipelineRunner.js');
98
+ throw new PipelineExecutionError(`Step "${step.name}" failed: ${error.message}`, step.name, error);
99
+ }
100
+ }
101
+ export async function executeParallelGroupWithTracing(otel, tracer, parentContext, sdk, group, state) {
102
+ const groupSpan = tracer.startSpan('qodo.pipeline.parallel', {
103
+ attributes: {
104
+ 'qodo.pipeline.parallel.step_count': group.steps.length,
105
+ 'qodo.pipeline.parallel.step_names': group.steps.map((s) => s.name).join(','),
106
+ },
107
+ }, parentContext);
108
+ const groupContext = otel.trace.setSpan(parentContext, groupSpan);
109
+ try {
110
+ const results = await Promise.allSettled(group.steps.map((step) => executeStepWithTracing(otel, tracer, groupContext, sdk, step, state)));
111
+ let merged = {};
112
+ const logs = [];
113
+ for (let i = 0; i < results.length; i++) {
114
+ const result = results[i];
115
+ if (result.status === 'fulfilled') {
116
+ merged = { ...merged, ...result.value.newState };
117
+ logs.push(result.value.log);
118
+ }
119
+ else {
120
+ const stepName = group.steps[i].name;
121
+ groupSpan.setAttribute('qodo.pipeline.parallel.status', 'error');
122
+ groupSpan.recordException(result.reason instanceof Error ? result.reason : new Error(String(result.reason)));
123
+ groupSpan.setStatus({ code: otel.SpanStatusCode.ERROR, message: `step "${stepName}" failed` });
124
+ groupSpan.end();
125
+ const { PipelineExecutionError } = await import('../sdk/pipeline/PipelineRunner.js');
126
+ throw new PipelineExecutionError(`Parallel step "${stepName}" failed: ${result.reason?.message || result.reason}`, stepName, result.reason instanceof Error ? result.reason : undefined);
127
+ }
128
+ }
129
+ groupSpan.setAttribute('qodo.pipeline.parallel.status', 'completed');
130
+ groupSpan.setStatus({ code: otel.SpanStatusCode.OK });
131
+ groupSpan.end();
132
+ return { newState: merged, logs };
133
+ }
134
+ catch (err) {
135
+ // If the span is already ended by the loop above, this is a no-op
136
+ // but we still need to rethrow
137
+ throw err;
138
+ }
139
+ }
140
+ //# sourceMappingURL=pipelineHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipelineHelpers.js","sourceRoot":"","sources":["../../src/tracing/pipelineHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,UAAU,eAAe,CAAI,KAAuB;IACxD,OAAQ,KAA0B,CAAC,IAAI,KAAK,UAAU,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAa,EACb,MAAkB,EAClB,aAA0B,EAC1B,GAAY,EACZ,IAA0B,EAC1B,KAAa;IAEb,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,sBAAsB,IAAI,CAAC,IAAI,EAAE,EAAE;QACnE,UAAU,EAAE;YACV,yBAAyB,EAAE,IAAI,CAAC,IAAI;YACpC,6BAA6B,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;SAC3C;KACF,EAAE,aAAa,CAAC,CAAC;IAElB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,gBAAgB;IAChB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,QAAQ,CAAC,YAAY,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;YAC9D,QAAQ,CAAC,YAAY,CAAC,gCAAgC,EAAE,MAAM,CAAC,CAAC;YAChE,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACjF,QAAQ,CAAC,GAAG,EAAE,CAAC;YACf,OAAO;gBACL,QAAQ,EAAE,EAAE;gBACZ,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE;aAC5E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAwB;QAC/B,KAAK;QACL,GAAG,EAAE,CAAC,eAAuB,EAAE,OAA2B,EAA6B,EAAE;YACvF,OAAO,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QACD,QAAQ,EAAE,IAAI,CAAC,IAAI;KACpB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACtC,QAAQ,CAAC,YAAY,CAAC,2BAA2B,EAAE,WAAW,CAAC,CAAC;QAChE,QAAQ,CAAC,YAAY,CAAC,gCAAgC,EAAE,UAAU,CAAC,CAAC;QACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC;QACrD,QAAQ,CAAC,GAAG,EAAE,CAAC;QACf,OAAO;YACL,QAAQ,EAAE,MAAM,IAAI,EAAE;YACtB,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE;SAC1D,CAAC;IACJ,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAEtC,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAC5B,QAAQ,CAAC,YAAY,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;YAC9D,QAAQ,CAAC,YAAY,CAAC,gCAAgC,EAAE,OAAO,CAAC,CAAC;YACjE,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5E,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;YAC/E,QAAQ,CAAC,GAAG,EAAE,CAAC;YACf,OAAO;gBACL,QAAQ,EAAE,EAAE;gBACZ,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE;aAC9E,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACnD,QAAQ,CAAC,YAAY,CAAC,2BAA2B,EAAE,WAAW,CAAC,CAAC;gBAChE,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrD,QAAQ,CAAC,GAAG,EAAE,CAAC;gBACf,OAAO;oBACL,QAAQ,EAAE,SAAS,IAAI,EAAE;oBACzB,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE;iBAC9E,CAAC;YACJ,CAAC;YAAC,OAAO,WAAgB,EAAE,CAAC;gBAC1B,QAAQ,CAAC,YAAY,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC;gBAC5D,QAAQ,CAAC,eAAe,CAAC,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBACtG,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;gBACpF,QAAQ,CAAC,GAAG,EAAE,CAAC;gBACf,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;gBACrF,MAAM,IAAI,sBAAsB,CAC9B,SAAS,IAAI,CAAC,IAAI,sBAAsB,WAAW,EAAE,OAAO,IAAI,WAAW,EAAE,EAC7E,IAAI,CAAC,IAAI,EACT,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CACvD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,QAAQ,CAAC,YAAY,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC;QAC5D,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,QAAQ,CAAC,GAAG,EAAE,CAAC;QACf,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;QACrF,MAAM,IAAI,sBAAsB,CAC9B,SAAS,IAAI,CAAC,IAAI,aAAa,KAAK,CAAC,OAAO,EAAE,EAC9C,IAAI,CAAC,IAAI,EACT,KAAK,CACN,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CACnD,IAAa,EACb,MAAkB,EAClB,aAA0B,EAC1B,GAAY,EACZ,KAA4B,EAC5B,KAAa;IAEb,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,wBAAwB,EAAE;QAC3D,UAAU,EAAE;YACV,mCAAmC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;YACvD,mCAAmC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SAC9E;KACF,EAAE,aAAa,CAAC,CAAC;IAElB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAElE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACvB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CACrE,CACF,CAAC;QAEF,IAAI,MAAM,GAAwB,EAAE,CAAC;QACrC,MAAM,IAAI,GAAc,EAAE,CAAC;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACrC,SAAS,CAAC,YAAY,CAAC,+BAA+B,EAAE,OAAO,CAAC,CAAC;gBACjE,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC7G,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,QAAQ,UAAU,EAAE,CAAC,CAAC;gBAC/F,SAAS,CAAC,GAAG,EAAE,CAAC;gBAChB,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;gBACrF,MAAM,IAAI,sBAAsB,CAC9B,kBAAkB,QAAQ,aAAa,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,EAChF,QAAQ,EACR,MAAM,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAC3D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,SAAS,CAAC,YAAY,CAAC,+BAA+B,EAAE,WAAW,CAAC,CAAC;QACrE,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,SAAS,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,kEAAkE;QAClE,+BAA+B;QAC/B,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}