vidpipe 1.2.2 → 1.2.3

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 (161) hide show
  1. package/dist/index.d.ts +2 -2
  2. package/dist/index.js +4766 -123
  3. package/dist/index.js.map +1 -1
  4. package/package.json +4 -2
  5. package/dist/agents/BaseAgent.d.ts +0 -52
  6. package/dist/agents/BaseAgent.d.ts.map +0 -1
  7. package/dist/agents/BaseAgent.js +0 -102
  8. package/dist/agents/BaseAgent.js.map +0 -1
  9. package/dist/agents/BlogAgent.d.ts +0 -3
  10. package/dist/agents/BlogAgent.d.ts.map +0 -1
  11. package/dist/agents/BlogAgent.js +0 -163
  12. package/dist/agents/BlogAgent.js.map +0 -1
  13. package/dist/agents/ChapterAgent.d.ts +0 -11
  14. package/dist/agents/ChapterAgent.d.ts.map +0 -1
  15. package/dist/agents/ChapterAgent.js +0 -191
  16. package/dist/agents/ChapterAgent.js.map +0 -1
  17. package/dist/agents/MediumVideoAgent.d.ts +0 -3
  18. package/dist/agents/MediumVideoAgent.d.ts.map +0 -1
  19. package/dist/agents/MediumVideoAgent.js +0 -219
  20. package/dist/agents/MediumVideoAgent.js.map +0 -1
  21. package/dist/agents/ShortsAgent.d.ts +0 -3
  22. package/dist/agents/ShortsAgent.d.ts.map +0 -1
  23. package/dist/agents/ShortsAgent.js +0 -243
  24. package/dist/agents/ShortsAgent.js.map +0 -1
  25. package/dist/agents/SilenceRemovalAgent.d.ts +0 -9
  26. package/dist/agents/SilenceRemovalAgent.d.ts.map +0 -1
  27. package/dist/agents/SilenceRemovalAgent.js +0 -209
  28. package/dist/agents/SilenceRemovalAgent.js.map +0 -1
  29. package/dist/agents/SocialMediaAgent.d.ts +0 -4
  30. package/dist/agents/SocialMediaAgent.d.ts.map +0 -1
  31. package/dist/agents/SocialMediaAgent.js +0 -248
  32. package/dist/agents/SocialMediaAgent.js.map +0 -1
  33. package/dist/agents/SummaryAgent.d.ts +0 -11
  34. package/dist/agents/SummaryAgent.d.ts.map +0 -1
  35. package/dist/agents/SummaryAgent.js +0 -333
  36. package/dist/agents/SummaryAgent.js.map +0 -1
  37. package/dist/commands/doctor.d.ts +0 -4
  38. package/dist/commands/doctor.d.ts.map +0 -1
  39. package/dist/commands/doctor.js +0 -230
  40. package/dist/commands/doctor.js.map +0 -1
  41. package/dist/config/brand.d.ts +0 -29
  42. package/dist/config/brand.d.ts.map +0 -1
  43. package/dist/config/brand.js +0 -83
  44. package/dist/config/brand.js.map +0 -1
  45. package/dist/config/environment.d.ts +0 -39
  46. package/dist/config/environment.d.ts.map +0 -1
  47. package/dist/config/environment.js +0 -47
  48. package/dist/config/environment.js.map +0 -1
  49. package/dist/config/ffmpegResolver.d.ts +0 -3
  50. package/dist/config/ffmpegResolver.d.ts.map +0 -1
  51. package/dist/config/ffmpegResolver.js +0 -37
  52. package/dist/config/ffmpegResolver.js.map +0 -1
  53. package/dist/config/logger.d.ts +0 -5
  54. package/dist/config/logger.d.ts.map +0 -1
  55. package/dist/config/logger.js +0 -13
  56. package/dist/config/logger.js.map +0 -1
  57. package/dist/config/pricing.d.ts +0 -34
  58. package/dist/config/pricing.d.ts.map +0 -1
  59. package/dist/config/pricing.js +0 -71
  60. package/dist/config/pricing.js.map +0 -1
  61. package/dist/index.d.ts.map +0 -1
  62. package/dist/pipeline.d.ts +0 -57
  63. package/dist/pipeline.d.ts.map +0 -1
  64. package/dist/pipeline.js +0 -324
  65. package/dist/pipeline.js.map +0 -1
  66. package/dist/providers/ClaudeProvider.d.ts +0 -14
  67. package/dist/providers/ClaudeProvider.d.ts.map +0 -1
  68. package/dist/providers/ClaudeProvider.js +0 -182
  69. package/dist/providers/ClaudeProvider.js.map +0 -1
  70. package/dist/providers/CopilotProvider.d.ts +0 -17
  71. package/dist/providers/CopilotProvider.d.ts.map +0 -1
  72. package/dist/providers/CopilotProvider.js +0 -149
  73. package/dist/providers/CopilotProvider.js.map +0 -1
  74. package/dist/providers/OpenAIProvider.d.ts +0 -14
  75. package/dist/providers/OpenAIProvider.d.ts.map +0 -1
  76. package/dist/providers/OpenAIProvider.js +0 -175
  77. package/dist/providers/OpenAIProvider.js.map +0 -1
  78. package/dist/providers/index.d.ts +0 -18
  79. package/dist/providers/index.d.ts.map +0 -1
  80. package/dist/providers/index.js +0 -61
  81. package/dist/providers/index.js.map +0 -1
  82. package/dist/providers/types.d.ts +0 -112
  83. package/dist/providers/types.d.ts.map +0 -1
  84. package/dist/providers/types.js +0 -8
  85. package/dist/providers/types.js.map +0 -1
  86. package/dist/services/captionGeneration.d.ts +0 -7
  87. package/dist/services/captionGeneration.d.ts.map +0 -1
  88. package/dist/services/captionGeneration.js +0 -29
  89. package/dist/services/captionGeneration.js.map +0 -1
  90. package/dist/services/costTracker.d.ts +0 -63
  91. package/dist/services/costTracker.d.ts.map +0 -1
  92. package/dist/services/costTracker.js +0 -137
  93. package/dist/services/costTracker.js.map +0 -1
  94. package/dist/services/fileWatcher.d.ts +0 -19
  95. package/dist/services/fileWatcher.d.ts.map +0 -1
  96. package/dist/services/fileWatcher.js +0 -120
  97. package/dist/services/fileWatcher.js.map +0 -1
  98. package/dist/services/gitOperations.d.ts +0 -3
  99. package/dist/services/gitOperations.d.ts.map +0 -1
  100. package/dist/services/gitOperations.js +0 -43
  101. package/dist/services/gitOperations.js.map +0 -1
  102. package/dist/services/socialPosting.d.ts +0 -38
  103. package/dist/services/socialPosting.d.ts.map +0 -1
  104. package/dist/services/socialPosting.js +0 -102
  105. package/dist/services/socialPosting.js.map +0 -1
  106. package/dist/services/transcription.d.ts +0 -3
  107. package/dist/services/transcription.d.ts.map +0 -1
  108. package/dist/services/transcription.js +0 -100
  109. package/dist/services/transcription.js.map +0 -1
  110. package/dist/services/videoIngestion.d.ts +0 -3
  111. package/dist/services/videoIngestion.d.ts.map +0 -1
  112. package/dist/services/videoIngestion.js +0 -104
  113. package/dist/services/videoIngestion.js.map +0 -1
  114. package/dist/tools/captions/captionGenerator.d.ts +0 -84
  115. package/dist/tools/captions/captionGenerator.d.ts.map +0 -1
  116. package/dist/tools/captions/captionGenerator.js +0 -390
  117. package/dist/tools/captions/captionGenerator.js.map +0 -1
  118. package/dist/tools/ffmpeg/aspectRatio.d.ts +0 -101
  119. package/dist/tools/ffmpeg/aspectRatio.d.ts.map +0 -1
  120. package/dist/tools/ffmpeg/aspectRatio.js +0 -339
  121. package/dist/tools/ffmpeg/aspectRatio.js.map +0 -1
  122. package/dist/tools/ffmpeg/audioExtraction.d.ts +0 -16
  123. package/dist/tools/ffmpeg/audioExtraction.d.ts.map +0 -1
  124. package/dist/tools/ffmpeg/audioExtraction.js +0 -87
  125. package/dist/tools/ffmpeg/audioExtraction.js.map +0 -1
  126. package/dist/tools/ffmpeg/captionBurning.d.ts +0 -8
  127. package/dist/tools/ffmpeg/captionBurning.d.ts.map +0 -1
  128. package/dist/tools/ffmpeg/captionBurning.js +0 -72
  129. package/dist/tools/ffmpeg/captionBurning.js.map +0 -1
  130. package/dist/tools/ffmpeg/clipExtraction.d.ts +0 -38
  131. package/dist/tools/ffmpeg/clipExtraction.d.ts.map +0 -1
  132. package/dist/tools/ffmpeg/clipExtraction.js +0 -215
  133. package/dist/tools/ffmpeg/clipExtraction.js.map +0 -1
  134. package/dist/tools/ffmpeg/faceDetection.d.ts +0 -127
  135. package/dist/tools/ffmpeg/faceDetection.d.ts.map +0 -1
  136. package/dist/tools/ffmpeg/faceDetection.js +0 -501
  137. package/dist/tools/ffmpeg/faceDetection.js.map +0 -1
  138. package/dist/tools/ffmpeg/frameCapture.d.ts +0 -10
  139. package/dist/tools/ffmpeg/frameCapture.d.ts.map +0 -1
  140. package/dist/tools/ffmpeg/frameCapture.js +0 -49
  141. package/dist/tools/ffmpeg/frameCapture.js.map +0 -1
  142. package/dist/tools/ffmpeg/silenceDetection.d.ts +0 -10
  143. package/dist/tools/ffmpeg/silenceDetection.d.ts.map +0 -1
  144. package/dist/tools/ffmpeg/silenceDetection.js +0 -56
  145. package/dist/tools/ffmpeg/silenceDetection.js.map +0 -1
  146. package/dist/tools/ffmpeg/singlePassEdit.d.ts +0 -25
  147. package/dist/tools/ffmpeg/singlePassEdit.d.ts.map +0 -1
  148. package/dist/tools/ffmpeg/singlePassEdit.js +0 -124
  149. package/dist/tools/ffmpeg/singlePassEdit.js.map +0 -1
  150. package/dist/tools/search/exaClient.d.ts +0 -8
  151. package/dist/tools/search/exaClient.d.ts.map +0 -1
  152. package/dist/tools/search/exaClient.js +0 -38
  153. package/dist/tools/search/exaClient.js.map +0 -1
  154. package/dist/tools/whisper/whisperClient.d.ts +0 -3
  155. package/dist/tools/whisper/whisperClient.d.ts.map +0 -1
  156. package/dist/tools/whisper/whisperClient.js +0 -77
  157. package/dist/tools/whisper/whisperClient.js.map +0 -1
  158. package/dist/types/index.d.ts +0 -305
  159. package/dist/types/index.d.ts.map +0 -1
  160. package/dist/types/index.js +0 -44
  161. package/dist/types/index.js.map +0 -1
