@polpo-ai/tools 0.2.4

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 (89) hide show
  1. package/dist/adapters/node-filesystem.d.ts +12 -0
  2. package/dist/adapters/node-filesystem.d.ts.map +1 -0
  3. package/dist/adapters/node-filesystem.js +46 -0
  4. package/dist/adapters/node-filesystem.js.map +1 -0
  5. package/dist/adapters/node-shell.d.ts +5 -0
  6. package/dist/adapters/node-shell.d.ts.map +1 -0
  7. package/dist/adapters/node-shell.js +34 -0
  8. package/dist/adapters/node-shell.js.map +1 -0
  9. package/dist/audio-tools.d.ts +42 -0
  10. package/dist/audio-tools.d.ts.map +1 -0
  11. package/dist/audio-tools.js +552 -0
  12. package/dist/audio-tools.js.map +1 -0
  13. package/dist/browser-tools.d.ts +36 -0
  14. package/dist/browser-tools.d.ts.map +1 -0
  15. package/dist/browser-tools.js +525 -0
  16. package/dist/browser-tools.js.map +1 -0
  17. package/dist/coding-tools.d.ts +99 -0
  18. package/dist/coding-tools.d.ts.map +1 -0
  19. package/dist/coding-tools.js +434 -0
  20. package/dist/coding-tools.js.map +1 -0
  21. package/dist/docx-tools.d.ts +22 -0
  22. package/dist/docx-tools.d.ts.map +1 -0
  23. package/dist/docx-tools.js +236 -0
  24. package/dist/docx-tools.js.map +1 -0
  25. package/dist/email-tools.d.ts +34 -0
  26. package/dist/email-tools.d.ts.map +1 -0
  27. package/dist/email-tools.js +787 -0
  28. package/dist/email-tools.js.map +1 -0
  29. package/dist/excel-tools.d.ts +25 -0
  30. package/dist/excel-tools.d.ts.map +1 -0
  31. package/dist/excel-tools.js +409 -0
  32. package/dist/excel-tools.js.map +1 -0
  33. package/dist/http-tools.d.ts +23 -0
  34. package/dist/http-tools.d.ts.map +1 -0
  35. package/dist/http-tools.js +214 -0
  36. package/dist/http-tools.js.map +1 -0
  37. package/dist/image-tools.d.ts +40 -0
  38. package/dist/image-tools.d.ts.map +1 -0
  39. package/dist/image-tools.js +522 -0
  40. package/dist/image-tools.js.map +1 -0
  41. package/dist/index.d.ts +33 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +37 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/memory-tools.d.ts +19 -0
  46. package/dist/memory-tools.d.ts.map +1 -0
  47. package/dist/memory-tools.js +104 -0
  48. package/dist/memory-tools.js.map +1 -0
  49. package/dist/outcome-tools.d.ts +25 -0
  50. package/dist/outcome-tools.d.ts.map +1 -0
  51. package/dist/outcome-tools.js +191 -0
  52. package/dist/outcome-tools.js.map +1 -0
  53. package/dist/path-sandbox.d.ts +28 -0
  54. package/dist/path-sandbox.d.ts.map +1 -0
  55. package/dist/path-sandbox.js +58 -0
  56. package/dist/path-sandbox.js.map +1 -0
  57. package/dist/pdf-tools.d.ts +25 -0
  58. package/dist/pdf-tools.d.ts.map +1 -0
  59. package/dist/pdf-tools.js +363 -0
  60. package/dist/pdf-tools.js.map +1 -0
  61. package/dist/phone-tools.d.ts +27 -0
  62. package/dist/phone-tools.d.ts.map +1 -0
  63. package/dist/phone-tools.js +577 -0
  64. package/dist/phone-tools.js.map +1 -0
  65. package/dist/safe-env.d.ts +26 -0
  66. package/dist/safe-env.d.ts.map +1 -0
  67. package/dist/safe-env.js +76 -0
  68. package/dist/safe-env.js.map +1 -0
  69. package/dist/search-tools.d.ts +22 -0
  70. package/dist/search-tools.d.ts.map +1 -0
  71. package/dist/search-tools.js +205 -0
  72. package/dist/search-tools.js.map +1 -0
  73. package/dist/ssrf-guard.d.ts +17 -0
  74. package/dist/ssrf-guard.d.ts.map +1 -0
  75. package/dist/ssrf-guard.js +95 -0
  76. package/dist/ssrf-guard.js.map +1 -0
  77. package/dist/types.d.ts +21 -0
  78. package/dist/types.d.ts.map +1 -0
  79. package/dist/types.js +5 -0
  80. package/dist/types.js.map +1 -0
  81. package/dist/vault-tools.d.ts +26 -0
  82. package/dist/vault-tools.d.ts.map +1 -0
  83. package/dist/vault-tools.js +86 -0
  84. package/dist/vault-tools.js.map +1 -0
  85. package/dist/whatsapp-tools.d.ts +18 -0
  86. package/dist/whatsapp-tools.d.ts.map +1 -0
  87. package/dist/whatsapp-tools.js +206 -0
  88. package/dist/whatsapp-tools.js.map +1 -0
  89. package/package.json +56 -0
