@moureau/pipeflow 0.0.1
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.
- package/LICENSE +201 -0
- package/README.md +833 -0
- package/dist/cjs/agents/agent.js +2 -0
- package/dist/cjs/agents/agent.js.map +7 -0
- package/dist/cjs/agents/index.js +2 -0
- package/dist/cjs/agents/index.js.map +7 -0
- package/dist/cjs/agents/tools/index.js +2 -0
- package/dist/cjs/agents/tools/index.js.map +7 -0
- package/dist/cjs/agents/tools/tools.js +2 -0
- package/dist/cjs/agents/tools/tools.js.map +7 -0
- package/dist/cjs/conversations/conversation/conversation.js +2 -0
- package/dist/cjs/conversations/conversation/conversation.js.map +7 -0
- package/dist/cjs/conversations/conversation/index.js +2 -0
- package/dist/cjs/conversations/conversation/index.js.map +7 -0
- package/dist/cjs/conversations/conversations.js +2 -0
- package/dist/cjs/conversations/conversations.js.map +7 -0
- package/dist/cjs/conversations/index.js +2 -0
- package/dist/cjs/conversations/index.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/index.js +2 -0
- package/dist/cjs/conversations/orchestration/orchestrator/index.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/orchestrator.js +3 -0
- package/dist/cjs/conversations/orchestration/orchestrator/orchestrator.js.map +7 -0
- package/dist/cjs/conversations/transcription/index.js +2 -0
- package/dist/cjs/conversations/transcription/index.js.map +7 -0
- package/dist/cjs/conversations/transcription/transcription.js +2 -0
- package/dist/cjs/conversations/transcription/transcription.js.map +7 -0
- package/dist/cjs/conversations/types.js +2 -0
- package/dist/cjs/conversations/types.js.map +7 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/persistence/adapters/index.js +2 -0
- package/dist/cjs/persistence/adapters/index.js.map +7 -0
- package/dist/cjs/persistence/adapters/memory/index.js +2 -0
- package/dist/cjs/persistence/adapters/memory/index.js.map +7 -0
- package/dist/cjs/persistence/adapters/memory/memory.js +2 -0
- package/dist/cjs/persistence/adapters/memory/memory.js.map +7 -0
- package/dist/cjs/persistence/adapters/sqlite/index.js +2 -0
- package/dist/cjs/persistence/adapters/sqlite/index.js.map +7 -0
- package/dist/cjs/persistence/adapters/sqlite/sqlite.js +58 -0
- package/dist/cjs/persistence/adapters/sqlite/sqlite.js.map +7 -0
- package/dist/cjs/persistence/index.js +2 -0
- package/dist/cjs/persistence/index.js.map +7 -0
- package/dist/cjs/persistence/persistence.js +2 -0
- package/dist/cjs/persistence/persistence.js.map +7 -0
- package/dist/cjs/providers/index.js +2 -0
- package/dist/cjs/providers/index.js.map +7 -0
- package/dist/cjs/providers/llm/adapters/deepseek/deepseek.js +2 -0
- package/dist/cjs/providers/llm/adapters/deepseek/deepseek.js.map +7 -0
- package/dist/cjs/providers/llm/adapters/deepseek/index.js +2 -0
- package/dist/cjs/providers/llm/adapters/deepseek/index.js.map +7 -0
- package/dist/cjs/providers/llm/adapters/index.js +2 -0
- package/dist/cjs/providers/llm/adapters/index.js.map +7 -0
- package/dist/cjs/providers/llm/index.js +2 -0
- package/dist/cjs/providers/llm/index.js.map +7 -0
- package/dist/cjs/providers/llm/types.js +2 -0
- package/dist/cjs/providers/llm/types.js.map +7 -0
- package/dist/cjs/providers/shared.js +2 -0
- package/dist/cjs/providers/shared.js.map +7 -0
- package/dist/cjs/providers/stt/adapters/deepgram/deepgram.js +2 -0
- package/dist/cjs/providers/stt/adapters/deepgram/deepgram.js.map +7 -0
- package/dist/cjs/providers/stt/adapters/deepgram/index.js +2 -0
- package/dist/cjs/providers/stt/adapters/deepgram/index.js.map +7 -0
- package/dist/cjs/providers/stt/adapters/index.js +2 -0
- package/dist/cjs/providers/stt/adapters/index.js.map +7 -0
- package/dist/cjs/providers/stt/index.js +2 -0
- package/dist/cjs/providers/stt/index.js.map +7 -0
- package/dist/cjs/providers/stt/types.js +2 -0
- package/dist/cjs/providers/stt/types.js.map +7 -0
- package/dist/cjs/providers/tts/adapters/index.js +2 -0
- package/dist/cjs/providers/tts/adapters/index.js.map +7 -0
- package/dist/cjs/providers/tts/adapters/kokoro/index.js +2 -0
- package/dist/cjs/providers/tts/adapters/kokoro/index.js.map +7 -0
- package/dist/cjs/providers/tts/adapters/kokoro/kokoro.js +2 -0
- package/dist/cjs/providers/tts/adapters/kokoro/kokoro.js.map +7 -0
- package/dist/cjs/providers/tts/index.js +2 -0
- package/dist/cjs/providers/tts/index.js.map +7 -0
- package/dist/cjs/providers/tts/types.js +2 -0
- package/dist/cjs/providers/tts/types.js.map +7 -0
- package/dist/cjs/transport/adapters/index.js +2 -0
- package/dist/cjs/transport/adapters/index.js.map +7 -0
- package/dist/cjs/transport/adapters/memory/index.js +2 -0
- package/dist/cjs/transport/adapters/memory/index.js.map +7 -0
- package/dist/cjs/transport/adapters/memory/memory.js +2 -0
- package/dist/cjs/transport/adapters/memory/memory.js.map +7 -0
- package/dist/cjs/transport/index.js +2 -0
- package/dist/cjs/transport/index.js.map +7 -0
- package/dist/cjs/transport/types.js +2 -0
- package/dist/cjs/transport/types.js.map +7 -0
- package/dist/esm/agents/agent.js +2 -0
- package/dist/esm/agents/agent.js.map +7 -0
- package/dist/esm/agents/index.js +2 -0
- package/dist/esm/agents/index.js.map +7 -0
- package/dist/esm/agents/tools/index.js +2 -0
- package/dist/esm/agents/tools/index.js.map +7 -0
- package/dist/esm/agents/tools/tools.js +2 -0
- package/dist/esm/agents/tools/tools.js.map +7 -0
- package/dist/esm/conversations/conversation/conversation.js +2 -0
- package/dist/esm/conversations/conversation/conversation.js.map +7 -0
- package/dist/esm/conversations/conversation/index.js +2 -0
- package/dist/esm/conversations/conversation/index.js.map +7 -0
- package/dist/esm/conversations/conversations.js +2 -0
- package/dist/esm/conversations/conversations.js.map +7 -0
- package/dist/esm/conversations/index.js +2 -0
- package/dist/esm/conversations/index.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/index.js +2 -0
- package/dist/esm/conversations/orchestration/orchestrator/index.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/orchestrator.js +3 -0
- package/dist/esm/conversations/orchestration/orchestrator/orchestrator.js.map +7 -0
- package/dist/esm/conversations/transcription/index.js +2 -0
- package/dist/esm/conversations/transcription/index.js.map +7 -0
- package/dist/esm/conversations/transcription/transcription.js +2 -0
- package/dist/esm/conversations/transcription/transcription.js.map +7 -0
- package/dist/esm/conversations/types.js +2 -0
- package/dist/esm/conversations/types.js.map +7 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +7 -0
- package/dist/esm/persistence/adapters/index.js +2 -0
- package/dist/esm/persistence/adapters/index.js.map +7 -0
- package/dist/esm/persistence/adapters/memory/index.js +2 -0
- package/dist/esm/persistence/adapters/memory/index.js.map +7 -0
- package/dist/esm/persistence/adapters/memory/memory.js +2 -0
- package/dist/esm/persistence/adapters/memory/memory.js.map +7 -0
- package/dist/esm/persistence/adapters/sqlite/index.js +2 -0
- package/dist/esm/persistence/adapters/sqlite/index.js.map +7 -0
- package/dist/esm/persistence/adapters/sqlite/sqlite.js +58 -0
- package/dist/esm/persistence/adapters/sqlite/sqlite.js.map +7 -0
- package/dist/esm/persistence/index.js +2 -0
- package/dist/esm/persistence/index.js.map +7 -0
- package/dist/esm/persistence/persistence.js +1 -0
- package/dist/esm/persistence/persistence.js.map +7 -0
- package/dist/esm/providers/index.js +2 -0
- package/dist/esm/providers/index.js.map +7 -0
- package/dist/esm/providers/llm/adapters/deepseek/deepseek.js +2 -0
- package/dist/esm/providers/llm/adapters/deepseek/deepseek.js.map +7 -0
- package/dist/esm/providers/llm/adapters/deepseek/index.js +2 -0
- package/dist/esm/providers/llm/adapters/deepseek/index.js.map +7 -0
- package/dist/esm/providers/llm/adapters/index.js +2 -0
- package/dist/esm/providers/llm/adapters/index.js.map +7 -0
- package/dist/esm/providers/llm/index.js +2 -0
- package/dist/esm/providers/llm/index.js.map +7 -0
- package/dist/esm/providers/llm/types.js +1 -0
- package/dist/esm/providers/llm/types.js.map +7 -0
- package/dist/esm/providers/shared.js +1 -0
- package/dist/esm/providers/shared.js.map +7 -0
- package/dist/esm/providers/stt/adapters/deepgram/deepgram.js +2 -0
- package/dist/esm/providers/stt/adapters/deepgram/deepgram.js.map +7 -0
- package/dist/esm/providers/stt/adapters/deepgram/index.js +2 -0
- package/dist/esm/providers/stt/adapters/deepgram/index.js.map +7 -0
- package/dist/esm/providers/stt/adapters/index.js +2 -0
- package/dist/esm/providers/stt/adapters/index.js.map +7 -0
- package/dist/esm/providers/stt/index.js +2 -0
- package/dist/esm/providers/stt/index.js.map +7 -0
- package/dist/esm/providers/stt/types.js +1 -0
- package/dist/esm/providers/stt/types.js.map +7 -0
- package/dist/esm/providers/tts/adapters/index.js +2 -0
- package/dist/esm/providers/tts/adapters/index.js.map +7 -0
- package/dist/esm/providers/tts/adapters/kokoro/index.js +2 -0
- package/dist/esm/providers/tts/adapters/kokoro/index.js.map +7 -0
- package/dist/esm/providers/tts/adapters/kokoro/kokoro.js +2 -0
- package/dist/esm/providers/tts/adapters/kokoro/kokoro.js.map +7 -0
- package/dist/esm/providers/tts/index.js +2 -0
- package/dist/esm/providers/tts/index.js.map +7 -0
- package/dist/esm/providers/tts/types.js +1 -0
- package/dist/esm/providers/tts/types.js.map +7 -0
- package/dist/esm/transport/adapters/index.js +2 -0
- package/dist/esm/transport/adapters/index.js.map +7 -0
- package/dist/esm/transport/adapters/memory/index.js +2 -0
- package/dist/esm/transport/adapters/memory/index.js.map +7 -0
- package/dist/esm/transport/adapters/memory/memory.js +2 -0
- package/dist/esm/transport/adapters/memory/memory.js.map +7 -0
- package/dist/esm/transport/index.js +2 -0
- package/dist/esm/transport/index.js.map +7 -0
- package/dist/esm/transport/types.js +1 -0
- package/dist/esm/transport/types.js.map +7 -0
- package/dist/types/agents/agent.d.ts +60 -0
- package/dist/types/agents/index.d.ts +4 -0
- package/dist/types/agents/tools/index.d.ts +2 -0
- package/dist/types/agents/tools/tools.d.ts +22 -0
- package/dist/types/conversations/conversation/conversation.d.ts +138 -0
- package/dist/types/conversations/conversation/index.d.ts +2 -0
- package/dist/types/conversations/conversations.d.ts +23 -0
- package/dist/types/conversations/index.d.ts +10 -0
- package/dist/types/conversations/orchestration/orchestrator/index.d.ts +2 -0
- package/dist/types/conversations/orchestration/orchestrator/orchestrator.d.ts +98 -0
- package/dist/types/conversations/transcription/index.d.ts +2 -0
- package/dist/types/conversations/transcription/transcription.d.ts +59 -0
- package/dist/types/conversations/types.d.ts +63 -0
- package/dist/types/index.d.ts +45 -0
- package/dist/types/persistence/adapters/index.d.ts +2 -0
- package/dist/types/persistence/adapters/memory/index.d.ts +1 -0
- package/dist/types/persistence/adapters/memory/memory.d.ts +27 -0
- package/dist/types/persistence/adapters/sqlite/index.d.ts +2 -0
- package/dist/types/persistence/adapters/sqlite/sqlite.d.ts +31 -0
- package/dist/types/persistence/index.d.ts +2 -0
- package/dist/types/persistence/persistence.d.ts +38 -0
- package/dist/types/providers/index.d.ts +6 -0
- package/dist/types/providers/llm/adapters/deepseek/deepseek.d.ts +24 -0
- package/dist/types/providers/llm/adapters/deepseek/index.d.ts +2 -0
- package/dist/types/providers/llm/adapters/index.d.ts +1 -0
- package/dist/types/providers/llm/index.d.ts +10 -0
- package/dist/types/providers/llm/types.d.ts +55 -0
- package/dist/types/providers/shared.d.ts +8 -0
- package/dist/types/providers/stt/adapters/deepgram/deepgram.d.ts +57 -0
- package/dist/types/providers/stt/adapters/deepgram/index.d.ts +2 -0
- package/dist/types/providers/stt/adapters/index.d.ts +1 -0
- package/dist/types/providers/stt/index.d.ts +2 -0
- package/dist/types/providers/stt/types.d.ts +30 -0
- package/dist/types/providers/tts/adapters/index.d.ts +1 -0
- package/dist/types/providers/tts/adapters/kokoro/index.d.ts +2 -0
- package/dist/types/providers/tts/adapters/kokoro/kokoro.d.ts +34 -0
- package/dist/types/providers/tts/index.d.ts +2 -0
- package/dist/types/providers/tts/types.d.ts +16 -0
- package/dist/types/transport/adapters/index.d.ts +1 -0
- package/dist/types/transport/adapters/memory/index.d.ts +1 -0
- package/dist/types/transport/adapters/memory/memory.d.ts +20 -0
- package/dist/types/transport/index.d.ts +2 -0
- package/dist/types/transport/types.d.ts +49 -0
- package/package.json +82 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/persistence/adapters/sqlite/sqlite.ts"],
|
|
4
|
+
"sourcesContent": ["import { Database } from \"bun:sqlite\";\nimport type {\n ConversationId,\n Generation,\n Participant,\n Turn,\n UserId,\n} from \"../../../conversations/types\";\nimport { TranscriptEntry } from \"../../../conversations/transcription/transcription\";\nimport type {\n ConversationRecord,\n NewConversation,\n Persistence,\n} from \"../../persistence\";\n\nexport interface SQLitePersistenceOptions {\n /** Database filename. Defaults to an in-memory database. */\n filename?: string;\n}\n\ninterface ConversationRow {\n id: string;\n agent_names: string;\n created_at: number;\n ended_at: number | null;\n}\n\ninterface ParticipantRow {\n conversation_id: string;\n user_id: string;\n aliases: string;\n joined_at: number;\n}\n\ninterface TranscriptRow {\n id: string;\n conversation_id: string;\n speaker: string;\n speaker_kind: string;\n text: string;\n timestamp: number;\n sequence: number;\n}\n\ninterface TurnRow {\n id: string;\n conversation_id: string;\n participant_id: string;\n participant_name: string;\n text: string;\n started_at: number;\n ended_at: number;\n sequence: number;\n}\n\ninterface GenerationRow {\n id: string;\n conversation_id: string;\n agent_name: string;\n text: string;\n status: string;\n started_at: number;\n ended_at: number | null;\n}\n\n/**\n * SQLite-backed persistence adapter (via bun:sqlite).\n *\n * A lightweight persistent backend for local applications and early\n * deployments.\n */\nexport class SQLitePersistence implements Persistence {\n private readonly db: Database;\n\n constructor(options: SQLitePersistenceOptions = {}) {\n this.db = new Database(options.filename ?? \":memory:\");\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS conversations (\n id TEXT PRIMARY KEY,\n agent_names TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n ended_at INTEGER\n );\n\n CREATE TABLE IF NOT EXISTS participants (\n conversation_id TEXT NOT NULL,\n user_id TEXT NOT NULL,\n aliases TEXT NOT NULL,\n joined_at INTEGER NOT NULL,\n PRIMARY KEY (conversation_id, user_id)\n );\n\n CREATE TABLE IF NOT EXISTS transcript (\n id TEXT PRIMARY KEY,\n conversation_id TEXT NOT NULL,\n speaker TEXT NOT NULL,\n speaker_kind TEXT NOT NULL,\n text TEXT NOT NULL,\n timestamp INTEGER NOT NULL,\n sequence INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS turns (\n id TEXT PRIMARY KEY,\n conversation_id TEXT NOT NULL,\n participant_id TEXT NOT NULL,\n participant_name TEXT NOT NULL,\n text TEXT NOT NULL,\n started_at INTEGER NOT NULL,\n ended_at INTEGER NOT NULL,\n sequence INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS generations (\n id TEXT PRIMARY KEY,\n conversation_id TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n text TEXT NOT NULL,\n status TEXT NOT NULL,\n started_at INTEGER NOT NULL,\n ended_at INTEGER\n );\n\n CREATE INDEX IF NOT EXISTS idx_participants_conversation ON participants (conversation_id);\n CREATE INDEX IF NOT EXISTS idx_transcript_conversation ON transcript (conversation_id);\n CREATE INDEX IF NOT EXISTS idx_turns_conversation ON turns (conversation_id);\n CREATE INDEX IF NOT EXISTS idx_generations_conversation ON generations (conversation_id);\n `);\n }\n\n close(): void {\n this.db.close();\n }\n\n async createConversation(input: NewConversation = {}): Promise<ConversationRecord> {\n const record: ConversationRecord = {\n id: input.id ?? crypto.randomUUID(),\n agentNames: input.agentNames ?? [],\n createdAt: input.createdAt ?? Date.now(),\n endedAt: null,\n };\n this.db\n .query(\n `INSERT OR REPLACE INTO conversations (id, agent_names, created_at, ended_at)\n VALUES (?, ?, ?, ?)`,\n )\n .run(record.id, JSON.stringify(record.agentNames), record.createdAt, null);\n return { ...record };\n }\n\n async getConversation(id: ConversationId): Promise<ConversationRecord | null> {\n const row = this.db\n .query<ConversationRow, [string]>(`SELECT * FROM conversations WHERE id = ?`)\n .get(id);\n return row ? rowToConversation(row) : null;\n }\n\n async listConversations(): Promise<ConversationRecord[]> {\n const rows = this.db\n .query<ConversationRow, []>(`SELECT * FROM conversations ORDER BY created_at ASC`)\n .all();\n return rows.map(rowToConversation);\n }\n\n async finalizeConversation(\n id: ConversationId,\n endedAt = Date.now(),\n ): Promise<ConversationRecord | null> {\n const result = this.db\n .query<unknown, [number, string]>(`UPDATE conversations SET ended_at = ? WHERE id = ?`)\n .run(endedAt, id);\n if (result.changes === 0) return null;\n return this.getConversation(id);\n }\n\n async deleteConversation(id: ConversationId): Promise<boolean> {\n const conversation = this.db\n .query<ConversationRow, [string]>(`SELECT id FROM conversations WHERE id = ?`)\n .get(id);\n if (!conversation) return false;\n this.db.query(`DELETE FROM participants WHERE conversation_id = ?`).run(id);\n this.db.query(`DELETE FROM transcript WHERE conversation_id = ?`).run(id);\n this.db.query(`DELETE FROM turns WHERE conversation_id = ?`).run(id);\n this.db.query(`DELETE FROM generations WHERE conversation_id = ?`).run(id);\n this.db.query(`DELETE FROM conversations WHERE id = ?`).run(id);\n return true;\n }\n\n async addParticipant(\n conversationId: ConversationId,\n participant: Participant,\n ): Promise<void> {\n this.db\n .query(\n `INSERT OR REPLACE INTO participants (conversation_id, user_id, aliases, joined_at)\n VALUES (?, ?, ?, ?)`,\n )\n .run(\n conversationId,\n participant.userId,\n JSON.stringify(participant.aliases),\n participant.joinedAt,\n );\n }\n\n async listParticipants(conversationId: ConversationId): Promise<Participant[]> {\n const rows = this.db\n .query<ParticipantRow, [string]>(\n `SELECT * FROM participants WHERE conversation_id = ? ORDER BY joined_at ASC`,\n )\n .all(conversationId);\n return rows.map((row) => ({\n userId: row.user_id,\n aliases: JSON.parse(row.aliases) as string[],\n joinedAt: row.joined_at,\n }));\n }\n\n async appendTranscript(\n conversationId: ConversationId,\n entry: TranscriptEntry,\n ): Promise<void> {\n this.db\n .query(\n `INSERT OR REPLACE INTO transcript (id, conversation_id, speaker, speaker_kind, text, timestamp, sequence)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n entry.id,\n conversationId,\n entry.speaker,\n entry.speakerKind,\n entry.text,\n entry.timestamp,\n entry.sequence,\n );\n }\n\n async listTranscript(conversationId: ConversationId): Promise<TranscriptEntry[]> {\n const rows = this.db\n .query<TranscriptRow, [string]>(\n `SELECT * FROM transcript WHERE conversation_id = ? ORDER BY sequence ASC`,\n )\n .all(conversationId);\n return rows.map((row) =>\n TranscriptEntry.fromPlain({\n id: row.id,\n conversationId: row.conversation_id,\n speaker: row.speaker,\n speakerKind: row.speaker_kind as TranscriptEntry[\"speakerKind\"],\n text: row.text,\n timestamp: row.timestamp,\n sequence: row.sequence,\n }),\n );\n }\n\n async appendTurn(conversationId: ConversationId, turn: Turn): Promise<void> {\n this.db\n .query(\n `INSERT OR REPLACE INTO turns (id, conversation_id, participant_id, participant_name, text, started_at, ended_at, sequence)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n turn.id,\n conversationId,\n turn.participantId,\n turn.participantName,\n turn.text,\n turn.startedAt,\n turn.endedAt,\n turn.sequence,\n );\n }\n\n async listTurns(conversationId: ConversationId): Promise<Turn[]> {\n const rows = this.db\n .query<TurnRow, [string]>(\n `SELECT * FROM turns WHERE conversation_id = ? ORDER BY sequence ASC`,\n )\n .all(conversationId);\n return rows.map((row) => ({\n id: row.id,\n conversationId: row.conversation_id,\n participantId: row.participant_id,\n participantName: row.participant_name,\n text: row.text,\n startedAt: row.started_at,\n endedAt: row.ended_at,\n sequence: row.sequence,\n }));\n }\n\n async appendGeneration(\n conversationId: ConversationId,\n generation: Generation,\n ): Promise<void> {\n this.db\n .query(\n `INSERT OR REPLACE INTO generations (id, conversation_id, agent_name, text, status, started_at, ended_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n generation.id,\n conversationId,\n generation.agentName,\n generation.text,\n generation.status,\n generation.startedAt,\n generation.endedAt ?? null,\n );\n }\n\n async listGenerations(conversationId: ConversationId): Promise<Generation[]> {\n const rows = this.db\n .query<GenerationRow, [string]>(\n `SELECT * FROM generations WHERE conversation_id = ? ORDER BY started_at ASC`,\n )\n .all(conversationId);\n return rows.map((row) => ({\n id: row.id,\n conversationId: row.conversation_id,\n agentName: row.agent_name,\n text: row.text,\n status: row.status as Generation[\"status\"],\n startedAt: row.started_at,\n endedAt: row.ended_at ?? undefined,\n }));\n }\n}\n\nfunction rowToConversation(row: ConversationRow): ConversationRecord {\n return {\n id: row.id,\n agentNames: JSON.parse(row.agent_names) as string[],\n createdAt: row.created_at,\n endedAt: row.ended_at,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["sqlite_exports", "__export", "SQLitePersistence", "__toCommonJS", "import_bun_sqlite", "import_transcription", "SQLitePersistence", "__name", "options", "input", "record", "id", "row", "rowToConversation", "endedAt", "conversationId", "participant", "entry", "turn", "generation"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var P=(r,e)=>{for(var s in e)n(r,s,{get:e[s],enumerable:!0})},a=(r,e,s,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of p(e))!m.call(r,o)&&o!==s&&n(r,o,{get:()=>e[o],enumerable:!(i=c(e,o))||i.enumerable});return r};var f=r=>a(n({},"__esModule",{value:!0}),r);var v={};P(v,{MemoryPersistence:()=>t.MemoryPersistence,SQLitePersistence:()=>t.SQLitePersistence});module.exports=f(v);var t=require("./adapters/index.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/persistence/index.ts"],
|
|
4
|
+
"sourcesContent": ["export type {\n ConversationRecord,\n NewConversation,\n Persistence,\n} from \"./persistence\";\nexport { MemoryPersistence, SQLitePersistence } from \"./adapters/index\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sGAAAE,EAAAF,GAKA,IAAAG,EAAqD",
|
|
6
|
+
"names": ["persistence_exports", "__export", "__toCommonJS", "import_adapters"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var i=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var v=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of s(n))!d.call(e,o)&&o!==t&&i(e,o,{get:()=>n[o],enumerable:!(r=a(n,o))||r.enumerable});return e};var c=e=>v(i({},"__esModule",{value:!0}),e);var p={};module.exports=c(p);
|
|
2
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/persistence/persistence.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\n ConversationId,\n Generation,\n Participant,\n Turn,\n UserId,\n} from \"../conversations/types\";\nimport type { TranscriptEntry } from \"../conversations/transcription/transcription\";\n\nexport interface ConversationRecord {\n id: ConversationId;\n agentNames: string[];\n createdAt: number;\n endedAt: number | null;\n}\n\nexport interface NewConversation {\n id?: ConversationId;\n agentNames?: string[];\n createdAt?: number;\n}\n\n/**\n * Storage contract for the conversation domain.\n *\n * Persistence is provider-independent: memory and SQLite are the built-in\n * adapters, and other backends can implement the same interface.\n */\nexport interface Persistence {\n // Conversations -----------------------------------------------------------\n\n createConversation(input?: NewConversation): Promise<ConversationRecord>;\n getConversation(id: ConversationId): Promise<ConversationRecord | null>;\n listConversations(): Promise<ConversationRecord[]>;\n /** Mark a conversation as ended. Returns null if it does not exist. */\n finalizeConversation(\n id: ConversationId,\n endedAt?: number,\n ): Promise<ConversationRecord | null>;\n deleteConversation(id: ConversationId): Promise<boolean>;\n\n // Participants ------------------------------------------------------------\n\n addParticipant(\n conversationId: ConversationId,\n participant: Participant,\n ): Promise<void>;\n listParticipants(conversationId: ConversationId): Promise<Participant[]>;\n\n // Transcript --------------------------------------------------------------\n\n /** Upsert a transcript entry (entries are immutable in practice). */\n appendTranscript(\n conversationId: ConversationId,\n entry: TranscriptEntry,\n ): Promise<void>;\n listTranscript(conversationId: ConversationId): Promise<TranscriptEntry[]>;\n\n // Turns -------------------------------------------------------------------\n\n appendTurn(conversationId: ConversationId, turn: Turn): Promise<void>;\n listTurns(conversationId: ConversationId): Promise<Turn[]>;\n\n // Generations -------------------------------------------------------------\n\n /** Upsert a generation so status updates (e.g. completed) overwrite. */\n appendGeneration(\n conversationId: ConversationId,\n generation: Generation,\n ): Promise<void>;\n listGenerations(conversationId: ConversationId): Promise<Generation[]>;\n}\n\n// Re-exported for convenience in adapters and callers.\nexport type { ConversationId, UserId };\n"],
|
|
5
|
+
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
|
+
"names": ["persistence_exports", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var i=(o,e)=>{for(var L in e)r(o,L,{get:e[L],enumerable:!0})},l=(o,e,L,p)=>{if(e&&typeof e=="object"||typeof e=="function")for(let T of M(e))!S.call(o,T)&&T!==L&&r(o,T,{get:()=>e[T],enumerable:!(p=x(e,T))||p.enumerable});return o};var n=o=>l(r({},"__esModule",{value:!0}),o);var f={};i(f,{DeepSeekLLM:()=>t.DeepSeekLLM,DeepgramSTT:()=>m.DeepgramSTT,KokoroTTS:()=>s.KokoroTTS,complete:()=>t.complete,streamText:()=>t.streamText});module.exports=n(f);var t=require("./llm/index.js"),m=require("./stt/index.js"),s=require("./tts/index.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/providers/index.ts"],
|
|
4
|
+
"sourcesContent": ["export type { LLM, LLMEvent, LLMMessage, LLMRole, LLMToolCall, LLMToolDefinition, LLMRequest } from \"./llm/index\";\nexport type { STT, STTOptions, STTSession } from \"./stt/index\";\nexport type { TTS, TTSRequest } from \"./tts/index\";\n\nexport { complete, streamText, DeepSeekLLM } from \"./llm/index\";\nexport { DeepgramSTT } from \"./stt/index\";\nexport { KokoroTTS } from \"./tts/index\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4JAAAE,EAAAF,GAIA,IAAAG,EAAkD,uBAClDC,EAA4B,uBAC5BC,EAA0B",
|
|
6
|
+
"names": ["providers_exports", "__export", "__toCommonJS", "import_llm", "import_stt", "import_tts"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var d=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var f=(r,e)=>d(r,"name",{value:e,configurable:!0});var y=(r,e)=>{for(var a in e)d(r,a,{get:e[a],enumerable:!0})},b=(r,e,a,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of h(e))!u.call(r,t)&&t!==a&&d(r,t,{get:()=>e[t],enumerable:!(o=m(e,t))||o.enumerable});return r};var g=r=>b(d({},"__esModule",{value:!0}),r);var S={};y(S,{DeepSeekLLM:()=>k});module.exports=g(S);class k{static{f(this,"DeepSeekLLM")}apiKey;model;baseUrl;fetchImpl;abort=null;constructor(e){if(!e.apiKey)throw new Error("DeepSeekLLM requires an apiKey");this.apiKey=e.apiKey,this.model=e.model??"deepseek-chat",this.baseUrl=(e.baseUrl??"https://api.deepseek.com").replace(/\/+$/,""),this.fetchImpl=e.fetch??fetch}stop(){this.abort?.abort()}async*stream(e){this.abort?.abort();const a=new AbortController;this.abort=a;try{const o=await this.fetchImpl(`${this.baseUrl}/chat/completions`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${this.apiKey}`},body:JSON.stringify({model:this.model,messages:e.messages,tools:e.tools?.map(i=>({type:"function",function:i})),stream:!0,temperature:e.temperature,max_tokens:e.maxTokens}),signal:a.signal});if(!o.ok){const i=await o.text();throw new Error(`DeepSeek request failed (${o.status}): ${i}`)}if(!o.body)throw new Error("DeepSeek returned an empty body");const t=new Map;for await(const i of L(o.body,a.signal)){const l=i.choices?.[0];if(!l)continue;const c=l.delta;c?.content&&(yield{type:"delta",content:c.content});for(const n of c?.tool_calls??[]){const p=n.index??0,s=t.get(p)??{id:"",name:"",arguments:""};n.id&&(s.id=n.id),n.function?.name&&(s.name+=n.function.name),n.function?.arguments&&(s.arguments+=n.function.arguments),t.set(p,s)}if(l.finish_reason==="tool_calls"){for(const n of t.values())yield{type:"tool_call",id:n.id,name:n.name,arguments:n.arguments};break}if(l.finish_reason==="stop")break}yield{type:"done"}}finally{this.abort===a&&(this.abort=null)}}}async function*L(r,e){const a=r.getReader(),o=new TextDecoder;let t="";for(;;){if(e.aborted)throw new DOMException("The operation was aborted.","AbortError");const{done:i,value:l}=await a.read();if(i)break;t+=o.decode(l,{stream:!0});const c=t.split(/\r?\n\r?\n/);t=c.pop()??"";for(const n of c)for(const p of n.split(/\r?\n/)){if(!p.startsWith("data:"))continue;const s=p.slice(5).trim();if(s==="[DONE]")return;try{yield JSON.parse(s)}catch{}}}}f(L,"parseSSE");
|
|
2
|
+
//# sourceMappingURL=deepseek.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/llm/adapters/deepseek/deepseek.ts"],
|
|
4
|
+
"sourcesContent": ["import type { LLM, LLMEvent, LLMRequest } from \"../../types\";\nimport type { FetchLike } from \"../../../shared\";\n\nexport interface DeepSeekOptions {\n apiKey: string;\n /** Defaults to `deepseek-chat`. */\n model?: string;\n /** Defaults to `https://api.deepseek.com`. */\n baseUrl?: string;\n /** Injectable fetch implementation, mainly for tests. */\n fetch?: FetchLike;\n}\n\ninterface DeepSeekDeltaToolCall {\n index?: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n}\n\ninterface DeepSeekChunk {\n choices?: Array<{\n delta?: { content?: string | null; tool_calls?: DeepSeekDeltaToolCall[] };\n finish_reason?: string | null;\n }>;\n}\n\n/**\n * DeepSeek LLM adapter (OpenAI-compatible chat completions over SSE).\n */\nexport class DeepSeekLLM implements LLM {\n private readonly apiKey: string;\n private readonly model: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: FetchLike;\n private abort: AbortController | null = null;\n\n constructor(options: DeepSeekOptions) {\n if (!options.apiKey) {\n throw new Error(\"DeepSeekLLM requires an apiKey\");\n }\n this.apiKey = options.apiKey;\n this.model = options.model ?? \"deepseek-chat\";\n this.baseUrl = (options.baseUrl ?? \"https://api.deepseek.com\").replace(/\\/+$/, \"\");\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n stop(): void {\n this.abort?.abort();\n }\n\n async *stream(request: LLMRequest): AsyncGenerator<LLMEvent> {\n // Only one generation at a time per adapter instance.\n this.abort?.abort();\n const controller = new AbortController();\n this.abort = controller;\n\n try {\n const response = await this.fetchImpl(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: this.model,\n messages: request.messages,\n tools: request.tools?.map((tool) => ({ type: \"function\", function: tool })),\n stream: true,\n temperature: request.temperature,\n max_tokens: request.maxTokens,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`DeepSeek request failed (${response.status}): ${body}`);\n }\n if (!response.body) {\n throw new Error(\"DeepSeek returned an empty body\");\n }\n\n // Tool calls arrive fragmented across chunks and are reassembled by\n // index before being emitted once the stream signals `tool_calls`.\n const toolCalls = new Map<number, { id: string; name: string; arguments: string }>();\n\n for await (const chunk of parseSSE(response.body, controller.signal)) {\n const choice = chunk.choices?.[0];\n if (!choice) continue;\n\n const delta = choice.delta;\n if (delta?.content) {\n yield { type: \"delta\", content: delta.content };\n }\n\n for (const tc of delta?.tool_calls ?? []) {\n const index = tc.index ?? 0;\n const accumulated = toolCalls.get(index) ?? { id: \"\", name: \"\", arguments: \"\" };\n if (tc.id) accumulated.id = tc.id;\n if (tc.function?.name) accumulated.name += tc.function.name;\n if (tc.function?.arguments) accumulated.arguments += tc.function.arguments;\n toolCalls.set(index, accumulated);\n }\n\n if (choice.finish_reason === \"tool_calls\") {\n for (const call of toolCalls.values()) {\n yield {\n type: \"tool_call\",\n id: call.id,\n name: call.name,\n arguments: call.arguments,\n };\n }\n break;\n }\n if (choice.finish_reason === \"stop\") {\n break;\n }\n }\n\n yield { type: \"done\" };\n } finally {\n if (this.abort === controller) {\n this.abort = null;\n }\n }\n }\n}\n\n/**\n * Parse an SSE byte stream into JSON events. Supports both LF and CRLF\n * framing, ignores comments and malformed frames, and stops at `[DONE]`.\n * Aborts with an `AbortError` once the signal fires.\n */\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n): AsyncGenerator<DeepSeekChunk> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n if (signal.aborted) {\n throw new DOMException(\"The operation was aborted.\", \"AbortError\");\n }\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n const frames = buffer.split(/\\r?\\n\\r?\\n/);\n buffer = frames.pop() ?? \"\";\n for (const frame of frames) {\n for (const line of frame.split(/\\r?\\n/)) {\n if (!line.startsWith(\"data:\")) continue;\n const data = line.slice(5).trim();\n if (data === \"[DONE]\") return;\n try {\n yield JSON.parse(data) as DeepSeekChunk;\n } catch {\n // Ignore malformed frames.\n }\n }\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["deepseek_exports", "__export", "DeepSeekLLM", "__toCommonJS", "DeepSeekLLM", "__name", "options", "request", "controller", "response", "tool", "body", "toolCalls", "chunk", "parseSSE", "choice", "delta", "tc", "index", "accumulated", "call", "signal", "reader", "decoder", "buffer", "done", "value", "frames", "frame", "line", "data"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var D=(p,e)=>{for(var r in e)t(p,r,{get:e[r],enumerable:!0})},L=(p,e,r,k)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of s(e))!x.call(p,o)&&o!==r&&t(p,o,{get:()=>e[o],enumerable:!(k=m(e,o))||k.enumerable});return p};var S=p=>L(t({},"__esModule",{value:!0}),p);var d={};D(d,{DeepSeekLLM:()=>f.DeepSeekLLM});module.exports=S(d);var f=require("./deepseek.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/llm/adapters/deepseek/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { DeepSeekLLM } from \"./deepseek\";\nexport type { DeepSeekOptions } from \"./deepseek\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gDAAAE,EAAAF,GAAA,IAAAG,EAA4B",
|
|
6
|
+
"names": ["deepseek_exports", "__export", "__toCommonJS", "import_deepseek"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var L=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var t=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var D=(o,e)=>{for(var r in e)L(o,r,{get:e[r],enumerable:!0})},M=(o,e,r,f)=>{if(e&&typeof e=="object"||typeof e=="function")for(let p of t(e))!x.call(o,p)&&p!==r&&L(o,p,{get:()=>e[p],enumerable:!(f=m(e,p))||f.enumerable});return o};var S=o=>M(L({},"__esModule",{value:!0}),o);var a={};D(a,{DeepSeekLLM:()=>k.DeepSeekLLM});module.exports=S(a);var k=require("./deepseek/deepseek.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/providers/llm/adapters/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { DeepSeekLLM } from \"./deepseek/deepseek\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gDAAAE,EAAAF,GAAA,IAAAG,EAA4B",
|
|
6
|
+
"names": ["adapters_exports", "__export", "__toCommonJS", "import_deepseek"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var s=(t,e)=>n(t,"name",{value:e,configurable:!0});var c=(t,e)=>{for(var o in e)n(t,o,{get:e[o],enumerable:!0})},l=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let L of a(e))!f.call(t,L)&&L!==o&&n(t,L,{get:()=>e[L],enumerable:!(r=p(e,L))||r.enumerable});return t};var y=t=>l(n({},"__esModule",{value:!0}),t);var u={};c(u,{DeepSeekLLM:()=>i.DeepSeekLLM,complete:()=>m,streamText:()=>M});module.exports=y(u);var i=require("./adapters/index.js");async function*M(t,e){for await(const o of t.stream(e))if(o.type==="delta")yield o.content;else if(o.type==="error")throw o.error}s(M,"streamText");async function m(t,e){let o="";for await(const r of M(t,e))o+=r;return o}s(m,"complete");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/providers/llm/index.ts"],
|
|
4
|
+
"sourcesContent": ["import type { LLM, LLMRequest } from \"./types\";\n\nexport type {\n LLM,\n LLMEvent,\n LLMMessage,\n LLMRole,\n LLMToolCall,\n LLMToolDefinition,\n LLMRequest,\n} from \"./types\";\n\n/**\n * Stream only the text deltas of an LLM generation, rethrowing any\n * streamed error.\n */\nexport async function* streamText(\n llm: LLM,\n request: LLMRequest,\n): AsyncGenerator<string> {\n for await (const event of llm.stream(request)) {\n if (event.type === \"delta\") {\n yield event.content;\n } else if (event.type === \"error\") {\n throw event.error;\n }\n }\n}\n\n/** Collect an entire LLM generation into a single string. */\nexport async function complete(llm: LLM, request: LLMRequest): Promise<string> {\n let text = \"\";\n for await (const chunk of streamText(llm, request)) {\n text += chunk;\n }\n return text;\n}\n\nexport { DeepSeekLLM } from \"./adapters/index\";\n"],
|
|
5
|
+
"mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4CAAAE,EAAA,eAAAC,IAAA,eAAAC,EAAAJ,GAsCA,IAAAK,EAA4B,4BAtB5B,eAAuBC,EACrBC,EACAC,EACwB,CACxB,gBAAiBC,KAASF,EAAI,OAAOC,CAAO,EAC1C,GAAIC,EAAM,OAAS,QACjB,MAAMA,EAAM,gBACHA,EAAM,OAAS,QACxB,MAAMA,EAAM,KAGlB,CAXuBC,EAAAJ,EAAA,cAcvB,eAAsBK,EAASJ,EAAUC,EAAsC,CAC7E,IAAII,EAAO,GACX,gBAAiBC,KAASP,EAAWC,EAAKC,CAAO,EAC/CI,GAAQC,EAEV,OAAOD,CACT,CANsBF,EAAAC,EAAA",
|
|
6
|
+
"names": ["llm_exports", "__export", "complete", "streamText", "__toCommonJS", "import_adapters", "streamText", "llm", "request", "event", "__name", "complete", "text", "chunk"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var L=Object.prototype.hasOwnProperty;var l=(t,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of a(e))!L.call(t,r)&&r!==s&&o(t,r,{get:()=>e[r],enumerable:!(n=i(e,r))||n.enumerable});return t};var g=t=>l(o({},"__esModule",{value:!0}),t);var p={};module.exports=g(p);
|
|
2
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/providers/llm/types.ts"],
|
|
4
|
+
"sourcesContent": ["export type LLMRole = \"system\" | \"user\" | \"assistant\" | \"tool\";\n\nexport interface LLMToolCall {\n id: string;\n name: string;\n /** JSON-encoded arguments for the tool. */\n arguments: string;\n}\n\nexport interface LLMMessage {\n role: LLMRole;\n content: string;\n /** Tool name, for `tool` role messages. */\n name?: string;\n /** Tool call id this message answers, for `tool` role messages. */\n toolCallId?: string;\n /** Tool calls announced by the assistant, for `assistant` role messages. */\n toolCalls?: LLMToolCall[];\n}\n\nexport interface LLMToolDefinition {\n name: string;\n description: string;\n /** JSON schema describing the tool arguments. */\n parameters: Record<string, unknown>;\n}\n\nexport interface LLMRequest {\n messages: LLMMessage[];\n tools?: LLMToolDefinition[];\n temperature?: number;\n maxTokens?: number;\n}\n\nexport type LLMEvent =\n | { type: \"delta\"; content: string }\n | { type: \"tool_call\"; id: string; name: string; arguments: string }\n | { type: \"done\" }\n | { type: \"error\"; error: Error };\n\n/**\n * Vendor-independent language model interface.\n *\n * `stream()` produces deltas as they arrive plus optional tool calls, and\n * terminates with `done`. Transport-level failures (network, HTTP status)\n * are thrown from the generator rather than emitted.\n */\nexport interface LLM {\n stream(request: LLMRequest): AsyncGenerator<LLMEvent>;\n /** Cancel the currently in-flight generation, if any. */\n stop(): void;\n}\n"],
|
|
5
|
+
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
|
+
"names": ["types_exports", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var r=Object.prototype.hasOwnProperty;var u=(t,e,p,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of o(e))!r.call(t,i)&&i!==p&&n(t,i,{get:()=>e[i],enumerable:!(s=R(e,i))||s.enumerable});return t};var q=t=>u(n({},"__esModule",{value:!0}),t);var L={};module.exports=q(L);
|
|
2
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/providers/shared.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * The fetch surface used by provider adapters.\n *\n * Defined separately from `typeof fetch` because Bun's fetch adds static\n * members (e.g. `preconnect`) that plain functions cannot satisfy, which\n * makes test doubles awkward.\n */\nexport type FetchLike = (\n input: string | URL | Request,\n init?: RequestInit,\n) => Promise<Response>;\n"],
|
|
5
|
+
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
|
+
"names": ["shared_exports", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var i=(t,e)=>a(t,"name",{value:e,configurable:!0});var f=(t,e)=>{for(var r in e)a(t,r,{get:e[r],enumerable:!0})},g=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of v(e))!u.call(t,s)&&s!==r&&a(t,s,{get:()=>e[s],enumerable:!(n=c(e,s))||n.enumerable});return t};var m=t=>g(a({},"__esModule",{value:!0}),t);var T={};f(T,{DeepgramSTT:()=>h,DeepgramSession:()=>l});module.exports=m(T);class h{static{i(this,"DeepgramSTT")}options;sessions=new Set;constructor(e){if(!e.apiKey)throw new Error("DeepgramSTT requires an apiKey");this.options=e}start(e={}){const r={...this.options,...e},n=S(r),s=r.createSocket??(p=>new WebSocket(p)),o=new l(s(n));return this.sessions.add(o),o.on("close",()=>{this.sessions.delete(o)}),o}cancel(){for(const e of[...this.sessions])e.abort()}}class l{static{i(this,"DeepgramSession")}socket;listeners=new Map;opened=!1;closed=!1;ended=!1;pendingClose={flag:!1};queued=[];endPromise;resolveEnd;constructor(e){this.socket=e,this.endPromise=new Promise(r=>{this.resolveEnd=r}),e.addEventListener("open",()=>{this.opened=!0;for(const r of this.queued)this.socket.send(d(r));this.queued.length=0,this.pendingClose.flag&&this.sendCloseStream()}),e.addEventListener("message",r=>{const n=y(r.data);if(n!==null)try{this.handleResult(JSON.parse(n))}catch{}}),e.addEventListener("error",()=>{this.emit("error",new Error("Deepgram socket error"))}),e.addEventListener("close",()=>{this.closed=!0,this.resolveEnd(),this.emit("close")})}write(e){if(this.closed)throw new Error("Deepgram session is closed");if(!this.opened){this.queued.push(e);return}this.socket.send(d(e))}async end(){if(!this.closed)return this.ended?this.endPromise:(this.ended=!0,this.opened?(this.sendCloseStream(),this.endPromise):(this.pendingClose.flag=!0,this.endPromise))}abort(){this.closed||this.socket.close()}on(e,r){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(r)}handleResult(e){if(e.type!=="Results")return;const n=e.channel?.alternatives?.[0]?.transcript??"";n&&(e.is_final===!0?this.emit("final",n):this.emit("partial",n))}sendCloseStream(){this.socket.send(JSON.stringify({type:"CloseStream"}))}emit(e,...r){const n=this.listeners.get(e);if(n)for(const s of[...n])s(...r)}}function S(t){const e=new URLSearchParams;return e.set("model",t.model??"nova-3"),e.set("interim_results",t.interimResults??!0?"true":"false"),e.set("encoding",t.encoding??"linear16"),e.set("sample_rate",String(t.sampleRate??16e3)),e.set("punctuate","true"),t.language&&e.set("language",t.language),e.set("token",t.apiKey),`${(t.endpoint??"wss://api.deepgram.com/v1/listen").replace(/\/+$/,"")}?${e.toString()}`}i(S,"buildListenUrl");function d(t){const e=new Uint8Array(t.byteLength);return e.set(t),e.buffer}i(d,"toArrayBuffer");function y(t){return typeof t=="string"?t:t instanceof ArrayBuffer?new TextDecoder().decode(t):ArrayBuffer.isView(t)?new TextDecoder().decode(new Uint8Array(t.buffer,t.byteOffset,t.byteLength)):null}i(y,"decodeMessage");
|
|
2
|
+
//# sourceMappingURL=deepgram.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/stt/adapters/deepgram/deepgram.ts"],
|
|
4
|
+
"sourcesContent": ["import type { STT, STTOptions, STTSession } from \"../../types\";\n\n/**\n * The minimal WebSocket surface used by the Deepgram adapter. Both the global\n * `WebSocket` (Bun) and test fakes satisfy this shape.\n */\nexport interface STTSocket {\n send(data: string | ArrayBuffer | ArrayBufferView): void;\n close(code?: number, reason?: string): void;\n addEventListener(\n type: string,\n listener: (event: { data?: unknown; error?: unknown }) => void,\n ): void;\n}\n\nexport interface DeepgramOptions extends STTOptions {\n apiKey: string;\n /** Defaults to `wss://api.deepgram.com/v1/listen`. */\n endpoint?: string;\n /** Injectable socket factory, mainly for tests. */\n createSocket?: (url: string) => STTSocket;\n}\n\ntype DeepgramEvent = \"partial\" | \"final\" | \"error\" | \"close\";\n\n/**\n * Deepgram streaming STT adapter (WebSocket).\n *\n * Audio written before the socket opens is queued and flushed on connect.\n * `end()` sends a `CloseStream` frame and resolves once the server closes\n * the socket.\n */\nexport class DeepgramSTT implements STT {\n private readonly options: DeepgramOptions;\n private readonly sessions = new Set<DeepgramSession>();\n\n constructor(options: DeepgramOptions) {\n if (!options.apiKey) {\n throw new Error(\"DeepgramSTT requires an apiKey\");\n }\n this.options = options;\n }\n\n start(options: STTOptions = {}): STTSession {\n const merged: DeepgramOptions = { ...this.options, ...options };\n const url = buildListenUrl(merged);\n const createSocket = merged.createSocket ?? ((target: string) => new WebSocket(target) as unknown as STTSocket);\n const session = new DeepgramSession(createSocket(url));\n this.sessions.add(session);\n session.on(\"close\", () => {\n this.sessions.delete(session);\n });\n return session;\n }\n\n cancel(): void {\n for (const session of [...this.sessions]) {\n session.abort();\n }\n }\n}\n\nexport class DeepgramSession implements STTSession {\n private readonly socket: STTSocket;\n private readonly listeners = new Map<DeepgramEvent, Set<(...args: any[]) => void>>();\n private opened = false;\n private closed = false;\n private ended = false;\n private readonly pendingClose = { flag: false };\n private readonly queued: Uint8Array[] = [];\n private readonly endPromise: Promise<void>;\n private resolveEnd!: () => void;\n\n constructor(socket: STTSocket) {\n this.socket = socket;\n this.endPromise = new Promise((resolve) => {\n this.resolveEnd = resolve;\n });\n\n socket.addEventListener(\"open\", () => {\n this.opened = true;\n for (const audio of this.queued) {\n this.socket.send(toArrayBuffer(audio));\n }\n this.queued.length = 0;\n if (this.pendingClose.flag) {\n this.sendCloseStream();\n }\n });\n\n socket.addEventListener(\"message\", (event) => {\n const text = decodeMessage(event.data);\n if (text === null) return;\n try {\n this.handleResult(JSON.parse(text));\n } catch {\n // Ignore malformed frames.\n }\n });\n\n socket.addEventListener(\"error\", () => {\n this.emit(\"error\", new Error(\"Deepgram socket error\"));\n });\n\n socket.addEventListener(\"close\", () => {\n this.closed = true;\n this.resolveEnd();\n this.emit(\"close\");\n });\n }\n\n write(audio: Uint8Array): void {\n if (this.closed) {\n throw new Error(\"Deepgram session is closed\");\n }\n if (!this.opened) {\n this.queued.push(audio);\n return;\n }\n this.socket.send(toArrayBuffer(audio));\n }\n\n async end(): Promise<void> {\n if (this.closed) return;\n if (this.ended) return this.endPromise;\n this.ended = true;\n if (!this.opened) {\n this.pendingClose.flag = true;\n return this.endPromise;\n }\n this.sendCloseStream();\n return this.endPromise;\n }\n\n /** Force-close the session without waiting for the server. */\n abort(): void {\n if (this.closed) return;\n this.socket.close();\n }\n\n on(event: \"partial\", listener: (transcript: string) => void): void;\n on(event: \"final\", listener: (transcript: string) => void): void;\n on(event: \"error\", listener: (error: Error) => void): void;\n on(event: \"close\", listener: () => void): void;\n on(event: DeepgramEvent, listener: (...args: any[]) => void): void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(listener);\n }\n\n private handleResult(message: Record<string, unknown>): void {\n if (message.type !== \"Results\") return;\n const alternatives = (message.channel as { alternatives?: { transcript?: string }[] })\n ?.alternatives;\n const text = alternatives?.[0]?.transcript ?? \"\";\n if (!text) return;\n if (message.is_final === true) {\n this.emit(\"final\", text);\n } else {\n this.emit(\"partial\", text);\n }\n }\n\n private sendCloseStream(): void {\n this.socket.send(JSON.stringify({ type: \"CloseStream\" }));\n }\n\n private emit(event: \"partial\", arg: string): void;\n private emit(event: \"final\", arg: string): void;\n private emit(event: \"error\", arg: Error): void;\n private emit(event: \"close\"): void;\n private emit(event: DeepgramEvent, ...args: any[]): void {\n const set = this.listeners.get(event);\n if (!set) return;\n for (const listener of [...set]) {\n listener(...args);\n }\n }\n}\n\nfunction buildListenUrl(options: DeepgramOptions): string {\n const params = new URLSearchParams();\n params.set(\"model\", options.model ?? \"nova-3\");\n params.set(\"interim_results\", (options.interimResults ?? true) ? \"true\" : \"false\");\n params.set(\"encoding\", options.encoding ?? \"linear16\");\n params.set(\"sample_rate\", String(options.sampleRate ?? 16000));\n params.set(\"punctuate\", \"true\");\n if (options.language) params.set(\"language\", options.language);\n params.set(\"token\", options.apiKey);\n\n const base = (options.endpoint ?? \"wss://api.deepgram.com/v1/listen\").replace(/\\/+$/, \"\");\n return `${base}?${params.toString()}`;\n}\n\nfunction toArrayBuffer(audio: Uint8Array): ArrayBuffer {\n // Copy so the view's backing buffer (possibly larger or shared) is not\n // sent over the socket.\n const copy = new Uint8Array(audio.byteLength);\n copy.set(audio);\n return copy.buffer;\n}\n\nfunction decodeMessage(data: unknown): string | null {\n if (typeof data === \"string\") return data;\n if (data instanceof ArrayBuffer) return new TextDecoder().decode(data);\n if (ArrayBuffer.isView(data)) {\n return new TextDecoder().decode(\n new Uint8Array(data.buffer, data.byteOffset, data.byteLength),\n );\n }\n return null;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["deepgram_exports", "__export", "DeepgramSTT", "DeepgramSession", "__toCommonJS", "DeepgramSTT", "__name", "options", "merged", "url", "buildListenUrl", "createSocket", "target", "session", "DeepgramSession", "socket", "resolve", "audio", "toArrayBuffer", "event", "text", "decodeMessage", "listener", "set", "message", "args", "params", "copy", "data"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var s=(p,e)=>{for(var o in e)t(p,o,{get:e[o],enumerable:!0})},D=(p,e,o,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of S(e))!T.call(p,r)&&r!==o&&t(p,r,{get:()=>e[r],enumerable:!(a=g(e,r))||a.enumerable});return p};var f=p=>D(t({},"__esModule",{value:!0}),p);var i={};s(i,{DeepgramSTT:()=>m.DeepgramSTT,DeepgramSession:()=>m.DeepgramSession});module.exports=f(i);var m=require("./deepgram.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/stt/adapters/deepgram/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { DeepgramSTT, DeepgramSession } from \"./deepgram\";\nexport type { DeepgramOptions, STTSocket } from \"./deepgram\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sFAAAE,EAAAF,GAAA,IAAAG,EAA6C",
|
|
6
|
+
"names": ["deepgram_exports", "__export", "__toCommonJS", "import_deepgram"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var p=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var t=Object.prototype.hasOwnProperty;var x=(r,e)=>{for(var o in e)p(r,o,{get:e[o],enumerable:!0})},D=(r,e,o,T)=>{if(e&&typeof e=="object"||typeof e=="function")for(let m of g(e))!t.call(r,m)&&m!==o&&p(r,m,{get:()=>e[m],enumerable:!(T=f(e,m))||T.enumerable});return r};var S=r=>D(p({},"__esModule",{value:!0}),r);var b={};x(b,{DeepgramSTT:()=>a.DeepgramSTT});module.exports=S(b);var a=require("./deepgram/deepgram.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/providers/stt/adapters/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { DeepgramSTT } from \"./deepgram/deepgram\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gDAAAE,EAAAF,GAAA,IAAAG,EAA4B",
|
|
6
|
+
"names": ["adapters_exports", "__export", "__toCommonJS", "import_deepgram"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var i=(e,T)=>{for(var p in T)r(e,p,{get:T[p],enumerable:!0})},n=(e,T,p,t)=>{if(T&&typeof T=="object"||typeof T=="function")for(let o of m(T))!f.call(e,o)&&o!==p&&r(e,o,{get:()=>T[o],enumerable:!(t=s(T,o))||t.enumerable});return e};var x=e=>n(r({},"__esModule",{value:!0}),e);var y={};i(y,{DeepgramSTT:()=>S.DeepgramSTT});module.exports=x(y);var S=require("./adapters/index.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/providers/stt/index.ts"],
|
|
4
|
+
"sourcesContent": ["export type { STT, STTOptions, STTSession } from \"./types\";\nexport { DeepgramSTT } from \"./adapters/index\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gDAAAE,EAAAF,GACA,IAAAG,EAA4B",
|
|
6
|
+
"names": ["stt_exports", "__export", "__toCommonJS", "import_adapters"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var v=(i,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of a(e))!d.call(i,r)&&r!==o&&t(i,r,{get:()=>e[r],enumerable:!(n=s(e,r))||n.enumerable});return i};var l=i=>v(t({},"__esModule",{value:!0}),i);var p={};module.exports=l(p);
|
|
2
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/providers/stt/types.ts"],
|
|
4
|
+
"sourcesContent": ["export interface STTOptions {\n model?: string;\n language?: string;\n /** Whether interim (partial) transcripts are reported. */\n interimResults?: boolean;\n /** Audio encoding, e.g. `linear16`. */\n encoding?: string;\n /** Audio sample rate in Hz. */\n sampleRate?: number;\n}\n\nexport interface STTSession {\n /** Feed an audio chunk into the recognizer. */\n write(audio: Uint8Array): void;\n /** Signal the end of the audio stream and wait for the session to close. */\n end(): Promise<void>;\n on(event: \"partial\", listener: (transcript: string) => void): void;\n on(event: \"final\", listener: (transcript: string) => void): void;\n on(event: \"error\", listener: (error: Error) => void): void;\n}\n\n/**\n * Vendor-independent speech-to-text interface.\n *\n * `start()` opens a streaming session; audio is fed in with `write()` and\n * transcripts are reported via `partial`/`final` events.\n */\nexport interface STT {\n start(options?: STTOptions): STTSession;\n /** Cancel all active sessions. */\n cancel(): void;\n}\n"],
|
|
5
|
+
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
|
+
"names": ["types_exports", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var f=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var t=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var K=(r,o)=>{for(var e in o)f(r,e,{get:o[e],enumerable:!0})},S=(r,o,e,k)=>{if(o&&typeof o=="object"||typeof o=="function")for(let T of t(o))!x.call(r,T)&&T!==e&&f(r,T,{get:()=>o[T],enumerable:!(k=p(o,T))||k.enumerable});return r};var a=r=>S(f({},"__esModule",{value:!0}),r);var b={};K(b,{KokoroTTS:()=>m.KokoroTTS});module.exports=a(b);var m=require("./kokoro/kokoro.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/providers/tts/adapters/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { KokoroTTS } from \"./kokoro/kokoro\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4CAAAE,EAAAF,GAAA,IAAAG,EAA0B",
|
|
6
|
+
"names": ["adapters_exports", "__export", "__toCommonJS", "import_kokoro"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var K=Object.prototype.hasOwnProperty;var T=(r,o)=>{for(var p in o)t(r,p,{get:o[p],enumerable:!0})},i=(r,o,p,e)=>{if(o&&typeof o=="object"||typeof o=="function")for(let k of x(o))!K.call(r,k)&&k!==p&&t(r,k,{get:()=>o[k],enumerable:!(e=m(o,k))||e.enumerable});return r};var n=r=>i(t({},"__esModule",{value:!0}),r);var s={};T(s,{KokoroTTS:()=>f.KokoroTTS});module.exports=n(s);var f=require("./kokoro.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/tts/adapters/kokoro/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { KokoroTTS } from \"./kokoro\";\nexport type { KokoroOptions } from \"./kokoro\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4CAAAE,EAAAF,GAAA,IAAAG,EAA0B",
|
|
6
|
+
"names": ["kokoro_exports", "__export", "__toCommonJS", "import_kokoro"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var l=(t,e)=>n(t,"name",{value:e,configurable:!0});var p=(t,e)=>{for(var r in e)n(t,r,{get:e[r],enumerable:!0})},f=(t,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of y(e))!d.call(t,a)&&a!==r&&n(t,a,{get:()=>e[a],enumerable:!(i=c(e,a))||i.enumerable});return t};var u=t=>f(n({},"__esModule",{value:!0}),t);var m={};p(m,{KokoroTTS:()=>b});module.exports=u(m);class b{static{l(this,"KokoroTTS")}baseUrl;voice;model;apiKey;chunkSize;fetchImpl;abort=null;constructor(e={}){this.baseUrl=(e.baseUrl??"http://localhost:8880").replace(/\/+$/,""),this.voice=e.voice??"af_heart",this.model=e.model??"kokoro",this.apiKey=e.apiKey,this.chunkSize=e.chunkSize??8192,this.fetchImpl=e.fetch??fetch}stop(){this.abort?.abort()}async*stream(e){if(!e.text)throw new Error("KokoroTTS requires request.text");this.abort?.abort();const r=new AbortController;this.abort=r;try{const i=await this.fetchImpl(`${this.baseUrl}/v1/audio/speech`,{method:"POST",headers:{"content-type":"application/json",...this.apiKey?{authorization:`Bearer ${this.apiKey}`}:{}},body:JSON.stringify({model:this.model,input:e.text,voice:e.voice??this.voice,response_format:e.format,speed:e.speed}),signal:r.signal});if(!i.ok){const s=await i.text();throw new Error(`Kokoro request failed (${i.status}): ${s}`)}if(!i.body)throw new Error("Kokoro returned an empty body");const a=i.body.getReader();let o=new Uint8Array(0);for(;;){if(r.signal.aborted)throw new DOMException("The operation was aborted.","AbortError");const{done:s,value:h}=await a.read();if(s)break;for(o=k(o,h);o.length>=this.chunkSize;)yield o.slice(0,this.chunkSize),o=o.slice(this.chunkSize)}o.length>0&&(yield o)}finally{this.abort===r&&(this.abort=null)}}}function k(t,e){const r=new Uint8Array(t.length+e.length);return r.set(t),r.set(e,t.length),r}l(k,"concat");
|
|
2
|
+
//# sourceMappingURL=kokoro.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/tts/adapters/kokoro/kokoro.ts"],
|
|
4
|
+
"sourcesContent": ["import type { TTS, TTSRequest } from \"../../types\";\nimport type { FetchLike } from \"../../../shared\";\n\nexport interface KokoroOptions {\n /**\n * Base URL of a Kokoro TTS server exposing the OpenAI-compatible\n * `/v1/audio/speech` endpoint. Defaults to a local kokoro-fastapi server.\n */\n baseUrl?: string;\n /** Default voice, e.g. `af_heart`. */\n voice?: string;\n model?: string;\n apiKey?: string;\n /** Size of the audio chunks yielded from the response stream. */\n chunkSize?: number;\n /** Injectable fetch implementation, mainly for tests. */\n fetch?: FetchLike;\n}\n\n/**\n * Kokoro TTS adapter. Consumes a Kokoro server's OpenAI-compatible speech\n * endpoint and re-chunks the returned audio so it can be played as it\n * arrives.\n */\nexport class KokoroTTS implements TTS {\n private readonly baseUrl: string;\n private readonly voice: string;\n private readonly model: string;\n private readonly apiKey: string | undefined;\n private readonly chunkSize: number;\n private readonly fetchImpl: FetchLike;\n private abort: AbortController | null = null;\n\n constructor(options: KokoroOptions = {}) {\n this.baseUrl = (options.baseUrl ?? \"http://localhost:8880\").replace(/\\/+$/, \"\");\n this.voice = options.voice ?? \"af_heart\";\n this.model = options.model ?? \"kokoro\";\n this.apiKey = options.apiKey;\n this.chunkSize = options.chunkSize ?? 8192;\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n stop(): void {\n this.abort?.abort();\n }\n\n async *stream(request: TTSRequest): AsyncGenerator<Uint8Array> {\n if (!request.text) {\n throw new Error(\"KokoroTTS requires request.text\");\n }\n\n this.abort?.abort();\n const controller = new AbortController();\n this.abort = controller;\n\n try {\n const response = await this.fetchImpl(`${this.baseUrl}/v1/audio/speech`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(this.apiKey ? { authorization: `Bearer ${this.apiKey}` } : {}),\n },\n body: JSON.stringify({\n model: this.model,\n input: request.text,\n voice: request.voice ?? this.voice,\n response_format: request.format,\n speed: request.speed,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Kokoro request failed (${response.status}): ${body}`);\n }\n if (!response.body) {\n throw new Error(\"Kokoro returned an empty body\");\n }\n\n const reader = response.body.getReader();\n let buffer: Uint8Array<ArrayBuffer> = new Uint8Array(0);\n\n while (true) {\n if (controller.signal.aborted) {\n throw new DOMException(\"The operation was aborted.\", \"AbortError\");\n }\n const { done, value } = await reader.read();\n if (done) break;\n buffer = concat(buffer, value);\n while (buffer.length >= this.chunkSize) {\n yield buffer.slice(0, this.chunkSize);\n buffer = buffer.slice(this.chunkSize);\n }\n }\n\n if (buffer.length > 0) {\n yield buffer;\n }\n } finally {\n if (this.abort === controller) {\n this.abort = null;\n }\n }\n }\n}\n\nfunction concat(\n a: Uint8Array<ArrayBufferLike>,\n b: Uint8Array<ArrayBufferLike>,\n): Uint8Array<ArrayBuffer> {\n const out = new Uint8Array(a.length + b.length);\n out.set(a);\n out.set(b, a.length);\n return out;\n}\n"],
|
|
5
|
+
"mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,eAAAE,IAAA,eAAAC,EAAAH,GAwBO,MAAMI,CAAyB,CAxBtC,MAwBsC,CAAAC,EAAA,kBACnB,QACA,MACA,MACA,OACA,UACA,UACT,MAAgC,KAExC,YAAYC,EAAyB,CAAC,EAAG,CACvC,KAAK,SAAWA,EAAQ,SAAW,yBAAyB,QAAQ,OAAQ,EAAE,EAC9E,KAAK,MAAQA,EAAQ,OAAS,WAC9B,KAAK,MAAQA,EAAQ,OAAS,SAC9B,KAAK,OAASA,EAAQ,OACtB,KAAK,UAAYA,EAAQ,WAAa,KACtC,KAAK,UAAYA,EAAQ,OAAS,KACpC,CAEA,MAAa,CACX,KAAK,OAAO,MAAM,CACpB,CAEA,MAAO,OAAOC,EAAiD,CAC7D,GAAI,CAACA,EAAQ,KACX,MAAM,IAAI,MAAM,iCAAiC,EAGnD,KAAK,OAAO,MAAM,EAClB,MAAMC,EAAa,IAAI,gBACvB,KAAK,MAAQA,EAEb,GAAI,CACF,MAAMC,EAAW,MAAM,KAAK,UAAU,GAAG,KAAK,OAAO,mBAAoB,CACvE,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,GAAI,KAAK,OAAS,CAAE,cAAe,UAAU,KAAK,MAAM,EAAG,EAAI,CAAC,CAClE,EACA,KAAM,KAAK,UAAU,CACnB,MAAO,KAAK,MACZ,MAAOF,EAAQ,KACf,MAAOA,EAAQ,OAAS,KAAK,MAC7B,gBAAiBA,EAAQ,OACzB,MAAOA,EAAQ,KACjB,CAAC,EACD,OAAQC,EAAW,MACrB,CAAC,EAED,GAAI,CAACC,EAAS,GAAI,CAChB,MAAMC,EAAO,MAAMD,EAAS,KAAK,EACjC,MAAM,IAAI,MAAM,0BAA0BA,EAAS,MAAM,MAAMC,CAAI,EAAE,CACvE,CACA,GAAI,CAACD,EAAS,KACZ,MAAM,IAAI,MAAM,+BAA+B,EAGjD,MAAME,EAASF,EAAS,KAAK,UAAU,EACvC,IAAIG,EAAkC,IAAI,WAAW,CAAC,EAEtD,OAAa,CACX,GAAIJ,EAAW,OAAO,QACpB,MAAM,IAAI,aAAa,6BAA8B,YAAY,EAEnE,KAAM,CAAE,KAAAK,EAAM,MAAAC,CAAM,EAAI,MAAMH,EAAO,KAAK,EAC1C,GAAIE,EAAM,MAEV,IADAD,EAASG,EAAOH,EAAQE,CAAK,EACtBF,EAAO,QAAU,KAAK,WAC3B,MAAMA,EAAO,MAAM,EAAG,KAAK,SAAS,EACpCA,EAASA,EAAO,MAAM,KAAK,SAAS,CAExC,CAEIA,EAAO,OAAS,IAClB,MAAMA,EAEV,QAAE,CACI,KAAK,QAAUJ,IACjB,KAAK,MAAQ,KAEjB,CACF,CACF,CAEA,SAASO,EACPC,EACAC,EACyB,CACzB,MAAMC,EAAM,IAAI,WAAWF,EAAE,OAASC,EAAE,MAAM,EAC9C,OAAAC,EAAI,IAAIF,CAAC,EACTE,EAAI,IAAID,EAAGD,EAAE,MAAM,EACZE,CACT,CARSb,EAAAU,EAAA",
|
|
6
|
+
"names": ["kokoro_exports", "__export", "KokoroTTS", "__toCommonJS", "KokoroTTS", "__name", "options", "request", "controller", "response", "body", "reader", "buffer", "done", "value", "concat", "a", "b", "out"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var x=(e,o)=>{for(var r in o)t(e,r,{get:o[r],enumerable:!0})},y=(e,o,r,p)=>{if(o&&typeof o=="object"||typeof o=="function")for(let T of m(o))!s.call(e,T)&&T!==r&&t(e,T,{get:()=>o[T],enumerable:!(p=f(o,T))||p.enumerable});return e};var k=e=>y(t({},"__esModule",{value:!0}),e);var q={};x(q,{KokoroTTS:()=>S.KokoroTTS});module.exports=k(q);var S=require("./adapters/index.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/providers/tts/index.ts"],
|
|
4
|
+
"sourcesContent": ["export type { TTS, TTSRequest } from \"./types\";\nexport { KokoroTTS } from \"./adapters/index\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4CAAAE,EAAAF,GACA,IAAAG,EAA0B",
|
|
6
|
+
"names": ["tts_exports", "__export", "__toCommonJS", "import_adapters"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var T=(t,e,a,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of o(e))!p.call(t,r)&&r!==a&&n(t,r,{get:()=>e[r],enumerable:!(s=i(e,r))||s.enumerable});return t};var c=t=>T(n({},"__esModule",{value:!0}),t);var m={};module.exports=c(m);
|
|
2
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/providers/tts/types.ts"],
|
|
4
|
+
"sourcesContent": ["export interface TTSRequest {\n text: string;\n voice?: string;\n speed?: number;\n format?: \"wav\" | \"mp3\" | \"pcm\";\n}\n\n/**\n * Vendor-independent text-to-speech interface.\n *\n * `stream()` produces audio chunks as they become available and throws on\n * transport-level failures. `stop()` cancels the in-flight synthesis.\n */\nexport interface TTS {\n stream(request: TTSRequest): AsyncGenerator<Uint8Array>;\n stop(): void;\n}\n"],
|
|
5
|
+
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
|
+
"names": ["types_exports", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var p=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var x=(o,r)=>{for(var m in r)p(o,m,{get:r[m],enumerable:!0})},y=(o,r,m,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of n(r))!s.call(o,e)&&e!==m&&p(o,e,{get:()=>r[e],enumerable:!(t=f(r,e))||t.enumerable});return o};var M=o=>y(p({},"__esModule",{value:!0}),o);var T={};x(T,{MemoryTransport:()=>a.MemoryTransport});module.exports=M(T);var a=require("./memory/memory.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/transport/adapters/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { MemoryTransport } from \"./memory/memory\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wDAAAE,EAAAF,GAAA,IAAAG,EAAgC",
|
|
6
|
+
"names": ["adapters_exports", "__export", "__toCommonJS", "import_memory"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var p=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var x=(o,r)=>{for(var m in r)p(o,m,{get:r[m],enumerable:!0})},y=(o,r,m,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of n(r))!s.call(o,e)&&e!==m&&p(o,e,{get:()=>r[e],enumerable:!(t=f(r,e))||t.enumerable});return o};var M=o=>y(p({},"__esModule",{value:!0}),o);var T={};x(T,{MemoryTransport:()=>a.MemoryTransport});module.exports=M(T);var a=require("./memory.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/transport/adapters/memory/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { MemoryTransport } from \"./memory\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wDAAAE,EAAAF,GAAA,IAAAG,EAAgC",
|
|
6
|
+
"names": ["memory_exports", "__export", "__toCommonJS", "import_memory"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var o=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var a=(r,e)=>o(r,"name",{value:e,configurable:!0});var c=(r,e)=>{for(var s in e)o(r,s,{get:e[s],enumerable:!0})},h=(r,e,s,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of d(e))!p.call(r,t)&&t!==s&&o(r,t,{get:()=>e[t],enumerable:!(i=l(e,t))||i.enumerable});return r};var v=r=>h(o({},"__esModule",{value:!0}),r);var w={};c(w,{MemoryTransport:()=>n});module.exports=v(w);class n{static{a(this,"MemoryTransport")}peer=null;listeners=new Set;closed=!1;static pair(){const e=new n,s=new n;return e.peer=s,s.peer=e,[e,s]}get isClosed(){return this.closed}send(e){if(this.closed)throw new Error("Cannot send on a closed transport");const s=this.peer;if(!s)throw new Error("Transport has no peer to send to");if(s.closed)throw new Error("Cannot send to a closed peer transport");s.deliver(e)}onMessage(e){if(this.closed)throw new Error("Cannot subscribe to a closed transport");return this.listeners.add(e),()=>{this.listeners.delete(e)}}async close(){if(this.closed)return;this.closed=!0,this.listeners.clear();const e=this.peer;this.peer=null,e&&!e.closed&&await e.close()}deliver(e){for(const s of[...this.listeners])try{s(e)}catch{}}}
|
|
2
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/transport/adapters/memory/memory.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Message, Transport } from \"../../types\";\n\n/**\n * In-process transport used for tests and development.\n *\n * A `MemoryTransport` is always half of a connection: messages sent on one\n * end are delivered to the listeners of the peer end. Use `pair()` to create\n * two connected ends, or `MemoryTransport.pair()` directly.\n */\nexport class MemoryTransport implements Transport {\n private peer: MemoryTransport | null = null;\n private readonly listeners = new Set<(message: Message) => void>();\n private closed = false;\n\n /** Create a pair of connected transports. */\n static pair(): [MemoryTransport, MemoryTransport] {\n const a = new MemoryTransport();\n const b = new MemoryTransport();\n a.peer = b;\n b.peer = a;\n return [a, b];\n }\n\n get isClosed(): boolean {\n return this.closed;\n }\n\n send(message: Message): void {\n if (this.closed) {\n throw new Error(\"Cannot send on a closed transport\");\n }\n const peer = this.peer;\n if (!peer) {\n throw new Error(\"Transport has no peer to send to\");\n }\n if (peer.closed) {\n throw new Error(\"Cannot send to a closed peer transport\");\n }\n peer.deliver(message);\n }\n\n onMessage(listener: (message: Message) => void): () => void {\n if (this.closed) {\n throw new Error(\"Cannot subscribe to a closed transport\");\n }\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.listeners.clear();\n const peer = this.peer;\n this.peer = null;\n if (peer && !peer.closed) {\n await peer.close();\n }\n }\n\n private deliver(message: Message): void {\n for (const listener of [...this.listeners]) {\n try {\n listener(message);\n } catch {\n // A faulty listener must not prevent delivery to the others.\n }\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GASO,MAAMI,CAAqC,CATlD,MASkD,CAAAC,EAAA,wBACxC,KAA+B,KACtB,UAAY,IAAI,IACzB,OAAS,GAGjB,OAAO,MAA2C,CAChD,MAAMC,EAAI,IAAIF,EACRG,EAAI,IAAIH,EACd,OAAAE,EAAE,KAAOC,EACTA,EAAE,KAAOD,EACF,CAACA,EAAGC,CAAC,CACd,CAEA,IAAI,UAAoB,CACtB,OAAO,KAAK,MACd,CAEA,KAAKC,EAAwB,CAC3B,GAAI,KAAK,OACP,MAAM,IAAI,MAAM,mCAAmC,EAErD,MAAMC,EAAO,KAAK,KAClB,GAAI,CAACA,EACH,MAAM,IAAI,MAAM,kCAAkC,EAEpD,GAAIA,EAAK,OACP,MAAM,IAAI,MAAM,wCAAwC,EAE1DA,EAAK,QAAQD,CAAO,CACtB,CAEA,UAAUE,EAAkD,CAC1D,GAAI,KAAK,OACP,MAAM,IAAI,MAAM,wCAAwC,EAE1D,YAAK,UAAU,IAAIA,CAAQ,EACpB,IAAM,CACX,KAAK,UAAU,OAAOA,CAAQ,CAChC,CACF,CAEA,MAAM,OAAuB,CAC3B,GAAI,KAAK,OAAQ,OACjB,KAAK,OAAS,GACd,KAAK,UAAU,MAAM,EACrB,MAAMD,EAAO,KAAK,KAClB,KAAK,KAAO,KACRA,GAAQ,CAACA,EAAK,QAChB,MAAMA,EAAK,MAAM,CAErB,CAEQ,QAAQD,EAAwB,CACtC,UAAWE,IAAY,CAAC,GAAG,KAAK,SAAS,EACvC,GAAI,CACFA,EAASF,CAAO,CAClB,MAAQ,CAER,CAEJ,CACF",
|
|
6
|
+
"names": ["memory_exports", "__export", "MemoryTransport", "__toCommonJS", "MemoryTransport", "__name", "a", "b", "message", "peer", "listener"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var n=(e,r)=>{for(var p in r)t(e,p,{get:r[p],enumerable:!0})},x=(e,r,p,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of y(r))!f.call(e,o)&&o!==p&&t(e,o,{get:()=>r[o],enumerable:!(s=m(r,o))||s.enumerable});return e};var M=e=>x(t({},"__esModule",{value:!0}),e);var T={};n(T,{MemoryTransport:()=>a.MemoryTransport});module.exports=M(T);var a=require("./adapters/index.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/transport/index.ts"],
|
|
4
|
+
"sourcesContent": ["export type { Message, Transport } from \"./types\";\nexport { MemoryTransport } from \"./adapters/index\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wDAAAE,EAAAF,GACA,IAAAG,EAAgC",
|
|
6
|
+
"names": ["transport_exports", "__export", "__toCommonJS", "import_adapters"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(n,o,s,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of a(o))!d.call(n,e)&&e!==s&&r(n,e,{get:()=>o[e],enumerable:!(t=i(o,e))||t.enumerable});return n};var v=n=>p(r({},"__esModule",{value:!0}),n);var I={};module.exports=v(I);
|
|
2
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/transport/types.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\n AudioChunk,\n ConversationId,\n Turn,\n UserId,\n} from \"../conversations/types\";\nimport type { TranscriptEntry } from \"../conversations/transcription/transcription\";\n\n/**\n * Messages exchanged between Pipeflow and the application over a Transport.\n */\nexport type Message =\n | {\n type: \"audio-in\";\n conversationId: ConversationId;\n userId: UserId;\n audio: AudioChunk;\n }\n | {\n type: \"audio-out\";\n conversationId: ConversationId;\n audio: AudioChunk;\n }\n | {\n type: \"transcript\";\n conversationId: ConversationId;\n entry: TranscriptEntry;\n }\n | {\n type: \"turn\";\n conversationId: ConversationId;\n turn: Turn;\n }\n | { type: \"interrupt\"; conversationId: ConversationId }\n | { type: \"start\"; conversationId: ConversationId }\n | { type: \"stop\"; conversationId: ConversationId };\n\nexport interface Transport {\n /**\n * Send a message to the peer connected to this transport.\n * Throws if the transport has been closed.\n */\n send(message: Message): void;\n\n /**\n * Close the transport and disconnect from the peer.\n * Closing one end of a connection closes the other end as well.\n */\n close(): Promise<void>;\n\n /**\n * Register a listener for incoming messages. Returns an unsubscribe\n * function.\n */\n onMessage(listener: (message: Message) => void): () => void;\n}\n"],
|
|
5
|
+
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
|
+
"names": ["types_exports", "__toCommonJS"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var c=Object.defineProperty;var g=(m,e)=>c(m,"name",{value:e,configurable:!0});import"./tools/tools.js";class L{static{g(this,"Agent")}name;context;toolRegistry=new Map;llm;constructor(e){const t=e.name.trim();if(!t)throw new Error("Agent requires a non-empty name");this.name=t,this.context=e.context?.trim()??"",this.llm=e.llm;for(const n of e.tools??[])this.addTool(n)}get tools(){return[...this.toolRegistry.values()]}addTool(e){if(this.toolRegistry.has(e.name))throw new Error(`Agent already has a tool named "${e.name}"`);this.toolRegistry.set(e.name,e)}hasTool(e){return this.toolRegistry.has(e)}getTool(e){return this.toolRegistry.get(e)}async run(e){if(!this.llm)throw new Error(`Agent "${this.name}" has no LLM provider configured. Pass an LLM when constructing the agent or the Pipeflow instance.`);const t=[];this.context&&t.push({role:"system",content:this.context}),e.history&&t.push(...e.history),t.push({role:"user",content:e.prompt});const n=this.tools.map(s=>({name:s.name,description:s.description,parameters:s.parameters??{type:"object",properties:{}}})),o=[],l=e.maxToolIterations??10;for(let s=0;s<l;s++){const{text:i,toolCalls:a}=await this.streamOnce({llm:this.llm,messages:t,definitions:n,temperature:e.temperature,maxTokens:e.maxTokens});if(a.length===0)return{text:i,messages:t,toolCalls:o};t.push({role:"assistant",content:i,toolCalls:a});for(const r of a){const u=await this.executeToolCall(r);o.push(u),t.push({role:"tool",toolCallId:r.id,name:r.name,content:JSON.stringify(u.result)})}}throw new Error(`Agent "${this.name}" exceeded ${l} tool iterations`)}async streamOnce(e){const{llm:t,messages:n,definitions:o,temperature:l,maxTokens:s}=e;let i="";const a=[];for await(const r of t.stream({messages:n,tools:o,temperature:l,maxTokens:s}))switch(r.type){case"delta":i+=r.content;break;case"tool_call":a.push({id:r.id,name:r.name,arguments:r.arguments});break;case"done":return{text:i,toolCalls:a};case"error":throw r.error}return{text:i,toolCalls:a}}async executeToolCall(e){const t=this.toolRegistry.get(e.name);let n;try{n=JSON.parse(e.arguments)}catch{n=e.arguments}if(!t)return{id:e.id,name:e.name,arguments:n,result:{error:`Unknown tool "${e.name}"`}};try{const o=await t.execute(n);return{id:e.id,name:e.name,arguments:n,result:o}}catch(o){return{id:e.id,name:e.name,arguments:n,result:{error:o instanceof Error?o.message:String(o)}}}}}export{L as Agent};
|
|
2
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/agents/agent.ts"],
|
|
4
|
+
"sourcesContent": ["import { Tool } from \"./tools/tools\";\nimport type {\n LLM,\n LLMMessage,\n LLMToolCall,\n LLMToolDefinition,\n} from \"../providers/llm/types\";\n\nexport interface AgentOptions {\n name: string;\n context?: string;\n tools?: Tool<never, unknown>[];\n /** LLM provider used by `run()`. Injected by `Pipeflow.agent()`. */\n llm?: LLM;\n}\n\nexport interface AgentRunRequest {\n prompt: string;\n /** Prior messages to continue from, e.g. a previous `run()` result. */\n history?: LLMMessage[];\n temperature?: number;\n maxTokens?: number;\n /** Safety bound on the number of tool-call round trips. */\n maxToolIterations?: number;\n}\n\nexport interface ExecutedToolCall {\n id: string;\n name: string;\n /** Parsed arguments, or the raw JSON string if parsing failed. */\n arguments: unknown;\n /** The tool result, or `{ error }` when the tool failed or is unknown. */\n result: unknown;\n}\n\nexport interface AgentRunResult {\n /** The assistant's final text response. */\n text: string;\n /** The full message history including the response and tool results. */\n messages: LLMMessage[];\n /** Every tool call executed during the run, in order. */\n toolCalls: ExecutedToolCall[];\n}\n\n/**\n * An AI persona: a name, a system context, and a set of tools.\n *\n * An agent can participate in conversations or be invoked independently\n * with `run()`.\n */\nexport class Agent {\n readonly name: string;\n readonly context: string;\n private readonly toolRegistry = new Map<string, Tool<never, unknown>>();\n /** LLM provider used by `run()` and the orchestrator. */\n readonly llm: LLM | undefined;\n\n constructor(options: AgentOptions) {\n const name = options.name.trim();\n if (!name) {\n throw new Error(\"Agent requires a non-empty name\");\n }\n this.name = name;\n this.context = options.context?.trim() ?? \"\";\n this.llm = options.llm;\n for (const tool of options.tools ?? []) {\n this.addTool(tool);\n }\n }\n\n get tools(): Tool<never, unknown>[] {\n return [...this.toolRegistry.values()];\n }\n\n addTool(tool: Tool<never, unknown>): void {\n if (this.toolRegistry.has(tool.name)) {\n throw new Error(`Agent already has a tool named \"${tool.name}\"`);\n }\n this.toolRegistry.set(tool.name, tool);\n }\n\n hasTool(name: string): boolean {\n return this.toolRegistry.has(name);\n }\n\n getTool(name: string): Tool<never, unknown> | undefined {\n return this.toolRegistry.get(name);\n }\n\n /**\n * Run the agent against the LLM, executing any requested tools and\n * feeding their results back until the model responds without a tool\n * call.\n */\n async run(request: AgentRunRequest): Promise<AgentRunResult> {\n if (!this.llm) {\n throw new Error(\n `Agent \"${this.name}\" has no LLM provider configured. ` +\n \"Pass an LLM when constructing the agent or the Pipeflow instance.\",\n );\n }\n\n const messages: LLMMessage[] = [];\n if (this.context) {\n messages.push({ role: \"system\", content: this.context });\n }\n if (request.history) {\n messages.push(...request.history);\n }\n messages.push({ role: \"user\", content: request.prompt });\n\n const definitions: LLMToolDefinition[] = this.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters ?? { type: \"object\", properties: {} },\n }));\n\n const executed: ExecutedToolCall[] = [];\n const maxIterations = request.maxToolIterations ?? 10;\n\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n const { text, toolCalls } = await this.streamOnce({\n llm: this.llm,\n messages,\n definitions,\n temperature: request.temperature,\n maxTokens: request.maxTokens,\n });\n\n if (toolCalls.length === 0) {\n return { text, messages, toolCalls: executed };\n }\n\n messages.push({ role: \"assistant\", content: text, toolCalls });\n for (const call of toolCalls) {\n const executedCall = await this.executeToolCall(call);\n executed.push(executedCall);\n messages.push({\n role: \"tool\",\n toolCallId: call.id,\n name: call.name,\n content: JSON.stringify(executedCall.result),\n });\n }\n }\n\n throw new Error(\n `Agent \"${this.name}\" exceeded ${maxIterations} tool iterations`,\n );\n }\n\n private async streamOnce(options: {\n llm: LLM;\n messages: LLMMessage[];\n definitions: LLMToolDefinition[];\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; toolCalls: LLMToolCall[] }> {\n const { llm, messages, definitions, temperature, maxTokens } = options;\n let text = \"\";\n const toolCalls: LLMToolCall[] = [];\n\n for await (const event of llm.stream({\n messages,\n tools: definitions,\n temperature,\n maxTokens,\n })) {\n switch (event.type) {\n case \"delta\":\n text += event.content;\n break;\n case \"tool_call\":\n toolCalls.push({ id: event.id, name: event.name, arguments: event.arguments });\n break;\n case \"done\":\n return { text, toolCalls };\n case \"error\":\n throw event.error;\n }\n }\n\n return { text, toolCalls };\n }\n\n private async executeToolCall(call: LLMToolCall): Promise<ExecutedToolCall> {\n const tool = this.toolRegistry.get(call.name);\n\n let args: unknown;\n try {\n args = JSON.parse(call.arguments);\n } catch {\n args = call.arguments;\n }\n\n if (!tool) {\n return {\n id: call.id,\n name: call.name,\n arguments: args,\n result: { error: `Unknown tool \"${call.name}\"` },\n };\n }\n\n try {\n const result = await tool.execute(args as never);\n return { id: call.id, name: call.name, arguments: args, result };\n } catch (error) {\n return {\n id: call.id,\n name: call.name,\n arguments: args,\n result: { error: error instanceof Error ? error.message : String(error) },\n };\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Agent", "__name", "options", "name", "tool", "request", "messages", "definitions", "executed", "maxIterations", "iteration", "text", "toolCalls", "call", "executedCall", "llm", "temperature", "maxTokens", "event", "args", "result", "error"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/agents/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { Agent } from \"./agent\";\nexport type {\n AgentOptions,\n AgentRunRequest,\n AgentRunResult,\n ExecutedToolCall,\n} from \"./agent\";\nexport { Tool, Tool as PipeflowTool } from \"./tools/tools\";\nexport type { ToolOptions } from \"./tools/tools\";\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,SAAAA,MAAa,UAOtB,OAAS,QAAAC,EAAc,QAARA,MAA4B",
|
|
6
|
+
"names": ["Agent", "Tool"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var o=Object.defineProperty;var s=(r,e)=>o(r,"name",{value:e,configurable:!0});class a{static{s(this,"Tool")}name;description;parameters;executor;constructor(e){const t=e.name.trim();if(!t)throw new Error("Tool requires a non-empty name");const n=e.description.trim();if(!n)throw new Error("Tool requires a non-empty description");this.name=t,this.description=n,this.parameters=e.parameters,this.executor=e.execute}async execute(e){return this.executor(e)}}export{a as Tool};
|
|
2
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/agents/tools/tools.ts"],
|
|
4
|
+
"sourcesContent": ["export interface ToolOptions<TArgs, TResult> {\n name: string;\n description: string;\n /** JSON schema describing the arguments for the LLM. */\n parameters?: Record<string, unknown>;\n execute: (args: TArgs) => TResult | Promise<TResult>;\n}\n\n/**\n * A capability exposed by the application to an agent.\n *\n * Tools execute in the application's backend: Pipeflow never runs\n * application code directly.\n */\nexport class Tool<TArgs = Record<string, unknown>, TResult = unknown> {\n readonly name: string;\n readonly description: string;\n readonly parameters: Record<string, unknown> | undefined;\n private readonly executor: (args: TArgs) => TResult | Promise<TResult>;\n\n constructor(options: ToolOptions<TArgs, TResult>) {\n const name = options.name.trim();\n if (!name) {\n throw new Error(\"Tool requires a non-empty name\");\n }\n const description = options.description.trim();\n if (!description) {\n throw new Error(\"Tool requires a non-empty description\");\n }\n this.name = name;\n this.description = description;\n this.parameters = options.parameters;\n this.executor = options.execute;\n }\n\n /** Execute the tool. Sync throws and rejections both surface as rejections. */\n async execute(args: TArgs): Promise<TResult> {\n return this.executor(args);\n }\n}\n"],
|
|
5
|
+
"mappings": "+EAcO,MAAMA,CAAyD,CAdtE,MAcsE,CAAAC,EAAA,aAC3D,KACA,YACA,WACQ,SAEjB,YAAYC,EAAsC,CAChD,MAAMC,EAAOD,EAAQ,KAAK,KAAK,EAC/B,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,gCAAgC,EAElD,MAAMC,EAAcF,EAAQ,YAAY,KAAK,EAC7C,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,uCAAuC,EAEzD,KAAK,KAAOD,EACZ,KAAK,YAAcC,EACnB,KAAK,WAAaF,EAAQ,WAC1B,KAAK,SAAWA,EAAQ,OAC1B,CAGA,MAAM,QAAQG,EAA+B,CAC3C,OAAO,KAAK,SAASA,CAAI,CAC3B,CACF",
|
|
6
|
+
"names": ["Tool", "__name", "options", "name", "description", "args"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var d=Object.defineProperty;var o=(a,t)=>d(a,"name",{value:t,configurable:!0});import{createConversationState as p}from"../types.js";import{Transcription as c}from"../transcription/transcription.js";class v{static{o(this,"Conversation")}id;agents;transcription;state;persistence;listeners=new Map;pendingToolCallsById=new Map;nextAudioSequence=0;constructor(t){this.id=t.id,this.agents=t.agents??[],this.persistence=t.persistence,this.transcription=new c(this.id),this.state=p()}get status(){return this.state.status}get participants(){return[...this.state.participants.values()]}start(){if(this.state.status==="stopped")throw new Error(`Conversation "${this.id}" has already been stopped`);this.state.status!=="started"&&(this.state.status="started",this.emit("start",{conversationId:this.id}),this.emitState())}async stop(){if(this.state.status==="stopped")return;this.state.status="stopped",this.pendingToolCallsById.clear();const t=this.cancelCurrentGeneration();t&&await this.persistence?.appendGeneration(this.id,t),await this.persistence?.finalizeConversation(this.id,Date.now()),this.emit("stop",{conversationId:this.id}),this.emitState()}async participate(t){if(this.state.status==="stopped")throw new Error(`Conversation "${this.id}" has already been stopped`);const e=Array.isArray(t)?t:[t],i=new Set;for(const n of e){if(i.has(n.userId))throw new Error(`Duplicate participant "${n.userId}" in batch`);if(i.add(n.userId),this.state.participants.has(n.userId))throw new Error(`Participant "${n.userId}" already exists`)}const r=[];for(const n of e){const s={userId:n.userId,aliases:[...n.aliases??[]],joinedAt:Date.now()};this.state.participants.set(s.userId,s),await this.persistence?.addParticipant(this.id,s),r.push(s),this.emit("participant",{conversationId:this.id,participant:s})}return this.emitState(),r}listen(t){if(this.state.status!=="started")throw new Error(`Conversation "${this.id}" is not started`);if(!this.state.participants.has(t.userId))throw new Error(`Unknown participant "${t.userId}"`);const e={data:t.audio,timestamp:Date.now(),sequence:this.nextAudioSequence++};this.emit("audio-in",{conversationId:this.id,userId:t.userId,audio:e})}interrupt(){const t=this.cancelCurrentGeneration();t&&this.persistence?.appendGeneration(this.id,t).catch(()=>{}),this.emit("interrupt",{conversationId:this.id}),this.emitState()}on(t,e){let i=this.listeners.get(t);return i||(i=new Set,this.listeners.set(t,i)),i.add(e),()=>{i.delete(e)}}emit(t,e){const i=this.listeners.get(t);if(i)for(const r of[...i])r(e)}pushAudio(t){this.emit("audio",{conversationId:this.id,audio:t})}async pushTurn(t){this.state.currentTurn=t,this.emit("turn",{conversationId:this.id,turn:t}),await this.persistence?.appendTurn(this.id,t),this.emitState()}async pushTranscript(t){const e=this.transcription.append({...t});return this.state.transcriptCount++,this.emit("transcript",{conversationId:this.id,entry:e}),await this.persistence?.appendTranscript(this.id,e),this.emitState(),e}async pushGeneration(t){this.state.currentGeneration=t,this.emit("generation",{conversationId:this.id,generation:t}),await this.persistence?.appendGeneration(this.id,t),this.emitState()}get pendingToolCalls(){return[...this.pendingToolCallsById.values()]}requestToolCall(t){this.pendingToolCallsById.set(t.id,t),this.emit("tool-call",{conversationId:this.id,call:t}),this.emitState()}resolveToolCall(t){if(!this.pendingToolCallsById.has(t.id))throw new Error(`No pending tool call "${t.id}"`);this.pendingToolCallsById.delete(t.id),this.emit("tool-call-result",{conversationId:this.id,result:t}),this.emitState()}async completeGeneration(t){const e=this.state.currentGeneration;e&&e.status==="streaming"&&(t!==void 0&&(e.text=t),e.status="completed",e.endedAt=Date.now(),await this.persistence?.appendGeneration(this.id,e),this.emitState())}transcript(){return this.transcription.list()}cancelCurrentGeneration(){const t=this.state.currentGeneration;return t&&t.status==="streaming"&&(t.status="cancelled",t.endedAt=Date.now()),this.state.currentGeneration=null,t??null}emitState(){this.emit("state",{conversationId:this.id,state:this.state})}}export{v as Conversation};
|
|
2
|
+
//# sourceMappingURL=conversation.js.map
|