@spekoai/mcp 1.0.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 (50) hide show
  1. package/README.md +59 -0
  2. package/dist/data/benchmarks.d.ts +124 -0
  3. package/dist/data/benchmarks.d.ts.map +1 -0
  4. package/dist/data/benchmarks.js +176 -0
  5. package/dist/data/benchmarks.js.map +1 -0
  6. package/dist/data/templates.d.ts +39 -0
  7. package/dist/data/templates.d.ts.map +1 -0
  8. package/dist/data/templates.js +385 -0
  9. package/dist/data/templates.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +26 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib/api-client.d.ts +71 -0
  15. package/dist/lib/api-client.d.ts.map +1 -0
  16. package/dist/lib/api-client.js +282 -0
  17. package/dist/lib/api-client.js.map +1 -0
  18. package/dist/lib/benchmark-utils.d.ts +45 -0
  19. package/dist/lib/benchmark-utils.d.ts.map +1 -0
  20. package/dist/lib/benchmark-utils.js +244 -0
  21. package/dist/lib/benchmark-utils.js.map +1 -0
  22. package/dist/lib/project-scanner.d.ts +16 -0
  23. package/dist/lib/project-scanner.d.ts.map +1 -0
  24. package/dist/lib/project-scanner.js +154 -0
  25. package/dist/lib/project-scanner.js.map +1 -0
  26. package/dist/lib/tier-gate.d.ts +14 -0
  27. package/dist/lib/tier-gate.d.ts.map +1 -0
  28. package/dist/lib/tier-gate.js +27 -0
  29. package/dist/lib/tier-gate.js.map +1 -0
  30. package/dist/tools/agent-crud.d.ts +3 -0
  31. package/dist/tools/agent-crud.d.ts.map +1 -0
  32. package/dist/tools/agent-crud.js +114 -0
  33. package/dist/tools/agent-crud.js.map +1 -0
  34. package/dist/tools/legacy.d.ts +3 -0
  35. package/dist/tools/legacy.d.ts.map +1 -0
  36. package/dist/tools/legacy.js +354 -0
  37. package/dist/tools/legacy.js.map +1 -0
  38. package/dist/tools/migrate.d.ts +3 -0
  39. package/dist/tools/migrate.d.ts.map +1 -0
  40. package/dist/tools/migrate.js +145 -0
  41. package/dist/tools/migrate.js.map +1 -0
  42. package/dist/tools/recommend.d.ts +3 -0
  43. package/dist/tools/recommend.d.ts.map +1 -0
  44. package/dist/tools/recommend.js +163 -0
  45. package/dist/tools/recommend.js.map +1 -0
  46. package/dist/tools/setup.d.ts +3 -0
  47. package/dist/tools/setup.d.ts.map +1 -0
  48. package/dist/tools/setup.js +104 -0
  49. package/dist/tools/setup.js.map +1 -0
  50. package/package.json +54 -0