@@ -1,149 +0,0 @@
1
- /**
2
- * CopilotProvider — wraps @github/copilot-sdk behind the LLMProvider interface.
3
- *
4
- * Extracts the Copilot-specific logic from BaseAgent into a reusable provider
5
- * that can be swapped with OpenAI or Claude providers via the abstraction layer.
6
- */
7
- import { CopilotClient } from '@github/copilot-sdk';
8
- import logger from '../config/logger.js';
9
- const DEFAULT_MODEL = 'Claude Opus 4.6';
10
- const DEFAULT_TIMEOUT_MS = 300_000; // 5 minutes
11
- export class CopilotProvider {
12
- name = 'copilot';
13
- client = null;
14
- isAvailable() {
15
- // Copilot uses GitHub auth, not an API key
16
- return true;
17
- }
18
- getDefaultModel() {
19
- return DEFAULT_MODEL;
20
- }
21
- async createSession(config) {
22
- if (!this.client) {
23
- this.client = new CopilotClient({ autoStart: true, logLevel: 'error' });
24
- }
25
- const copilotSession = await this.client.createSession({
26
- systemMessage: { mode: 'replace', content: config.systemPrompt },
27
- tools: config.tools.map((t) => ({
28
- name: t.name,
29
- description: t.description,
30
- parameters: t.parameters,
31
- handler: t.handler,
32
- })),
33
- streaming: config.streaming ?? true,
34
- });
35
- return new CopilotSessionWrapper(copilotSession, config.timeoutMs ?? DEFAULT_TIMEOUT_MS);
36
- }
37
- /** Tear down the underlying Copilot client. */
38
- async close() {
39
- try {
40
- if (this.client) {
41
- await this.client.stop();
42
- this.client = null;
43
- }
44
- }
45
- catch (err) {
46
- logger.error(`[CopilotProvider] Error during close: ${err}`);
47
- }
48
- }
49
- }
50
- /** Wraps a CopilotSession to satisfy the LLMSession interface. */
51
- class CopilotSessionWrapper {
52
- session;
53
- timeoutMs;
54
- eventHandlers = new Map();
55
- // Latest usage data captured from assistant.usage events
56
- lastUsage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
57
- lastCost;
58
- lastQuotaSnapshots;
59
- constructor(session, timeoutMs) {
60
- this.session = session;
61
- this.timeoutMs = timeoutMs;
62
- this.setupEventForwarding();
63
- this.setupUsageTracking();
64
- }
65
- async sendAndWait(message) {
66
- const start = Date.now();
67
- // Reset usage tracking for this call
68
- this.lastUsage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
69
- this.lastCost = undefined;
70
- this.lastQuotaSnapshots = undefined;
71
- const response = await this.session.sendAndWait({ prompt: message }, this.timeoutMs);
72
- const content = response?.data?.content ?? '';
73
- const toolCalls = []; // Copilot SDK handles tool calls internally
74
- return {
75
- content,
76
- toolCalls,
77
- usage: this.lastUsage,
78
- cost: this.lastCost,
79
- quotaSnapshots: this.lastQuotaSnapshots,
80
- durationMs: Date.now() - start,
81
- };
82
- }
83
- on(event, handler) {
84
- const handlers = this.eventHandlers.get(event) ?? [];
85
- handlers.push(handler);
86
- this.eventHandlers.set(event, handlers);
87
- }
88
- async close() {
89
- await this.session.destroy();
90
- this.eventHandlers.clear();
91
- }
92
- /** Capture assistant.usage events for token/cost tracking. */
93
- setupUsageTracking() {
94
- this.session.on((event) => {
95
- if (event.type === 'assistant.usage') {
96
- const d = event.data;
97
- this.lastUsage = {
98
- inputTokens: d.inputTokens ?? 0,
99
- outputTokens: d.outputTokens ?? 0,
100
- totalTokens: (d.inputTokens ?? 0) + (d.outputTokens ?? 0),
101
- cacheReadTokens: d.cacheReadTokens,
102
- cacheWriteTokens: d.cacheWriteTokens,
103
- };
104
- if (d.cost != null) {
105
- this.lastCost = {
106
- amount: d.cost,
107
- unit: 'premium_requests',
108
- model: d.model ?? DEFAULT_MODEL,
109
- multiplier: d.multiplier,
110
- };
111
- }
112
- if (d.quotaSnapshots != null) {
113
- this.lastQuotaSnapshots = d.quotaSnapshots;
114
- }
115
- }
116
- });
117
- }
118
- /** Forward CopilotSession events to ProviderEvent subscribers. */
119
- setupEventForwarding() {
120
- this.session.on((event) => {
121
- switch (event.type) {
122
- case 'assistant.message_delta':
123
- this.emit('delta', event.data);
124
- break;
125
- case 'tool.execution_start':
126
- this.emit('tool_start', event.data);
127
- break;
128
- case 'tool.execution_complete':
129
- this.emit('tool_end', event.data);
130
- break;
131
- case 'assistant.usage':
132
- this.emit('usage', event.data);
133
- break;
134
- case 'session.error':
135
- this.emit('error', event.data);
136
- break;
137
- }
138
- });
139
- }
140
- emit(type, data) {
141
- const handlers = this.eventHandlers.get(type);
142
- if (handlers) {
143
- for (const handler of handlers) {
144
- handler({ type, data });
145
- }
146
- }
147
- }
148
- }
149
- //# sourceMappingURL=CopilotProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CopilotProvider.js","sourceRoot":"","sources":["../../src/providers/CopilotProvider.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * OpenAI Provider — wraps the OpenAI SDK behind the LLMProvider interface.
3
- *
4
- * Implements chat completions with automatic tool-calling loop:
5
- * user message → LLM → (tool_calls? → execute → feed back → LLM)* → final text
6
- */
7
- import type { LLMProvider, LLMSession, SessionConfig } from './types.js';
8
- export declare class OpenAIProvider implements LLMProvider {
9
- readonly name: "openai";
10
- isAvailable(): boolean;
11
- getDefaultModel(): string;
12
- createSession(config: SessionConfig): Promise<LLMSession>;
13
- }
14
- //# sourceMappingURL=OpenAIProvider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../src/providers/OpenAIProvider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EAEV,aAAa,EAKd,MAAM,YAAY,CAAC;AAkLpB,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAElC,WAAW,IAAI,OAAO;IAItB,eAAe,IAAI,MAAM;IAInB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;CAMhE"}
@@ -1,175 +0,0 @@
1
- /**
2
- * OpenAI Provider — wraps the OpenAI SDK behind the LLMProvider interface.
3
- *
4
- * Implements chat completions with automatic tool-calling loop:
5
- * user message → LLM → (tool_calls? → execute → feed back → LLM)* → final text
6
- */
7
- import OpenAI from 'openai';
8
- import { calculateTokenCost } from '../config/pricing.js';
9
- import logger from '../config/logger.js';
10
- const MAX_TOOL_ROUNDS = 50;
11
- // ── helpers ────────────────────────────────────────────────────────────
12
- /** Convert our ToolWithHandler[] to the OpenAI SDK tool format. */
13
- function toOpenAITools(tools) {
14
- return tools.map((t) => ({
15
- type: 'function',
16
- function: {
17
- name: t.name,
18
- description: t.description,
19
- parameters: t.parameters,
20
- },
21
- }));
22
- }
23
- /** Build a handler lookup map keyed by tool name. */
24
- function buildHandlerMap(tools) {
25
- return new Map(tools.map((t) => [t.name, t.handler]));
26
- }
27
- /** Sum two TokenUsage objects. */
28
- function addUsage(a, b) {
29
- return {
30
- inputTokens: a.inputTokens + b.inputTokens,
31
- outputTokens: a.outputTokens + b.outputTokens,
32
- totalTokens: a.totalTokens + b.totalTokens,
33
- };
34
- }
35
- // ── session ────────────────────────────────────────────────────────────
36
- class OpenAISession {
37
- client;
38
- model;
39
- messages;
40
- tools;
41
- handlers;
42
- listeners = new Map();
43
- timeoutMs;
44
- constructor(client, config, model) {
45
- this.client = client;
46
- this.model = model;
47
- this.messages = [{ role: 'system', content: config.systemPrompt }];
48
- this.tools = toOpenAITools(config.tools);
49
- this.handlers = buildHandlerMap(config.tools);
50
- this.timeoutMs = config.timeoutMs;
51
- }
52
- // ── public API ─────────────────────────────────────────────────────
53
- async sendAndWait(message) {
54
- this.messages.push({ role: 'user', content: message });
55
- let cumulative = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };
56
- const start = Date.now();
57
- // Agent loop: keep calling the LLM until no tool_calls remain
58
- let toolRound = 0;
59
- while (true) {
60
- if (++toolRound > MAX_TOOL_ROUNDS) {
61
- logger.warn(`OpenAI agent exceeded ${MAX_TOOL_ROUNDS} tool rounds — aborting to prevent runaway`);
62
- throw new Error(`Max tool rounds (${MAX_TOOL_ROUNDS}) exceeded — possible infinite loop`);
63
- }
64
- const controller = new AbortController();
65
- const timeoutId = this.timeoutMs
66
- ? setTimeout(() => controller.abort(), this.timeoutMs)
67
- : undefined;
68
- let response;
69
- try {
70
- response = await this.client.chat.completions.create({
71
- model: this.model,
72
- messages: this.messages,
73
- ...(this.tools.length > 0 ? { tools: this.tools } : {}),
74
- }, { signal: controller.signal });
75
- }
76
- finally {
77
- if (timeoutId)
78
- clearTimeout(timeoutId);
79
- }
80
- const choice = response.choices[0];
81
- const assistantMsg = choice.message;
82
- // Accumulate token usage
83
- if (response.usage) {
84
- const iterUsage = {
85
- inputTokens: response.usage.prompt_tokens,
86
- outputTokens: response.usage.completion_tokens,
87
- totalTokens: response.usage.total_tokens,
88
- };
89
- cumulative = addUsage(cumulative, iterUsage);
90
- this.emit('usage', iterUsage);
91
- }
92
- // Add assistant message to history
93
- this.messages.push(assistantMsg);
94
- const toolCalls = assistantMsg.tool_calls;
95
- if (!toolCalls || toolCalls.length === 0) {
96
- // No more tool calls — return final response
97
- const cost = calculateTokenCost(this.model, cumulative.inputTokens, cumulative.outputTokens);
98
- return {
99
- content: assistantMsg.content ?? '',
100
- toolCalls: [],
101
- usage: cumulative,
102
- cost: { amount: cost, unit: 'usd', model: this.model },
103
- durationMs: Date.now() - start,
104
- };
105
- }
106
- // Execute each tool call and feed results back
107
- for (const tc of toolCalls) {
108
- if (tc.type !== 'function')
109
- continue;
110
- const fnName = tc.function.name;
111
- const handler = this.handlers.get(fnName);
112
- let result;
113
- if (!handler) {
114
- logger.warn(`OpenAI requested unknown tool: ${fnName}`);
115
- result = { error: `Unknown tool: ${fnName}` };
116
- }
117
- else {
118
- this.emit('tool_start', { name: fnName, arguments: tc.function.arguments });
119
- try {
120
- const args = JSON.parse(tc.function.arguments);
121
- result = await handler(args);
122
- }
123
- catch (err) {
124
- logger.error(`Tool ${fnName} failed: ${err}`);
125
- result = { error: String(err) };
126
- }
127
- this.emit('tool_end', { name: fnName, result });
128
- }
129
- this.messages.push({
130
- role: 'tool',
131
- tool_call_id: tc.id,
132
- content: typeof result === 'string' ? result : JSON.stringify(result),
133
- });
134
- }
135
- // Loop back to call the LLM again with tool results
136
- }
137
- }
138
- on(event, handler) {
139
- const list = this.listeners.get(event) ?? [];
140
- list.push(handler);
141
- this.listeners.set(event, list);
142
- }
143
- async close() {
144
- this.messages = [];
145
- this.listeners.clear();
146
- }
147
- // ── internals ──────────────────────────────────────────────────────
148
- emit(type, data) {
149
- for (const handler of this.listeners.get(type) ?? []) {
150
- try {
151
- handler({ type, data });
152
- }
153
- catch {
154
- // Don't let listener errors break the agent loop
155
- }
156
- }
157
- }
158
- }
159
- // ── provider ───────────────────────────────────────────────────────────
160
- export class OpenAIProvider {
161
- name = 'openai';
162
- isAvailable() {
163
- return !!process.env.OPENAI_API_KEY;
164
- }
165
- getDefaultModel() {
166
- return 'gpt-4o';
167
- }
168
- async createSession(config) {
169
- const client = new OpenAI(); // reads OPENAI_API_KEY from env
170
- const model = config.model ?? this.getDefaultModel();
171
- logger.info(`OpenAI session created (model=${model}, tools=${config.tools.length})`);
172
- return new OpenAISession(client, config, model);
173
- }
174
- }
175
- //# sourceMappingURL=OpenAIProvider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OpenAIProvider.js","sourceRoot":"","sources":["../../src/providers/OpenAIProvider.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- import type { LLMProvider } from './types.js';
2
- import type { ProviderName } from './types.js';
3
- /**
4
- * Get the configured LLM provider.
5
- * Reads from LLM_PROVIDER env var, defaults to 'copilot'.
6
- * Caches the instance for reuse.
7
- */
8
- export declare function getProvider(name?: ProviderName): LLMProvider;
9
- /** Reset the cached provider (for testing) */
10
- export declare function resetProvider(): Promise<void>;
11
- /** Get the name of the current provider */
12
- export declare function getProviderName(): ProviderName;
13
- export type { LLMProvider, LLMSession, LLMResponse, SessionConfig, ToolWithHandler, TokenUsage, CostInfo, QuotaSnapshot, ProviderEvent, ProviderEventType } from './types.js';
14
- export type { ProviderName } from './types.js';
15
- export { CopilotProvider } from './CopilotProvider.js';
16
- export { OpenAIProvider } from './OpenAIProvider.js';
17
- export { ClaudeProvider } from './ClaudeProvider.js';
18
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAgB/C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG,WAAW,CAkC5D;AAED,8CAA8C;AAC9C,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAInD;AAED,2CAA2C;AAC3C,wBAAgB,eAAe,IAAI,YAAY,CAI9C;AAGD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC9K,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,61 +0,0 @@
1
- import { CopilotProvider } from './CopilotProvider.js';
2
- import { OpenAIProvider } from './OpenAIProvider.js';
3
- import { ClaudeProvider } from './ClaudeProvider.js';
4
- import logger from '../config/logger.js';
5
- const providers = {
6
- copilot: () => new CopilotProvider(),
7
- openai: () => new OpenAIProvider(),
8
- claude: () => new ClaudeProvider(),
9
- };
10
- /** Cached singleton provider instance */
11
- let currentProvider = null;
12
- let currentProviderName = null;
13
- /**
14
- * Get the configured LLM provider.
15
- * Reads from LLM_PROVIDER env var, defaults to 'copilot'.
16
- * Caches the instance for reuse.
17
- */
18
- export function getProvider(name) {
19
- const raw = name ?? (process.env.LLM_PROVIDER || 'copilot').trim().toLowerCase();
20
- const providerName = raw;
21
- if (currentProvider && currentProviderName === providerName) {
22
- return currentProvider;
23
- }
24
- // Close old provider if switching to a different one
25
- currentProvider?.close?.().catch(() => { });
26
- if (!providers[providerName]) {
27
- throw new Error(`Unknown LLM provider: "${providerName}". ` +
28
- `Valid options: ${Object.keys(providers).join(', ')}`);
29
- }
30
- const provider = providers[providerName]();
31
- if (!provider.isAvailable()) {
32
- logger.warn(`Provider "${providerName}" is not available (missing API key or config). ` +
33
- `Falling back to copilot provider.`);
34
- currentProvider = providers.copilot();
35
- currentProviderName = 'copilot';
36
- return currentProvider;
37
- }
38
- logger.info(`Using LLM provider: ${providerName} (model: ${provider.getDefaultModel()})`);
39
- currentProvider = provider;
40
- currentProviderName = providerName;
41
- return currentProvider;
42
- }
43
- /** Reset the cached provider (for testing) */
44
- export async function resetProvider() {
45
- try {
46
- await currentProvider?.close?.();
47
- }
48
- catch { /* ignore close errors */ }
49
- currentProvider = null;
50
- currentProviderName = null;
51
- }
52
- /** Get the name of the current provider */
53
- export function getProviderName() {
54
- const raw = (process.env.LLM_PROVIDER || 'copilot').trim().toLowerCase();
55
- const valid = ['copilot', 'openai', 'claude'];
56
- return currentProviderName ?? (valid.includes(raw) ? raw : 'copilot');
57
- }
58
- export { CopilotProvider } from './CopilotProvider.js';
59
- export { OpenAIProvider } from './OpenAIProvider.js';
60
- export { ClaudeProvider } from './ClaudeProvider.js';
61
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,MAAM,MAAM,qBAAqB,CAAC;AAEzC,MAAM,SAAS,GAA4C;IACzD,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE;IACpC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE;IAClC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE;CACnC,CAAC;AAEF,yCAAyC;AACzC,IAAI,eAAe,GAAuB,IAAI,CAAC;AAC/C,IAAI,mBAAmB,GAAwB,IAAI,CAAC;AAEpD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAmB;IAC7C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjF,MAAM,YAAY,GAAG,GAAmB,CAAC;IAEzC,IAAI,eAAe,IAAI,mBAAmB,KAAK,YAAY,EAAE,CAAC;QAC5D,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,qDAAqD;IACrD,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAA6B,CAAC,CAAC,CAAC;IAEtE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,0BAA0B,YAAY,KAAK;YAC3C,kBAAkB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtD,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;IAE3C,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CACT,aAAa,YAAY,kDAAkD;YAC3E,mCAAmC,CACpC,CAAC;QACF,eAAe,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;QACtC,mBAAmB,GAAG,SAAS,CAAC;QAChC,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,uBAAuB,YAAY,YAAY,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IAC1F,eAAe,GAAG,QAAQ,CAAC;IAC3B,mBAAmB,GAAG,YAAY,CAAC;IACnC,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,8CAA8C;AAC9C,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QAAC,MAAM,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;IAC7E,eAAe,GAAG,IAAI,CAAC;IACvB,mBAAmB,GAAG,IAAI,CAAC;AAC7B,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACzE,MAAM,KAAK,GAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC9D,OAAO,mBAAmB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAmB,CAAC,CAAC,CAAC,CAAE,GAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC1G,CAAC;AAKD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,112 +0,0 @@
1
- /**
2
- * LLM Provider Abstraction Layer
3
- *
4
- * Defines the contract for all LLM providers (Copilot SDK, OpenAI, Claude).
5
- * Providers normalize different SDK patterns into a unified interface.
6
- */
7
- /** Supported LLM provider names */
8
- export type ProviderName = 'copilot' | 'openai' | 'claude';
9
- /** Tool definition in JSON Schema format (compatible with all providers) */
10
- export interface ToolDefinition {
11
- name: string;
12
- description: string;
13
- parameters: Record<string, unknown>;
14
- }
15
- /** A tool call requested by the LLM */
16
- export interface ToolCall {
17
- id: string;
18
- name: string;
19
- arguments: Record<string, unknown>;
20
- }
21
- /** Token usage for a single LLM call */
22
- export interface TokenUsage {
23
- inputTokens: number;
24
- outputTokens: number;
25
- totalTokens: number;
26
- cacheReadTokens?: number;
27
- cacheWriteTokens?: number;
28
- }
29
- /** Cost information for a single LLM call */
30
- export interface CostInfo {
31
- /** Provider-specific cost (e.g., USD for OpenAI/Claude, PRUs for Copilot) */
32
- amount: number;
33
- /** Unit of measurement */
34
- unit: 'usd' | 'premium_requests';
35
- /** Model used */
36
- model: string;
37
- /** Model multiplier (for Copilot PRU calculation) */
38
- multiplier?: number;
39
- }
40
- /** Copilot-specific quota snapshot from assistant.usage event */
41
- export interface QuotaSnapshot {
42
- isUnlimitedEntitlement: boolean;
43
- entitlementRequests: number;
44
- usedRequests: number;
45
- remainingPercentage: number;
46
- resetDate?: string;
47
- overage: number;
48
- }
49
- /** Response from an LLM provider call */
50
- export interface LLMResponse {
51
- /** Text content of the response */
52
- content: string;
53
- /** Tool calls requested by the LLM (if any) */
54
- toolCalls: ToolCall[];
55
- /** Token usage metrics */
56
- usage: TokenUsage;
57
- /** Cost information */
58
- cost?: CostInfo;
59
- /** Copilot quota snapshots (only for Copilot provider) */
60
- quotaSnapshots?: Record<string, QuotaSnapshot>;
61
- /** Duration of the call in milliseconds */
62
- durationMs?: number;
63
- }
64
- /** Event types emitted by provider sessions */
65
- export type ProviderEventType = 'delta' | 'tool_start' | 'tool_end' | 'usage' | 'error';
66
- /** Event data for provider events */
67
- export interface ProviderEvent {
68
- type: ProviderEventType;
69
- data: unknown;
70
- }
71
- /** Tool handler function - executes tool logic and returns result */
72
- export type ToolHandler = (args: Record<string, unknown>) => Promise<unknown>;
73
- /** Tool with its handler attached */
74
- export interface ToolWithHandler extends ToolDefinition {
75
- handler: ToolHandler;
76
- }
77
- /** Configuration for creating a provider session */
78
- export interface SessionConfig {
79
- /** System prompt for the LLM */
80
- systemPrompt: string;
81
- /** Tools available to the LLM */
82
- tools: ToolWithHandler[];
83
- /** Whether to enable streaming */
84
- streaming?: boolean;
85
- /** Model to use (provider-specific, e.g., 'claude-sonnet-4', 'gpt-4o') */
86
- model?: string;
87
- /** Timeout in milliseconds */
88
- timeoutMs?: number;
89
- }
90
- /** An active session with an LLM provider */
91
- export interface LLMSession {
92
- /** Send a message and wait for the complete response */
93
- sendAndWait(message: string): Promise<LLMResponse>;
94
- /** Subscribe to session events */
95
- on(event: ProviderEventType, handler: (event: ProviderEvent) => void): void;
96
- /** Close and clean up the session */
97
- close(): Promise<void>;
98
- }
99
- /** LLM Provider interface - the main contract */
100
- export interface LLMProvider {
101
- /** Provider name identifier */
102
- readonly name: ProviderName;
103
- /** Create a new session with the given configuration */
104
- createSession(config: SessionConfig): Promise<LLMSession>;
105
- /** Check if the provider is available (API key set, etc.) */
106
- isAvailable(): boolean;
107
- /** Get the default model for this provider */
108
- getDefaultModel(): string;
109
- /** Optional lifecycle hook to release provider-level resources. */
110
- close?(): Promise<void>;
111
- }
112
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,mCAAmC;AACnC,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE1D,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACpC;AAED,uCAAuC;AACvC,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,6CAA6C;AAC7C,MAAM,WAAW,QAAQ;IACvB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAA;IACd,0BAA0B;IAC1B,IAAI,EAAE,KAAK,GAAG,kBAAkB,CAAA;IAChC,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,iEAAiE;AACjE,MAAM,WAAW,aAAa;IAC5B,sBAAsB,EAAE,OAAO,CAAA;IAC/B,mBAAmB,EAAE,MAAM,CAAA;IAC3B,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,+CAA+C;IAC/C,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,0BAA0B;IAC1B,KAAK,EAAE,UAAU,CAAA;IACjB,uBAAuB;IACvB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC9C,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,+CAA+C;AAC/C,MAAM,MAAM,iBAAiB,GACzB,OAAO,GACP,YAAY,GACZ,UAAU,GACV,OAAO,GACP,OAAO,CAAA;AAEX,qCAAqC;AACrC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAA;IACvB,IAAI,EAAE,OAAO,CAAA;CACd;AAED,qEAAqE;AACrE,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAE7E,qCAAqC;AACrC,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,OAAO,EAAE,WAAW,CAAA;CACrB;AAED,oDAAoD;AACpD,MAAM,WAAW,aAAa;IAC5B,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAA;IACpB,iCAAiC;IACjC,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,kCAAkC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,wDAAwD;IACxD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAClD,kCAAkC;IAClC,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI,CAAA;IAC3E,qCAAqC;IACrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,iDAAiD;AACjD,MAAM,WAAW,WAAW;IAC1B,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,wDAAwD;IACxD,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACzD,6DAA6D;IAC7D,WAAW,IAAI,OAAO,CAAA;IACtB,8CAA8C;IAC9C,eAAe,IAAI,MAAM,CAAA;IACzB,mEAAmE;IACnE,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB"}
@@ -1,8 +0,0 @@
1
- /**
2
- * LLM Provider Abstraction Layer
3
- *
4
- * Defines the contract for all LLM providers (Copilot SDK, OpenAI, Claude).
5
- * Providers normalize different SDK patterns into a unified interface.
6
- */
7
- export {};
8
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,7 +0,0 @@
1
- import { VideoFile, Transcript } from '../types';
2
- /**
3
- * Generate SRT, VTT, and ASS caption files for a video and save them to disk.
4
- * Returns the list of written file paths.
5
- */
6
- export declare function generateCaptions(video: VideoFile, transcript: Transcript): Promise<string[]>;
7
- //# sourceMappingURL=captionGeneration.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"captionGeneration.d.ts","sourceRoot":"","sources":["../../src/services/captionGeneration.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAKhD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,MAAM,EAAE,CAAC,CAsBnB"}
@@ -1,29 +0,0 @@
1
- import path from 'path';
2
- import fsp from 'fs/promises';
3
- import { generateSRT, generateVTT, generateStyledASS } from '../tools/captions/captionGenerator';
4
- import { getConfig } from '../config/environment';
5
- import logger from '../config/logger';
6
- /**
7
- * Generate SRT, VTT, and ASS caption files for a video and save them to disk.
8
- * Returns the list of written file paths.
9
- */
10
- export async function generateCaptions(video, transcript) {
11
- const config = getConfig();
12
- const captionsDir = path.join(config.OUTPUT_DIR, video.slug, 'captions');
13
- await fsp.mkdir(captionsDir, { recursive: true });
14
- const srtPath = path.join(captionsDir, 'captions.srt');
15
- const vttPath = path.join(captionsDir, 'captions.vtt');
16
- const assPath = path.join(captionsDir, 'captions.ass');
17
- const srt = generateSRT(transcript);
18
- const vtt = generateVTT(transcript);
19
- const ass = generateStyledASS(transcript);
20
- await Promise.all([
21
- fsp.writeFile(srtPath, srt, 'utf-8'),
22
- fsp.writeFile(vttPath, vtt, 'utf-8'),
23
- fsp.writeFile(assPath, ass, 'utf-8'),
24
- ]);
25
- const paths = [srtPath, vttPath, assPath];
26
- logger.info(`Captions saved: ${paths.join(', ')}`);
27
- return paths;
28
- }
29
- //# sourceMappingURL=captionGeneration.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"captionGeneration.js","sourceRoot":"","sources":["../../src/services/captionGeneration.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,GAAG,MAAM,aAAa,CAAA;AAE7B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AAChG,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,MAAM,MAAM,kBAAkB,CAAA;AAErC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAgB,EAChB,UAAsB;IAEtB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACxE,MAAM,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAEjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;IAEtD,MAAM,GAAG,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;IACnC,MAAM,GAAG,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;IACnC,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAA;IAEzC,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC;QACpC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC;QACpC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC;KACrC,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IACzC,MAAM,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClD,OAAO,KAAK,CAAA;AACd,CAAC"}