@moureau/pipeflow 0.0.1 → 0.0.2
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/README.md +245 -117
- package/dist/cjs/agents/agent.js +1 -1
- package/dist/cjs/agents/agent.js.map +3 -3
- package/dist/cjs/agents/tools/tools.js +1 -1
- package/dist/cjs/agents/tools/tools.js.map +3 -3
- package/dist/cjs/conversations/conversation/conversation.js +1 -1
- package/dist/cjs/conversations/conversation/conversation.js.map +3 -3
- package/dist/cjs/conversations/conversations.js +1 -1
- package/dist/cjs/conversations/conversations.js.map +3 -3
- package/dist/cjs/conversations/index.js +1 -1
- package/dist/cjs/conversations/index.js.map +3 -3
- package/dist/cjs/conversations/orchestration/coordination/coordination.js +10 -0
- package/dist/cjs/conversations/orchestration/coordination/coordination.js.map +7 -0
- package/dist/cjs/conversations/orchestration/coordination/index.js +2 -0
- package/dist/cjs/conversations/orchestration/coordination/index.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/coordination-runner/coordination-runner.js +4 -0
- package/dist/cjs/conversations/orchestration/orchestrator/coordination-runner/coordination-runner.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/coordination-runner/index.js +2 -0
- package/dist/cjs/conversations/orchestration/orchestrator/coordination-runner/index.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/generation/generation.js +2 -0
- package/dist/cjs/conversations/orchestration/orchestrator/generation/generation.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/generation/index.js +2 -0
- package/dist/cjs/conversations/orchestration/orchestrator/generation/index.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/history/history.js +4 -0
- package/dist/cjs/conversations/orchestration/orchestrator/history/history.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/history/index.js +2 -0
- package/dist/cjs/conversations/orchestration/orchestrator/history/index.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/index.js +1 -1
- package/dist/cjs/conversations/orchestration/orchestrator/index.js.map +3 -3
- package/dist/cjs/conversations/orchestration/orchestrator/orchestrator.js +1 -2
- package/dist/cjs/conversations/orchestration/orchestrator/orchestrator.js.map +3 -3
- package/dist/cjs/conversations/orchestration/orchestrator/routing/index.js +2 -0
- package/dist/cjs/conversations/orchestration/orchestrator/routing/index.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/routing/routing.js +23 -0
- package/dist/cjs/conversations/orchestration/orchestrator/routing/routing.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/speech/index.js +2 -0
- package/dist/cjs/conversations/orchestration/orchestrator/speech/index.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/speech/speech.js +2 -0
- package/dist/cjs/conversations/orchestration/orchestrator/speech/speech.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/tools/index.js +2 -0
- package/dist/cjs/conversations/orchestration/orchestrator/tools/index.js.map +7 -0
- package/dist/cjs/conversations/orchestration/orchestrator/tools/tools.js +2 -0
- package/dist/cjs/conversations/orchestration/orchestrator/tools/tools.js.map +7 -0
- package/dist/cjs/conversations/orchestration/test-harness.js +2 -0
- package/dist/cjs/conversations/orchestration/test-harness.js.map +7 -0
- package/dist/cjs/conversations/orchestration/text-chunker/index.js +2 -0
- package/dist/cjs/conversations/orchestration/text-chunker/index.js.map +7 -0
- package/dist/cjs/conversations/orchestration/text-chunker/text-chunker.js +3 -0
- package/dist/cjs/conversations/orchestration/text-chunker/text-chunker.js.map +7 -0
- package/dist/cjs/conversations/stream/conversation-stream.js +2 -0
- package/dist/cjs/conversations/stream/conversation-stream.js.map +7 -0
- package/dist/cjs/conversations/stream/index.js +2 -0
- package/dist/cjs/conversations/stream/index.js.map +7 -0
- package/dist/cjs/conversations/types.js +1 -1
- package/dist/cjs/conversations/types.js.map +2 -2
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +3 -3
- package/dist/cjs/persistence/adapters/sqlite/sqlite.js +18 -14
- package/dist/cjs/persistence/adapters/sqlite/sqlite.js.map +3 -3
- package/dist/cjs/pipeflow/index.js +2 -0
- package/dist/cjs/pipeflow/index.js.map +7 -0
- package/dist/cjs/pipeflow/pipeflow.js +2 -0
- package/dist/cjs/pipeflow/pipeflow.js.map +7 -0
- package/dist/cjs/providers/index.js +1 -1
- package/dist/cjs/providers/index.js.map +2 -2
- package/dist/cjs/providers/llm/adapters/claude/claude.js +5 -0
- package/dist/cjs/providers/llm/adapters/claude/claude.js.map +7 -0
- package/dist/cjs/providers/llm/adapters/claude/index.js +2 -0
- package/dist/cjs/providers/llm/adapters/claude/index.js.map +7 -0
- package/dist/cjs/providers/llm/adapters/deepseek/deepseek.js +1 -1
- package/dist/cjs/providers/llm/adapters/deepseek/deepseek.js.map +3 -3
- package/dist/cjs/providers/llm/adapters/index.js +1 -1
- package/dist/cjs/providers/llm/adapters/index.js.map +3 -3
- package/dist/cjs/providers/llm/adapters/openai/index.js +2 -0
- package/dist/cjs/providers/llm/adapters/openai/index.js.map +7 -0
- package/dist/cjs/providers/llm/adapters/openai/openai.js +2 -0
- package/dist/cjs/providers/llm/adapters/openai/openai.js.map +7 -0
- package/dist/cjs/providers/llm/adapters/openai-compatible.js +10 -0
- package/dist/cjs/providers/llm/adapters/openai-compatible.js.map +7 -0
- package/dist/cjs/providers/llm/adapters/openrouter/index.js +2 -0
- package/dist/cjs/providers/llm/adapters/openrouter/index.js.map +7 -0
- package/dist/cjs/providers/llm/adapters/openrouter/openrouter.js +2 -0
- package/dist/cjs/providers/llm/adapters/openrouter/openrouter.js.map +7 -0
- package/dist/cjs/providers/llm/index.js +1 -1
- package/dist/cjs/providers/llm/index.js.map +3 -3
- package/dist/cjs/providers/llm/toolmode/index.js +2 -0
- package/dist/cjs/providers/llm/toolmode/index.js.map +7 -0
- package/dist/cjs/providers/llm/toolmode/toolmode.js +2 -0
- package/dist/cjs/providers/llm/toolmode/toolmode.js.map +7 -0
- package/dist/cjs/providers/llm/types.js +1 -1
- package/dist/cjs/providers/llm/types.js.map +3 -3
- package/dist/cjs/providers/stt/adapters/deepgram/deepgram.js +1 -1
- package/dist/cjs/providers/stt/adapters/deepgram/deepgram.js.map +3 -3
- package/dist/cjs/providers/stt/adapters/index.js +1 -1
- package/dist/cjs/providers/stt/adapters/index.js.map +3 -3
- package/dist/cjs/providers/stt/adapters/openrouter/index.js +2 -0
- package/dist/cjs/providers/stt/adapters/openrouter/index.js.map +7 -0
- package/dist/cjs/providers/stt/adapters/openrouter/openrouter.js +2 -0
- package/dist/cjs/providers/stt/adapters/openrouter/openrouter.js.map +7 -0
- package/dist/cjs/providers/tts/adapters/index.js +1 -1
- package/dist/cjs/providers/tts/adapters/index.js.map +3 -3
- package/dist/cjs/providers/tts/adapters/kokoro/kokoro.js +4 -1
- package/dist/cjs/providers/tts/adapters/kokoro/kokoro.js.map +3 -3
- package/dist/cjs/providers/tts/adapters/openrouter/index.js +2 -0
- package/dist/cjs/providers/tts/adapters/openrouter/index.js.map +7 -0
- package/dist/cjs/providers/tts/adapters/openrouter/openrouter.js +2 -0
- package/dist/cjs/providers/tts/adapters/openrouter/openrouter.js.map +7 -0
- package/dist/cjs/transport/streamobject/field-stream/field-stream.js +2 -0
- package/dist/cjs/transport/streamobject/field-stream/field-stream.js.map +7 -0
- package/dist/cjs/transport/streamobject/field-stream/index.js +2 -0
- package/dist/cjs/transport/streamobject/field-stream/index.js.map +7 -0
- package/dist/cjs/transport/streamobject/index.js +2 -0
- package/dist/cjs/transport/streamobject/index.js.map +7 -0
- package/dist/cjs/transport/streamobject/json-adapter/index.js +2 -0
- package/dist/cjs/transport/streamobject/json-adapter/index.js.map +7 -0
- package/dist/cjs/transport/streamobject/json-adapter/json-adapter.js +4 -0
- package/dist/cjs/transport/streamobject/json-adapter/json-adapter.js.map +7 -0
- package/dist/cjs/transport/streamobject/reference/index.js +2 -0
- package/dist/cjs/transport/streamobject/reference/index.js.map +7 -0
- package/dist/cjs/transport/streamobject/reference/reference.js +2 -0
- package/dist/cjs/transport/streamobject/reference/reference.js.map +7 -0
- package/dist/cjs/transport/streamobject/stream-object/index.js +2 -0
- package/dist/cjs/transport/streamobject/stream-object/index.js.map +7 -0
- package/dist/cjs/transport/streamobject/stream-object/stream-object.js +2 -0
- package/dist/cjs/transport/streamobject/stream-object/stream-object.js.map +7 -0
- package/dist/esm/agents/agent.js +1 -1
- package/dist/esm/agents/agent.js.map +3 -3
- package/dist/esm/agents/tools/tools.js +1 -1
- package/dist/esm/agents/tools/tools.js.map +3 -3
- package/dist/esm/conversations/conversation/conversation.js +1 -1
- package/dist/esm/conversations/conversation/conversation.js.map +3 -3
- package/dist/esm/conversations/conversations.js +1 -1
- package/dist/esm/conversations/conversations.js.map +3 -3
- package/dist/esm/conversations/index.js +1 -1
- package/dist/esm/conversations/index.js.map +3 -3
- package/dist/esm/conversations/orchestration/coordination/coordination.js +10 -0
- package/dist/esm/conversations/orchestration/coordination/coordination.js.map +7 -0
- package/dist/esm/conversations/orchestration/coordination/index.js +2 -0
- package/dist/esm/conversations/orchestration/coordination/index.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/coordination-runner/coordination-runner.js +4 -0
- package/dist/esm/conversations/orchestration/orchestrator/coordination-runner/coordination-runner.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/coordination-runner/index.js +2 -0
- package/dist/esm/conversations/orchestration/orchestrator/coordination-runner/index.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/generation/generation.js +2 -0
- package/dist/esm/conversations/orchestration/orchestrator/generation/generation.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/generation/index.js +2 -0
- package/dist/esm/conversations/orchestration/orchestrator/generation/index.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/history/history.js +4 -0
- package/dist/esm/conversations/orchestration/orchestrator/history/history.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/history/index.js +2 -0
- package/dist/esm/conversations/orchestration/orchestrator/history/index.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/index.js +1 -1
- package/dist/esm/conversations/orchestration/orchestrator/index.js.map +3 -3
- package/dist/esm/conversations/orchestration/orchestrator/orchestrator.js +1 -2
- package/dist/esm/conversations/orchestration/orchestrator/orchestrator.js.map +3 -3
- package/dist/esm/conversations/orchestration/orchestrator/routing/index.js +2 -0
- package/dist/esm/conversations/orchestration/orchestrator/routing/index.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/routing/routing.js +23 -0
- package/dist/esm/conversations/orchestration/orchestrator/routing/routing.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/speech/index.js +2 -0
- package/dist/esm/conversations/orchestration/orchestrator/speech/index.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/speech/speech.js +2 -0
- package/dist/esm/conversations/orchestration/orchestrator/speech/speech.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/tools/index.js +2 -0
- package/dist/esm/conversations/orchestration/orchestrator/tools/index.js.map +7 -0
- package/dist/esm/conversations/orchestration/orchestrator/tools/tools.js +2 -0
- package/dist/esm/conversations/orchestration/orchestrator/tools/tools.js.map +7 -0
- package/dist/esm/conversations/orchestration/test-harness.js +2 -0
- package/dist/esm/conversations/orchestration/test-harness.js.map +7 -0
- package/dist/esm/conversations/orchestration/text-chunker/index.js +2 -0
- package/dist/esm/conversations/orchestration/text-chunker/index.js.map +7 -0
- package/dist/esm/conversations/orchestration/text-chunker/text-chunker.js +3 -0
- package/dist/esm/conversations/orchestration/text-chunker/text-chunker.js.map +7 -0
- package/dist/esm/conversations/stream/conversation-stream.js +2 -0
- package/dist/esm/conversations/stream/conversation-stream.js.map +7 -0
- package/dist/esm/conversations/stream/index.js +2 -0
- package/dist/esm/conversations/stream/index.js.map +7 -0
- package/dist/esm/conversations/types.js +1 -1
- package/dist/esm/conversations/types.js.map +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +3 -3
- package/dist/esm/persistence/adapters/sqlite/sqlite.js +18 -14
- package/dist/esm/persistence/adapters/sqlite/sqlite.js.map +3 -3
- package/dist/esm/pipeflow/index.js +2 -0
- package/dist/esm/pipeflow/index.js.map +7 -0
- package/dist/esm/pipeflow/pipeflow.js +2 -0
- package/dist/esm/pipeflow/pipeflow.js.map +7 -0
- package/dist/esm/providers/index.js +1 -1
- package/dist/esm/providers/index.js.map +3 -3
- package/dist/esm/providers/llm/adapters/claude/claude.js +5 -0
- package/dist/esm/providers/llm/adapters/claude/claude.js.map +7 -0
- package/dist/esm/providers/llm/adapters/claude/index.js +2 -0
- package/dist/esm/providers/llm/adapters/claude/index.js.map +7 -0
- package/dist/esm/providers/llm/adapters/deepseek/deepseek.js +1 -1
- package/dist/esm/providers/llm/adapters/deepseek/deepseek.js.map +3 -3
- package/dist/esm/providers/llm/adapters/index.js +1 -1
- package/dist/esm/providers/llm/adapters/index.js.map +3 -3
- package/dist/esm/providers/llm/adapters/openai/index.js +2 -0
- package/dist/esm/providers/llm/adapters/openai/index.js.map +7 -0
- package/dist/esm/providers/llm/adapters/openai/openai.js +2 -0
- package/dist/esm/providers/llm/adapters/openai/openai.js.map +7 -0
- package/dist/esm/providers/llm/adapters/openai-compatible.js +10 -0
- package/dist/esm/providers/llm/adapters/openai-compatible.js.map +7 -0
- package/dist/esm/providers/llm/adapters/openrouter/index.js +2 -0
- package/dist/esm/providers/llm/adapters/openrouter/index.js.map +7 -0
- package/dist/esm/providers/llm/adapters/openrouter/openrouter.js +2 -0
- package/dist/esm/providers/llm/adapters/openrouter/openrouter.js.map +7 -0
- package/dist/esm/providers/llm/index.js +1 -1
- package/dist/esm/providers/llm/index.js.map +3 -3
- package/dist/esm/providers/llm/toolmode/index.js +2 -0
- package/dist/esm/providers/llm/toolmode/index.js.map +7 -0
- package/dist/esm/providers/llm/toolmode/toolmode.js +2 -0
- package/dist/esm/providers/llm/toolmode/toolmode.js.map +7 -0
- package/dist/esm/providers/llm/types.js +1 -0
- package/dist/esm/providers/llm/types.js.map +4 -4
- package/dist/esm/providers/stt/adapters/deepgram/deepgram.js +1 -1
- package/dist/esm/providers/stt/adapters/deepgram/deepgram.js.map +3 -3
- package/dist/esm/providers/stt/adapters/index.js +1 -1
- package/dist/esm/providers/stt/adapters/index.js.map +3 -3
- package/dist/esm/providers/stt/adapters/openrouter/index.js +2 -0
- package/dist/esm/providers/stt/adapters/openrouter/index.js.map +7 -0
- package/dist/esm/providers/stt/adapters/openrouter/openrouter.js +2 -0
- package/dist/esm/providers/stt/adapters/openrouter/openrouter.js.map +7 -0
- package/dist/esm/providers/tts/adapters/index.js +1 -1
- package/dist/esm/providers/tts/adapters/index.js.map +3 -3
- package/dist/esm/providers/tts/adapters/kokoro/kokoro.js +4 -1
- package/dist/esm/providers/tts/adapters/kokoro/kokoro.js.map +3 -3
- package/dist/esm/providers/tts/adapters/openrouter/index.js +2 -0
- package/dist/esm/providers/tts/adapters/openrouter/index.js.map +7 -0
- package/dist/esm/providers/tts/adapters/openrouter/openrouter.js +2 -0
- package/dist/esm/providers/tts/adapters/openrouter/openrouter.js.map +7 -0
- package/dist/esm/transport/streamobject/field-stream/field-stream.js +2 -0
- package/dist/esm/transport/streamobject/field-stream/field-stream.js.map +7 -0
- package/dist/esm/transport/streamobject/field-stream/index.js +2 -0
- package/dist/esm/transport/streamobject/field-stream/index.js.map +7 -0
- package/dist/esm/transport/streamobject/index.js +2 -0
- package/dist/esm/transport/streamobject/index.js.map +7 -0
- package/dist/esm/transport/streamobject/json-adapter/index.js +2 -0
- package/dist/esm/transport/streamobject/json-adapter/index.js.map +7 -0
- package/dist/esm/transport/streamobject/json-adapter/json-adapter.js +4 -0
- package/dist/esm/transport/streamobject/json-adapter/json-adapter.js.map +7 -0
- package/dist/esm/transport/streamobject/reference/index.js +2 -0
- package/dist/esm/transport/streamobject/reference/index.js.map +7 -0
- package/dist/esm/transport/streamobject/reference/reference.js +2 -0
- package/dist/esm/transport/streamobject/reference/reference.js.map +7 -0
- package/dist/esm/transport/streamobject/stream-object/index.js +2 -0
- package/dist/esm/transport/streamobject/stream-object/index.js.map +7 -0
- package/dist/esm/transport/streamobject/stream-object/stream-object.js +2 -0
- package/dist/esm/transport/streamobject/stream-object/stream-object.js.map +7 -0
- package/dist/types/agents/agent.d.ts +3 -0
- package/dist/types/agents/tools/tools.d.ts +28 -6
- package/dist/types/conversations/conversation/conversation.d.ts +85 -6
- package/dist/types/conversations/conversations.d.ts +11 -1
- package/dist/types/conversations/index.d.ts +2 -1
- package/dist/types/conversations/orchestration/coordination/coordination.d.ts +192 -0
- package/dist/types/conversations/orchestration/coordination/index.d.ts +2 -0
- package/dist/types/conversations/orchestration/orchestrator/coordination-runner/coordination-runner.d.ts +108 -0
- package/dist/types/conversations/orchestration/orchestrator/coordination-runner/index.d.ts +2 -0
- package/dist/types/conversations/orchestration/orchestrator/generation/generation.d.ts +43 -0
- package/dist/types/conversations/orchestration/orchestrator/generation/index.d.ts +2 -0
- package/dist/types/conversations/orchestration/orchestrator/history/history.d.ts +62 -0
- package/dist/types/conversations/orchestration/orchestrator/history/index.d.ts +1 -0
- package/dist/types/conversations/orchestration/orchestrator/index.d.ts +10 -0
- package/dist/types/conversations/orchestration/orchestrator/orchestrator.d.ts +45 -27
- package/dist/types/conversations/orchestration/orchestrator/routing/index.d.ts +1 -0
- package/dist/types/conversations/orchestration/orchestrator/routing/routing.d.ts +19 -0
- package/dist/types/conversations/orchestration/orchestrator/speech/index.d.ts +2 -0
- package/dist/types/conversations/orchestration/orchestrator/speech/speech.d.ts +49 -0
- package/dist/types/conversations/orchestration/orchestrator/tools/index.d.ts +2 -0
- package/dist/types/conversations/orchestration/orchestrator/tools/tools.d.ts +31 -0
- package/dist/types/conversations/orchestration/test-harness.d.ts +96 -0
- package/dist/types/conversations/orchestration/text-chunker/index.d.ts +1 -0
- package/dist/types/conversations/orchestration/text-chunker/text-chunker.d.ts +39 -0
- package/dist/types/conversations/stream/conversation-stream.d.ts +42 -0
- package/dist/types/conversations/stream/index.d.ts +1 -0
- package/dist/types/conversations/types.d.ts +32 -0
- package/dist/types/index.d.ts +5 -38
- package/dist/types/pipeflow/index.d.ts +2 -0
- package/dist/types/pipeflow/pipeflow.d.ts +35 -0
- package/dist/types/providers/index.d.ts +1 -1
- package/dist/types/providers/llm/adapters/claude/claude.d.ts +45 -0
- package/dist/types/providers/llm/adapters/claude/index.d.ts +2 -0
- package/dist/types/providers/llm/adapters/deepseek/deepseek.d.ts +23 -2
- package/dist/types/providers/llm/adapters/index.d.ts +3 -0
- package/dist/types/providers/llm/adapters/openai/index.d.ts +2 -0
- package/dist/types/providers/llm/adapters/openai/openai.d.ts +45 -0
- package/dist/types/providers/llm/adapters/openai-compatible.d.ts +44 -0
- package/dist/types/providers/llm/adapters/openrouter/index.d.ts +2 -0
- package/dist/types/providers/llm/adapters/openrouter/openrouter.d.ts +60 -0
- package/dist/types/providers/llm/index.d.ts +5 -2
- package/dist/types/providers/llm/toolmode/index.d.ts +2 -0
- package/dist/types/providers/llm/toolmode/toolmode.d.ts +99 -0
- package/dist/types/providers/llm/types.d.ts +62 -0
- package/dist/types/providers/stt/adapters/deepgram/deepgram.d.ts +4 -1
- package/dist/types/providers/stt/adapters/index.d.ts +1 -0
- package/dist/types/providers/stt/adapters/openrouter/index.d.ts +2 -0
- package/dist/types/providers/stt/adapters/openrouter/openrouter.d.ts +94 -0
- package/dist/types/providers/tts/adapters/index.d.ts +1 -0
- package/dist/types/providers/tts/adapters/kokoro/kokoro.d.ts +17 -2
- package/dist/types/providers/tts/adapters/openrouter/index.d.ts +2 -0
- package/dist/types/providers/tts/adapters/openrouter/openrouter.d.ts +45 -0
- package/dist/types/transport/streamobject/field-stream/field-stream.d.ts +85 -0
- package/dist/types/transport/streamobject/field-stream/index.d.ts +2 -0
- package/dist/types/transport/streamobject/index.d.ts +8 -0
- package/dist/types/transport/streamobject/json-adapter/index.d.ts +2 -0
- package/dist/types/transport/streamobject/json-adapter/json-adapter.d.ts +65 -0
- package/dist/types/transport/streamobject/reference/index.d.ts +2 -0
- package/dist/types/transport/streamobject/reference/reference.d.ts +127 -0
- package/dist/types/transport/streamobject/stream-object/index.d.ts +2 -0
- package/dist/types/transport/streamobject/stream-object/stream-object.d.ts +31 -0
- package/package.json +23 -2
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/conversations/orchestration/text-chunker/text-chunker.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Streaming text segmenter for speech.\n *\n * Turns an incremental LLM token stream into speakable chunks with a boundary\n * hierarchy, so TTS never waits indefinitely for punctuation:\n *\n * 1. **Strong boundary** \u2014 `. ! ? \\n` flush immediately (sentence end).\n * 2. **Soft boundary** \u2014 once the buffer is long enough, split at the last\n * `, ; :` that yields a chunk of at least `minSoftLength` characters.\n * 3. **Hard cap** \u2014 at `maxLength` the buffer flushes regardless of\n * punctuation.\n *\n * The heuristics are intentionally internal and benchmark-driven rather than\n * configurable through the public API.\n */\n\nconst STRONG_BOUNDARIES = new Set([\".\", \"!\", \"?\", \"\\n\"]);\nconst SOFT_BOUNDARIES = new Set([\",\", \";\", \":\"]);\n\nexport interface TextChunkerOptions {\n /** Buffer length at which a soft boundary becomes eligible. Default 80. */\n targetLength?: number;\n /** Hard cap before an unconditional flush. Default 140. */\n maxLength?: number;\n /** Smallest chunk a soft boundary may produce. Default 40. */\n minSoftLength?: number;\n}\n\nexport class TextChunker {\n private readonly targetLength: number;\n private readonly maxLength: number;\n private readonly minSoftLength: number;\n private buffer = \"\";\n\n constructor(options: TextChunkerOptions = {}) {\n this.targetLength = options.targetLength ?? 80;\n this.maxLength = options.maxLength ?? 140;\n this.minSoftLength = options.minSoftLength ?? 40;\n }\n\n /** Feed tokens; returns zero or more complete chunks to synthesize. */\n push(delta: string): string[] {\n this.buffer += delta;\n const chunks: string[] = [];\n for (;;) {\n const chunk = this.takeNext();\n if (chunk === null) break;\n if (chunk.length > 0) chunks.push(chunk);\n }\n return chunks;\n }\n\n /** Flush any remaining buffered text as a final chunk (or null). */\n flush(): string | null {\n const rest = this.buffer.trim();\n this.buffer = \"\";\n return rest.length > 0 ? rest : null;\n }\n\n /** Drop the buffer (interrupt, stop). */\n clear(): void {\n this.buffer = \"\";\n }\n\n private takeNext(): string | null {\n if (this.buffer.length === 0) return null;\n\n // 1. Strong boundary \u2014 flush at the first sentence end for low latency.\n for (let i = 0; i < this.buffer.length; i++) {\n if (STRONG_BOUNDARIES.has(this.buffer[i]!)) return this.takeThrough(i);\n }\n\n // 2. Soft boundary once the buffer is long enough: prefer the last\n // comma/semicolon/colon, as long as it yields a chunk of at least\n // minSoftLength (never split a short clause off early).\n if (this.buffer.length >= this.targetLength) {\n for (let i = this.buffer.length - 1; i >= 0; i--) {\n if (SOFT_BOUNDARIES.has(this.buffer[i]!)) {\n if (i + 1 >= this.minSoftLength) return this.takeThrough(i);\n break; // any earlier boundary is even smaller\n }\n }\n }\n\n // 3. Hard cap \u2014 never wait indefinitely for punctuation.\n if (this.buffer.length >= this.maxLength) {\n return this.takeThrough(this.maxLength - 1);\n }\n\n return null;\n }\n\n /** Cut the buffer through index `i` (inclusive) and return the text. */\n private takeThrough(i: number): string {\n const chunk = this.buffer.slice(0, i + 1).trim();\n this.buffer = this.buffer.slice(i + 1);\n return chunk;\n }\n}\n"],
|
|
5
|
+
"mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,IAAA,eAAAC,EAAAH,GAgBA,MAAMI,EAAoB,IAAI,IAAI,CAAC,IAAK,IAAK,IAAK;AAAA,CAAI,CAAC,EACjDC,EAAkB,IAAI,IAAI,CAAC,IAAK,IAAK,GAAG,CAAC,EAWxC,MAAMC,CAAY,CA5BzB,MA4ByB,CAAAC,EAAA,oBACN,aACA,UACA,cACT,OAAS,GAEjB,YAAYC,EAA8B,CAAC,EAAG,CAC5C,KAAK,aAAeA,EAAQ,cAAgB,GAC5C,KAAK,UAAYA,EAAQ,WAAa,IACtC,KAAK,cAAgBA,EAAQ,eAAiB,EAChD,CAGA,KAAKC,EAAyB,CAC5B,KAAK,QAAUA,EACf,MAAMC,EAAmB,CAAC,EAC1B,OAAS,CACP,MAAMC,EAAQ,KAAK,SAAS,EAC5B,GAAIA,IAAU,KAAM,MAChBA,EAAM,OAAS,GAAGD,EAAO,KAAKC,CAAK,CACzC,CACA,OAAOD,CACT,CAGA,OAAuB,CACrB,MAAME,EAAO,KAAK,OAAO,KAAK,EAC9B,YAAK,OAAS,GACPA,EAAK,OAAS,EAAIA,EAAO,IAClC,CAGA,OAAc,CACZ,KAAK,OAAS,EAChB,CAEQ,UAA0B,CAChC,GAAI,KAAK,OAAO,SAAW,EAAG,OAAO,KAGrC,QAASC,EAAI,EAAGA,EAAI,KAAK,OAAO,OAAQA,IACtC,GAAIT,EAAkB,IAAI,KAAK,OAAOS,CAAC,CAAE,EAAG,OAAO,KAAK,YAAYA,CAAC,EAMvE,GAAI,KAAK,OAAO,QAAU,KAAK,cAC7B,QAASA,EAAI,KAAK,OAAO,OAAS,EAAGA,GAAK,EAAGA,IAC3C,GAAIR,EAAgB,IAAI,KAAK,OAAOQ,CAAC,CAAE,EAAG,CACxC,GAAIA,EAAI,GAAK,KAAK,cAAe,OAAO,KAAK,YAAYA,CAAC,EAC1D,KACF,EAKJ,OAAI,KAAK,OAAO,QAAU,KAAK,UACtB,KAAK,YAAY,KAAK,UAAY,CAAC,EAGrC,IACT,CAGQ,YAAYA,EAAmB,CACrC,MAAMF,EAAQ,KAAK,OAAO,MAAM,EAAGE,EAAI,CAAC,EAAE,KAAK,EAC/C,YAAK,OAAS,KAAK,OAAO,MAAMA,EAAI,CAAC,EAC9BF,CACT,CACF",
|
|
6
|
+
"names": ["text_chunker_exports", "__export", "TextChunker", "__toCommonJS", "STRONG_BOUNDARIES", "SOFT_BOUNDARIES", "TextChunker", "__name", "options", "delta", "chunks", "chunk", "rest", "i"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var o=(i,e)=>r(i,"name",{value:e,configurable:!0});var u=(i,e)=>{for(var t in e)r(i,t,{get:e[t],enumerable:!0})},d=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of m(e))!h.call(i,s)&&s!==t&&r(i,s,{get:()=>e[s],enumerable:!(n=p(e,s))||n.enumerable});return i};var v=i=>d(r({},"__esModule",{value:!0}),i);var g={};u(g,{ConversationStream:()=>b});module.exports=v(g);var l=require("../../transport/streamobject/field-stream/field-stream.js");const f=[{path:["agent"],type:"string",maxLength:128},{path:["text"],type:"string",mode:"array",maxItems:4096,maxLength:4096}],a=0,c=1;class b extends l.FieldStream{static{o(this,"ConversationStream")}unsubscribers;active=null;constructor(e){super(f,{onCancel:o(()=>e.interrupt(),"onCancel")}),this.unsubscribers=[e.on("text-delta",({text:t,agentName:n})=>this.onDelta(t,n)),e.on("generation-complete",()=>this.completeReply()),e.on("error",({error:t})=>this.fail(t)),e.on("interrupt",()=>this.abortReply())]}dispose(){for(const e of this.unsubscribers)e()}onDelta(e,t){this.active===null&&(this.beginObject(),this.active={agentName:t,items:[]},t!==void 0&&this.emitField(a,t));const n=this.active.items.length;this.active.items.push(e),this.emitItem(c,n,e)}completeReply(){const e=this.active;if(e===null)return;this.active=null;const t=[];e.agentName!==void 0&&t.push({kind:"field",field:a,value:e.agentName}),t.push({kind:"field",field:c,value:e.items}),t.push({kind:"object-complete"}),this.emitObject(t)}abortReply(){this.active=null,this.cancelObject()}}
|
|
2
|
+
//# sourceMappingURL=conversation-stream.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/conversations/stream/conversation-stream.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * ConversationStream \u2014 the conversation's semantic reply stream.\n *\n * Turns a Conversation's event stream (LLM text fragments + generation\n * completion) into FieldStream completion events: consumers act on partial\n * reply text without waiting for the reply to finish.\n *\n * const replies = new ConversationStream(conversation);\n * replies.whenItem(\"text\", (fragment, i) => render(fragment));\n * replies.when(\"agent\", (agent) => showSpeaker(agent));\n * replies.whenObjectDone((reply) => finalize(reply));\n * replies.cancel(); // aborts the current generation (interrupts the LLM)\n *\n * One semantic object per top-level generation (agent or coordination\n * reply). The `text` field is an ordered sequence of completed text\n * fragments \u2014 semantically \"the next fragment of the reply arrived\", not\n * \"whatever happened to be inside a provider SSE packet\". Fragment sizes are\n * an implementation detail of the producer and may be coalesced later.\n *\n * Lifecycle per reply:\n *\n * first fragment \u2500\u2500\u25B6 STREAMING \u2500\u2500generation-complete\u2500\u2500\u25B6 DONE\n * \u251C\u2500\u2500cancel()/interrupt\u2500\u2500\u25B6 CANCELLED\n * \u2514\u2500\u2500provider error\u2500\u2500\u2500\u2500\u2500\u2500\u25B6 FAILED\n *\n * Each boundary fires at most once; no completion event fires after a\n * terminal state. Interruptions and errors leave already-delivered fragments\n * as valid partial state. Delegated sub-generation results do not terminate\n * the top-level reply \u2014 only the top-level generation's completion does.\n */\nimport { FieldStream } from \"../../transport/streamobject/field-stream/field-stream\";\nimport type {\n Event,\n Schema,\n} from \"../../transport/streamobject/reference/reference\";\nimport type { Conversation } from \"../conversation/conversation\";\n\nconst REPLY_SCHEMA: Schema = [\n { path: [\"agent\"], type: \"string\", maxLength: 128 },\n { path: [\"text\"], type: \"string\", mode: \"array\", maxItems: 4096, maxLength: 4096 },\n];\n\nconst AGENT_FIELD = 0;\nconst TEXT_FIELD = 1;\n\nexport class ConversationStream extends FieldStream {\n private readonly unsubscribers: Array<() => void>;\n private active: { agentName: string | undefined; items: string[] } | null = null;\n\n constructor(conversation: Conversation) {\n // cancel() interrupts the conversation, which stops the current\n // generation's LLM through the orchestrator. Idempotent.\n super(REPLY_SCHEMA, { onCancel: () => conversation.interrupt() });\n this.unsubscribers = [\n conversation.on(\"text-delta\", ({ text, agentName }) => this.onDelta(text, agentName)),\n conversation.on(\"generation-complete\", () => this.completeReply()),\n conversation.on(\"error\", ({ error }) => this.fail(error)),\n conversation.on(\"interrupt\", () => this.abortReply()),\n ];\n }\n\n /** Stop listening to the conversation. */\n dispose(): void {\n for (const unsubscribe of this.unsubscribers) unsubscribe();\n }\n\n private onDelta(text: string, agentName: string | undefined): void {\n if (this.active === null) {\n this.beginObject();\n this.active = { agentName, items: [] };\n if (agentName !== undefined) this.emitField(AGENT_FIELD, agentName);\n }\n const index = this.active.items.length;\n this.active.items.push(text);\n this.emitItem(TEXT_FIELD, index, text);\n }\n\n private completeReply(): void {\n const active = this.active;\n if (active === null) return;\n this.active = null;\n const events: Event[] = [];\n if (active.agentName !== undefined) {\n events.push({ kind: \"field\", field: AGENT_FIELD, value: active.agentName });\n }\n events.push({ kind: \"field\", field: TEXT_FIELD, value: active.items });\n events.push({ kind: \"object-complete\" });\n this.emitObject(events);\n }\n\n private abortReply(): void {\n this.active = null;\n this.cancelObject(); // delivered fragments remain valid partial state\n }\n}\n"],
|
|
5
|
+
"mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GA8BA,IAAAI,EAA4B,kEAO5B,MAAMC,EAAuB,CAC3B,CAAE,KAAM,CAAC,OAAO,EAAG,KAAM,SAAU,UAAW,GAAI,EAClD,CAAE,KAAM,CAAC,MAAM,EAAG,KAAM,SAAU,KAAM,QAAS,SAAU,KAAM,UAAW,IAAK,CACnF,EAEMC,EAAc,EACdC,EAAa,EAEZ,MAAMC,UAA2B,aAAY,CA7CpD,MA6CoD,CAAAC,EAAA,2BACjC,cACT,OAAoE,KAE5E,YAAYC,EAA4B,CAGtC,MAAML,EAAc,CAAE,SAAUI,EAAA,IAAMC,EAAa,UAAU,EAA7B,WAA+B,CAAC,EAChE,KAAK,cAAgB,CACnBA,EAAa,GAAG,aAAc,CAAC,CAAE,KAAAC,EAAM,UAAAC,CAAU,IAAM,KAAK,QAAQD,EAAMC,CAAS,CAAC,EACpFF,EAAa,GAAG,sBAAuB,IAAM,KAAK,cAAc,CAAC,EACjEA,EAAa,GAAG,QAAS,CAAC,CAAE,MAAAG,CAAM,IAAM,KAAK,KAAKA,CAAK,CAAC,EACxDH,EAAa,GAAG,YAAa,IAAM,KAAK,WAAW,CAAC,CACtD,CACF,CAGA,SAAgB,CACd,UAAWI,KAAe,KAAK,cAAeA,EAAY,CAC5D,CAEQ,QAAQH,EAAcC,EAAqC,CAC7D,KAAK,SAAW,OAClB,KAAK,YAAY,EACjB,KAAK,OAAS,CAAE,UAAAA,EAAW,MAAO,CAAC,CAAE,EACjCA,IAAc,QAAW,KAAK,UAAUN,EAAaM,CAAS,GAEpE,MAAMG,EAAQ,KAAK,OAAO,MAAM,OAChC,KAAK,OAAO,MAAM,KAAKJ,CAAI,EAC3B,KAAK,SAASJ,EAAYQ,EAAOJ,CAAI,CACvC,CAEQ,eAAsB,CAC5B,MAAMK,EAAS,KAAK,OACpB,GAAIA,IAAW,KAAM,OACrB,KAAK,OAAS,KACd,MAAMC,EAAkB,CAAC,EACrBD,EAAO,YAAc,QACvBC,EAAO,KAAK,CAAE,KAAM,QAAS,MAAOX,EAAa,MAAOU,EAAO,SAAU,CAAC,EAE5EC,EAAO,KAAK,CAAE,KAAM,QAAS,MAAOV,EAAY,MAAOS,EAAO,KAAM,CAAC,EACrEC,EAAO,KAAK,CAAE,KAAM,iBAAkB,CAAC,EACvC,KAAK,WAAWA,CAAM,CACxB,CAEQ,YAAmB,CACzB,KAAK,OAAS,KACd,KAAK,aAAa,CACpB,CACF",
|
|
6
|
+
"names": ["conversation_stream_exports", "__export", "ConversationStream", "__toCommonJS", "import_field_stream", "REPLY_SCHEMA", "AGENT_FIELD", "TEXT_FIELD", "ConversationStream", "__name", "conversation", "text", "agentName", "error", "unsubscribe", "index", "active", "events"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var s=(r,o)=>{for(var t in o)a(r,t,{get:o[t],enumerable:!0})},v=(r,o,t,m)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of i(o))!p.call(r,e)&&e!==t&&a(r,e,{get:()=>o[e],enumerable:!(m=f(o,e))||m.enumerable});return r};var x=r=>v(a({},"__esModule",{value:!0}),r);var C={};s(C,{ConversationStream:()=>n.ConversationStream});module.exports=x(C);var n=require("./conversation-stream.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/conversations/stream/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { ConversationStream } from \"./conversation-stream\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8DAAAE,EAAAF,GAAA,IAAAG,EAAmC",
|
|
6
|
+
"names": ["stream_exports", "__export", "__toCommonJS", "import_conversation_stream"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var i=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var s=(t,e)=>i(t,"name",{value:e,configurable:!0});var d=(t,e)=>{for(var r in e)i(t,r,{get:e[r],enumerable:!0})},c=(t,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of u(e))!p.call(t,n)&&n!==r&&i(t,n,{get:()=>e[n],enumerable:!(a=o(e,n))||a.enumerable});return t};var l=t=>c(i({},"__esModule",{value:!0}),t);var g={};d(g,{createConversationState:()=>m});module.exports=l(g);function m(t="created"){return{status:t,participants:new Map,floor:null,currentTurn:null,currentGeneration:null,transcriptCount:0}}s(m,"createConversationState");
|
|
2
2
|
//# sourceMappingURL=types.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/conversations/types.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Core domain types shared across Pipeflow modules.\n */\n\n// ---------------------------------------------------------------------------\n// Identities\n// ---------------------------------------------------------------------------\n\nexport type ConversationId = string;\nexport type UserId = string;\nexport type TurnId = string;\n\n// ---------------------------------------------------------------------------\n// Participants\n// ---------------------------------------------------------------------------\n\nexport interface ParticipantInput {\n userId: UserId;\n aliases?: string[];\n}\n\nexport interface Participant {\n userId: UserId;\n aliases: string[];\n joinedAt: number;\n}\n\n// ---------------------------------------------------------------------------\n// Turns & generations\n// ---------------------------------------------------------------------------\n\nexport interface Turn {\n id: TurnId;\n conversationId: ConversationId;\n participantId: UserId;\n participantName: string;\n text: string;\n sequence: number;\n startedAt: number;\n endedAt: number;\n}\n\nexport type GenerationStatus = \"streaming\" | \"completed\" | \"cancelled\";\n\nexport interface Generation {\n id: string;\n conversationId: ConversationId;\n agentName: string;\n text: string;\n status: GenerationStatus;\n startedAt: number;\n endedAt?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Tool calls\n// ---------------------------------------------------------------------------\n\nexport interface ToolCall {\n id: string;\n name: string;\n /** Parsed arguments, or the raw JSON string if parsing failed. */\n arguments: unknown;\n}\n\nexport type ToolCallResult =\n | { id: string; result: unknown }\n | { id: string; error: string };\n\n// ---------------------------------------------------------------------------\n// Audio\n// ---------------------------------------------------------------------------\n\nexport interface AudioChunk {\n data: Uint8Array;\n timestamp: number;\n sequence: number;\n}\n\n// ---------------------------------------------------------------------------\n// Conversation state\n// ---------------------------------------------------------------------------\n\nexport type ConversationStatus = \"created\" | \"started\" | \"stopped\";\n\nexport interface ConversationState {\n status: ConversationStatus;\n participants: Map<UserId, Participant>;\n floor: UserId | null;\n currentTurn: Turn | null;\n currentGeneration: Generation | null;\n transcriptCount: number;\n}\n\nexport function createConversationState(\n status: ConversationStatus = \"created\",\n): ConversationState {\n return {\n status,\n participants: new Map(),\n floor: null,\n currentTurn: null,\n currentGeneration: null,\n transcriptCount: 0,\n };\n}\n"],
|
|
5
|
-
"mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,
|
|
4
|
+
"sourcesContent": ["/**\n * Core domain types shared across Pipeflow modules.\n */\n\n// ---------------------------------------------------------------------------\n// Identities\n// ---------------------------------------------------------------------------\n\nexport type ConversationId = string;\nexport type UserId = string;\nexport type TurnId = string;\n\n// ---------------------------------------------------------------------------\n// Participants\n// ---------------------------------------------------------------------------\n\nexport interface ParticipantInput {\n userId: UserId;\n aliases?: string[];\n}\n\nexport interface Participant {\n userId: UserId;\n aliases: string[];\n joinedAt: number;\n}\n\n// ---------------------------------------------------------------------------\n// Turns & generations\n// ---------------------------------------------------------------------------\n\nexport interface Turn {\n id: TurnId;\n conversationId: ConversationId;\n participantId: UserId;\n participantName: string;\n text: string;\n sequence: number;\n startedAt: number;\n endedAt: number;\n}\n\nexport type GenerationStatus = \"streaming\" | \"completed\" | \"cancelled\";\n\n/**\n * Latency instrumentation for a generation. Times are epoch milliseconds;\n * only `startedAt` is always present. The chain distinguishes each hop:\n *\n * ```text\n * turn \u2192 first LLM token \u2192 first TTS text (buffering flush)\n * \u2192 TTS requested \u2192 TTS first audio \u2192 audio delivered \u2192 completed\n * ```\n */\nexport interface GenerationTiming {\n startedAt: number;\n /** First LLM delta of this generation (first-token latency). */\n firstTokenAt?: number;\n /** First sentence flushed to TTS (text buffering latency). */\n firstTtsTextAt?: number;\n /** First TTS stream request issued (queue latency). */\n firstTtsRequestAt?: number;\n /** First audio chunk produced by the TTS provider (provider latency). */\n firstTtsAudioAt?: number;\n /** First TTS audio chunk delivered to the application (transport latency). */\n firstAudioAt?: number;\n completedAt?: number;\n}\n\nexport interface Generation {\n id: string;\n conversationId: ConversationId;\n agentName: string;\n text: string;\n status: GenerationStatus;\n startedAt: number;\n endedAt?: number;\n /**\n * \"sub\" marks a task dispatched to another agent by the coordinator.\n * Regular agent replies omit this field.\n */\n kind?: \"sub\";\n /** For sub-generations: the id of the coordinator generation that dispatched them. */\n parentGenerationId?: string;\n /** Latency instrumentation, recorded as the generation streams. */\n timing?: GenerationTiming;\n}\n\n// ---------------------------------------------------------------------------\n// Tool calls\n// ---------------------------------------------------------------------------\n\nexport interface ToolCall {\n id: string;\n name: string;\n /** Parsed arguments, or the raw JSON string if parsing failed. */\n arguments: unknown;\n}\n\nexport type ToolCallResult =\n | { id: string; result: unknown }\n | { id: string; error: string };\n\n// ---------------------------------------------------------------------------\n// Audio\n// ---------------------------------------------------------------------------\n\nexport interface AudioChunk {\n data: Uint8Array;\n timestamp: number;\n sequence: number;\n}\n\n// ---------------------------------------------------------------------------\n// Conversation state\n// ---------------------------------------------------------------------------\n\nexport type ConversationStatus = \"created\" | \"started\" | \"stopped\";\n\nexport interface ConversationState {\n status: ConversationStatus;\n participants: Map<UserId, Participant>;\n floor: UserId | null;\n currentTurn: Turn | null;\n currentGeneration: Generation | null;\n transcriptCount: number;\n}\n\nexport function createConversationState(\n status: ConversationStatus = \"created\",\n): ConversationState {\n return {\n status,\n participants: new Map(),\n floor: null,\n currentTurn: null,\n currentGeneration: null,\n transcriptCount: 0,\n };\n}\n"],
|
|
5
|
+
"mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GA+HO,SAASI,EACdC,EAA6B,UACV,CACnB,MAAO,CACL,OAAAA,EACA,aAAc,IAAI,IAClB,MAAO,KACP,YAAa,KACb,kBAAmB,KACnB,gBAAiB,CACnB,CACF,CAXgBC,EAAAF,EAAA",
|
|
6
6
|
"names": ["types_exports", "__export", "createConversationState", "__toCommonJS", "createConversationState", "status", "__name"]
|
|
7
7
|
}
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var p=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var x=(e,t)=>{for(var n in t)p(e,n,{get:t[n],enumerable:!0})},m=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of f(t))!u.call(e,r)&&r!==n&&p(e,r,{get:()=>t[r],enumerable:!(i=T(t,r))||i.enumerable});return e};var v=e=>m(p({},"__esModule",{value:!0}),e);var y={};x(y,{Agent:()=>l.Agent,Conversation:()=>o.Conversation,Conversations:()=>o.Conversations,Pipeflow:()=>a.Pipeflow,PipeflowTool:()=>s.Tool,Tool:()=>s.Tool,TranscriptEntry:()=>o.TranscriptEntry,Transcription:()=>o.Transcription});module.exports=v(y);var a=require("./pipeflow.js"),l=require("./agents/agent.js"),s=require("./agents/tools/tools.js"),o=require("./conversations/index.js");
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["index_exports", "__export", "
|
|
4
|
+
"sourcesContent": ["// ---------------------------------------------------------------------------\n// Core public API\n// ---------------------------------------------------------------------------\n\nexport { Pipeflow } from \"./pipeflow\";\nexport type { PipeflowOptions } from \"./pipeflow\";\n\nexport { Agent } from \"./agents/agent\";\nexport type {\n AgentOptions,\n AgentRunRequest,\n AgentRunResult,\n ExecutedToolCall,\n} from \"./agents/agent\";\nexport { Tool, Tool as PipeflowTool } from \"./agents/tools/tools\";\nexport type { ToolOptions } from \"./agents/tools/tools\";\n\nexport {\n Conversation,\n Conversations,\n Transcription,\n TranscriptEntry,\n} from \"./conversations/index\";\nexport type {\n AudioChunk,\n ConversationEvents,\n ConversationId,\n ConversationOptions,\n ConversationState,\n ConversationStatus,\n CreateConversationOptions,\n Generation,\n GenerationStatus,\n Participant,\n ParticipantInput,\n ToolCall,\n ToolCallResult,\n TranscriptEntryInput,\n TranscriptSpeakerKind,\n Turn,\n TurnId,\n UserId,\n} from \"./conversations/index\";\n\n// Realtime machinery (Orchestrator and friends) lives behind the\n// `@moureau/pipeflow/conversations` subpath \u2014 it is implementation detail\n// that `Conversation.start()` attaches automatically.\n\n// ---------------------------------------------------------------------------\n// Configuration interfaces.\n//\n// Provider and persistence *implementations* are intentionally not exported\n// from the main entry \u2014 they are replaceable implementation detail. Import\n// them from their module subpaths when needed:\n//\n// import { DeepSeekLLM } from \"pipeflow/providers\";\n// import { SQLitePersistence } from \"pipeflow/persistence\";\n// import { MemoryTransport } from \"pipeflow/transport\";\n// ---------------------------------------------------------------------------\n\nexport type { LLM, LLMMessage } from \"./providers/llm/types\";\nexport type { STT } from \"./providers/stt/types\";\nexport type { TTS } from \"./providers/tts/types\";\nexport type { Persistence } from \"./persistence/persistence\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8OAAAE,EAAAF,GAIA,IAAAG,EAAyB,sBAGzBC,EAAsB,0BAOtBC,EAA2C,gCAG3CC,EAKO",
|
|
6
|
+
"names": ["index_exports", "__export", "__toCommonJS", "import_pipeflow", "import_agent", "import_tools", "import_conversations"]
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var a=Object.defineProperty;var
|
|
1
|
+
"use strict";var a=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var r=(i,n)=>a(i,"name",{value:n,configurable:!0});var p=(i,n)=>{for(var e in n)a(i,e,{get:n[e],enumerable:!0})},_=(i,n,e,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of c(n))!u.call(i,s)&&s!==e&&a(i,s,{get:()=>n[s],enumerable:!(t=T(n,s))||t.enumerable});return i};var N=i=>_(a({},"__esModule",{value:!0}),i);var m={};p(m,{SQLitePersistence:()=>R});module.exports=N(m);var d=require("bun:sqlite"),E=require("../../../conversations/transcription/transcription.js");class R{static{r(this,"SQLitePersistence")}db;constructor(n={}){this.db=new d.Database(n.filename??":memory:"),this.db.exec(`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS conversations (
|
|
3
3
|
id TEXT PRIMARY KEY,
|
|
4
4
|
agent_names TEXT NOT NULL,
|
|
@@ -36,23 +36,27 @@
|
|
|
36
36
|
);
|
|
37
37
|
|
|
38
38
|
CREATE TABLE IF NOT EXISTS generations (
|
|
39
|
-
id
|
|
40
|
-
conversation_id
|
|
41
|
-
agent_name
|
|
42
|
-
text
|
|
43
|
-
status
|
|
44
|
-
started_at
|
|
45
|
-
ended_at
|
|
39
|
+
id TEXT PRIMARY KEY,
|
|
40
|
+
conversation_id TEXT NOT NULL,
|
|
41
|
+
agent_name TEXT NOT NULL,
|
|
42
|
+
text TEXT NOT NULL,
|
|
43
|
+
status TEXT NOT NULL,
|
|
44
|
+
started_at INTEGER NOT NULL,
|
|
45
|
+
ended_at INTEGER,
|
|
46
|
+
kind TEXT,
|
|
47
|
+
parent_generation_id TEXT,
|
|
48
|
+
timing TEXT
|
|
46
49
|
);
|
|
47
50
|
|
|
48
51
|
CREATE INDEX IF NOT EXISTS idx_participants_conversation ON participants (conversation_id);
|
|
49
52
|
CREATE INDEX IF NOT EXISTS idx_transcript_conversation ON transcript (conversation_id);
|
|
50
53
|
CREATE INDEX IF NOT EXISTS idx_turns_conversation ON turns (conversation_id);
|
|
51
54
|
CREATE INDEX IF NOT EXISTS idx_generations_conversation ON generations (conversation_id);
|
|
52
|
-
`)}close(){this.db.close()}async createConversation(
|
|
53
|
-
VALUES (?, ?, ?, ?)`).run(
|
|
54
|
-
VALUES (?, ?, ?, ?)`).run(e
|
|
55
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)`).run(
|
|
56
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(
|
|
57
|
-
|
|
55
|
+
`);const e=new Set(this.db.query("PRAGMA table_info(generations)").all().map(t=>t.name));e.has("kind")||this.db.exec("ALTER TABLE generations ADD COLUMN kind TEXT"),e.has("parent_generation_id")||this.db.exec("ALTER TABLE generations ADD COLUMN parent_generation_id TEXT"),e.has("timing")||this.db.exec("ALTER TABLE generations ADD COLUMN timing TEXT")}close(){this.db.close()}async createConversation(n={}){const e={id:n.id??crypto.randomUUID(),agentNames:n.agentNames??[],createdAt:n.createdAt??Date.now(),endedAt:null};return this.db.query(`INSERT OR REPLACE INTO conversations (id, agent_names, created_at, ended_at)
|
|
56
|
+
VALUES (?, ?, ?, ?)`).run(e.id,JSON.stringify(e.agentNames),e.createdAt,null),{...e}}async getConversation(n){const e=this.db.query("SELECT * FROM conversations WHERE id = ?").get(n);return e?o(e):null}async listConversations(){return this.db.query("SELECT * FROM conversations ORDER BY created_at ASC").all().map(o)}async finalizeConversation(n,e=Date.now()){return this.db.query("UPDATE conversations SET ended_at = ? WHERE id = ?").run(e,n).changes===0?null:this.getConversation(n)}async deleteConversation(n){return this.db.query("SELECT id FROM conversations WHERE id = ?").get(n)?(this.db.query("DELETE FROM participants WHERE conversation_id = ?").run(n),this.db.query("DELETE FROM transcript WHERE conversation_id = ?").run(n),this.db.query("DELETE FROM turns WHERE conversation_id = ?").run(n),this.db.query("DELETE FROM generations WHERE conversation_id = ?").run(n),this.db.query("DELETE FROM conversations WHERE id = ?").run(n),!0):!1}async addParticipant(n,e){this.db.query(`INSERT OR REPLACE INTO participants (conversation_id, user_id, aliases, joined_at)
|
|
57
|
+
VALUES (?, ?, ?, ?)`).run(n,e.userId,JSON.stringify(e.aliases),e.joinedAt)}async listParticipants(n){return this.db.query("SELECT * FROM participants WHERE conversation_id = ? ORDER BY joined_at ASC").all(n).map(t=>({userId:t.user_id,aliases:JSON.parse(t.aliases),joinedAt:t.joined_at}))}async appendTranscript(n,e){this.db.query(`INSERT OR REPLACE INTO transcript (id, conversation_id, speaker, speaker_kind, text, timestamp, sequence)
|
|
58
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`).run(e.id,n,e.speaker,e.speakerKind,e.text,e.timestamp,e.sequence)}async listTranscript(n){return this.db.query("SELECT * FROM transcript WHERE conversation_id = ? ORDER BY sequence ASC").all(n).map(t=>E.TranscriptEntry.fromPlain({id:t.id,conversationId:t.conversation_id,speaker:t.speaker,speakerKind:t.speaker_kind,text:t.text,timestamp:t.timestamp,sequence:t.sequence}))}async appendTurn(n,e){this.db.query(`INSERT OR REPLACE INTO turns (id, conversation_id, participant_id, participant_name, text, started_at, ended_at, sequence)
|
|
59
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(e.id,n,e.participantId,e.participantName,e.text,e.startedAt,e.endedAt,e.sequence)}async listTurns(n){return this.db.query("SELECT * FROM turns WHERE conversation_id = ? ORDER BY sequence ASC").all(n).map(t=>({id:t.id,conversationId:t.conversation_id,participantId:t.participant_id,participantName:t.participant_name,text:t.text,startedAt:t.started_at,endedAt:t.ended_at,sequence:t.sequence}))}async appendGeneration(n,e){this.db.query(`INSERT OR REPLACE INTO generations
|
|
60
|
+
(id, conversation_id, agent_name, text, status, started_at, ended_at, kind, parent_generation_id, timing)
|
|
61
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(e.id,n,e.agentName,e.text,e.status,e.startedAt,e.endedAt??null,e.kind??null,e.parentGenerationId??null,e.timing?JSON.stringify(e.timing):null)}async listGenerations(n){return this.db.query("SELECT * FROM generations WHERE conversation_id = ? ORDER BY started_at ASC").all(n).map(t=>({id:t.id,conversationId:t.conversation_id,agentName:t.agent_name,text:t.text,status:t.status,startedAt:t.started_at,endedAt:t.ended_at??void 0,kind:t.kind==="sub"?"sub":void 0,parentGenerationId:t.parent_generation_id??void 0,timing:t.timing?JSON.parse(t.timing):void 0}))}}function o(i){return{id:i.id,agentNames:JSON.parse(i.agent_names),createdAt:i.created_at,endedAt:i.ended_at}}r(o,"rowToConversation");
|
|
58
62
|
//# sourceMappingURL=sqlite.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAyB,
|
|
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"]
|
|
4
|
+
"sourcesContent": ["import { Database } from \"bun:sqlite\";\nimport type {\n ConversationId,\n Generation,\n GenerationTiming,\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 kind: string | null;\n parent_generation_id: string | null;\n timing: string | 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 kind TEXT,\n parent_generation_id TEXT,\n timing TEXT\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 // Lightweight migration for databases created before the generation\n // columns existed: CREATE TABLE IF NOT EXISTS leaves existing tables\n // untouched, so add the missing columns when needed.\n const generationColumns = new Set(\n (this.db.query(`PRAGMA table_info(generations)`).all() as { name: string }[]).map(\n (column) => column.name,\n ),\n );\n if (!generationColumns.has(\"kind\")) {\n this.db.exec(`ALTER TABLE generations ADD COLUMN kind TEXT`);\n }\n if (!generationColumns.has(\"parent_generation_id\")) {\n this.db.exec(`ALTER TABLE generations ADD COLUMN parent_generation_id TEXT`);\n }\n if (!generationColumns.has(\"timing\")) {\n this.db.exec(`ALTER TABLE generations ADD COLUMN timing TEXT`);\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\n (id, conversation_id, agent_name, text, status, started_at, ended_at, kind, parent_generation_id, timing)\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 generation.kind ?? null,\n generation.parentGenerationId ?? null,\n generation.timing ? JSON.stringify(generation.timing) : 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 kind: row.kind === \"sub\" ? \"sub\" : undefined,\n parentGenerationId: row.parent_generation_id ?? undefined,\n timing: row.timing ? (JSON.parse(row.timing) as GenerationTiming) : 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", "generationColumns", "column", "input", "record", "id", "row", "rowToConversation", "endedAt", "conversationId", "participant", "entry", "turn", "generation"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var i=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var x=(p,o)=>{for(var f in o)i(p,f,{get:o[f],enumerable:!0})},P=(p,o,f,r)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of w(o))!m.call(p,e)&&e!==f&&i(p,e,{get:()=>o[e],enumerable:!(r=l(o,e))||r.enumerable});return p};var n=p=>P(i({},"__esModule",{value:!0}),p);var s={};x(s,{Pipeflow:()=>t.Pipeflow});module.exports=n(s);var t=require("./pipeflow.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/pipeflow/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { Pipeflow } from \"./pipeflow\";\nexport type { PipeflowOptions } from \"./pipeflow\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0CAAAE,EAAAF,GAAA,IAAAG,EAAyB",
|
|
6
|
+
"names": ["pipeflow_exports", "__export", "__toCommonJS", "import_pipeflow"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var o=(e,t)=>n(e,"name",{value:t,configurable:!0});var y=(e,t)=>{for(var s in t)n(e,s,{get:t[s],enumerable:!0})},T=(e,t,s,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of f(t))!d.call(e,r)&&r!==s&&n(e,r,{get:()=>t[r],enumerable:!(i=c(t,r))||i.enumerable});return e};var a=e=>T(n({},"__esModule",{value:!0}),e);var v={};y(v,{Pipeflow:()=>L});module.exports=a(v);var l=require("../agents/agent.js"),m=require("../conversations/conversations.js"),p=require("../persistence/adapters/memory/memory.js");class L{static{o(this,"Pipeflow")}llm;stt;tts;conversations;constructor(t={}){this.llm=t.llm,this.stt=t.stt,this.tts=t.tts;const s=t.persistence??new p.MemoryPersistence;this.conversations=new m.Conversations({persistence:s,stt:t.stt,tts:t.tts})}agent(t){return new l.Agent({...t,llm:t.llm??this.llm})}}
|
|
2
|
+
//# sourceMappingURL=pipeflow.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/pipeflow/pipeflow.ts"],
|
|
4
|
+
"sourcesContent": ["import { Agent, type AgentOptions } from \"../agents/agent\";\nimport { Conversations } from \"../conversations/conversations\";\nimport { MemoryPersistence } from \"../persistence/adapters/memory/memory\";\nimport type { Persistence } from \"../persistence/persistence\";\nimport type { LLM } from \"../providers/llm/types\";\nimport type { STT } from \"../providers/stt/types\";\nimport type { TTS } from \"../providers/tts/types\";\n\nexport interface PipeflowOptions {\n llm?: LLM;\n stt?: STT;\n tts?: TTS;\n persistence?: Persistence;\n}\n\n/**\n * The Pipeflow entry point.\n *\n * ```ts\n * const pipeflow = new Pipeflow({ llm });\n * const agent = pipeflow.agent({ name: \"Jarvis\", context: \"...\" });\n * const conversation = await pipeflow.conversations.create({ agents: [agent] });\n * ```\n */\nexport class Pipeflow {\n readonly llm: LLM | undefined;\n readonly stt: STT | undefined;\n readonly tts: TTS | undefined;\n readonly conversations: Conversations;\n\n constructor(options: PipeflowOptions = {}) {\n this.llm = options.llm;\n this.stt = options.stt;\n this.tts = options.tts;\n const persistence = options.persistence ?? new MemoryPersistence();\n this.conversations = new Conversations({\n persistence,\n stt: options.stt,\n tts: options.tts,\n });\n }\n\n /**\n * Create an agent. Agents inherit the Pipeflow instance's LLM provider so\n * `agent.run()` works out of the box.\n */\n agent(options: Omit<AgentOptions, \"llm\"> & { llm?: LLM }): Agent {\n return new Agent({ ...options, llm: options.llm ?? this.llm });\n }\n}\n"],
|
|
5
|
+
"mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,cAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAyC,2BACzCC,EAA8B,0CAC9BC,EAAkC,iDAsB3B,MAAMC,CAAS,CAxBtB,MAwBsB,CAAAC,EAAA,iBACX,IACA,IACA,IACA,cAET,YAAYC,EAA2B,CAAC,EAAG,CACzC,KAAK,IAAMA,EAAQ,IACnB,KAAK,IAAMA,EAAQ,IACnB,KAAK,IAAMA,EAAQ,IACnB,MAAMC,EAAcD,EAAQ,aAAe,IAAI,oBAC/C,KAAK,cAAgB,IAAI,gBAAc,CACrC,YAAAC,EACA,IAAKD,EAAQ,IACb,IAAKA,EAAQ,GACf,CAAC,CACH,CAMA,MAAMA,EAA2D,CAC/D,OAAO,IAAI,QAAM,CAAE,GAAGA,EAAS,IAAKA,EAAQ,KAAO,KAAK,GAAI,CAAC,CAC/D,CACF",
|
|
6
|
+
"names": ["pipeflow_exports", "__export", "Pipeflow", "__toCommonJS", "import_agent", "import_conversations", "import_memory", "Pipeflow", "__name", "options", "persistence"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var r=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var
|
|
1
|
+
"use strict";var r=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var S=(t,e)=>{for(var T in e)r(t,T,{get:e[T],enumerable:!0})},i=(t,e,T,p)=>{if(e&&typeof e=="object"||typeof e=="function")for(let L of M(e))!n.call(t,L)&&L!==T&&r(t,L,{get:()=>e[L],enumerable:!(p=x(e,L))||p.enumerable});return t};var l=t=>i(r({},"__esModule",{value:!0}),t);var f={};S(f,{DeepSeekLLM:()=>o.DeepSeekLLM,DeepgramSTT:()=>m.DeepgramSTT,KokoroTTS:()=>s.KokoroTTS,OpenRouterLLM:()=>o.OpenRouterLLM,complete:()=>o.complete,streamText:()=>o.streamText});module.exports=l(f);var o=require("./llm/index.js"),m=require("./stt/index.js"),s=require("./tts/index.js");
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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,
|
|
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, OpenRouterLLM } from \"./llm/index\";\nexport { DeepgramSTT } from \"./stt/index\";\nexport { KokoroTTS } from \"./tts/index\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8LAAAE,EAAAF,GAIA,IAAAG,EAAiE,uBACjEC,EAA4B,uBAC5BC,EAA0B",
|
|
6
6
|
"names": ["providers_exports", "__export", "__toCommonJS", "import_llm", "import_stt", "import_tts"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";var b=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var L=Object.prototype.hasOwnProperty;var u=(r,e)=>b(r,"name",{value:e,configurable:!0});var w=(r,e)=>{for(var s in e)b(r,s,{get:e[s],enumerable:!0})},T=(r,e,s,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of k(e))!L.call(r,o)&&o!==s&&b(r,o,{get:()=>e[o],enumerable:!(a=y(e,o))||a.enumerable});return r};var _=r=>T(b({},"__esModule",{value:!0}),r);var x={};w(x,{ClaudeLLM:()=>M});module.exports=_(x);class M{static{u(this,"ClaudeLLM")}apiKey;model;baseUrl;fetchImpl;onTiming;idleTimeoutMs;onUsage;streams=new Set;constructor(e){if(!e.apiKey)throw new Error("ClaudeLLM requires an apiKey");this.apiKey=e.apiKey,this.model=e.model??"claude-sonnet-4-5",this.baseUrl=(e.baseUrl??"https://api.anthropic.com/v1").replace(/\/+$/,""),this.fetchImpl=e.fetch??fetch,this.onTiming=e.onTiming,this.idleTimeoutMs=e.idleTimeoutMs??8e3,this.onUsage=e.onUsage}stop(){for(const e of this.streams)e.abort()}async*stream(e){const s=new AbortController;this.streams.add(s);try{const{system:a,wire:o}=v(e.messages);this.onTiming?.("request-start");const d=await this.fetchImpl(`${this.baseUrl}/messages`,{method:"POST",headers:{"content-type":"application/json","x-api-key":this.apiKey,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:this.model,max_tokens:e.maxTokens??4096,...a.length>0?{system:a}:{},messages:o,...e.tools&&e.tools.length>0?{tools:e.tools.map(n=>({name:n.name,description:n.description,input_schema:n.parameters??{type:"object",properties:{}}}))}:{},...e.temperature!==void 0?{temperature:e.temperature}:{},stream:!0}),signal:s.signal});if(!d.ok){const n=await d.text();throw new Error(`Claude request failed (${d.status}): ${n}`)}if(!d.body)throw new Error("Claude returned an empty body");this.onTiming?.("headers");const l=new Map;let p,g,c=!1;for await(const n of C(d.body,s.signal,this.onTiming,this.idleTimeoutMs)){switch(n.event){case"message_start":{p=n.data.message?.usage?.input_tokens;break}case"content_block_start":{const t=n.data.content_block;t.type==="tool_use"&&t.id&&t.name&&l.set(n.data.index,{id:t.id,name:t.name,json:""});break}case"content_block_delta":{const t=n.data.delta;if(t.type==="text_delta"&&t.text)yield{type:"delta",content:t.text};else if(t.type==="input_json_delta"&&t.partial_json){const i=l.get(n.data.index);i&&(i.json+=t.partial_json)}break}case"content_block_stop":{const t=l.get(n.data.index);if(t){let i="{}";if(t.json.length>0)try{i=t.json,JSON.parse(i)}catch{i="{}"}yield{type:"tool_call",id:t.id,name:t.name,arguments:i},l.delete(n.data.index)}break}case"message_delta":{const t=n.data.usage;t?.output_tokens!==void 0&&(g=t.output_tokens);break}case"message_stop":(p!==void 0||g!==void 0)&&this.onUsage?.({promptTokens:p??0,completionTokens:g??0}),c=!0;break;case"error":{const t=n.data.error;yield{type:"error",error:new Error(`Claude stream error: ${t?.message??JSON.stringify(n.data)}`)},c=!0;break}}if(c)break}}finally{this.streams.delete(s)}yield{type:"done"}}}function v(r){const e=[],s=[];for(const a of r)switch(a.role){case"system":e.push(a.content);break;case"user":s.push({role:"user",content:a.content});break;case"assistant":{const o=[];a.content&&o.push({type:"text",text:a.content});for(const d of a.toolCalls??[]){let l={};try{l=JSON.parse(d.arguments)}catch{l={}}o.push({type:"tool_use",id:d.id,name:d.name,input:l})}s.push({role:"assistant",content:o});break}case"tool":s.push({role:"user",content:[{type:"tool_result",tool_use_id:a.toolCallId,content:a.content}]});break}return{system:e.join(`
|
|
2
|
+
|
|
3
|
+
`),wire:s}}u(v,"mapMessages");async function*C(r,e,s,a){const o=r.getReader(),d=new TextDecoder;let l="",p=!1;const g=u(()=>{let c;return new Promise((n,t)=>{const i=u(()=>{c!==void 0&&clearTimeout(c),e.removeEventListener("abort",f)},"cleanup"),f=u(()=>{i(),t(new DOMException("The operation was aborted.","AbortError"))},"onAbort");o.read().then(m=>{i(),n(m)},m=>{i(),t(m)}),c=setTimeout(()=>{i(),o.cancel().catch(()=>{}),t(new Error(`Claude stream idle for ${a}ms \u2014 no data received; aborting the stalled stream`))},a),e.addEventListener("abort",f,{once:!0})})},"readWithTimeout");for(;;){if(e.aborted)throw new DOMException("The operation was aborted.","AbortError");const{done:c,value:n}=await g();if(c)break;l+=d.decode(n,{stream:!0});const t=l.split(/\r?\n\r?\n/);l=t.pop()??"";for(const i of t){p||(p=!0,s?.("first-chunk"));let f="";const m=[];for(const h of i.split(/\r?\n/))h.startsWith("event:")?f=h.slice(6).trim():h.startsWith("data:")&&m.push(h.slice(5).trimStart());if(m.length!==0)try{yield{event:f,data:JSON.parse(m.join(`
|
|
4
|
+
`))}}catch{}}}}u(C,"readClaudeSSE");
|
|
5
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/llm/adapters/claude/claude.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\n LLM,\n LLMEvent,\n LLMMessage,\n LLMRequest,\n LLMStreamTimingCallback,\n LLMUsageCallback,\n} from \"../../types\";\nimport type { FetchLike } from \"../../../shared\";\n\nexport interface ClaudeOptions {\n apiKey: string;\n /** Defaults to `claude-sonnet-4-5`. */\n model?: string;\n /** Defaults to `https://api.anthropic.com/v1`. */\n baseUrl?: string;\n /** Injectable fetch implementation, mainly for tests. */\n fetch?: FetchLike;\n /** Provider-timeline hook: request-start / headers / first-chunk. */\n onTiming?: LLMStreamTimingCallback;\n /**\n * Abort a stream that delivers no data for this long (default 8000ms) \u2014\n * protects against provider connections that go silent after the model\n * already produced its output. Raise it for providers with slow TTFT.\n */\n idleTimeoutMs?: number;\n /** Called with the provider-reported token usage (when included). */\n onUsage?: LLMUsageCallback;\n}\n\n/** An SSE frame: the `event:` type plus the parsed `data:` payload. */\ninterface ClaudeEvent {\n event: string;\n data: Record<string, unknown>;\n}\n\n/**\n * Claude LLM adapter (Anthropic Messages API over SSE).\n *\n * The wire format differs from the OpenAI-compatible adapters: tools are\n * `input_schema` blocks, tool calls arrive as `tool_use` content blocks with\n * `input_json_delta` fragments (reassembled here into `tool_call` events),\n * tool results are `tool_result` blocks inside user messages, and `max_tokens`\n * is required. There is no `response_format`, so `toolMode` is not supported \u2014\n * tool calling is always native.\n */\nexport class ClaudeLLM implements LLM {\n private readonly apiKey: string;\n private readonly model: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: FetchLike;\n private readonly onTiming: LLMStreamTimingCallback | undefined;\n private readonly idleTimeoutMs: number;\n private readonly onUsage: LLMUsageCallback | undefined;\n private readonly streams = new Set<AbortController>();\n\n constructor(options: ClaudeOptions) {\n if (!options.apiKey) {\n throw new Error(\"ClaudeLLM requires an apiKey\");\n }\n this.apiKey = options.apiKey;\n this.model = options.model ?? \"claude-sonnet-4-5\";\n this.baseUrl = (options.baseUrl ?? \"https://api.anthropic.com/v1\").replace(/\\/+$/, \"\");\n this.fetchImpl = options.fetch ?? fetch;\n this.onTiming = options.onTiming;\n this.idleTimeoutMs = options.idleTimeoutMs ?? 8_000;\n this.onUsage = options.onUsage;\n }\n\n /** Cancel every in-flight stream (parallel sub-generations included). */\n stop(): void {\n for (const controller of this.streams) controller.abort();\n }\n\n async *stream(request: LLMRequest): AsyncGenerator<LLMEvent> {\n const controller = new AbortController();\n this.streams.add(controller);\n\n try {\n const { system, wire } = mapMessages(request.messages);\n\n this.onTiming?.(\"request-start\");\n const response = await this.fetchImpl(`${this.baseUrl}/messages`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"x-api-key\": this.apiKey,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: this.model,\n // Required by the Anthropic API.\n max_tokens: request.maxTokens ?? 4096,\n ...(system.length > 0 ? { system } : {}),\n messages: wire,\n ...(request.tools && request.tools.length > 0\n ? {\n tools: request.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.parameters ?? { type: \"object\", properties: {} },\n })),\n }\n : {}),\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n stream: true,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Claude request failed (${response.status}): ${body}`);\n }\n if (!response.body) {\n throw new Error(\"Claude returned an empty body\");\n }\n this.onTiming?.(\"headers\");\n\n // Tool_use blocks can interleave and complete in any order; keyed by\n // block index. Arguments arrive as `input_json_delta` fragments.\n const toolBlocks = new Map<\n number,\n { id: string; name: string; json: string }\n >();\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let finished = false;\n\n for await (const frame of readClaudeSSE(\n response.body,\n controller.signal,\n this.onTiming,\n this.idleTimeoutMs,\n )) {\n switch (frame.event) {\n case \"message_start\": {\n const usage = frame.data.message as { usage?: { input_tokens?: number } };\n inputTokens = usage?.usage?.input_tokens;\n break;\n }\n case \"content_block_start\": {\n const block = frame.data.content_block as {\n type: string;\n id?: string;\n name?: string;\n };\n if (block.type === \"tool_use\" && block.id && block.name) {\n toolBlocks.set(frame.data.index as number, {\n id: block.id,\n name: block.name,\n json: \"\",\n });\n }\n break;\n }\n case \"content_block_delta\": {\n const delta = frame.data.delta as { type: string; text?: string; partial_json?: string };\n if (delta.type === \"text_delta\" && delta.text) {\n yield { type: \"delta\", content: delta.text };\n } else if (delta.type === \"input_json_delta\" && delta.partial_json) {\n const block = toolBlocks.get(frame.data.index as number);\n if (block) block.json += delta.partial_json;\n }\n break;\n }\n case \"content_block_stop\": {\n const block = toolBlocks.get(frame.data.index as number);\n if (block) {\n let args = \"{}\";\n if (block.json.length > 0) {\n try {\n args = block.json;\n JSON.parse(args); // validate before handing off\n } catch {\n args = \"{}\";\n }\n }\n yield {\n type: \"tool_call\",\n id: block.id,\n name: block.name,\n arguments: args,\n };\n toolBlocks.delete(frame.data.index as number);\n }\n break;\n }\n case \"message_delta\": {\n const usage = frame.data.usage as { output_tokens?: number };\n if (usage?.output_tokens !== undefined) outputTokens = usage.output_tokens;\n break;\n }\n case \"message_stop\":\n if (inputTokens !== undefined || outputTokens !== undefined) {\n this.onUsage?.({\n promptTokens: inputTokens ?? 0,\n completionTokens: outputTokens ?? 0,\n });\n }\n finished = true;\n break;\n case \"error\": {\n const error = frame.data.error as { message?: string } | undefined;\n yield {\n type: \"error\",\n error: new Error(\n `Claude stream error: ${error?.message ?? JSON.stringify(frame.data)}`,\n ),\n };\n finished = true;\n break;\n }\n }\n if (finished) break;\n }\n } finally {\n this.streams.delete(controller);\n }\n\n yield { type: \"done\" };\n }\n}\n\n/** Anthropic messages: leading system messages become `system`; the rest map to wire roles. */\nfunction mapMessages(messages: LLMMessage[]): { system: string; wire: unknown[] } {\n const system: string[] = [];\n const wire: unknown[] = [];\n for (const message of messages) {\n switch (message.role) {\n case \"system\":\n system.push(message.content);\n break;\n case \"user\":\n wire.push({ role: \"user\", content: message.content });\n break;\n case \"assistant\": {\n const blocks: unknown[] = [];\n if (message.content) blocks.push({ type: \"text\", text: message.content });\n for (const call of message.toolCalls ?? []) {\n let input: unknown = {};\n try {\n input = JSON.parse(call.arguments);\n } catch {\n input = {};\n }\n blocks.push({ type: \"tool_use\", id: call.id, name: call.name, input });\n }\n wire.push({ role: \"assistant\", content: blocks });\n break;\n }\n case \"tool\":\n wire.push({\n role: \"user\",\n content: [\n {\n type: \"tool_result\",\n tool_use_id: message.toolCallId,\n content: message.content,\n },\n ],\n });\n break;\n }\n }\n return { system: system.join(\"\\n\\n\"), wire };\n}\n\n/**\n * Parse the Anthropic SSE stream into `{ event, data }` frames. Unlike the\n * OpenAI-compatible streamer, the `event:` line matters \u2014 it distinguishes\n * text deltas from tool-argument deltas. Bounded by the idle timeout.\n */\nasync function* readClaudeSSE(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n onTiming: LLMStreamTimingCallback | undefined,\n idleTimeoutMs: number,\n): AsyncGenerator<ClaudeEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let firstEvent = false;\n\n const readWithTimeout = (): Promise<Awaited<ReturnType<typeof reader.read>>> => {\n let timer: ReturnType<typeof setTimeout> | undefined;\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n if (timer !== undefined) clearTimeout(timer);\n signal.removeEventListener(\"abort\", onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n };\n reader.read().then(\n (result) => {\n cleanup();\n resolve(result);\n },\n (error) => {\n cleanup();\n reject(error);\n },\n );\n timer = setTimeout(() => {\n cleanup();\n void reader.cancel().catch(() => {});\n reject(\n new Error(\n `Claude stream idle for ${idleTimeoutMs}ms \u2014 no data received; aborting the stalled stream`,\n ),\n );\n }, idleTimeoutMs);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n };\n\n while (true) {\n if (signal.aborted) {\n throw new DOMException(\"The operation was aborted.\", \"AbortError\");\n }\n const { done, value } = await readWithTimeout();\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 if (!firstEvent) {\n firstEvent = true;\n onTiming?.(\"first-chunk\");\n }\n let event = \"\";\n const dataLines: string[] = [];\n for (const line of frame.split(/\\r?\\n/)) {\n if (line.startsWith(\"event:\")) event = line.slice(6).trim();\n else if (line.startsWith(\"data:\")) dataLines.push(line.slice(5).trimStart());\n }\n if (dataLines.length === 0) continue;\n try {\n yield { event, data: JSON.parse(dataLines.join(\"\\n\")) as Record<string, unknown> };\n } catch {\n // Ignore malformed frames.\n }\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,eAAAE,IAAA,eAAAC,EAAAH,GA8CO,MAAMI,CAAyB,CA9CtC,MA8CsC,CAAAC,EAAA,kBACnB,OACA,MACA,QACA,UACA,SACA,cACA,QACA,QAAU,IAAI,IAE/B,YAAYC,EAAwB,CAClC,GAAI,CAACA,EAAQ,OACX,MAAM,IAAI,MAAM,8BAA8B,EAEhD,KAAK,OAASA,EAAQ,OACtB,KAAK,MAAQA,EAAQ,OAAS,oBAC9B,KAAK,SAAWA,EAAQ,SAAW,gCAAgC,QAAQ,OAAQ,EAAE,EACrF,KAAK,UAAYA,EAAQ,OAAS,MAClC,KAAK,SAAWA,EAAQ,SACxB,KAAK,cAAgBA,EAAQ,eAAiB,IAC9C,KAAK,QAAUA,EAAQ,OACzB,CAGA,MAAa,CACX,UAAWC,KAAc,KAAK,QAASA,EAAW,MAAM,CAC1D,CAEA,MAAO,OAAOC,EAA+C,CAC3D,MAAMD,EAAa,IAAI,gBACvB,KAAK,QAAQ,IAAIA,CAAU,EAE3B,GAAI,CACF,KAAM,CAAE,OAAAE,EAAQ,KAAAC,CAAK,EAAIC,EAAYH,EAAQ,QAAQ,EAErD,KAAK,WAAW,eAAe,EAC/B,MAAMI,EAAW,MAAM,KAAK,UAAU,GAAG,KAAK,OAAO,YAAa,CAChE,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,YAAa,KAAK,OAClB,oBAAqB,YACvB,EACA,KAAM,KAAK,UAAU,CACnB,MAAO,KAAK,MAEZ,WAAYJ,EAAQ,WAAa,KACjC,GAAIC,EAAO,OAAS,EAAI,CAAE,OAAAA,CAAO,EAAI,CAAC,EACtC,SAAUC,EACV,GAAIF,EAAQ,OAASA,EAAQ,MAAM,OAAS,EACxC,CACE,MAAOA,EAAQ,MAAM,IAAKK,IAAU,CAClC,KAAMA,EAAK,KACX,YAAaA,EAAK,YAClB,aAAcA,EAAK,YAAc,CAAE,KAAM,SAAU,WAAY,CAAC,CAAE,CACpE,EAAE,CACJ,EACA,CAAC,EACL,GAAIL,EAAQ,cAAgB,OAAY,CAAE,YAAaA,EAAQ,WAAY,EAAI,CAAC,EAChF,OAAQ,EACV,CAAC,EACD,OAAQD,EAAW,MACrB,CAAC,EAED,GAAI,CAACK,EAAS,GAAI,CAChB,MAAME,EAAO,MAAMF,EAAS,KAAK,EACjC,MAAM,IAAI,MAAM,0BAA0BA,EAAS,MAAM,MAAME,CAAI,EAAE,CACvE,CACA,GAAI,CAACF,EAAS,KACZ,MAAM,IAAI,MAAM,+BAA+B,EAEjD,KAAK,WAAW,SAAS,EAIzB,MAAMG,EAAa,IAAI,IAIvB,IAAIC,EACAC,EACAC,EAAW,GAEf,gBAAiBC,KAASC,EACxBR,EAAS,KACTL,EAAW,OACX,KAAK,SACL,KAAK,aACP,EAAG,CACD,OAAQY,EAAM,MAAO,CACnB,IAAK,gBAAiB,CAEpBH,EADcG,EAAM,KAAK,SACJ,OAAO,aAC5B,KACF,CACA,IAAK,sBAAuB,CAC1B,MAAME,EAAQF,EAAM,KAAK,cAKrBE,EAAM,OAAS,YAAcA,EAAM,IAAMA,EAAM,MACjDN,EAAW,IAAII,EAAM,KAAK,MAAiB,CACzC,GAAIE,EAAM,GACV,KAAMA,EAAM,KACZ,KAAM,EACR,CAAC,EAEH,KACF,CACA,IAAK,sBAAuB,CAC1B,MAAMC,EAAQH,EAAM,KAAK,MACzB,GAAIG,EAAM,OAAS,cAAgBA,EAAM,KACvC,KAAM,CAAE,KAAM,QAAS,QAASA,EAAM,IAAK,UAClCA,EAAM,OAAS,oBAAsBA,EAAM,aAAc,CAClE,MAAMD,EAAQN,EAAW,IAAII,EAAM,KAAK,KAAe,EACnDE,IAAOA,EAAM,MAAQC,EAAM,aACjC,CACA,KACF,CACA,IAAK,qBAAsB,CACzB,MAAMD,EAAQN,EAAW,IAAII,EAAM,KAAK,KAAe,EACvD,GAAIE,EAAO,CACT,IAAIE,EAAO,KACX,GAAIF,EAAM,KAAK,OAAS,EACtB,GAAI,CACFE,EAAOF,EAAM,KACb,KAAK,MAAME,CAAI,CACjB,MAAQ,CACNA,EAAO,IACT,CAEF,KAAM,CACJ,KAAM,YACN,GAAIF,EAAM,GACV,KAAMA,EAAM,KACZ,UAAWE,CACb,EACAR,EAAW,OAAOI,EAAM,KAAK,KAAe,CAC9C,CACA,KACF,CACA,IAAK,gBAAiB,CACpB,MAAMK,EAAQL,EAAM,KAAK,MACrBK,GAAO,gBAAkB,SAAWP,EAAeO,EAAM,eAC7D,KACF,CACA,IAAK,gBACCR,IAAgB,QAAaC,IAAiB,SAChD,KAAK,UAAU,CACb,aAAcD,GAAe,EAC7B,iBAAkBC,GAAgB,CACpC,CAAC,EAEHC,EAAW,GACX,MACF,IAAK,QAAS,CACZ,MAAMO,EAAQN,EAAM,KAAK,MACzB,KAAM,CACJ,KAAM,QACN,MAAO,IAAI,MACT,wBAAwBM,GAAO,SAAW,KAAK,UAAUN,EAAM,IAAI,CAAC,EACtE,CACF,EACAD,EAAW,GACX,KACF,CACF,CACA,GAAIA,EAAU,KAChB,CACF,QAAE,CACA,KAAK,QAAQ,OAAOX,CAAU,CAChC,CAEA,KAAM,CAAE,KAAM,MAAO,CACvB,CACF,CAGA,SAASI,EAAYe,EAA6D,CAChF,MAAMjB,EAAmB,CAAC,EACpBC,EAAkB,CAAC,EACzB,UAAWiB,KAAWD,EACpB,OAAQC,EAAQ,KAAM,CACpB,IAAK,SACHlB,EAAO,KAAKkB,EAAQ,OAAO,EAC3B,MACF,IAAK,OACHjB,EAAK,KAAK,CAAE,KAAM,OAAQ,QAASiB,EAAQ,OAAQ,CAAC,EACpD,MACF,IAAK,YAAa,CAChB,MAAMC,EAAoB,CAAC,EACvBD,EAAQ,SAASC,EAAO,KAAK,CAAE,KAAM,OAAQ,KAAMD,EAAQ,OAAQ,CAAC,EACxE,UAAWE,KAAQF,EAAQ,WAAa,CAAC,EAAG,CAC1C,IAAIG,EAAiB,CAAC,EACtB,GAAI,CACFA,EAAQ,KAAK,MAAMD,EAAK,SAAS,CACnC,MAAQ,CACNC,EAAQ,CAAC,CACX,CACAF,EAAO,KAAK,CAAE,KAAM,WAAY,GAAIC,EAAK,GAAI,KAAMA,EAAK,KAAM,MAAAC,CAAM,CAAC,CACvE,CACApB,EAAK,KAAK,CAAE,KAAM,YAAa,QAASkB,CAAO,CAAC,EAChD,KACF,CACA,IAAK,OACHlB,EAAK,KAAK,CACR,KAAM,OACN,QAAS,CACP,CACE,KAAM,cACN,YAAaiB,EAAQ,WACrB,QAASA,EAAQ,OACnB,CACF,CACF,CAAC,EACD,KACJ,CAEF,MAAO,CAAE,OAAQlB,EAAO,KAAK;AAAA;AAAA,CAAM,EAAG,KAAAC,CAAK,CAC7C,CAzCSL,EAAAM,EAAA,eAgDT,eAAgBS,EACdN,EACAiB,EACAC,EACAC,EAC6B,CAC7B,MAAMC,EAASpB,EAAK,UAAU,EACxBqB,EAAU,IAAI,YACpB,IAAIC,EAAS,GACTC,EAAa,GAEjB,MAAMC,EAAkBjC,EAAA,IAAwD,CAC9E,IAAIkC,EACJ,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtC,MAAMC,EAAUrC,EAAA,IAAM,CAChBkC,IAAU,QAAW,aAAaA,CAAK,EAC3CR,EAAO,oBAAoB,QAASY,CAAO,CAC7C,EAHgB,WAIVA,EAAUtC,EAAA,IAAM,CACpBqC,EAAQ,EACRD,EAAO,IAAI,aAAa,6BAA8B,YAAY,CAAC,CACrE,EAHgB,WAIhBP,EAAO,KAAK,EAAE,KACXU,GAAW,CACVF,EAAQ,EACRF,EAAQI,CAAM,CAChB,EACCnB,GAAU,CACTiB,EAAQ,EACRD,EAAOhB,CAAK,CACd,CACF,EACAc,EAAQ,WAAW,IAAM,CACvBG,EAAQ,EACHR,EAAO,OAAO,EAAE,MAAM,IAAM,CAAC,CAAC,EACnCO,EACE,IAAI,MACF,0BAA0BR,CAAa,yDACzC,CACF,CACF,EAAGA,CAAa,EAChBF,EAAO,iBAAiB,QAASY,EAAS,CAAE,KAAM,EAAK,CAAC,CAC1D,CAAC,CACH,EAhCwB,mBAkCxB,OAAa,CACX,GAAIZ,EAAO,QACT,MAAM,IAAI,aAAa,6BAA8B,YAAY,EAEnE,KAAM,CAAE,KAAAc,EAAM,MAAAC,CAAM,EAAI,MAAMR,EAAgB,EAC9C,GAAIO,EAAM,MACVT,GAAUD,EAAQ,OAAOW,EAAO,CAAE,OAAQ,EAAK,CAAC,EAEhD,MAAMC,EAASX,EAAO,MAAM,YAAY,EACxCA,EAASW,EAAO,IAAI,GAAK,GACzB,UAAW5B,KAAS4B,EAAQ,CACrBV,IACHA,EAAa,GACbL,IAAW,aAAa,GAE1B,IAAIgB,EAAQ,GACZ,MAAMC,EAAsB,CAAC,EAC7B,UAAWC,KAAQ/B,EAAM,MAAM,OAAO,EAChC+B,EAAK,WAAW,QAAQ,EAAGF,EAAQE,EAAK,MAAM,CAAC,EAAE,KAAK,EACjDA,EAAK,WAAW,OAAO,GAAGD,EAAU,KAAKC,EAAK,MAAM,CAAC,EAAE,UAAU,CAAC,EAE7E,GAAID,EAAU,SAAW,EACzB,GAAI,CACF,KAAM,CAAE,MAAAD,EAAO,KAAM,KAAK,MAAMC,EAAU,KAAK;AAAA,CAAI,CAAC,CAA6B,CACnF,MAAQ,CAER,CACF,CACF,CACF,CA1EgB5C,EAAAe,EAAA",
|
|
6
|
+
"names": ["claude_exports", "__export", "ClaudeLLM", "__toCommonJS", "ClaudeLLM", "__name", "options", "controller", "request", "system", "wire", "mapMessages", "response", "tool", "body", "toolBlocks", "inputTokens", "outputTokens", "finished", "frame", "readClaudeSSE", "block", "delta", "args", "usage", "error", "messages", "message", "blocks", "call", "input", "signal", "onTiming", "idleTimeoutMs", "reader", "decoder", "buffer", "firstEvent", "readWithTimeout", "timer", "resolve", "reject", "cleanup", "onAbort", "result", "done", "value", "frames", "event", "dataLines", "line"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var m=(o,e)=>{for(var r in e)t(o,r,{get:e[r],enumerable:!0})},x=(o,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let p of u(e))!f.call(o,p)&&p!==r&&t(o,p,{get:()=>e[p],enumerable:!(a=l(e,p))||a.enumerable});return o};var C=o=>x(t({},"__esModule",{value:!0}),o);var L={};m(L,{ClaudeLLM:()=>d.ClaudeLLM});module.exports=C(L);var d=require("./claude.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/llm/adapters/claude/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { ClaudeLLM } from \"./claude\";\nexport type { ClaudeOptions } from \"./claude\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4CAAAE,EAAAF,GAAA,IAAAG,EAA0B",
|
|
6
|
+
"names": ["claude_exports", "__export", "__toCommonJS", "import_claude"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var o=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var l=(t,e)=>o(t,"name",{value:e,configurable:!0});var p=(t,e)=>{for(var i in e)o(t,i,{get:e[i],enumerable:!0})},h=(t,e,i,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of d(e))!m.call(t,a)&&a!==i&&o(t,a,{get:()=>e[a],enumerable:!(r=n(e,a))||r.enumerable});return t};var L=t=>h(o({},"__esModule",{value:!0}),t);var M={};p(M,{DeepSeekLLM:()=>c});module.exports=L(M);var s=require("../openai-compatible.js");class c{static{l(this,"DeepSeekLLM")}apiKey;model;baseUrl;fetchImpl;onTiming;idleTimeoutMs;onUsage;toolMode;streams=new Set;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,this.onTiming=e.onTiming,this.idleTimeoutMs=e.idleTimeoutMs??8e3,this.onUsage=e.onUsage,this.toolMode=e.toolMode}stop(){for(const e of this.streams)e.abort()}async*stream(e){const i=new AbortController;this.streams.add(i);try{yield*(0,s.openAICompatibleStream)({baseUrl:this.baseUrl,apiKey:this.apiKey,model:this.model,fetchImpl:this.fetchImpl,request:e,signal:i.signal,extraBody:{thinking:{type:"disabled"}},label:"DeepSeek",onTiming:this.onTiming,idleTimeoutMs:this.idleTimeoutMs,onUsage:this.onUsage,toolMode:this.toolMode})}finally{this.streams.delete(i)}}}
|
|
2
2
|
//# sourceMappingURL=deepseek.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/providers/llm/adapters/deepseek/deepseek.ts"],
|
|
4
|
-
"sourcesContent": ["import type {
|
|
5
|
-
"mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,IAAA,eAAAC,EAAAH,
|
|
6
|
-
"names": ["deepseek_exports", "__export", "DeepSeekLLM", "__toCommonJS", "
|
|
4
|
+
"sourcesContent": ["import type {\n LLM,\n LLMEvent,\n LLMRequest,\n LLMStreamTimingCallback,\n LLMUsageCallback,\n ToolMode,\n} from \"../../types\";\nimport type { FetchLike } from \"../../../shared\";\nimport { openAICompatibleStream } from \"../openai-compatible\";\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 /** Provider-timeline hook: request-start / headers / first-chunk. */\n onTiming?: LLMStreamTimingCallback;\n /**\n * Abort a stream that delivers no data for this long (default 8000ms) \u2014\n * protects against provider connections that go silent after the model\n * already produced its output. Raise it for providers with slow TTFT.\n */\n idleTimeoutMs?: number;\n /** Called with the provider-reported token usage (when included). */\n onUsage?: LLMUsageCallback;\n /**\n * Default tool encoding for requests that don't set `toolMode` (the\n * request's `toolMode` wins). For models whose endpoints lack native tool\n * calling.\n */\n toolMode?: ToolMode;\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 readonly onTiming: LLMStreamTimingCallback | undefined;\n private readonly idleTimeoutMs: number;\n private readonly onUsage: LLMUsageCallback | undefined;\n private readonly toolMode: ToolMode | undefined;\n private readonly streams = new Set<AbortController>();\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 this.onTiming = options.onTiming;\n this.idleTimeoutMs = options.idleTimeoutMs ?? 8_000;\n this.onUsage = options.onUsage;\n this.toolMode = options.toolMode;\n }\n\n /** Cancel every in-flight stream (parallel sub-generations included). */\n stop(): void {\n for (const controller of this.streams) controller.abort();\n }\n\n async *stream(request: LLMRequest): AsyncGenerator<LLMEvent> {\n // Multiple generations can stream concurrently (e.g. delegated\n // sub-agents); each gets its own controller, and stop() aborts them all.\n const controller = new AbortController();\n this.streams.add(controller);\n\n try {\n yield* openAICompatibleStream({\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n model: this.model,\n fetchImpl: this.fetchImpl,\n request,\n signal: controller.signal,\n // Reasoning models default to enabled thinking; disable it so the\n // adapter behaves uniformly on deepseek-chat.\n extraBody: { thinking: { type: \"disabled\" } },\n label: \"DeepSeek\",\n onTiming: this.onTiming,\n idleTimeoutMs: this.idleTimeoutMs,\n onUsage: this.onUsage,\n toolMode: this.toolMode,\n });\n } finally {\n this.streams.delete(controller);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,IAAA,eAAAC,EAAAH,GASA,IAAAI,EAAuC,gCA+BhC,MAAMC,CAA2B,CAxCxC,MAwCwC,CAAAC,EAAA,oBACrB,OACA,MACA,QACA,UACA,SACA,cACA,QACA,SACA,QAAU,IAAI,IAE/B,YAAYC,EAA0B,CACpC,GAAI,CAACA,EAAQ,OACX,MAAM,IAAI,MAAM,gCAAgC,EAElD,KAAK,OAASA,EAAQ,OACtB,KAAK,MAAQA,EAAQ,OAAS,gBAC9B,KAAK,SAAWA,EAAQ,SAAW,4BAA4B,QAAQ,OAAQ,EAAE,EACjF,KAAK,UAAYA,EAAQ,OAAS,MAClC,KAAK,SAAWA,EAAQ,SACxB,KAAK,cAAgBA,EAAQ,eAAiB,IAC9C,KAAK,QAAUA,EAAQ,QACvB,KAAK,SAAWA,EAAQ,QAC1B,CAGA,MAAa,CACX,UAAWC,KAAc,KAAK,QAASA,EAAW,MAAM,CAC1D,CAEA,MAAO,OAAOC,EAA+C,CAG3D,MAAMD,EAAa,IAAI,gBACvB,KAAK,QAAQ,IAAIA,CAAU,EAE3B,GAAI,CACF,SAAO,0BAAuB,CAC5B,QAAS,KAAK,QACd,OAAQ,KAAK,OACb,MAAO,KAAK,MACZ,UAAW,KAAK,UAChB,QAAAC,EACA,OAAQD,EAAW,OAGnB,UAAW,CAAE,SAAU,CAAE,KAAM,UAAW,CAAE,EAC5C,MAAO,WACP,SAAU,KAAK,SACf,cAAe,KAAK,cACpB,QAAS,KAAK,QACd,SAAU,KAAK,QACjB,CAAC,CACH,QAAE,CACA,KAAK,QAAQ,OAAOA,CAAU,CAChC,CACF,CACF",
|
|
6
|
+
"names": ["deepseek_exports", "__export", "DeepSeekLLM", "__toCommonJS", "import_openai_compatible", "DeepSeekLLM", "__name", "options", "controller", "request"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var p=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var a=(o,e)=>{for(var L in e)p(o,L,{get:e[L],enumerable:!0})},d=(o,e,L,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of u(e))!O.call(o,r)&&r!==L&&p(o,r,{get:()=>e[r],enumerable:!(t=n(e,r))||t.enumerable});return o};var k=o=>d(p({},"__esModule",{value:!0}),o);var l={};a(l,{ClaudeLLM:()=>M.ClaudeLLM,DeepSeekLLM:()=>f.DeepSeekLLM,OpenAILLM:()=>x.OpenAILLM,OpenRouterLLM:()=>m.OpenRouterLLM});module.exports=k(l);var f=require("./deepseek/deepseek.js"),m=require("./openrouter/openrouter.js"),x=require("./openai/openai.js"),M=require("./claude/claude.js");
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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,
|
|
6
|
-
"names": ["adapters_exports", "__export", "__toCommonJS", "import_deepseek"]
|
|
4
|
+
"sourcesContent": ["export { DeepSeekLLM } from \"./deepseek/deepseek\";\nexport { OpenRouterLLM } from \"./openrouter/openrouter\";\nexport { OpenAILLM } from \"./openai/openai\";\nexport { ClaudeLLM } from \"./claude/claude\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sIAAAE,EAAAF,GAAA,IAAAG,EAA4B,+BAC5BC,EAA8B,mCAC9BC,EAA0B,2BAC1BC,EAA0B",
|
|
6
|
+
"names": ["adapters_exports", "__export", "__toCommonJS", "import_deepseek", "import_openrouter", "import_openai", "import_claude"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var x=(e,p)=>{for(var n in p)r(e,n,{get:p[n],enumerable:!0})},A=(e,p,n,t)=>{if(p&&typeof p=="object"||typeof p=="function")for(let o of i(p))!m.call(e,o)&&o!==n&&r(e,o,{get:()=>p[o],enumerable:!(t=f(p,o))||t.enumerable});return e};var I=e=>A(r({},"__esModule",{value:!0}),e);var L={};x(L,{OpenAILLM:()=>O.OpenAILLM});module.exports=I(L);var O=require("./openai.js");
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/llm/adapters/openai/index.ts"],
|
|
4
|
+
"sourcesContent": ["export { OpenAILLM } from \"./openai\";\nexport type { OpenAIOptions } from \"./openai\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4CAAAE,EAAAF,GAAA,IAAAG,EAA0B",
|
|
6
|
+
"names": ["openai_exports", "__export", "__toCommonJS", "import_openai"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var l=(t,e)=>a(t,"name",{value:e,configurable:!0});var p=(t,e)=>{for(var i in e)a(t,i,{get:e[i],enumerable:!0})},h=(t,e,i,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of m(e))!d.call(t,o)&&o!==i&&a(t,o,{get:()=>e[o],enumerable:!(r=s(e,o))||r.enumerable});return t};var L=t=>h(a({},"__esModule",{value:!0}),t);var c={};p(c,{OpenAILLM:()=>M});module.exports=L(c);var n=require("../openai-compatible.js");class M{static{l(this,"OpenAILLM")}apiKey;model;baseUrl;fetchImpl;onTiming;idleTimeoutMs;onUsage;toolMode;streams=new Set;constructor(e){if(!e.apiKey)throw new Error("OpenAILLM requires an apiKey");this.apiKey=e.apiKey,this.model=e.model??"gpt-4o-mini",this.baseUrl=(e.baseUrl??"https://api.openai.com/v1").replace(/\/+$/,""),this.fetchImpl=e.fetch??fetch,this.onTiming=e.onTiming,this.idleTimeoutMs=e.idleTimeoutMs??8e3,this.onUsage=e.onUsage,this.toolMode=e.toolMode}stop(){for(const e of this.streams)e.abort()}async*stream(e){const i=new AbortController;this.streams.add(i);try{yield*(0,n.openAICompatibleStream)({baseUrl:this.baseUrl,apiKey:this.apiKey,model:this.model,fetchImpl:this.fetchImpl,request:e,signal:i.signal,label:"OpenAI",onTiming:this.onTiming,idleTimeoutMs:this.idleTimeoutMs,onUsage:this.onUsage,toolMode:this.toolMode})}finally{this.streams.delete(i)}}}
|
|
2
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/providers/llm/adapters/openai/openai.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\n LLM,\n LLMEvent,\n LLMRequest,\n LLMStreamTimingCallback,\n LLMUsageCallback,\n ToolMode,\n} from \"../../types\";\nimport type { FetchLike } from \"../../../shared\";\nimport { openAICompatibleStream } from \"../openai-compatible\";\n\nexport interface OpenAIOptions {\n apiKey: string;\n /** Defaults to `gpt-4o-mini`. */\n model?: string;\n /** Defaults to `https://api.openai.com/v1`. */\n baseUrl?: string;\n /** Injectable fetch implementation, mainly for tests. */\n fetch?: FetchLike;\n /** Provider-timeline hook: request-start / headers / first-chunk. */\n onTiming?: LLMStreamTimingCallback;\n /**\n * Abort a stream that delivers no data for this long (default 8000ms) \u2014\n * protects against provider connections that go silent after the model\n * already produced its output. Raise it for providers with slow TTFT.\n */\n idleTimeoutMs?: number;\n /** Called with the provider-reported token usage (when included). */\n onUsage?: LLMUsageCallback;\n /**\n * Default tool encoding for requests that don't set `toolMode` (the\n * request's `toolMode` wins). For models whose endpoints lack native tool\n * calling.\n */\n toolMode?: ToolMode;\n}\n\n/**\n * OpenAI LLM adapter (OpenAI-compatible chat completions over SSE).\n */\nexport class OpenAILLM implements LLM {\n private readonly apiKey: string;\n private readonly model: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: FetchLike;\n private readonly onTiming: LLMStreamTimingCallback | undefined;\n private readonly idleTimeoutMs: number;\n private readonly onUsage: LLMUsageCallback | undefined;\n private readonly toolMode: ToolMode | undefined;\n private readonly streams = new Set<AbortController>();\n\n constructor(options: OpenAIOptions) {\n if (!options.apiKey) {\n throw new Error(\"OpenAILLM requires an apiKey\");\n }\n this.apiKey = options.apiKey;\n this.model = options.model ?? \"gpt-4o-mini\";\n this.baseUrl = (options.baseUrl ?? \"https://api.openai.com/v1\").replace(/\\/+$/, \"\");\n this.fetchImpl = options.fetch ?? fetch;\n this.onTiming = options.onTiming;\n this.idleTimeoutMs = options.idleTimeoutMs ?? 8_000;\n this.onUsage = options.onUsage;\n this.toolMode = options.toolMode;\n }\n\n /** Cancel every in-flight stream (parallel sub-generations included). */\n stop(): void {\n for (const controller of this.streams) controller.abort();\n }\n\n async *stream(request: LLMRequest): AsyncGenerator<LLMEvent> {\n // Multiple generations can stream concurrently (e.g. delegated\n // sub-agents); each gets its own controller, and stop() aborts them all.\n const controller = new AbortController();\n this.streams.add(controller);\n\n try {\n yield* openAICompatibleStream({\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n model: this.model,\n fetchImpl: this.fetchImpl,\n request,\n signal: controller.signal,\n label: \"OpenAI\",\n onTiming: this.onTiming,\n idleTimeoutMs: this.idleTimeoutMs,\n onUsage: this.onUsage,\n toolMode: this.toolMode,\n });\n } finally {\n this.streams.delete(controller);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "4dAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,eAAAE,IAAA,eAAAC,EAAAH,GASA,IAAAI,EAAuC,gCA+BhC,MAAMC,CAAyB,CAxCtC,MAwCsC,CAAAC,EAAA,kBACnB,OACA,MACA,QACA,UACA,SACA,cACA,QACA,SACA,QAAU,IAAI,IAE/B,YAAYC,EAAwB,CAClC,GAAI,CAACA,EAAQ,OACX,MAAM,IAAI,MAAM,8BAA8B,EAEhD,KAAK,OAASA,EAAQ,OACtB,KAAK,MAAQA,EAAQ,OAAS,cAC9B,KAAK,SAAWA,EAAQ,SAAW,6BAA6B,QAAQ,OAAQ,EAAE,EAClF,KAAK,UAAYA,EAAQ,OAAS,MAClC,KAAK,SAAWA,EAAQ,SACxB,KAAK,cAAgBA,EAAQ,eAAiB,IAC9C,KAAK,QAAUA,EAAQ,QACvB,KAAK,SAAWA,EAAQ,QAC1B,CAGA,MAAa,CACX,UAAWC,KAAc,KAAK,QAASA,EAAW,MAAM,CAC1D,CAEA,MAAO,OAAOC,EAA+C,CAG3D,MAAMD,EAAa,IAAI,gBACvB,KAAK,QAAQ,IAAIA,CAAU,EAE3B,GAAI,CACF,SAAO,0BAAuB,CAC5B,QAAS,KAAK,QACd,OAAQ,KAAK,OACb,MAAO,KAAK,MACZ,UAAW,KAAK,UAChB,QAAAC,EACA,OAAQD,EAAW,OACnB,MAAO,SACP,SAAU,KAAK,SACf,cAAe,KAAK,cACpB,QAAS,KAAK,QACd,SAAU,KAAK,QACjB,CAAC,CACH,QAAE,CACA,KAAK,QAAQ,OAAOA,CAAU,CAChC,CACF,CACF",
|
|
6
|
+
"names": ["openai_exports", "__export", "OpenAILLM", "__toCommonJS", "import_openai_compatible", "OpenAILLM", "__name", "options", "controller", "request"]
|
|
7
|
+
}
|