@@ -0,0 +1,385 @@
1
+ /**
2
+ * Project scaffolding templates for different voice AI frameworks.
3
+ */
4
+ const LIVEKIT_STT_IMPORTS = {
5
+ Deepgram: "from livekit.plugins import deepgram",
6
+ OpenAI: "from livekit.plugins import openai",
7
+ Google: "from livekit.plugins import google",
8
+ };
9
+ const LIVEKIT_LLM_IMPORTS = {
10
+ OpenAI: "from livekit.plugins import openai",
11
+ Anthropic: "from livekit.plugins import anthropic",
12
+ Google: "from livekit.plugins import google",
13
+ };
14
+ const LIVEKIT_TTS_IMPORTS = {
15
+ Cartesia: "from livekit.plugins import cartesia",
16
+ ElevenLabs: "from livekit.plugins import elevenlabs",
17
+ };
18
+ const LIVEKIT_STT_SNIPPETS = {
19
+ Deepgram: "deepgram.STT(model=\"{model}\")",
20
+ OpenAI: "openai.STT(model=\"{model}\")",
21
+ Google: "google.STT(model=\"{model}\")",
22
+ };
23
+ const LIVEKIT_LLM_SNIPPETS = {
24
+ OpenAI: "openai.LLM(model=\"{model}\")",
25
+ Anthropic: "anthropic.LLM(model=\"{model}\")",
26
+ Google: "google.LLM(model=\"{model}\")",
27
+ };
28
+ const LIVEKIT_TTS_SNIPPETS = {
29
+ Cartesia: "cartesia.TTS(model=\"{model}\")",
30
+ ElevenLabs: "elevenlabs.TTS(model=\"{model}\")",
31
+ };
32
+ const LIVEKIT_ENV_KEYS = {
33
+ Deepgram: "DEEPGRAM_API_KEY",
34
+ AssemblyAI: "ASSEMBLYAI_API_KEY",
35
+ OpenAI: "OPENAI_API_KEY",
36
+ Google: "GOOGLE_API_KEY",
37
+ Speechmatics: "SPEECHMATICS_API_KEY",
38
+ Groq: "GROQ_API_KEY",
39
+ Anthropic: "ANTHROPIC_API_KEY",
40
+ Cartesia: "CARTESIA_API_KEY",
41
+ ElevenLabs: "ELEVENLABS_API_KEY",
42
+ PlayHT: "PLAYHT_API_KEY",
43
+ Rime: "RIME_API_KEY",
44
+ };
45
+ const uniq = (items) => [...new Set(items.filter(Boolean))];
46
+ function templateOrError(stage, provider, model) {
47
+ if (stage === "STT") {
48
+ const expression = LIVEKIT_STT_SNIPPETS[provider];
49
+ if (!expression)
50
+ throw new Error(`LiveKit scaffold does not support STT provider: ${provider}`);
51
+ return expression.replace("{model}", model);
52
+ }
53
+ if (stage === "LLM") {
54
+ const expression = LIVEKIT_LLM_SNIPPETS[provider];
55
+ if (!expression)
56
+ throw new Error(`LiveKit scaffold does not support LLM provider: ${provider}`);
57
+ return expression.replace("{model}", model);
58
+ }
59
+ const expression = LIVEKIT_TTS_SNIPPETS[provider];
60
+ if (!expression)
61
+ throw new Error(`LiveKit scaffold does not support TTS provider: ${provider}`);
62
+ return expression.replace("{model}", model);
63
+ }
64
+ export function getLiveKitAgentTemplate(config) {
65
+ const envKeyForProvider = (provider) => {
66
+ const key = LIVEKIT_ENV_KEYS[provider];
67
+ return key ? `${key}=your-${provider.toLowerCase().replace(/\s/g, "-")}-key` : null;
68
+ };
69
+ const seen = new Set();
70
+ const addKey = (provider) => {
71
+ const line = envKeyForProvider(provider);
72
+ if (!line || seen.has(provider))
73
+ return [];
74
+ seen.add(provider);
75
+ return [line];
76
+ };
77
+ const envLines = [
78
+ "# Speko Generated Config",
79
+ `# Agent: ${config.agentName}`,
80
+ `# Language: ${config.language} | Use Case: ${config.useCase}`,
81
+ "",
82
+ "# LiveKit",
83
+ "LIVEKIT_URL=wss://your-project.livekit.cloud",
84
+ "LIVEKIT_API_KEY=your-api-key",
85
+ "LIVEKIT_API_SECRET=your-api-secret",
86
+ "",
87
+ `# STT: ${config.stt} ${config.sttModel}`,
88
+ ...addKey(config.stt),
89
+ "",
90
+ `# LLM: ${config.llm} ${config.llmModel}`,
91
+ ...addKey(config.llm),
92
+ "",
93
+ `# TTS: ${config.tts} ${config.ttsModel}`,
94
+ ...addKey(config.tts),
95
+ "",
96
+ ];
97
+ const sttImports = uniq([LIVEKIT_STT_IMPORTS[config.stt]]);
98
+ const llmImports = uniq([LIVEKIT_LLM_IMPORTS[config.llm]]);
99
+ const ttsImports = uniq([LIVEKIT_TTS_IMPORTS[config.tts]]);
100
+ const envFile = envLines.join("\n");
101
+ const agentPy = `"""
102
+ ${config.agentName} - Voice AI Agent
103
+ Generated by Speko MCP
104
+
105
+ Stack: ${config.stt} ${config.sttModel} → ${config.llm} ${config.llmModel} → ${config.tts} ${config.ttsModel}
106
+ Language: ${config.language} | Use Case: ${config.useCase}
107
+ """
108
+
109
+ import logging
110
+ from dotenv import load_dotenv
111
+ from livekit.agents import AutoSubscribe, JobContext, WorkerOptions, cli, llm
112
+ from livekit.agents.pipeline import VoicePipelineAgent
113
+ ${sttImports.filter(Boolean).join("\n")}
114
+ ${llmImports.filter(Boolean).join("\n")}
115
+ ${ttsImports.filter(Boolean).join("\n")}
116
+
117
+ load_dotenv()
118
+ logger = logging.getLogger("${config.agentName}")
119
+
120
+
121
+ async def entrypoint(ctx: JobContext):
122
+ await ctx.connect(auto_subscribe=AutoSubscribe.AUDIO_ONLY)
123
+
124
+ initial_ctx = llm.ChatContext().append(
125
+ role="system",
126
+ text=(
127
+ "You are a voice AI agent for ${config.useCase.toLowerCase()}. "
128
+ "You communicate in ${config.language}. "
129
+ "Keep responses concise (1-2 sentences). "
130
+ "Be natural, warm, and helpful."
131
+ ),
132
+ )
133
+
134
+ agent = VoicePipelineAgent(
135
+ vad=ctx.proc.userdata.get("vad"),
136
+ stt=${templateOrError("STT", config.stt, config.sttModel)},
137
+ llm=${templateOrError("LLM", config.llm, config.llmModel)},
138
+ tts=${templateOrError("TTS", config.tts, config.ttsModel)},
139
+ chat_ctx=initial_ctx,
140
+ )
141
+
142
+ agent.start(ctx.room)
143
+ await agent.say(
144
+ "Hello! How can I help you today?",
145
+ allow_interruptions=True,
146
+ )
147
+
148
+
149
+ if __name__ == "__main__":
150
+ cli.run_app(WorkerOptions(entrypoint_fnc=entrypoint))
151
+ `;
152
+ const LIVEKIT_PLUGIN_PACKAGES = {
153
+ Deepgram: "livekit-plugins-deepgram>=1.0.0",
154
+ OpenAI: "livekit-plugins-openai>=1.0.0",
155
+ Cartesia: "livekit-plugins-cartesia>=1.0.0",
156
+ ElevenLabs: "livekit-plugins-elevenlabs>=1.0.0",
157
+ Anthropic: "livekit-plugins-anthropic>=1.0.0",
158
+ Google: "livekit-plugins-google>=1.0.0",
159
+ };
160
+ const pluginLines = uniq([
161
+ LIVEKIT_PLUGIN_PACKAGES[config.stt],
162
+ LIVEKIT_PLUGIN_PACKAGES[config.llm],
163
+ LIVEKIT_PLUGIN_PACKAGES[config.tts],
164
+ ].filter(Boolean));
165
+ const requirementsTxt = [
166
+ "livekit-agents>=1.0.0",
167
+ ...pluginLines,
168
+ "livekit-plugins-silero>=1.0.0",
169
+ "python-dotenv>=1.0.0",
170
+ "",
171
+ ].join("\n");
172
+ const spekoYaml = `# Speko Agent Configuration
173
+ # Generated by Speko MCP — https://speko.ai
174
+
175
+ agent:
176
+ name: ${config.agentName}
177
+ version: "1.0.0"
178
+ language: ${config.language}
179
+ use_case: ${config.useCase}
180
+
181
+ pipeline:
182
+ stt:
183
+ provider: ${config.stt.toLowerCase()}
184
+ model: ${config.sttModel}
185
+ llm:
186
+ provider: ${config.llm.toLowerCase()}
187
+ model: ${config.llmModel}
188
+ temperature: 0.7
189
+ max_tokens: 150
190
+ tts:
191
+ provider: ${config.tts.toLowerCase()}
192
+ model: ${config.ttsModel}
193
+
194
+ quality:
195
+ target_latency_ms: 250
196
+ min_utmos: 4.0
197
+ max_cost_per_min: 0.015
198
+
199
+ monitoring:
200
+ log_level: info
201
+ metrics: true
202
+ alerts:
203
+ latency_p95_threshold_ms: 350
204
+ error_rate_threshold: 0.02
205
+ `;
206
+ const readmeMd = `# ${config.agentName}
207
+
208
+ Voice AI agent generated by [Speko](https://speko.ai).
209
+
210
+ ## Stack
211
+
212
+ | Component | Provider | Model |
213
+ |-----------|----------|-------|
214
+ | STT | ${config.stt} | ${config.sttModel} |
215
+ | LLM | ${config.llm} | ${config.llmModel} |
216
+ | TTS | ${config.tts} | ${config.ttsModel} |
217
+
218
+ **Language:** ${config.language}
219
+ **Use Case:** ${config.useCase}
220
+
221
+ ## Setup
222
+
223
+ \`\`\`bash
224
+ # Install dependencies
225
+ pip install -r requirements.txt
226
+
227
+ # Configure environment
228
+ cp .env.example .env
229
+ # Edit .env with your API keys
230
+
231
+ # Run the agent
232
+ python agent.py dev
233
+ \`\`\`
234
+
235
+ ## Configuration
236
+
237
+ Edit \`speko.yaml\` to adjust pipeline settings, quality targets, and monitoring thresholds.
238
+
239
+ ## Powered by Speko
240
+
241
+ This agent was scaffolded using Speko MCP. To optimize your stack:
242
+
243
+ \`\`\`
244
+ npx @speko/mcp
245
+ \`\`\`
246
+ `;
247
+ return [
248
+ { path: ".env.example", content: envFile },
249
+ { path: "agent.py", content: agentPy },
250
+ { path: "requirements.txt", content: requirementsTxt },
251
+ { path: "speko.yaml", content: spekoYaml },
252
+ { path: "README.md", content: readmeMd },
253
+ ];
254
+ }
255
+ export function getNextJSTemplate(config) {
256
+ const envFile = [
257
+ "# Speko Generated Config",
258
+ `# Agent: ${config.agentName}`,
259
+ "",
260
+ "NEXT_PUBLIC_ELEVENLABS_AGENT_ID=your-agent-id",
261
+ "ELEVENLABS_API_KEY=your-elevenlabs-key",
262
+ ...(config.llm === "OpenAI" ? ["OPENAI_API_KEY=your-openai-key"] : []),
263
+ ...(config.llm === "Anthropic" ? ["ANTHROPIC_API_KEY=your-anthropic-key"] : []),
264
+ "",
265
+ ].join("\n");
266
+ const voiceWidgetTsx = `"use client";
267
+
268
+ import { useConversation } from "@elevenlabs/react";
269
+ import { useCallback, useState } from "react";
270
+
271
+ /**
272
+ * ${config.agentName} — Voice Widget
273
+ * Generated by Speko MCP
274
+ *
275
+ * Stack: ${config.stt} → ${config.llm} → ${config.tts}
276
+ */
277
+ export function VoiceWidget() {
278
+ const [isActive, setIsActive] = useState(false);
279
+
280
+ const conversation = useConversation({
281
+ onConnect: () => setIsActive(true),
282
+ onDisconnect: () => setIsActive(false),
283
+ onError: (error) => console.error("Voice error:", error),
284
+ });
285
+
286
+ const startConversation = useCallback(async () => {
287
+ try {
288
+ await navigator.mediaDevices.getUserMedia({ audio: true });
289
+ await conversation.startSession({
290
+ agentId: process.env.NEXT_PUBLIC_ELEVENLABS_AGENT_ID!,
291
+ });
292
+ } catch (error) {
293
+ console.error("Failed to start:", error);
294
+ }
295
+ }, [conversation]);
296
+
297
+ const stopConversation = useCallback(async () => {
298
+ await conversation.endSession();
299
+ }, [conversation]);
300
+
301
+ return (
302
+ <div className="flex flex-col items-center gap-4 p-8">
303
+ <div
304
+ className={\`w-24 h-24 rounded-full flex items-center justify-center transition-all \${
305
+ isActive
306
+ ? "bg-red-500 animate-pulse shadow-lg shadow-red-500/50"
307
+ : "bg-indigo-600 hover:bg-indigo-700 shadow-lg"
308
+ }\`}
309
+ >
310
+ <button
311
+ onClick={isActive ? stopConversation : startConversation}
312
+ className="text-white text-sm font-medium"
313
+ >
314
+ {isActive ? "End" : "Start"}
315
+ </button>
316
+ </div>
317
+ <p className="text-sm text-gray-500">
318
+ {conversation.status === "connected"
319
+ ? conversation.isSpeaking
320
+ ? "Agent is speaking..."
321
+ : "Listening..."
322
+ : "Click to start"}
323
+ </p>
324
+ </div>
325
+ );
326
+ }
327
+ `;
328
+ return [
329
+ { path: ".env.example", content: envFile },
330
+ { path: "components/voice-widget.tsx", content: voiceWidgetTsx },
331
+ ];
332
+ }
333
+ export function getSpekoComponentTemplate(config) {
334
+ if (config.framework === "nextjs") {
335
+ return `"use client";
336
+
337
+ import { VoiceAgent } from "@speko/js/react";
338
+
339
+ export function SpekoWidget() {
340
+ return (
341
+ <VoiceAgent
342
+ agentId="${config.agentId}"
343
+ apiKey={process.env.NEXT_PUBLIC_SPEKO_KEY}
344
+ language="${config.language}"
345
+ priority="${config.priority}"
346
+ context="${config.context.replace(/"/g, '\\"')}"
347
+ systemPrompt="${config.systemPrompt.replace(/"/g, '\\"')}"
348
+ position="bottom-right"
349
+ />
350
+ );
351
+ }
352
+ `;
353
+ }
354
+ if (config.framework === "react") {
355
+ return `import { VoiceAgent } from "@speko/js/react";
356
+
357
+ export function SpekoWidget() {
358
+ return (
359
+ <VoiceAgent
360
+ agentId="${config.agentId}"
361
+ apiKey={import.meta.env.VITE_SPEKO_KEY}
362
+ language="${config.language}"
363
+ priority="${config.priority}"
364
+ context="${config.context.replace(/"/g, '\\"')}"
365
+ systemPrompt="${config.systemPrompt.replace(/"/g, '\\"')}"
366
+ />
367
+ );
368
+ }
369
+ `;
370
+ }
371
+ return `import { Speko } from "@speko/js";
372
+
373
+ const speko = new Speko({
374
+ agentId: "${config.agentId}",
375
+ apiKey: window.SPEKO_KEY,
376
+ language: "${config.language}",
377
+ priority: "${config.priority}",
378
+ context: "${config.context.replace(/"/g, '\\"')}",
379
+ systemPrompt: "${config.systemPrompt.replace(/"/g, '\\"')}",
380
+ });
381
+
382
+ speko.mount("#speko-root");
383
+ `;
384
+ }
385
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/data/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { registerAgentCrudTools } from "./tools/agent-crud.js";
5
+ import { registerLegacyTools } from "./tools/legacy.js";
6
+ import { registerMigrateTool } from "./tools/migrate.js";
7
+ import { registerRecommendTool } from "./tools/recommend.js";
8
+ import { registerSetupTool } from "./tools/setup.js";
9
+ const server = new McpServer({
10
+ name: "speko",
11
+ version: "0.3.0",
12
+ });
13
+ registerSetupTool(server);
14
+ registerMigrateTool(server);
15
+ registerAgentCrudTools(server);
16
+ registerRecommendTool(server);
17
+ registerLegacyTools(server);
18
+ async function main() {
19
+ const transport = new StdioServerTransport();
20
+ await server.connect(transport);
21
+ }
22
+ main().catch((error) => {
23
+ console.error("Speko MCP server error:", error);
24
+ process.exit(1);
25
+ });
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC1B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC5B,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAE5B,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,71 @@
1
+ export type AgentPriority = "speed" | "quality" | "cost";
2
+ export interface AgentCreateInput {
3
+ name: string;
4
+ context: string;
5
+ systemPrompt?: string;
6
+ language?: string;
7
+ priority?: AgentPriority;
8
+ greeting?: string;
9
+ }
10
+ export interface AgentUpdateInput {
11
+ context?: string;
12
+ systemPrompt?: string;
13
+ language?: string;
14
+ priority?: AgentPriority;
15
+ greeting?: string;
16
+ }
17
+ export interface AgentRecord {
18
+ id: string;
19
+ name: string;
20
+ context: string;
21
+ systemPrompt: string;
22
+ language: string;
23
+ priority: string;
24
+ greeting?: string;
25
+ createdAt: string;
26
+ updatedAt: string;
27
+ [key: string]: unknown;
28
+ }
29
+ export interface AgentStatus {
30
+ agentId: string;
31
+ health: string;
32
+ recentCalls: number;
33
+ successRate?: number;
34
+ avgLatencyMs?: number;
35
+ mode?: string;
36
+ provider?: string;
37
+ lastCallAt?: string;
38
+ [key: string]: unknown;
39
+ }
40
+ export interface ApiResult<T> {
41
+ data: T;
42
+ meta: {
43
+ mode: "live" | "mock";
44
+ baseUrl: string;
45
+ warning?: string;
46
+ };
47
+ }
48
+ export interface SpekoApiClientOptions {
49
+ baseUrl?: string;
50
+ dashboardBaseUrl?: string;
51
+ apiKey?: string;
52
+ mockMode?: boolean;
53
+ fetchImpl?: typeof fetch;
54
+ allowMockFallback?: boolean;
55
+ }
56
+ export declare class SpekoApiClient {
57
+ private readonly baseUrl;
58
+ private readonly dashboardBaseUrl;
59
+ private readonly apiKey;
60
+ private readonly fetchImpl;
61
+ private readonly mockMode;
62
+ private readonly allowMockFallback;
63
+ constructor(options?: SpekoApiClientOptions);
64
+ getDashboardUrl(agentId: string): string;
65
+ private request;
66
+ private mockAgentFromInput;
67
+ createAgent(input: AgentCreateInput): Promise<ApiResult<AgentRecord>>;
68
+ updateAgent(agentId: string, input: AgentUpdateInput): Promise<ApiResult<AgentRecord>>;
69
+ getAgentStatus(agentId: string): Promise<ApiResult<AgentStatus>>;
70
+ }
71
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}