@@ -0,0 +1,552 @@
1
+ /**
2
+ * Audio tools for speech-to-text (STT) and text-to-speech (TTS).
3
+ *
4
+ * Provides agent capabilities to:
5
+ * - Transcribe audio files to text (audio_transcribe)
6
+ * - Generate speech audio from text (audio_speak)
7
+ *
8
+ * Architecture: direct fetch() to provider REST APIs — zero vendor SDK dependencies.
9
+ *
10
+ * Supported providers:
11
+ * STT: openai (Whisper), deepgram (Nova)
12
+ * TTS: openai (gpt-4o-mini-tts / tts-1), deepgram (Aura), elevenlabs, edge (free, local)
13
+ *
14
+ * Edge TTS: Uses Microsoft Edge's neural TTS engine via the `edge-tts` CLI.
15
+ * Free, no API key, ~400 voices in 60+ languages. Auto-selects voice from
16
+ * language + gender params. Also used as automatic fallback when cloud providers fail.
17
+ * Install: `pip install edge-tts`
18
+ *
19
+ * Credential resolution order (same as email/image tools):
20
+ * 1. Agent vault (per-agent credentials — e.g. service "openai" key "key")
21
+ * 2. Environment variables (global fallback)
22
+ * 3. Edge TTS (automatic fallback — no credentials needed)
23
+ *
24
+ * Environment variables (fallback):
25
+ * OPENAI_API_KEY — openai provider (STT + TTS)
26
+ * DEEPGRAM_API_KEY — deepgram provider (STT + TTS)
27
+ * ELEVENLABS_API_KEY — elevenlabs provider (TTS)
28
+ */
29
+ import { readFileSync, writeFileSync, mkdirSync, statSync } from "node:fs";
30
+ import { resolve, dirname, extname } from "node:path";
31
+ import { execFile } from "node:child_process";
32
+ import { Type } from "@sinclair/typebox";
33
+ import { resolveAllowedPaths, assertPathAllowed } from "./path-sandbox.js";
34
+ // ─── Constants ───
35
+ const MAX_AUDIO_SIZE = 25 * 1024 * 1024; // 25 MB (OpenAI Whisper limit)
36
+ const DEFAULT_TIMEOUT = 120_000; // 2 min for audio processing
37
+ // ─── Helpers ───
38
+ function requireEnv(key) {
39
+ const val = process.env[key];
40
+ if (!val)
41
+ throw new Error(`Missing environment variable: ${key}. Set it before using this tool.`);
42
+ return val;
43
+ }
44
+ /** Build a FormData-like multipart body for fetch (Node 18+). */
45
+ function audioFormData(fileBuffer, filename, fields) {
46
+ const form = new FormData();
47
+ const blob = new Blob([new Uint8Array(fileBuffer)], { type: mimeFromExt(extname(filename)) });
48
+ form.append("file", blob, filename);
49
+ for (const [k, v] of Object.entries(fields)) {
50
+ form.append(k, v);
51
+ }
52
+ return { body: form };
53
+ }
54
+ function mimeFromExt(ext) {
55
+ const map = {
56
+ ".mp3": "audio/mpeg",
57
+ ".wav": "audio/wav",
58
+ ".flac": "audio/flac",
59
+ ".ogg": "audio/ogg",
60
+ ".m4a": "audio/mp4",
61
+ ".webm": "audio/webm",
62
+ ".mp4": "audio/mp4",
63
+ ".mpeg": "audio/mpeg",
64
+ ".mpga": "audio/mpeg",
65
+ };
66
+ return map[ext.toLowerCase()] ?? "application/octet-stream";
67
+ }
68
+ // ─── Tool: audio_transcribe ───
69
+ const AudioTranscribeSchema = Type.Object({
70
+ path: Type.String({ description: "Path to the audio file to transcribe (mp3, wav, flac, ogg, m4a, webm)" }),
71
+ provider: Type.Optional(Type.Union([
72
+ Type.Literal("openai"),
73
+ Type.Literal("deepgram"),
74
+ ], { description: "STT provider (default: openai)" })),
75
+ model: Type.Optional(Type.String({ description: "Model name. OpenAI: 'whisper-1' (default). Deepgram: 'nova-3' (default)." })),
76
+ language: Type.Optional(Type.String({ description: "ISO 639-1 language code (e.g. 'en', 'it', 'es'). Helps accuracy." })),
77
+ prompt: Type.Optional(Type.String({ description: "Optional context/prompt to guide transcription (OpenAI only)" })),
78
+ });
79
+ function createTranscribeTool(cwd, sandbox, vault) {
80
+ return {
81
+ name: "audio_transcribe",
82
+ label: "Transcribe Audio",
83
+ description: "Transcribe an audio file to text using speech-to-text AI. " +
84
+ "Supports mp3, wav, flac, ogg, m4a, webm formats. Max file size: 25 MB. " +
85
+ "Providers: openai (Whisper, default), deepgram (Nova). " +
86
+ "Credentials resolved from: agent vault > OPENAI_API_KEY or DEEPGRAM_API_KEY env var.",
87
+ parameters: AudioTranscribeSchema,
88
+ async execute(_id, params, signal) {
89
+ const filePath = resolve(cwd, params.path);
90
+ assertPathAllowed(filePath, sandbox, "audio_transcribe");
91
+ const provider = params.provider ?? "openai";
92
+ let fileBuffer;
93
+ try {
94
+ fileBuffer = readFileSync(filePath);
95
+ }
96
+ catch (err) {
97
+ return {
98
+ content: [{ type: "text", text: `Error reading audio file: ${err.message}` }],
99
+ details: { error: "file_read_error" },
100
+ };
101
+ }
102
+ if (fileBuffer.byteLength > MAX_AUDIO_SIZE) {
103
+ return {
104
+ content: [{ type: "text", text: `Audio file too large: ${(fileBuffer.byteLength / 1024 / 1024).toFixed(1)} MB (max ${MAX_AUDIO_SIZE / 1024 / 1024} MB)` }],
105
+ details: { error: "file_too_large", size: fileBuffer.byteLength },
106
+ };
107
+ }
108
+ try {
109
+ if (provider === "openai") {
110
+ return await transcribeOpenAI(filePath, fileBuffer, params, vault, signal);
111
+ }
112
+ else {
113
+ return await transcribeDeepgram(filePath, fileBuffer, params, vault, signal);
114
+ }
115
+ }
116
+ catch (err) {
117
+ return {
118
+ content: [{ type: "text", text: `Transcription error (${provider}): ${err.message}` }],
119
+ details: { provider, error: err.message },
120
+ };
121
+ }
122
+ },
123
+ };
124
+ }
125
+ async function transcribeOpenAI(filePath, fileBuffer, params, vault, signal) {
126
+ const apiKey = vault?.getKey("openai", "key") ?? requireEnv("OPENAI_API_KEY");
127
+ const model = params.model ?? "whisper-1";
128
+ const fields = { model };
129
+ if (params.language)
130
+ fields.language = params.language;
131
+ if (params.prompt)
132
+ fields.prompt = params.prompt;
133
+ fields.response_format = "verbose_json";
134
+ const { body } = audioFormData(fileBuffer, filePath.split("/").pop(), fields);
135
+ const controller = new AbortController();
136
+ const timer = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);
137
+ if (signal)
138
+ signal.addEventListener("abort", () => controller.abort(), { once: true });
139
+ const response = await fetch("https://api.openai.com/v1/audio/transcriptions", {
140
+ method: "POST",
141
+ headers: { Authorization: `Bearer ${apiKey}` },
142
+ body,
143
+ signal: controller.signal,
144
+ });
145
+ clearTimeout(timer);
146
+ if (!response.ok) {
147
+ const errText = await response.text();
148
+ throw new Error(`OpenAI API ${response.status}: ${errText}`);
149
+ }
150
+ const data = await response.json();
151
+ const info = [
152
+ `Language: ${data.language ?? "unknown"}`,
153
+ `Duration: ${data.duration ? `${data.duration.toFixed(1)}s` : "unknown"}`,
154
+ `Model: ${model}`,
155
+ ].join(" | ");
156
+ return {
157
+ content: [{ type: "text", text: `${info}\n\n${data.text}` }],
158
+ details: {
159
+ provider: "openai",
160
+ model,
161
+ language: data.language,
162
+ duration: data.duration,
163
+ textLength: data.text.length,
164
+ },
165
+ };
166
+ }
167
+ async function transcribeDeepgram(filePath, fileBuffer, params, vault, signal) {
168
+ const apiKey = vault?.getKey("deepgram", "key") ?? requireEnv("DEEPGRAM_API_KEY");
169
+ const model = params.model ?? "nova-3";
170
+ const queryParams = new URLSearchParams({
171
+ model,
172
+ smart_format: "true",
173
+ punctuate: "true",
174
+ });
175
+ if (params.language)
176
+ queryParams.set("language", params.language);
177
+ const controller = new AbortController();
178
+ const timer = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);
179
+ if (signal)
180
+ signal.addEventListener("abort", () => controller.abort(), { once: true });
181
+ const ext = extname(filePath).toLowerCase();
182
+ const mime = mimeFromExt(ext);
183
+ const response = await fetch(`https://api.deepgram.com/v1/listen?${queryParams}`, {
184
+ method: "POST",
185
+ headers: {
186
+ Authorization: `Token ${apiKey}`,
187
+ "Content-Type": mime,
188
+ },
189
+ body: new Uint8Array(fileBuffer),
190
+ signal: controller.signal,
191
+ });
192
+ clearTimeout(timer);
193
+ if (!response.ok) {
194
+ const errText = await response.text();
195
+ throw new Error(`Deepgram API ${response.status}: ${errText}`);
196
+ }
197
+ const data = await response.json();
198
+ const transcript = data.results?.channels?.[0]?.alternatives?.[0]?.transcript ?? "";
199
+ const confidence = data.results?.channels?.[0]?.alternatives?.[0]?.confidence;
200
+ const duration = data.metadata?.duration;
201
+ const info = [
202
+ `Confidence: ${confidence ? `${(confidence * 100).toFixed(1)}%` : "unknown"}`,
203
+ `Duration: ${duration ? `${duration.toFixed(1)}s` : "unknown"}`,
204
+ `Model: ${model}`,
205
+ ].join(" | ");
206
+ return {
207
+ content: [{ type: "text", text: `${info}\n\n${transcript}` }],
208
+ details: {
209
+ provider: "deepgram",
210
+ model,
211
+ confidence,
212
+ duration,
213
+ textLength: transcript.length,
214
+ },
215
+ };
216
+ }
217
+ // ─── Tool: audio_speak ───
218
+ const AudioSpeakSchema = Type.Object({
219
+ text: Type.String({ description: "Text to convert to speech" }),
220
+ path: Type.String({ description: "Output file path (e.g. 'output.mp3'). Format inferred from extension." }),
221
+ provider: Type.Optional(Type.Union([
222
+ Type.Literal("openai"),
223
+ Type.Literal("deepgram"),
224
+ Type.Literal("elevenlabs"),
225
+ Type.Literal("edge"),
226
+ ], { description: "TTS provider. 'openai' (default), 'deepgram', 'elevenlabs', or 'edge' (free, local Microsoft Edge TTS — no API key needed). If the chosen provider fails, edge-tts is tried as automatic fallback." })),
227
+ model: Type.Optional(Type.String({ description: "Model name. OpenAI: 'tts-1' (default), 'tts-1-hd', 'gpt-4o-mini-tts'. Deepgram: 'aura-2-en' (default). ElevenLabs: 'eleven_multilingual_v2' (default)." })),
228
+ voice: Type.Optional(Type.String({ description: "Voice name/ID. OpenAI: alloy, echo, fable, onyx, nova, shimmer (default: alloy). ElevenLabs: voice ID. Edge: full voice name like 'it-IT-DiegoNeural' (auto-selected from language+gender if omitted)." })),
229
+ language: Type.Optional(Type.String({ description: "ISO 639-1 language code (e.g. 'it', 'en', 'es'). Used by edge provider to select the right voice. Also useful for other providers with multilingual models." })),
230
+ gender: Type.Optional(Type.Union([
231
+ Type.Literal("male"),
232
+ Type.Literal("female"),
233
+ ], { description: "Voice gender preference. Used by edge provider to pick the right voice when no explicit voice is given. For other providers, choose the voice directly." })),
234
+ speed: Type.Optional(Type.Number({ description: "Playback speed 0.25-4.0 (OpenAI only, default: 1.0)" })),
235
+ instructions: Type.Optional(Type.String({ description: "Voice style instructions (OpenAI gpt-4o-mini-tts only, e.g. 'Speak in a cheerful tone')" })),
236
+ });
237
+ function createSpeakTool(cwd, sandbox, vault) {
238
+ return {
239
+ name: "audio_speak",
240
+ label: "Text to Speech",
241
+ description: "Generate speech audio from text using text-to-speech AI. " +
242
+ "Output format is inferred from file extension (mp3, wav, flac, opus, aac, pcm). " +
243
+ "Providers: openai (default), deepgram (Aura), elevenlabs, edge (free, no API key — Microsoft Edge neural voices). " +
244
+ "If the chosen provider fails (quota, auth, billing), edge-tts is tried automatically as fallback. " +
245
+ "Use 'language' (ISO 639-1) and 'gender' params to help select the right voice, especially for edge provider. " +
246
+ "Credentials resolved from: agent vault > OPENAI_API_KEY, DEEPGRAM_API_KEY, or ELEVENLABS_API_KEY env var.",
247
+ parameters: AudioSpeakSchema,
248
+ async execute(_id, params, signal) {
249
+ const filePath = resolve(cwd, params.path);
250
+ assertPathAllowed(filePath, sandbox, "audio_speak");
251
+ const provider = params.provider ?? "openai";
252
+ // Direct edge-tts request — no fallback needed
253
+ if (provider === "edge") {
254
+ try {
255
+ return await speakEdgeTts(filePath, params, signal);
256
+ }
257
+ catch (err) {
258
+ return {
259
+ content: [{ type: "text", text: `TTS error (edge): ${err.message}` }],
260
+ details: { provider: "edge", error: err.message },
261
+ };
262
+ }
263
+ }
264
+ // Cloud provider with edge-tts fallback
265
+ try {
266
+ if (provider === "openai") {
267
+ return await speakOpenAI(filePath, params, vault, signal);
268
+ }
269
+ else if (provider === "deepgram") {
270
+ return await speakDeepgram(filePath, params, vault, signal);
271
+ }
272
+ else {
273
+ return await speakElevenLabs(filePath, params, vault, signal);
274
+ }
275
+ }
276
+ catch (err) {
277
+ // Automatic fallback to edge-tts if available
278
+ if (edgeTtsAvailable()) {
279
+ try {
280
+ const result = await speakEdgeTts(filePath, params, signal);
281
+ // Prepend fallback notice
282
+ const notice = `[Fallback] ${provider} failed (${err.message}), used edge-tts instead.\n`;
283
+ return {
284
+ content: [{ type: "text", text: notice + result.content[0].text }],
285
+ details: { ...result.details, fallbackFrom: provider, fallbackReason: err.message },
286
+ };
287
+ }
288
+ catch (edgeErr) {
289
+ return {
290
+ content: [{ type: "text", text: `TTS error (${provider}): ${err.message}\nEdge-tts fallback also failed: ${edgeErr.message}` }],
291
+ details: { provider, error: err.message, edgeError: edgeErr.message },
292
+ };
293
+ }
294
+ }
295
+ return {
296
+ content: [{ type: "text", text: `TTS error (${provider}): ${err.message}` }],
297
+ details: { provider, error: err.message },
298
+ };
299
+ }
300
+ },
301
+ };
302
+ }
303
+ async function speakOpenAI(filePath, params, vault, signal) {
304
+ const apiKey = vault?.getKey("openai", "key") ?? requireEnv("OPENAI_API_KEY");
305
+ const model = params.model ?? "tts-1";
306
+ const voice = params.voice ?? "alloy";
307
+ const ext = extname(filePath).toLowerCase().replace(".", "");
308
+ const formatMap = {
309
+ mp3: "mp3", wav: "wav", flac: "flac", opus: "opus", aac: "aac", pcm: "pcm",
310
+ };
311
+ const responseFormat = formatMap[ext] ?? "mp3";
312
+ const body = {
313
+ model,
314
+ input: params.text,
315
+ voice,
316
+ response_format: responseFormat,
317
+ };
318
+ if (params.speed !== undefined)
319
+ body.speed = params.speed;
320
+ if (params.instructions)
321
+ body.instructions = params.instructions;
322
+ const controller = new AbortController();
323
+ const timer = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);
324
+ if (signal)
325
+ signal.addEventListener("abort", () => controller.abort(), { once: true });
326
+ const response = await fetch("https://api.openai.com/v1/audio/speech", {
327
+ method: "POST",
328
+ headers: {
329
+ Authorization: `Bearer ${apiKey}`,
330
+ "Content-Type": "application/json",
331
+ },
332
+ body: JSON.stringify(body),
333
+ signal: controller.signal,
334
+ });
335
+ clearTimeout(timer);
336
+ if (!response.ok) {
337
+ const errText = await response.text();
338
+ throw new Error(`OpenAI TTS API ${response.status}: ${errText}`);
339
+ }
340
+ const buffer = Buffer.from(await response.arrayBuffer());
341
+ mkdirSync(dirname(filePath), { recursive: true });
342
+ writeFileSync(filePath, buffer);
343
+ return {
344
+ content: [{ type: "text", text: `Speech audio saved: ${filePath} (${(buffer.byteLength / 1024).toFixed(1)} KB, ${responseFormat}, voice: ${voice}, model: ${model})` }],
345
+ details: {
346
+ provider: "openai",
347
+ model,
348
+ voice,
349
+ format: responseFormat,
350
+ path: filePath,
351
+ bytes: buffer.byteLength,
352
+ textLength: params.text.length,
353
+ },
354
+ };
355
+ }
356
+ async function speakDeepgram(filePath, params, vault, signal) {
357
+ const apiKey = vault?.getKey("deepgram", "key") ?? requireEnv("DEEPGRAM_API_KEY");
358
+ const model = params.model ?? "aura-2-en";
359
+ const controller = new AbortController();
360
+ const timer = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);
361
+ if (signal)
362
+ signal.addEventListener("abort", () => controller.abort(), { once: true });
363
+ const response = await fetch(`https://api.deepgram.com/v1/speak?model=${encodeURIComponent(model)}`, {
364
+ method: "POST",
365
+ headers: {
366
+ Authorization: `Token ${apiKey}`,
367
+ "Content-Type": "application/json",
368
+ },
369
+ body: JSON.stringify({ text: params.text }),
370
+ signal: controller.signal,
371
+ });
372
+ clearTimeout(timer);
373
+ if (!response.ok) {
374
+ const errText = await response.text();
375
+ throw new Error(`Deepgram TTS API ${response.status}: ${errText}`);
376
+ }
377
+ const buffer = Buffer.from(await response.arrayBuffer());
378
+ mkdirSync(dirname(filePath), { recursive: true });
379
+ writeFileSync(filePath, buffer);
380
+ return {
381
+ content: [{ type: "text", text: `Speech audio saved: ${filePath} (${(buffer.byteLength / 1024).toFixed(1)} KB, model: ${model})` }],
382
+ details: {
383
+ provider: "deepgram",
384
+ model,
385
+ format: "mp3",
386
+ path: filePath,
387
+ bytes: buffer.byteLength,
388
+ textLength: params.text.length,
389
+ },
390
+ };
391
+ }
392
+ async function speakElevenLabs(filePath, params, vault, signal) {
393
+ const apiKey = vault?.getKey("elevenlabs", "key") ?? requireEnv("ELEVENLABS_API_KEY");
394
+ const model = params.model ?? "eleven_multilingual_v2";
395
+ // ElevenLabs default voice: "Rachel" (21m00Tcm4TlvDq8ikWAM)
396
+ const voiceId = params.voice ?? "21m00Tcm4TlvDq8ikWAM";
397
+ const ext = extname(filePath).toLowerCase().replace(".", "");
398
+ const formatMap = {
399
+ mp3: "mp3_44100_128", wav: "pcm_44100", flac: "flac",
400
+ };
401
+ const outputFormat = formatMap[ext] ?? "mp3_44100_128";
402
+ const controller = new AbortController();
403
+ const timer = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);
404
+ if (signal)
405
+ signal.addEventListener("abort", () => controller.abort(), { once: true });
406
+ const response = await fetch(`https://api.elevenlabs.io/v1/text-to-speech/${voiceId}?output_format=${outputFormat}`, {
407
+ method: "POST",
408
+ headers: {
409
+ "xi-api-key": apiKey,
410
+ "Content-Type": "application/json",
411
+ },
412
+ body: JSON.stringify({
413
+ text: params.text,
414
+ model_id: model,
415
+ }),
416
+ signal: controller.signal,
417
+ });
418
+ clearTimeout(timer);
419
+ if (!response.ok) {
420
+ const errText = await response.text();
421
+ throw new Error(`ElevenLabs API ${response.status}: ${errText}`);
422
+ }
423
+ const buffer = Buffer.from(await response.arrayBuffer());
424
+ mkdirSync(dirname(filePath), { recursive: true });
425
+ writeFileSync(filePath, buffer);
426
+ return {
427
+ content: [{ type: "text", text: `Speech audio saved: ${filePath} (${(buffer.byteLength / 1024).toFixed(1)} KB, voice: ${voiceId}, model: ${model})` }],
428
+ details: {
429
+ provider: "elevenlabs",
430
+ model,
431
+ voiceId,
432
+ format: outputFormat,
433
+ path: filePath,
434
+ bytes: buffer.byteLength,
435
+ textLength: params.text.length,
436
+ },
437
+ };
438
+ }
439
+ // ─── Edge TTS (free, local CLI, automatic fallback) ───
440
+ /**
441
+ * Default Edge TTS voices per language+gender.
442
+ * Format: `${lang}-${region}-${name}Neural`
443
+ * Each entry: [female, male]. First match wins.
444
+ */
445
+ const EDGE_VOICES = {
446
+ "it": ["it-IT-ElsaNeural", "it-IT-DiegoNeural"],
447
+ "en": ["en-US-EmmaMultilingualNeural", "en-US-AndrewMultilingualNeural"],
448
+ "es": ["es-ES-ElviraNeural", "es-ES-AlvaroNeural"],
449
+ "fr": ["fr-FR-DeniseNeural", "fr-FR-HenriNeural"],
450
+ "de": ["de-DE-KatjaNeural", "de-DE-ConradNeural"],
451
+ "pt": ["pt-BR-FranciscaNeural", "pt-BR-AntonioNeural"],
452
+ "ja": ["ja-JP-NanamiNeural", "ja-JP-KeitaNeural"],
453
+ "zh": ["zh-CN-XiaoxiaoNeural", "zh-CN-YunxiNeural"],
454
+ "ko": ["ko-KR-SunHiNeural", "ko-KR-InJoonNeural"],
455
+ "ar": ["ar-SA-ZariyahNeural", "ar-SA-HamedNeural"],
456
+ "hi": ["hi-IN-SwaraNeural", "hi-IN-MadhurNeural"],
457
+ "ru": ["ru-RU-SvetlanaNeural", "ru-RU-DmitryNeural"],
458
+ "nl": ["nl-NL-ColetteNeural", "nl-NL-MaartenNeural"],
459
+ "pl": ["pl-PL-AgnieszkaNeural", "pl-PL-MarekNeural"],
460
+ "tr": ["tr-TR-EmelNeural", "tr-TR-AhmetNeural"],
461
+ "sv": ["sv-SE-SofieNeural", "sv-SE-MattiasNeural"],
462
+ };
463
+ /**
464
+ * Resolve the best Edge TTS voice for a given language and gender hint.
465
+ * Falls back to en-US if the language is unknown.
466
+ */
467
+ function resolveEdgeVoice(voice, language, gender) {
468
+ // If the agent passed an explicit voice name like "it-IT-DiegoNeural", use it directly
469
+ if (voice && voice.includes("-") && voice.endsWith("Neural"))
470
+ return voice;
471
+ const lang = (language ?? "en").toLowerCase().split("-")[0]; // "it-IT" → "it"
472
+ const pair = EDGE_VOICES[lang] ?? EDGE_VOICES["en"];
473
+ return gender === "male" ? pair[1] : pair[0]; // default female if no gender hint
474
+ }
475
+ /** Check if edge-tts CLI is available on the system. */
476
+ function isEdgeTtsAvailable() {
477
+ try {
478
+ const { execFileSync } = require("node:child_process");
479
+ execFileSync("edge-tts", ["--version"], { stdio: "pipe", timeout: 5000 });
480
+ return true;
481
+ }
482
+ catch {
483
+ return false;
484
+ }
485
+ }
486
+ // Cache the availability check
487
+ let _edgeTtsAvailable;
488
+ function edgeTtsAvailable() {
489
+ if (_edgeTtsAvailable === undefined)
490
+ _edgeTtsAvailable = isEdgeTtsAvailable();
491
+ return _edgeTtsAvailable;
492
+ }
493
+ async function speakEdgeTts(filePath, params, signal) {
494
+ if (!edgeTtsAvailable()) {
495
+ throw new Error("edge-tts CLI is not installed. Install it with: pip install edge-tts");
496
+ }
497
+ const voice = resolveEdgeVoice(params.voice, params.language, params.gender);
498
+ mkdirSync(dirname(filePath), { recursive: true });
499
+ // Determine rate from speed if present
500
+ const args = [
501
+ "--text", params.text,
502
+ "--voice", voice,
503
+ "--write-media", filePath,
504
+ ];
505
+ return new Promise((resolvePromise, reject) => {
506
+ const child = execFile("edge-tts", args, { timeout: DEFAULT_TIMEOUT }, (err, _stdout, stderr) => {
507
+ if (err) {
508
+ reject(new Error(`edge-tts failed: ${err.message}${stderr ? ` — ${stderr}` : ""}`));
509
+ return;
510
+ }
511
+ let bytes = 0;
512
+ try {
513
+ bytes = statSync(filePath).size;
514
+ }
515
+ catch { /* ignore */ }
516
+ resolvePromise({
517
+ content: [{ type: "text", text: `Speech audio saved: ${filePath} (${(bytes / 1024).toFixed(1)} KB, voice: ${voice}, provider: edge-tts)` }],
518
+ details: {
519
+ provider: "edge",
520
+ voice,
521
+ path: filePath,
522
+ bytes,
523
+ textLength: params.text.length,
524
+ },
525
+ });
526
+ });
527
+ if (signal) {
528
+ signal.addEventListener("abort", () => child.kill(), { once: true });
529
+ }
530
+ });
531
+ }
532
+ export const ALL_AUDIO_TOOL_NAMES = ["audio_transcribe", "audio_speak"];
533
+ /**
534
+ * Create audio tools for speech-to-text and text-to-speech.
535
+ *
536
+ * @param cwd - Working directory for resolving file paths
537
+ * @param allowedPaths - Sandbox paths for file validation
538
+ * @param allowedTools - Optional filter
539
+ * @param vault - Resolved vault credentials for credential resolution
540
+ */
541
+ export function createAudioTools(cwd, allowedPaths, allowedTools, vault) {
542
+ const sandbox = resolveAllowedPaths(cwd, allowedPaths);
543
+ const factories = {
544
+ audio_transcribe: () => createTranscribeTool(cwd, sandbox, vault),
545
+ audio_speak: () => createSpeakTool(cwd, sandbox, vault),
546
+ };
547
+ const names = allowedTools
548
+ ? ALL_AUDIO_TOOL_NAMES.filter(n => allowedTools.some(a => a.toLowerCase() === n))
549
+ : ALL_AUDIO_TOOL_NAMES;
550
+ return names.map(n => factories[n]());
551
+ }
552
+ //# sourceMappingURL=audio-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-tools.js","sourceRoot":"","sources":["../src/audio-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Browser automation tools powered by agent-browser.
3
+ *
4
+ * Uses the agent-browser CLI (https://github.com/vercel-labs/agent-browser)
5
+ * via child_process with --json output for structured results.
6
+ *
7
+ * The agent-browser CLI manages a daemon process that keeps the browser alive
8
+ * between commands, making sequential tool calls fast (no cold-start per command).
9
+ *
10
+ * Requires `agent-browser` to be installed globally or in PATH.
11
+ * Install: `npm install -g agent-browser && agent-browser install`
12
+ *
13
+ * Session isolation: Each agent gets its own browser session via --session flag,
14
+ * preventing cross-agent interference when multiple agents use browser tools.
15
+ */
16
+ import type { AgentTool } from "@mariozechner/pi-agent-core";
17
+ /**
18
+ * Cleanup an agent-browser session: close the session.
19
+ * Profile data is automatically persisted by agent-browser when --profile is used.
20
+ * Called by the engine on agent exit.
21
+ */
22
+ export declare function cleanupAgentBrowserSession(session: string): Promise<void>;
23
+ export type BrowserToolName = "browser_navigate" | "browser_snapshot" | "browser_click" | "browser_fill" | "browser_type" | "browser_press" | "browser_screenshot" | "browser_get" | "browser_select" | "browser_hover" | "browser_scroll" | "browser_wait" | "browser_eval" | "browser_close" | "browser_back" | "browser_forward" | "browser_reload" | "browser_tabs";
24
+ export declare const ALL_BROWSER_TOOL_NAMES: BrowserToolName[];
25
+ /**
26
+ * Create browser automation tools powered by agent-browser CLI.
27
+ *
28
+ * @param cwd - Working directory for resolving relative file paths (screenshots)
29
+ * @param session - Browser session name for isolation (default: agent name or "default")
30
+ * @param allowedTools - Optional filter: only include tools with these names
31
+ * @param profileDir - Persistent browser profile directory. Passed as --profile to agent-browser.
32
+ * Stores cookies, localStorage, auth state across sessions.
33
+ * Typically `.polpo/browser-profiles/<agent>/`.
34
+ */
35
+ export declare function createBrowserTools(cwd: string, session?: string, allowedTools?: string[], profileDir?: string): AgentTool<any>[];
36
+ //# sourceMappingURL=browser-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-tools.d.ts","sourceRoot":"","sources":["../src/browser-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,6BAA6B,CAAC;AAK9E;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU/E;AAgfD,MAAM,MAAM,eAAe,GACvB,kBAAkB,GAAG,kBAAkB,GAAG,eAAe,GAAG,cAAc,GAC1E,cAAc,GAAG,eAAe,GAAG,oBAAoB,GAAG,aAAa,GACvE,gBAAgB,GAAG,eAAe,GAAG,gBAAgB,GAAG,cAAc,GACtE,cAAc,GAAG,eAAe,GAAG,cAAc,GAAG,iBAAiB,GACrE,gBAAgB,GAAG,cAAc,CAAC;AAEtC,eAAO,MAAM,sBAAsB,EAAE,eAAe,EAMnD,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAkB,EAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,UAAU,CAAC,EAAE,MAAM,GAClB,SAAS,CAAC,GAAG,CAAC,EAAE,CA2BlB"}