@rudderjs/ai 1.17.2 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -1274
- package/dist/budget-orm/index.d.ts +1 -95
- package/dist/budget-orm/index.d.ts.map +1 -1
- package/dist/budget-orm/index.js +4 -176
- package/dist/budget-orm/index.js.map +1 -1
- package/dist/chat-mentions.d.ts +1 -58
- package/dist/chat-mentions.d.ts.map +1 -1
- package/dist/chat-mentions.js +4 -80
- package/dist/chat-mentions.js.map +1 -1
- package/dist/commands/ai-eval.d.ts +1 -92
- package/dist/commands/ai-eval.d.ts.map +1 -1
- package/dist/commands/ai-eval.js +4 -377
- package/dist/commands/ai-eval.js.map +1 -1
- package/dist/commands/make-agent.d.ts +1 -2
- package/dist/commands/make-agent.d.ts.map +1 -1
- package/dist/commands/make-agent.js +4 -22
- package/dist/commands/make-agent.js.map +1 -1
- package/dist/computer-use/index.d.ts +1 -52
- package/dist/computer-use/index.d.ts.map +1 -1
- package/dist/computer-use/index.js +4 -50
- package/dist/computer-use/index.js.map +1 -1
- package/dist/conversation-orm/index.d.ts +1 -108
- package/dist/conversation-orm/index.d.ts.map +1 -1
- package/dist/conversation-orm/index.js +4 -214
- package/dist/conversation-orm/index.js.map +1 -1
- package/dist/doctor.d.ts +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +4 -65
- package/dist/doctor.js.map +1 -1
- package/dist/eval/index.d.ts +1 -270
- package/dist/eval/index.d.ts.map +1 -1
- package/dist/eval/index.js +4 -509
- package/dist/eval/index.js.map +1 -1
- package/dist/gateway/index.d.ts +1 -10
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +4 -10
- package/dist/gateway/index.js.map +1 -1
- package/dist/index.d.ts +1 -66
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -78
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -15
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +4 -14
- package/dist/mcp/index.js.map +1 -1
- package/dist/memory-embedding/index.d.ts +1 -120
- package/dist/memory-embedding/index.d.ts.map +1 -1
- package/dist/memory-embedding/index.js +4 -228
- package/dist/memory-embedding/index.js.map +1 -1
- package/dist/memory-orm/index.d.ts +1 -117
- package/dist/memory-orm/index.d.ts.map +1 -1
- package/dist/memory-orm/index.js +4 -186
- package/dist/memory-orm/index.js.map +1 -1
- package/dist/node/index.d.ts +1 -2
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +4 -2
- package/dist/node/index.js.map +1 -1
- package/dist/observers.d.ts +1 -129
- package/dist/observers.d.ts.map +1 -1
- package/dist/observers.js +4 -39
- package/dist/observers.js.map +1 -1
- package/dist/react/index.d.ts +1 -15
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +4 -15
- package/dist/react/index.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -1
- package/dist/server/index.js.map +1 -1
- package/package.json +9 -13
- package/boost/guidelines.md +0 -260
- package/boost/skills/ai-agents/SKILL.md +0 -240
- package/boost/skills/ai-tools/SKILL.md +0 -260
- package/dist/agent-run-store.d.ts +0 -161
- package/dist/agent-run-store.d.ts.map +0 -1
- package/dist/agent-run-store.js +0 -98
- package/dist/agent-run-store.js.map +0 -1
- package/dist/agent-sse.d.ts +0 -153
- package/dist/agent-sse.d.ts.map +0 -1
- package/dist/agent-sse.js +0 -282
- package/dist/agent-sse.js.map +0 -1
- package/dist/agent.d.ts +0 -508
- package/dist/agent.d.ts.map +0 -1
- package/dist/agent.js +0 -1538
- package/dist/agent.js.map +0 -1
- package/dist/attachment.d.ts +0 -31
- package/dist/attachment.d.ts.map +0 -1
- package/dist/attachment.js +0 -89
- package/dist/attachment.js.map +0 -1
- package/dist/audio.d.ts +0 -45
- package/dist/audio.d.ts.map +0 -1
- package/dist/audio.js +0 -93
- package/dist/audio.js.map +0 -1
- package/dist/base64.d.ts +0 -7
- package/dist/base64.d.ts.map +0 -1
- package/dist/base64.js +0 -39
- package/dist/base64.js.map +0 -1
- package/dist/budget/pricing.d.ts +0 -124
- package/dist/budget/pricing.d.ts.map +0 -1
- package/dist/budget/pricing.js +0 -175
- package/dist/budget/pricing.js.map +0 -1
- package/dist/budget/storage.d.ts +0 -104
- package/dist/budget/storage.d.ts.map +0 -1
- package/dist/budget/storage.js +0 -0
- package/dist/budget/storage.js.map +0 -1
- package/dist/budget/with-budget.d.ts +0 -119
- package/dist/budget/with-budget.d.ts.map +0 -1
- package/dist/budget/with-budget.js +0 -175
- package/dist/budget/with-budget.js.map +0 -1
- package/dist/cached-embedding.d.ts +0 -14
- package/dist/cached-embedding.d.ts.map +0 -1
- package/dist/cached-embedding.js +0 -44
- package/dist/cached-embedding.js.map +0 -1
- package/dist/computer-use/actions.d.ts +0 -214
- package/dist/computer-use/actions.d.ts.map +0 -1
- package/dist/computer-use/actions.js +0 -48
- package/dist/computer-use/actions.js.map +0 -1
- package/dist/computer-use/errors.d.ts +0 -57
- package/dist/computer-use/errors.d.ts.map +0 -1
- package/dist/computer-use/errors.js +0 -76
- package/dist/computer-use/errors.js.map +0 -1
- package/dist/computer-use/playwright.d.ts +0 -76
- package/dist/computer-use/playwright.d.ts.map +0 -1
- package/dist/computer-use/playwright.js +0 -270
- package/dist/computer-use/playwright.js.map +0 -1
- package/dist/computer-use/tool.d.ts +0 -154
- package/dist/computer-use/tool.d.ts.map +0 -1
- package/dist/computer-use/tool.js +0 -210
- package/dist/computer-use/tool.js.map +0 -1
- package/dist/continuation-validation.d.ts +0 -85
- package/dist/continuation-validation.d.ts.map +0 -1
- package/dist/continuation-validation.js +0 -166
- package/dist/continuation-validation.js.map +0 -1
- package/dist/conversation-persistence.d.ts +0 -46
- package/dist/conversation-persistence.d.ts.map +0 -1
- package/dist/conversation-persistence.js +0 -176
- package/dist/conversation-persistence.js.map +0 -1
- package/dist/conversation.d.ts +0 -11
- package/dist/conversation.d.ts.map +0 -1
- package/dist/conversation.js +0 -55
- package/dist/conversation.js.map +0 -1
- package/dist/eval/fixtures.d.ts +0 -65
- package/dist/eval/fixtures.d.ts.map +0 -1
- package/dist/eval/fixtures.js +0 -110
- package/dist/eval/fixtures.js.map +0 -1
- package/dist/eval/html-reporter.d.ts +0 -25
- package/dist/eval/html-reporter.d.ts.map +0 -1
- package/dist/eval/html-reporter.js +0 -209
- package/dist/eval/html-reporter.js.map +0 -1
- package/dist/eval/json-reporter.d.ts +0 -43
- package/dist/eval/json-reporter.d.ts.map +0 -1
- package/dist/eval/json-reporter.js +0 -40
- package/dist/eval/json-reporter.js.map +0 -1
- package/dist/facade.d.ts +0 -96
- package/dist/facade.d.ts.map +0 -1
- package/dist/facade.js +0 -146
- package/dist/facade.js.map +0 -1
- package/dist/fake.d.ts +0 -201
- package/dist/fake.d.ts.map +0 -1
- package/dist/fake.js +0 -428
- package/dist/fake.js.map +0 -1
- package/dist/file-search.d.ts +0 -168
- package/dist/file-search.d.ts.map +0 -1
- package/dist/file-search.js +0 -158
- package/dist/file-search.js.map +0 -1
- package/dist/files.d.ts +0 -27
- package/dist/files.d.ts.map +0 -1
- package/dist/files.js +0 -44
- package/dist/files.js.map +0 -1
- package/dist/gateway/http-gateway-adapter.d.ts +0 -94
- package/dist/gateway/http-gateway-adapter.d.ts.map +0 -1
- package/dist/gateway/http-gateway-adapter.js +0 -106
- package/dist/gateway/http-gateway-adapter.js.map +0 -1
- package/dist/gateway/sse.d.ts +0 -28
- package/dist/gateway/sse.d.ts.map +0 -1
- package/dist/gateway/sse.js +0 -78
- package/dist/gateway/sse.js.map +0 -1
- package/dist/handoff.d.ts +0 -95
- package/dist/handoff.d.ts.map +0 -1
- package/dist/handoff.js +0 -78
- package/dist/handoff.js.map +0 -1
- package/dist/handoffs-driver.d.ts +0 -58
- package/dist/handoffs-driver.d.ts.map +0 -1
- package/dist/handoffs-driver.js +0 -103
- package/dist/handoffs-driver.js.map +0 -1
- package/dist/image.d.ts +0 -40
- package/dist/image.d.ts.map +0 -1
- package/dist/image.js +0 -109
- package/dist/image.js.map +0 -1
- package/dist/mcp/client-tools.d.ts +0 -39
- package/dist/mcp/client-tools.d.ts.map +0 -1
- package/dist/mcp/client-tools.js +0 -147
- package/dist/mcp/client-tools.js.map +0 -1
- package/dist/mcp/server-from-agent.d.ts +0 -24
- package/dist/mcp/server-from-agent.d.ts.map +0 -1
- package/dist/mcp/server-from-agent.js +0 -113
- package/dist/mcp/server-from-agent.js.map +0 -1
- package/dist/mcp/types.d.ts +0 -64
- package/dist/mcp/types.d.ts.map +0 -1
- package/dist/mcp/types.js +0 -6
- package/dist/mcp/types.js.map +0 -1
- package/dist/memory-extract.d.ts +0 -60
- package/dist/memory-extract.d.ts.map +0 -1
- package/dist/memory-extract.js +0 -163
- package/dist/memory-extract.js.map +0 -1
- package/dist/memory-inject.d.ts +0 -39
- package/dist/memory-inject.d.ts.map +0 -1
- package/dist/memory-inject.js +0 -135
- package/dist/memory-inject.js.map +0 -1
- package/dist/memory.d.ts +0 -55
- package/dist/memory.d.ts.map +0 -1
- package/dist/memory.js +0 -132
- package/dist/memory.js.map +0 -1
- package/dist/middleware.d.ts +0 -18
- package/dist/middleware.d.ts.map +0 -1
- package/dist/middleware.js +0 -72
- package/dist/middleware.js.map +0 -1
- package/dist/node/attachment.d.ts +0 -6
- package/dist/node/attachment.d.ts.map +0 -1
- package/dist/node/attachment.js +0 -35
- package/dist/node/attachment.js.map +0 -1
- package/dist/node/transcription.d.ts +0 -4
- package/dist/node/transcription.d.ts.map +0 -1
- package/dist/node/transcription.js +0 -8
- package/dist/node/transcription.js.map +0 -1
- package/dist/output.d.ts +0 -22
- package/dist/output.d.ts.map +0 -1
- package/dist/output.js +0 -60
- package/dist/output.js.map +0 -1
- package/dist/provider-tools.d.ts +0 -87
- package/dist/provider-tools.d.ts.map +0 -1
- package/dist/provider-tools.js +0 -189
- package/dist/provider-tools.js.map +0 -1
- package/dist/providers/anthropic.d.ts +0 -24
- package/dist/providers/anthropic.d.ts.map +0 -1
- package/dist/providers/anthropic.js +0 -405
- package/dist/providers/anthropic.js.map +0 -1
- package/dist/providers/azure.d.ts +0 -13
- package/dist/providers/azure.d.ts.map +0 -1
- package/dist/providers/azure.js +0 -15
- package/dist/providers/azure.js.map +0 -1
- package/dist/providers/bedrock.d.ts +0 -75
- package/dist/providers/bedrock.d.ts.map +0 -1
- package/dist/providers/bedrock.js +0 -181
- package/dist/providers/bedrock.js.map +0 -1
- package/dist/providers/cohere.d.ts +0 -13
- package/dist/providers/cohere.d.ts.map +0 -1
- package/dist/providers/cohere.js +0 -87
- package/dist/providers/cohere.js.map +0 -1
- package/dist/providers/deepseek.d.ts +0 -12
- package/dist/providers/deepseek.d.ts.map +0 -1
- package/dist/providers/deepseek.js +0 -15
- package/dist/providers/deepseek.js.map +0 -1
- package/dist/providers/elevenlabs.d.ts +0 -98
- package/dist/providers/elevenlabs.d.ts.map +0 -1
- package/dist/providers/elevenlabs.js +0 -229
- package/dist/providers/elevenlabs.js.map +0 -1
- package/dist/providers/google-cache-registry.d.ts +0 -132
- package/dist/providers/google-cache-registry.d.ts.map +0 -1
- package/dist/providers/google-cache-registry.js +0 -209
- package/dist/providers/google-cache-registry.js.map +0 -1
- package/dist/providers/google.d.ts +0 -38
- package/dist/providers/google.d.ts.map +0 -1
- package/dist/providers/google.js +0 -903
- package/dist/providers/google.js.map +0 -1
- package/dist/providers/groq.d.ts +0 -12
- package/dist/providers/groq.d.ts.map +0 -1
- package/dist/providers/groq.js +0 -15
- package/dist/providers/groq.js.map +0 -1
- package/dist/providers/jina.d.ts +0 -13
- package/dist/providers/jina.d.ts.map +0 -1
- package/dist/providers/jina.js +0 -90
- package/dist/providers/jina.js.map +0 -1
- package/dist/providers/mistral.d.ts +0 -13
- package/dist/providers/mistral.d.ts.map +0 -1
- package/dist/providers/mistral.js +0 -46
- package/dist/providers/mistral.js.map +0 -1
- package/dist/providers/ollama.d.ts +0 -11
- package/dist/providers/ollama.d.ts.map +0 -1
- package/dist/providers/ollama.js +0 -15
- package/dist/providers/ollama.js.map +0 -1
- package/dist/providers/openai.d.ts +0 -79
- package/dist/providers/openai.d.ts.map +0 -1
- package/dist/providers/openai.js +0 -792
- package/dist/providers/openai.js.map +0 -1
- package/dist/providers/openrouter.d.ts +0 -43
- package/dist/providers/openrouter.d.ts.map +0 -1
- package/dist/providers/openrouter.js +0 -21
- package/dist/providers/openrouter.js.map +0 -1
- package/dist/providers/voyage.d.ts +0 -91
- package/dist/providers/voyage.d.ts.map +0 -1
- package/dist/providers/voyage.js +0 -166
- package/dist/providers/voyage.js.map +0 -1
- package/dist/providers/xai.d.ts +0 -12
- package/dist/providers/xai.d.ts.map +0 -1
- package/dist/providers/xai.js +0 -15
- package/dist/providers/xai.js.map +0 -1
- package/dist/queue-job.d.ts +0 -100
- package/dist/queue-job.d.ts.map +0 -1
- package/dist/queue-job.js +0 -185
- package/dist/queue-job.js.map +0 -1
- package/dist/react/agent-run.d.ts +0 -111
- package/dist/react/agent-run.d.ts.map +0 -1
- package/dist/react/agent-run.js +0 -107
- package/dist/react/agent-run.js.map +0 -1
- package/dist/react/useAgentRun.d.ts +0 -68
- package/dist/react/useAgentRun.d.ts.map +0 -1
- package/dist/react/useAgentRun.js +0 -125
- package/dist/react/useAgentRun.js.map +0 -1
- package/dist/registry.d.ts +0 -45
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js +0 -131
- package/dist/registry.js.map +0 -1
- package/dist/rerank.d.ts +0 -20
- package/dist/rerank.d.ts.map +0 -1
- package/dist/rerank.js +0 -40
- package/dist/rerank.js.map +0 -1
- package/dist/resume-approval.d.ts +0 -30
- package/dist/resume-approval.d.ts.map +0 -1
- package/dist/resume-approval.js +0 -147
- package/dist/resume-approval.js.map +0 -1
- package/dist/sanitize-conversation.d.ts +0 -43
- package/dist/sanitize-conversation.d.ts.map +0 -1
- package/dist/sanitize-conversation.js +0 -85
- package/dist/sanitize-conversation.js.map +0 -1
- package/dist/scoped-tool.d.ts +0 -98
- package/dist/scoped-tool.d.ts.map +0 -1
- package/dist/scoped-tool.js +0 -174
- package/dist/scoped-tool.js.map +0 -1
- package/dist/server/provider.d.ts +0 -22
- package/dist/server/provider.d.ts.map +0 -1
- package/dist/server/provider.js +0 -194
- package/dist/server/provider.js.map +0 -1
- package/dist/similarity-search.d.ts +0 -163
- package/dist/similarity-search.d.ts.map +0 -1
- package/dist/similarity-search.js +0 -147
- package/dist/similarity-search.js.map +0 -1
- package/dist/sub-agent-run-store.d.ts +0 -157
- package/dist/sub-agent-run-store.d.ts.map +0 -1
- package/dist/sub-agent-run-store.js +0 -87
- package/dist/sub-agent-run-store.js.map +0 -1
- package/dist/tool-execution.d.ts +0 -16
- package/dist/tool-execution.d.ts.map +0 -1
- package/dist/tool-execution.js +0 -498
- package/dist/tool-execution.js.map +0 -1
- package/dist/tool-helpers.d.ts +0 -77
- package/dist/tool-helpers.d.ts.map +0 -1
- package/dist/tool-helpers.js +0 -117
- package/dist/tool-helpers.js.map +0 -1
- package/dist/tool.d.ts +0 -216
- package/dist/tool.d.ts.map +0 -1
- package/dist/tool.js +0 -175
- package/dist/tool.js.map +0 -1
- package/dist/transcription.d.ts +0 -42
- package/dist/transcription.d.ts.map +0 -1
- package/dist/transcription.js +0 -77
- package/dist/transcription.js.map +0 -1
- package/dist/types.d.ts +0 -1020
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/util/hash.d.ts +0 -11
- package/dist/util/hash.d.ts.map +0 -1
- package/dist/util/hash.js +0 -23
- package/dist/util/hash.js.map +0 -1
- package/dist/vector-stores/index.d.ts +0 -96
- package/dist/vector-stores/index.d.ts.map +0 -1
- package/dist/vector-stores/index.js +0 -153
- package/dist/vector-stores/index.js.map +0 -1
- package/dist/vercel-protocol.d.ts +0 -18
- package/dist/vercel-protocol.d.ts.map +0 -1
- package/dist/vercel-protocol.js +0 -75
- package/dist/vercel-protocol.js.map +0 -1
- package/dist/zod-to-json-schema.d.ts +0 -16
- package/dist/zod-to-json-schema.d.ts.map +0 -1
- package/dist/zod-to-json-schema.js +0 -17
- package/dist/zod-to-json-schema.js.map +0 -1
package/dist/registry.d.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { AiModelConfig, ProviderFactory, ProviderAdapter, RerankingAdapter, FileAdapter, VectorStoreAdapter } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Try a list of provider/model strings in order until one succeeds.
|
|
4
|
-
*
|
|
5
|
-
* Used by the media-generation paths (Image, Audio, Transcription) to give
|
|
6
|
-
* the same failover ergonomics agents already have. The first model is the
|
|
7
|
-
* "primary"; the rest are fallbacks. Errors from earlier candidates are
|
|
8
|
-
* swallowed; only the last error is thrown if every candidate fails.
|
|
9
|
-
*
|
|
10
|
-
* The agent loop has its own failover wired into LoopContext (telemetry,
|
|
11
|
-
* abort handling, observer attempts counter). This is a simpler helper for
|
|
12
|
-
* single-shot calls outside the agent loop.
|
|
13
|
-
*
|
|
14
|
-
* @param primary The user's chosen model string (e.g. `'openai/dall-e-3'`).
|
|
15
|
-
* @param fallbacks Additional candidates to try on failure.
|
|
16
|
-
* @param call Receives each candidate model string and runs the work.
|
|
17
|
-
*/
|
|
18
|
-
export declare function tryWithFailover<T>(primary: string, fallbacks: readonly string[], call: (modelString: string) => Promise<T>): Promise<T>;
|
|
19
|
-
export declare class AiRegistry {
|
|
20
|
-
/** Register a provider factory */
|
|
21
|
-
static register(factory: ProviderFactory): void;
|
|
22
|
-
/** Get a registered provider factory by name */
|
|
23
|
-
static getFactory(name: string): ProviderFactory;
|
|
24
|
-
/** Set the default provider/model string */
|
|
25
|
-
static setDefault(modelString: string): void;
|
|
26
|
-
/** Get the default provider/model string */
|
|
27
|
-
static getDefault(): string;
|
|
28
|
-
/** Parse 'provider/model' string into [providerName, modelId] */
|
|
29
|
-
static parseModelString(modelString: string): [string, string];
|
|
30
|
-
/** Resolve a provider/model string to a ProviderAdapter */
|
|
31
|
-
static resolve(modelString: string): ProviderAdapter;
|
|
32
|
-
/** Resolve a provider/model string to a RerankingAdapter */
|
|
33
|
-
static resolveReranking(modelString: string): RerankingAdapter;
|
|
34
|
-
/** Resolve a file adapter for a provider name */
|
|
35
|
-
static resolveFiles(providerName: string): FileAdapter;
|
|
36
|
-
/** Resolve a vector-store adapter for a provider name (#B8) */
|
|
37
|
-
static resolveVectorStores(providerName: string): VectorStoreAdapter;
|
|
38
|
-
/** Set available models for user selection */
|
|
39
|
-
static setModels(models: AiModelConfig[]): void;
|
|
40
|
-
/** Get available models */
|
|
41
|
-
static getModels(): AiModelConfig[];
|
|
42
|
-
/** Test-cleanup hook (public — other packages reset across the boundary). */
|
|
43
|
-
static reset(): void;
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=registry.d.ts.map
|
package/dist/registry.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpI;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAaZ;AA4CD,qBAAa,UAAU;IACrB,kCAAkC;IAClC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAI/C,gDAAgD;IAChD,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;IAMhD,4CAA4C;IAC5C,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAI5C,4CAA4C;IAC5C,MAAM,CAAC,UAAU,IAAI,MAAM;IAK3B,iEAAiE;IACjE,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAM9D,2DAA2D;IAC3D,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe;IAMpD,4DAA4D;IAC5D,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB;IAY9D,iDAAiD;IACjD,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,WAAW;IAWtD,+DAA+D;IAC/D,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB;IAYpE,8CAA8C;IAC9C,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAI/C,2BAA2B;IAC3B,MAAM,CAAC,SAAS,IAAI,aAAa,EAAE;IAInC,6EAA6E;IAC7E,MAAM,CAAC,KAAK,IAAI,IAAI;CAMrB"}
|
package/dist/registry.js
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Try a list of provider/model strings in order until one succeeds.
|
|
3
|
-
*
|
|
4
|
-
* Used by the media-generation paths (Image, Audio, Transcription) to give
|
|
5
|
-
* the same failover ergonomics agents already have. The first model is the
|
|
6
|
-
* "primary"; the rest are fallbacks. Errors from earlier candidates are
|
|
7
|
-
* swallowed; only the last error is thrown if every candidate fails.
|
|
8
|
-
*
|
|
9
|
-
* The agent loop has its own failover wired into LoopContext (telemetry,
|
|
10
|
-
* abort handling, observer attempts counter). This is a simpler helper for
|
|
11
|
-
* single-shot calls outside the agent loop.
|
|
12
|
-
*
|
|
13
|
-
* @param primary The user's chosen model string (e.g. `'openai/dall-e-3'`).
|
|
14
|
-
* @param fallbacks Additional candidates to try on failure.
|
|
15
|
-
* @param call Receives each candidate model string and runs the work.
|
|
16
|
-
*/
|
|
17
|
-
export async function tryWithFailover(primary, fallbacks, call) {
|
|
18
|
-
const candidates = fallbacks.length > 0
|
|
19
|
-
? [primary, ...fallbacks.filter((m) => m !== primary)]
|
|
20
|
-
: [primary];
|
|
21
|
-
let lastError;
|
|
22
|
-
for (const m of candidates) {
|
|
23
|
-
try {
|
|
24
|
-
return await call(m);
|
|
25
|
-
}
|
|
26
|
-
catch (err) {
|
|
27
|
-
lastError = err instanceof Error ? err : new Error(String(err));
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
throw lastError ?? new Error('[Rudder AI] No provider available for failover.');
|
|
31
|
-
}
|
|
32
|
-
const _g = globalThis;
|
|
33
|
-
if (!_g['__rudderjs_ai_registry__']) {
|
|
34
|
-
_g['__rudderjs_ai_registry__'] = {
|
|
35
|
-
factories: new Map(),
|
|
36
|
-
default: null,
|
|
37
|
-
models: [],
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
const _store = _g['__rudderjs_ai_registry__'];
|
|
41
|
-
// Reset listeners — modules that hold registry-shaped caches (e.g. the
|
|
42
|
-
// facade's embedding-adapter cache) subscribe here so `AiRegistry.reset()`
|
|
43
|
-
// clears them in lock-step. Survives reload via the same global slot.
|
|
44
|
-
if (!_g['__rudderjs_ai_reset_listeners__']) {
|
|
45
|
-
_g['__rudderjs_ai_reset_listeners__'] = new Set();
|
|
46
|
-
}
|
|
47
|
-
const _resetListeners = _g['__rudderjs_ai_reset_listeners__'];
|
|
48
|
-
/** Test-cleanup hook (@internal — subscribe to `AiRegistry.reset()` to clear adjacent caches. ). Kept public — other packages reset across the boundary. */
|
|
49
|
-
export function _onAiRegistryReset(fn) { _resetListeners.add(fn); }
|
|
50
|
-
export class AiRegistry {
|
|
51
|
-
/** Register a provider factory */
|
|
52
|
-
static register(factory) {
|
|
53
|
-
_store.factories.set(factory.name, factory);
|
|
54
|
-
}
|
|
55
|
-
/** Get a registered provider factory by name */
|
|
56
|
-
static getFactory(name) {
|
|
57
|
-
const f = _store.factories.get(name);
|
|
58
|
-
if (!f)
|
|
59
|
-
throw new Error(`[Rudder AI] Unknown AI provider "${name}". Register it first.`);
|
|
60
|
-
return f;
|
|
61
|
-
}
|
|
62
|
-
/** Set the default provider/model string */
|
|
63
|
-
static setDefault(modelString) {
|
|
64
|
-
_store.default = modelString;
|
|
65
|
-
}
|
|
66
|
-
/** Get the default provider/model string */
|
|
67
|
-
static getDefault() {
|
|
68
|
-
if (!_store.default)
|
|
69
|
-
throw new Error('[Rudder AI] No default model set. Add ai() to providers with a config.');
|
|
70
|
-
return _store.default;
|
|
71
|
-
}
|
|
72
|
-
/** Parse 'provider/model' string into [providerName, modelId] */
|
|
73
|
-
static parseModelString(modelString) {
|
|
74
|
-
const slash = modelString.indexOf('/');
|
|
75
|
-
if (slash === -1)
|
|
76
|
-
throw new Error(`[Rudder AI] Invalid model string "${modelString}". Expected "provider/model" format.`);
|
|
77
|
-
return [modelString.slice(0, slash), modelString.slice(slash + 1)];
|
|
78
|
-
}
|
|
79
|
-
/** Resolve a provider/model string to a ProviderAdapter */
|
|
80
|
-
static resolve(modelString) {
|
|
81
|
-
const [providerName, model] = this.parseModelString(modelString);
|
|
82
|
-
const factory = this.getFactory(providerName);
|
|
83
|
-
return factory.create(model);
|
|
84
|
-
}
|
|
85
|
-
/** Resolve a provider/model string to a RerankingAdapter */
|
|
86
|
-
static resolveReranking(modelString) {
|
|
87
|
-
const [providerName, model] = this.parseModelString(modelString);
|
|
88
|
-
const factory = this.getFactory(providerName);
|
|
89
|
-
if (!factory.createReranking) {
|
|
90
|
-
throw new Error(`[Rudder AI] Provider "${providerName}" does not support reranking. ` +
|
|
91
|
-
`Use a provider that implements createReranking() (e.g. cohere, jina).`);
|
|
92
|
-
}
|
|
93
|
-
return factory.createReranking(model);
|
|
94
|
-
}
|
|
95
|
-
/** Resolve a file adapter for a provider name */
|
|
96
|
-
static resolveFiles(providerName) {
|
|
97
|
-
const factory = this.getFactory(providerName);
|
|
98
|
-
if (!factory.createFiles) {
|
|
99
|
-
throw new Error(`[Rudder AI] Provider "${providerName}" does not support file management. ` +
|
|
100
|
-
`Use a provider that implements createFiles() (e.g. openai, anthropic, google).`);
|
|
101
|
-
}
|
|
102
|
-
return factory.createFiles();
|
|
103
|
-
}
|
|
104
|
-
/** Resolve a vector-store adapter for a provider name (#B8) */
|
|
105
|
-
static resolveVectorStores(providerName) {
|
|
106
|
-
const factory = this.getFactory(providerName);
|
|
107
|
-
if (!factory.createVectorStores) {
|
|
108
|
-
throw new Error(`[Rudder AI] Provider "${providerName}" does not support hosted vector stores. ` +
|
|
109
|
-
`Use a provider that implements createVectorStores() (e.g. openai). ` +
|
|
110
|
-
`For self-hosted RAG, use similaritySearch() against an @rudderjs/orm Model with a pgvector column.`);
|
|
111
|
-
}
|
|
112
|
-
return factory.createVectorStores();
|
|
113
|
-
}
|
|
114
|
-
/** Set available models for user selection */
|
|
115
|
-
static setModels(models) {
|
|
116
|
-
_store.models = models;
|
|
117
|
-
}
|
|
118
|
-
/** Get available models */
|
|
119
|
-
static getModels() {
|
|
120
|
-
return _store.models;
|
|
121
|
-
}
|
|
122
|
-
/** Test-cleanup hook (public — other packages reset across the boundary). */
|
|
123
|
-
static reset() {
|
|
124
|
-
_store.factories.clear();
|
|
125
|
-
_store.default = null;
|
|
126
|
-
_store.models = [];
|
|
127
|
-
for (const fn of _resetListeners)
|
|
128
|
-
fn();
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
//# sourceMappingURL=registry.js.map
|
package/dist/registry.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/rerank.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { RerankingResult } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Fluent reranking builder.
|
|
4
|
-
*
|
|
5
|
-
* @example
|
|
6
|
-
* const result = await Reranker.of('search query', documents).topK(5).rank()
|
|
7
|
-
* const result = await Reranker.of('query', docs).model('cohere/rerank-v3.5').rank()
|
|
8
|
-
*/
|
|
9
|
-
export declare class Reranker {
|
|
10
|
-
private readonly _query;
|
|
11
|
-
private readonly _documents;
|
|
12
|
-
private _model;
|
|
13
|
-
private _topK;
|
|
14
|
-
private constructor();
|
|
15
|
-
static of(query: string, documents: string[]): Reranker;
|
|
16
|
-
model(model: string): this;
|
|
17
|
-
topK(k: number): this;
|
|
18
|
-
rank(): Promise<RerankingResult>;
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=rerank.d.ts.map
|
package/dist/rerank.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rerank.d.ts","sourceRoot":"","sources":["../src/rerank.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;;;;GAMG;AACH,qBAAa,QAAQ;IAKjB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,KAAK,CAAoB;IAEjC,OAAO;IAKP,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,QAAQ;IAIvD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKf,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;CAWvC"}
|
package/dist/rerank.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { AiRegistry } from './registry.js';
|
|
2
|
-
/**
|
|
3
|
-
* Fluent reranking builder.
|
|
4
|
-
*
|
|
5
|
-
* @example
|
|
6
|
-
* const result = await Reranker.of('search query', documents).topK(5).rank()
|
|
7
|
-
* const result = await Reranker.of('query', docs).model('cohere/rerank-v3.5').rank()
|
|
8
|
-
*/
|
|
9
|
-
export class Reranker {
|
|
10
|
-
_query;
|
|
11
|
-
_documents;
|
|
12
|
-
_model;
|
|
13
|
-
_topK;
|
|
14
|
-
constructor(_query, _documents) {
|
|
15
|
-
this._query = _query;
|
|
16
|
-
this._documents = _documents;
|
|
17
|
-
}
|
|
18
|
-
static of(query, documents) {
|
|
19
|
-
return new Reranker(query, documents);
|
|
20
|
-
}
|
|
21
|
-
model(model) {
|
|
22
|
-
this._model = model;
|
|
23
|
-
return this;
|
|
24
|
-
}
|
|
25
|
-
topK(k) {
|
|
26
|
-
this._topK = k;
|
|
27
|
-
return this;
|
|
28
|
-
}
|
|
29
|
-
async rank() {
|
|
30
|
-
const modelStr = this._model ?? AiRegistry.getDefault();
|
|
31
|
-
const adapter = AiRegistry.resolveReranking(modelStr);
|
|
32
|
-
return adapter.rerank({
|
|
33
|
-
query: this._query,
|
|
34
|
-
documents: this._documents,
|
|
35
|
-
model: modelStr,
|
|
36
|
-
topK: this._topK,
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=rerank.js.map
|
package/dist/rerank.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rerank.js","sourceRoot":"","sources":["../src/rerank.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG1C;;;;;;GAMG;AACH,MAAM,OAAO,QAAQ;IAKA;IACA;IALX,MAAM,CAAoB;IAC1B,KAAK,CAAoB;IAEjC,YACmB,MAAc,EACd,UAAoB;QADpB,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAU;IACpC,CAAC;IAEJ,MAAM,CAAC,EAAE,CAAC,KAAa,EAAE,SAAmB;QAC1C,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC,CAAS;QACZ,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;QACd,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,UAAU,EAAE,CAAA;QACvD,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QAErD,OAAO,OAAO,CAAC,MAAM,CAAC;YACpB,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,IAAI,CAAC,KAAK;SACjB,CAAC,CAAA;IACJ,CAAC;CACF"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { AgentPromptOptions, AiMessage, AnyTool, ToolCall } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* When continuing a chat after a stop-on-approval round-trip, the supplied
|
|
4
|
-
* `messages` array ends with an `assistant` message whose `toolCalls` were
|
|
5
|
-
* never fulfilled (the loop paused before executing them). Most providers
|
|
6
|
-
* (Anthropic in particular) reject such conversations because every
|
|
7
|
-
* `tool_use` block must be followed by a matching `tool_result`.
|
|
8
|
-
*
|
|
9
|
-
* This helper detects that case, executes the pending **server** tool calls
|
|
10
|
-
* (honoring `approvedToolCallIds` / `rejectedToolCallIds`), appends the
|
|
11
|
-
* resulting tool messages to `messages` in place, and returns them. The
|
|
12
|
-
* caller can attach the returned list to `AgentResponse.resumedToolMessages`
|
|
13
|
-
* so that the panels dispatcher persists them in the conversation store.
|
|
14
|
-
*
|
|
15
|
-
* Client tools (no `execute`) must come back from the browser with their
|
|
16
|
-
* tool result already in the conversation, so the trailing assistant message
|
|
17
|
-
* will not have unmatched `toolCalls` for them — they're handled outside.
|
|
18
|
-
*/
|
|
19
|
-
export declare function resumePendingToolCalls(deps: {
|
|
20
|
-
messages: AiMessage[];
|
|
21
|
-
toolMap: Map<string, AnyTool>;
|
|
22
|
-
options: AgentPromptOptions | undefined;
|
|
23
|
-
}): Promise<{
|
|
24
|
-
resumed: AiMessage[];
|
|
25
|
-
approvalStillRequired: {
|
|
26
|
-
toolCall: ToolCall;
|
|
27
|
-
isClientTool: boolean;
|
|
28
|
-
} | undefined;
|
|
29
|
-
}>;
|
|
30
|
-
//# sourceMappingURL=resume-approval.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resume-approval.d.ts","sourceRoot":"","sources":["../src/resume-approval.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAElF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,OAAO,EAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,OAAO,EAAG,kBAAkB,GAAG,SAAS,CAAA;CACzC,GAAG,OAAO,CAAC;IACV,OAAO,EAAgB,SAAS,EAAE,CAAA;IAClC,qBAAqB,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAA;CACjF,CAAC,CA8HD"}
|
package/dist/resume-approval.js
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { applyToModelOutput, evaluateApproval, executeMaybeStreaming, validateToolArgs, } from './tool-helpers.js';
|
|
2
|
-
/**
|
|
3
|
-
* When continuing a chat after a stop-on-approval round-trip, the supplied
|
|
4
|
-
* `messages` array ends with an `assistant` message whose `toolCalls` were
|
|
5
|
-
* never fulfilled (the loop paused before executing them). Most providers
|
|
6
|
-
* (Anthropic in particular) reject such conversations because every
|
|
7
|
-
* `tool_use` block must be followed by a matching `tool_result`.
|
|
8
|
-
*
|
|
9
|
-
* This helper detects that case, executes the pending **server** tool calls
|
|
10
|
-
* (honoring `approvedToolCallIds` / `rejectedToolCallIds`), appends the
|
|
11
|
-
* resulting tool messages to `messages` in place, and returns them. The
|
|
12
|
-
* caller can attach the returned list to `AgentResponse.resumedToolMessages`
|
|
13
|
-
* so that the panels dispatcher persists them in the conversation store.
|
|
14
|
-
*
|
|
15
|
-
* Client tools (no `execute`) must come back from the browser with their
|
|
16
|
-
* tool result already in the conversation, so the trailing assistant message
|
|
17
|
-
* will not have unmatched `toolCalls` for them — they're handled outside.
|
|
18
|
-
*/
|
|
19
|
-
export async function resumePendingToolCalls(deps) {
|
|
20
|
-
const { messages, toolMap, options } = deps;
|
|
21
|
-
// Strip trailing pending-approval placeholders from a prior partial resume.
|
|
22
|
-
// They were synthesized so every `tool_use` in the parent assistant message
|
|
23
|
-
// had a matching `tool_result` during the pause; on resume we re-walk the
|
|
24
|
-
// parent and append fresh results (real or placeholder) based on the
|
|
25
|
-
// latest approval state.
|
|
26
|
-
while (messages.length > 0) {
|
|
27
|
-
const tail = messages[messages.length - 1];
|
|
28
|
-
if (tail.role === 'tool' && tail._pending) {
|
|
29
|
-
messages.pop();
|
|
30
|
-
}
|
|
31
|
-
else
|
|
32
|
-
break;
|
|
33
|
-
}
|
|
34
|
-
// Find the parent assistant message — it's the most recent assistant
|
|
35
|
-
// message immediately followed only by tool messages. On a fresh pause
|
|
36
|
-
// there are no tools yet; on a subsequent resume the parent is buried
|
|
37
|
-
// under the real tool results we appended last time.
|
|
38
|
-
let parentIdx = messages.length - 1;
|
|
39
|
-
while (parentIdx >= 0 && messages[parentIdx].role === 'tool')
|
|
40
|
-
parentIdx--;
|
|
41
|
-
const last = parentIdx >= 0 ? messages[parentIdx] : undefined;
|
|
42
|
-
if (!last || last.role !== 'assistant' || !last.toolCalls || last.toolCalls.length === 0) {
|
|
43
|
-
return { resumed: [], approvalStillRequired: undefined };
|
|
44
|
-
}
|
|
45
|
-
// Collect tool-call ids already resolved in a prior partial resume — those
|
|
46
|
-
// trail the parent assistant as non-`_pending` tool messages. Skipping
|
|
47
|
-
// them on the next walk avoids double-executing approved tools.
|
|
48
|
-
const alreadyResolved = new Set();
|
|
49
|
-
for (let i = parentIdx + 1; i < messages.length; i++) {
|
|
50
|
-
const m = messages[i];
|
|
51
|
-
if (m.role !== 'tool')
|
|
52
|
-
break;
|
|
53
|
-
if (!m._pending && m.toolCallId)
|
|
54
|
-
alreadyResolved.add(m.toolCallId);
|
|
55
|
-
}
|
|
56
|
-
const resumed = [];
|
|
57
|
-
let approvalStillRequired;
|
|
58
|
-
for (let i = 0; i < last.toolCalls.length; i++) {
|
|
59
|
-
const tc = last.toolCalls[i];
|
|
60
|
-
if (alreadyResolved.has(tc.id))
|
|
61
|
-
continue;
|
|
62
|
-
const tool = toolMap.get(tc.name);
|
|
63
|
-
if (!tool) {
|
|
64
|
-
const err = `Error: Unknown tool "${tc.name}"`;
|
|
65
|
-
const m = { role: 'tool', content: err, toolCallId: tc.id };
|
|
66
|
-
messages.push(m);
|
|
67
|
-
resumed.push(m);
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
if (!tool.execute) {
|
|
71
|
-
// Client tool whose result is missing from the supplied messages.
|
|
72
|
-
// Surface an error so the model can recover instead of hanging.
|
|
73
|
-
const err = `Error: client tool "${tc.name}" was not executed by the browser`;
|
|
74
|
-
const m = { role: 'tool', content: err, toolCallId: tc.id };
|
|
75
|
-
messages.push(m);
|
|
76
|
-
resumed.push(m);
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
const decision = await evaluateApproval(tool, tc, options);
|
|
80
|
-
if (decision === 'rejected') {
|
|
81
|
-
const rej = { rejected: true, reason: 'User rejected this tool call' };
|
|
82
|
-
const m = { role: 'tool', content: JSON.stringify(rej), toolCallId: tc.id };
|
|
83
|
-
messages.push(m);
|
|
84
|
-
resumed.push(m);
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
if (decision === 'pending') {
|
|
88
|
-
// Still pending — the user hasn't decided on this call yet. Stop
|
|
89
|
-
// executing further tools AND synthesize placeholder tool messages for
|
|
90
|
-
// every unresolved sibling (including this one), so Anthropic's
|
|
91
|
-
// "every tool_use needs a matching tool_result" invariant holds while
|
|
92
|
-
// the loop is paused. The next resume strips these placeholders and
|
|
93
|
-
// re-walks based on the fresh approval state.
|
|
94
|
-
approvalStillRequired = { toolCall: tc, isClientTool: false };
|
|
95
|
-
for (let j = i; j < last.toolCalls.length; j++) {
|
|
96
|
-
const sib = last.toolCalls[j];
|
|
97
|
-
if (alreadyResolved.has(sib.id))
|
|
98
|
-
continue;
|
|
99
|
-
messages.push({
|
|
100
|
-
role: 'tool',
|
|
101
|
-
content: 'Tool call pending user approval — execution deferred.',
|
|
102
|
-
toolCallId: sib.id,
|
|
103
|
-
_pending: true,
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
break;
|
|
107
|
-
}
|
|
108
|
-
// Validate args before executing on resume. Approval-resume bypasses
|
|
109
|
-
// middleware so we use the raw tc.arguments. On failure, feed the
|
|
110
|
-
// structured error to the model so it can correct itself.
|
|
111
|
-
const validation = validateToolArgs(tool, tc.arguments);
|
|
112
|
-
if (!validation.ok) {
|
|
113
|
-
const m = { role: 'tool', content: JSON.stringify(validation.error), toolCallId: tc.id };
|
|
114
|
-
messages.push(m);
|
|
115
|
-
resumed.push(m);
|
|
116
|
-
continue;
|
|
117
|
-
}
|
|
118
|
-
try {
|
|
119
|
-
// Drain generator yields silently — approval-resume runs outside the
|
|
120
|
-
// stream, so any preliminary updates are discarded; only the final
|
|
121
|
-
// return value is captured.
|
|
122
|
-
const execGen = executeMaybeStreaming(tool, validation.value, { toolCallId: tc.id });
|
|
123
|
-
let result;
|
|
124
|
-
while (true) {
|
|
125
|
-
const step = await execGen.next();
|
|
126
|
-
if (step.done) {
|
|
127
|
-
result = step.value;
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
// Approval-resume has no middleware context here, so toModelOutput
|
|
132
|
-
// errors fall back silently to default stringification (R6).
|
|
133
|
-
const content = await applyToModelOutput(tool, result);
|
|
134
|
-
const m = { role: 'tool', content, toolCallId: tc.id };
|
|
135
|
-
messages.push(m);
|
|
136
|
-
resumed.push(m);
|
|
137
|
-
}
|
|
138
|
-
catch (err) {
|
|
139
|
-
const errMsg = `Error: ${err instanceof Error ? err.message : String(err)}`;
|
|
140
|
-
const m = { role: 'tool', content: errMsg, toolCallId: tc.id };
|
|
141
|
-
messages.push(m);
|
|
142
|
-
resumed.push(m);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
return { resumed, approvalStillRequired };
|
|
146
|
-
}
|
|
147
|
-
//# sourceMappingURL=resume-approval.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resume-approval.js","sourceRoot":"","sources":["../src/resume-approval.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,mBAAmB,CAAA;AAG1B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAI5C;IAIC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAE3C,4EAA4E;IAC5E,4EAA4E;IAC5E,0EAA0E;IAC1E,qEAAqE;IACrE,yBAAyB;IACzB,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,CAAA;QAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1C,QAAQ,CAAC,GAAG,EAAE,CAAA;QAChB,CAAC;;YAAM,MAAK;IACd,CAAC;IAED,qEAAqE;IACrE,uEAAuE;IACvE,sEAAsE;IACtE,qDAAqD;IACrD,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;IACnC,OAAO,SAAS,IAAI,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAE,CAAC,IAAI,KAAK,MAAM;QAAE,SAAS,EAAE,CAAA;IAC1E,MAAM,IAAI,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7D,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzF,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAA;IAC1D,CAAC;IAED,2EAA2E;IAC3E,uEAAuE;IACvE,gEAAgE;IAChE,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAA;IACzC,KAAK,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;QACtB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,MAAK;QAC5B,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAU;YAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAA;IACpE,CAAC;IAED,MAAM,OAAO,GAAgB,EAAE,CAAA;IAC/B,IAAI,qBAAgF,CAAA;IAEpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAA;QAC7B,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAAE,SAAQ;QAExC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QACjC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,wBAAwB,EAAE,CAAC,IAAI,GAAG,CAAA;YAC9C,MAAM,CAAC,GAAc,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAA;YACtE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACf,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,kEAAkE;YAClE,gEAAgE;YAChE,MAAM,GAAG,GAAG,uBAAuB,EAAE,CAAC,IAAI,mCAAmC,CAAA;YAC7E,MAAM,CAAC,GAAc,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAA;YACtE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACf,SAAQ;QACV,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;QAC1D,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAA;YACtE,MAAM,CAAC,GAAc,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAA;YACtF,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACf,SAAQ;QACV,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,iEAAiE;YACjE,uEAAuE;YACvE,gEAAgE;YAChE,sEAAsE;YACtE,oEAAoE;YACpE,8CAA8C;YAC9C,qBAAqB,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;YAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAA;gBAC9B,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,SAAQ;gBACzC,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAQ,MAAM;oBAClB,OAAO,EAAK,uDAAuD;oBACnE,UAAU,EAAE,GAAG,CAAC,EAAE;oBAClB,QAAQ,EAAI,IAAI;iBACjB,CAAC,CAAA;YACJ,CAAC;YACD,MAAK;QACP,CAAC;QAED,qEAAqE;QACrE,kEAAkE;QAClE,0DAA0D;QAC1D,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,CAAA;QACvD,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,CAAC,GAAc,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAA;YACnG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACf,SAAQ;QACV,CAAC;QAED,IAAI,CAAC;YACH,qEAAqE;YACrE,mEAAmE;YACnE,4BAA4B;YAC5B,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YACpF,IAAI,MAAe,CAAA;YACnB,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;gBACjC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;oBAAC,MAAK;gBAAC,CAAC;YAC/C,CAAC;YACD,mEAAmE;YACnE,6DAA6D;YAC7D,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YACtD,MAAM,CAAC,GAAc,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAA;YACjE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;YAC3E,MAAM,CAAC,GAAc,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAA;YACzE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAA;AAC3C,CAAC"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Make a loaded conversation history safe to replay against any provider by
|
|
3
|
-
* enforcing the tool-call / tool-result invariant in BOTH directions.
|
|
4
|
-
*
|
|
5
|
-
* Anthropic's Messages API requires every `tool_use` block to be followed by
|
|
6
|
-
* `tool_result` blocks for all of its ids. OpenAI-compatible providers
|
|
7
|
-
* (DeepSeek, OpenRouter, Azure) are stricter still: a `role:'tool'` message
|
|
8
|
-
* must immediately follow the `assistant` + `tool_calls` that declared its id,
|
|
9
|
-
* and an unanswered `tool_calls` is equally rejected, surfacing as
|
|
10
|
-
* `400 Messages with role 'tool' must be a response to a preceding message
|
|
11
|
-
* with 'tool_calls'`. A conversation interrupted mid-turn (a crash after the
|
|
12
|
-
* assistant message persisted but before all tool results landed; a client
|
|
13
|
-
* failure that never replayed the results) leaves a malformed graph in the
|
|
14
|
-
* store, and replaying it 400s.
|
|
15
|
-
*
|
|
16
|
-
* {@link sanitizeConversation} walks the messages in order:
|
|
17
|
-
*
|
|
18
|
-
* - **Complete tool turn** (every declared id has a matching result in the
|
|
19
|
-
* immediately-following tool run) is kept, with the results re-emitted in
|
|
20
|
-
* `toolCalls` order, exactly one per call. Any extra / duplicate / orphan
|
|
21
|
-
* tool message interleaved in that run is dropped.
|
|
22
|
-
* - **Dangling tool turn** (one or more declared ids unanswered) has its
|
|
23
|
-
* assistant `toolCalls` stripped; the text `content` is preserved as a
|
|
24
|
-
* plain assistant message (an empty one is dropped entirely); the partial
|
|
25
|
-
* tool results are dropped.
|
|
26
|
-
* - **Orphan tool result** (a `role:'tool'` message whose parent assistant
|
|
27
|
-
* is missing or was dropped as dangling) is dropped. Replaying it trips
|
|
28
|
-
* the 400 above on OpenAI-compatible providers and a BadRequestError on
|
|
29
|
-
* Anthropic.
|
|
30
|
-
*
|
|
31
|
-
* Unlike the wire-level normalizer the provider adapters apply (which
|
|
32
|
-
* SYNTHESIZES stub results so an in-flight request stays well-formed), the
|
|
33
|
-
* load boundary DROPS incomplete turns: an interrupted turn is abandoned
|
|
34
|
-
* history, and a fake "result missing" message would pollute the model's
|
|
35
|
-
* future context.
|
|
36
|
-
*
|
|
37
|
-
* Pure and idempotent: safe to apply at any load boundary, and re-running over
|
|
38
|
-
* an already-sanitized array is a no-op. {@link OrmConversationStore} applies
|
|
39
|
-
* it in `load()` so persisted histories are replay-safe by default.
|
|
40
|
-
*/
|
|
41
|
-
import type { AiMessage } from './types.js';
|
|
42
|
-
export declare function sanitizeConversation(messages: AiMessage[]): AiMessage[];
|
|
43
|
-
//# sourceMappingURL=sanitize-conversation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize-conversation.d.ts","sourceRoot":"","sources":["../src/sanitize-conversation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAgDvE"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Make a loaded conversation history safe to replay against any provider by
|
|
3
|
-
* enforcing the tool-call / tool-result invariant in BOTH directions.
|
|
4
|
-
*
|
|
5
|
-
* Anthropic's Messages API requires every `tool_use` block to be followed by
|
|
6
|
-
* `tool_result` blocks for all of its ids. OpenAI-compatible providers
|
|
7
|
-
* (DeepSeek, OpenRouter, Azure) are stricter still: a `role:'tool'` message
|
|
8
|
-
* must immediately follow the `assistant` + `tool_calls` that declared its id,
|
|
9
|
-
* and an unanswered `tool_calls` is equally rejected, surfacing as
|
|
10
|
-
* `400 Messages with role 'tool' must be a response to a preceding message
|
|
11
|
-
* with 'tool_calls'`. A conversation interrupted mid-turn (a crash after the
|
|
12
|
-
* assistant message persisted but before all tool results landed; a client
|
|
13
|
-
* failure that never replayed the results) leaves a malformed graph in the
|
|
14
|
-
* store, and replaying it 400s.
|
|
15
|
-
*
|
|
16
|
-
* {@link sanitizeConversation} walks the messages in order:
|
|
17
|
-
*
|
|
18
|
-
* - **Complete tool turn** (every declared id has a matching result in the
|
|
19
|
-
* immediately-following tool run) is kept, with the results re-emitted in
|
|
20
|
-
* `toolCalls` order, exactly one per call. Any extra / duplicate / orphan
|
|
21
|
-
* tool message interleaved in that run is dropped.
|
|
22
|
-
* - **Dangling tool turn** (one or more declared ids unanswered) has its
|
|
23
|
-
* assistant `toolCalls` stripped; the text `content` is preserved as a
|
|
24
|
-
* plain assistant message (an empty one is dropped entirely); the partial
|
|
25
|
-
* tool results are dropped.
|
|
26
|
-
* - **Orphan tool result** (a `role:'tool'` message whose parent assistant
|
|
27
|
-
* is missing or was dropped as dangling) is dropped. Replaying it trips
|
|
28
|
-
* the 400 above on OpenAI-compatible providers and a BadRequestError on
|
|
29
|
-
* Anthropic.
|
|
30
|
-
*
|
|
31
|
-
* Unlike the wire-level normalizer the provider adapters apply (which
|
|
32
|
-
* SYNTHESIZES stub results so an in-flight request stays well-formed), the
|
|
33
|
-
* load boundary DROPS incomplete turns: an interrupted turn is abandoned
|
|
34
|
-
* history, and a fake "result missing" message would pollute the model's
|
|
35
|
-
* future context.
|
|
36
|
-
*
|
|
37
|
-
* Pure and idempotent: safe to apply at any load boundary, and re-running over
|
|
38
|
-
* an already-sanitized array is a no-op. {@link OrmConversationStore} applies
|
|
39
|
-
* it in `load()` so persisted histories are replay-safe by default.
|
|
40
|
-
*/
|
|
41
|
-
export function sanitizeConversation(messages) {
|
|
42
|
-
const result = [];
|
|
43
|
-
for (let i = 0; i < messages.length; i++) {
|
|
44
|
-
const msg = messages[i];
|
|
45
|
-
// A `tool` message reaching the top level was not consumed by a complete
|
|
46
|
-
// assistant turn below (those advance `i` past their results), so its
|
|
47
|
-
// parent is missing or was dropped as dangling. It is an orphan; drop it.
|
|
48
|
-
if (msg.role === 'tool')
|
|
49
|
-
continue;
|
|
50
|
-
if (msg.role !== 'assistant' || !msg.toolCalls?.length) {
|
|
51
|
-
result.push(msg);
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
const wanted = msg.toolCalls.map(tc => tc.id).filter(Boolean);
|
|
55
|
-
// Map the immediately-following tool run by id (first result per id wins).
|
|
56
|
-
const resultsById = new Map();
|
|
57
|
-
let j = i + 1;
|
|
58
|
-
while (j < messages.length && messages[j].role === 'tool') {
|
|
59
|
-
const t = messages[j];
|
|
60
|
-
const tid = t.toolCallId;
|
|
61
|
-
if (tid && !resultsById.has(tid))
|
|
62
|
-
resultsById.set(tid, t);
|
|
63
|
-
j++;
|
|
64
|
-
}
|
|
65
|
-
const allCovered = wanted.every(id => resultsById.has(id));
|
|
66
|
-
if (allCovered) {
|
|
67
|
-
// Emit the assistant followed by exactly one result per call, in
|
|
68
|
-
// `toolCalls` order. This normalizes ordering and drops any extra /
|
|
69
|
-
// orphan tool message that was interleaved in the run.
|
|
70
|
-
result.push(msg);
|
|
71
|
-
for (const tc of msg.toolCalls)
|
|
72
|
-
result.push(resultsById.get(tc.id));
|
|
73
|
-
i = j - 1;
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
// Dangling: strip toolCalls, drop the partial tool results, keep any text.
|
|
77
|
-
const text = typeof msg.content === 'string' ? msg.content : '';
|
|
78
|
-
if (text.trim() !== '') {
|
|
79
|
-
result.push({ role: 'assistant', content: msg.content });
|
|
80
|
-
}
|
|
81
|
-
i = j - 1;
|
|
82
|
-
}
|
|
83
|
-
return result;
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=sanitize-conversation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize-conversation.js","sourceRoot":"","sources":["../src/sanitize-conversation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAIH,MAAM,UAAU,oBAAoB,CAAC,QAAqB;IACxD,MAAM,MAAM,GAAgB,EAAE,CAAA;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;QAExB,yEAAyE;QACzE,sEAAsE;QACtE,0EAA0E;QAC1E,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,SAAQ;QAEjC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAChB,SAAQ;QACV,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAE7D,2EAA2E;QAC3E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAqB,CAAA;QAChD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3D,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;YACtB,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAA;YACxB,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YACzD,CAAC,EAAE,CAAA;QACL,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1D,IAAI,UAAU,EAAE,CAAC;YACf,iEAAiE;YACjE,oEAAoE;YACpE,uDAAuD;YACvD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAChB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAE,CAAC,CAAA;YACpE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACT,SAAQ;QACV,CAAC;QAED,2EAA2E;QAC3E,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/D,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QAC1D,CAAC;QACD,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACX,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|