@yushaw/sanqian-ai-sdk 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contracts/tools.ts","../src/contracts/permissions.ts","../src/contracts/conversations.ts","../src/contracts/active-work.ts","../src/contracts/readiness.ts","../src/contracts/secrets.ts","../src/contracts/session.ts","../src/contracts/task-pipeline.ts","../src/contracts/embedding.ts","../src/contracts/bridge.ts","../src/contracts/bridge-impl.ts","../src/contracts/output-operations.ts","../src/providers/sanqian/event-converter.ts","../src/providers/sanqian/agent-id-resolver.ts","../src/providers/sanqian/provider.ts","../src/providers/sanqian/mock-sdk.ts","../src/providers/sanqian/embedding-provider.ts","../src/providers/sanqian/rerank-provider.ts","../src/providers/vercel/provider.ts","../src/providers/vercel/tool-converter.ts","../src/providers/vercel/embedding-provider.ts"],"sourcesContent":["/**\n * Tool Registry - provider-neutral tool registration and execution.\n */\n\nimport type { RuntimeToolDefinition, RuntimeToolExecutionResult } from './provider'\n\nexport type ToolCategory =\n | 'read-only'\n | 'local-file-read'\n | 'local-file-write'\n | 'note-mutation'\n | 'notebook-mutation'\n | 'network'\n | 'dangerous'\n\nexport interface RuntimeToolMetadata {\n category: ToolCategory\n readOnlyHint?: boolean\n destructiveHint?: boolean\n idempotentHint?: boolean\n}\n\nexport type RuntimeToolHandler = (\n args: Record<string, unknown>,\n context?: RuntimeToolExecutionContext\n) => Promise<unknown>\n\nexport interface RuntimeToolExecutionContext {\n toolCallId: string\n signal?: AbortSignal\n}\n\nexport interface RuntimeToolExecutionInput {\n toolCallId: string\n name: string\n args: Record<string, unknown>\n signal?: AbortSignal\n}\n\nexport interface RuntimeToolRegistration {\n definition: RuntimeToolDefinition\n handler: RuntimeToolHandler\n metadata: RuntimeToolMetadata\n}\n\nexport interface RuntimeToolRegistry {\n register(\n tool: RuntimeToolDefinition,\n handler: RuntimeToolHandler,\n metadata?: Partial<RuntimeToolMetadata>\n ): void\n get(name: string): RuntimeToolRegistration | undefined\n list(): RuntimeToolRegistration[]\n execute(input: RuntimeToolExecutionInput): Promise<RuntimeToolExecutionResult>\n}\n\n/**\n * Create a tool registry instance.\n */\nexport function createToolRegistry(): RuntimeToolRegistry {\n const tools = new Map<string, RuntimeToolRegistration>()\n\n return {\n register(definition, handler, metadata) {\n tools.set(definition.name, {\n definition,\n handler,\n metadata: {\n category: metadata?.category ?? 'read-only',\n readOnlyHint: metadata?.readOnlyHint,\n destructiveHint: metadata?.destructiveHint,\n idempotentHint: metadata?.idempotentHint,\n },\n })\n },\n\n get(name) {\n return tools.get(name)\n },\n\n list() {\n return Array.from(tools.values())\n },\n\n async execute(input) {\n const registration = tools.get(input.name)\n if (!registration) {\n return {\n toolCallId: input.toolCallId,\n success: false,\n error: `Unknown tool: ${input.name}`,\n }\n }\n\n try {\n const result = await registration.handler(input.args, {\n toolCallId: input.toolCallId,\n signal: input.signal,\n })\n return {\n toolCallId: input.toolCallId,\n result,\n success: true,\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Tool execution failed'\n return {\n toolCallId: input.toolCallId,\n success: false,\n error: message,\n }\n }\n },\n }\n}\n","/**\n * Permission Policy - controls mutation tool execution with HITL support.\n *\n * The runtime evaluates permissions before executing mutation tools.\n * When a tool requires approval, the runtime emits an 'interrupt' event\n * and waits for the UI to respond via the pending permission table.\n */\n\nimport type { RuntimeToolExecutionInput, ToolCategory, RuntimeToolRegistry } from './tools'\nimport type { RuntimeInterrupt } from './events'\n\nexport type PermissionDecision =\n | { type: 'allow' }\n | { type: 'deny'; reason: string }\n | { type: 'ask'; interrupt: RuntimeInterrupt }\n\nexport interface PermissionPolicy {\n evaluate(input: RuntimeToolExecutionInput): Promise<PermissionDecision>\n}\n\n/**\n * Pending permission request -- tracks an in-flight approval request.\n */\nexport interface PendingPermission {\n id: string\n toolCallId: string\n toolName: string\n args: Record<string, unknown>\n createdAt: number\n resolve: (decision: 'approve' | 'deny' | 'cancel') => void\n}\n\n/**\n * Permission Gate -- manages pending permission requests and resolution.\n *\n * Used by VercelProvider to enforce local HITL before mutation tool execution.\n * SanqianProvider delegates HITL to the Sanqian backend.\n */\nexport interface PermissionGate {\n /** Evaluate and potentially block tool execution. Returns the final decision. */\n requestPermission(input: RuntimeToolExecutionInput): Promise<PermissionDecision>\n /** Resolve a pending permission request (called when UI responds). */\n resolvePermission(id: string, decision: 'approve' | 'deny' | 'cancel'): void\n /** Cancel all pending permissions (called on provider switch or stream cancel). */\n cancelAll(reason: string): void\n /** Get all pending permission requests. */\n listPending(): PendingPermission[]\n /** Listen for new permission requests (for emitting interrupt events). */\n onPermissionRequest(listener: (pending: PendingPermission) => void): () => void\n}\n\n/**\n * Create a permission gate that uses a policy and tool registry\n * to decide whether tools need approval.\n */\nexport function createPermissionGate(\n policy: PermissionPolicy\n): PermissionGate {\n const pending = new Map<string, PendingPermission>()\n const listeners = new Set<(p: PendingPermission) => void>()\n let counter = 0\n\n return {\n async requestPermission(input) {\n const decision = await policy.evaluate(input)\n\n if (decision.type !== 'ask') {\n return decision\n }\n\n // Create pending request and wait for resolution\n return new Promise<PermissionDecision>((resolve) => {\n counter++\n const id = `perm-${counter}`\n const entry: PendingPermission = {\n id,\n toolCallId: input.toolCallId,\n toolName: input.name,\n args: input.args,\n createdAt: Date.now(),\n resolve: (userDecision) => {\n pending.delete(id)\n if (userDecision === 'approve') {\n resolve({ type: 'allow' })\n } else if (userDecision === 'deny') {\n resolve({ type: 'deny', reason: 'User denied' })\n } else {\n resolve({ type: 'deny', reason: 'Cancelled' })\n }\n },\n }\n pending.set(id, entry)\n for (const listener of listeners) {\n listener(entry)\n }\n })\n },\n\n resolvePermission(id, decision) {\n const entry = pending.get(id)\n if (entry) {\n entry.resolve(decision)\n }\n },\n\n cancelAll() {\n for (const entry of pending.values()) {\n entry.resolve('cancel')\n }\n pending.clear()\n },\n\n listPending() {\n return Array.from(pending.values())\n },\n\n onPermissionRequest(listener) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}\n\n/**\n * Default policy: allow all tools.\n */\nexport function createDefaultPermissionPolicy(): PermissionPolicy {\n return {\n async evaluate() {\n return { type: 'allow' }\n },\n }\n}\n\n/**\n * Category-based policy: allow read-only, ask for mutations.\n */\nexport function createCategoryPermissionPolicy(\n registry: RuntimeToolRegistry\n): PermissionPolicy {\n const mutationCategories: ToolCategory[] = [\n 'note-mutation', 'notebook-mutation', 'local-file-write', 'dangerous',\n ]\n\n return {\n async evaluate(input) {\n const tool = registry.get(input.name)\n if (!tool) {\n return { type: 'deny', reason: `Unknown tool: ${input.name}` }\n }\n\n if (mutationCategories.includes(tool.metadata.category)) {\n return {\n type: 'ask',\n interrupt: {\n type: 'approval_request',\n payload: {\n tool: input.name,\n args: input.args,\n reason: `Tool \"${input.name}\" requires approval (category: ${tool.metadata.category})`,\n },\n },\n }\n }\n\n return { type: 'allow' }\n },\n }\n}\n\n/**\n * Sanitize tool error messages -- strip file paths, SQL errors, and secrets.\n */\nexport function redactToolError(error: string): string {\n let redacted = error\n // Strip stack trace lines (newline + whitespace + \"at\")\n redacted = redacted.replace(/\\n\\s+at\\s+.+/g, '')\n // Strip absolute file paths (Unix and Windows)\n redacted = redacted.replace(/(?:\\/[\\w.@-]+){2,}/g, '[path]')\n redacted = redacted.replace(/[A-Z]:\\\\[\\w.\\\\-]+/g, '[path]')\n // Strip SQL-like errors\n redacted = redacted.replace(/SQLITE_\\w+|sqlite3?_\\w+/gi, '[db-error]')\n return redacted.trim()\n}\n","/**\n * Conversation Store - provider-scoped conversation persistence.\n */\n\nimport type { RuntimeMessage } from './provider'\n\nexport interface ConversationInfo {\n id: string\n providerId: string\n agentId?: string\n title: string\n createdAt: string\n updatedAt: string\n messageCount: number\n}\n\nexport interface ConversationDetail extends ConversationInfo {\n messages: RuntimeConversationMessage[]\n}\n\nexport interface RuntimeConversationMessage extends RuntimeMessage {\n id: string\n timestamp: string\n toolCalls?: Array<{\n id: string\n name: string\n args: Record<string, unknown>\n result?: unknown\n }>\n}\n\nexport interface ConversationPatch {\n title?: string\n}\n\nexport interface ListConversationsInput {\n providerId?: string\n agentId?: string\n limit?: number\n offset?: number\n}\n\nexport interface ConversationPage {\n conversations: ConversationInfo[]\n total: number\n}\n\nexport interface GetConversationInput {\n messageLimit?: number\n}\n\nexport interface CreateConversationInput {\n providerId: string\n agentId?: string\n title?: string\n}\n\nexport interface ConversationStore {\n list(input: ListConversationsInput): Promise<ConversationPage>\n get(id: string, input?: GetConversationInput): Promise<ConversationDetail | null>\n create(input: CreateConversationInput): Promise<ConversationDetail>\n appendMessages(id: string, messages: RuntimeConversationMessage[]): Promise<void>\n update(id: string, patch: ConversationPatch): Promise<void>\n delete(id: string): Promise<void>\n}\n\n/**\n * In-memory conversation store for playground/testing.\n */\nexport function createMemoryConversationStore(): ConversationStore {\n const conversations = new Map<string, ConversationDetail>()\n let counter = 0\n\n return {\n async list(input) {\n let items = Array.from(conversations.values())\n if (input.providerId) {\n items = items.filter(c => c.providerId === input.providerId)\n }\n if (input.agentId) {\n items = items.filter(c => c.agentId === input.agentId)\n }\n items.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))\n const offset = input.offset ?? 0\n const limit = input.limit ?? 20\n return {\n conversations: items.slice(offset, offset + limit),\n total: items.length,\n }\n },\n\n async get(id, input) {\n const conv = conversations.get(id)\n if (!conv) return null\n if (input?.messageLimit) {\n return {\n ...conv,\n messages: conv.messages.slice(-input.messageLimit),\n }\n }\n return conv\n },\n\n async create(input) {\n counter++\n const id = `conv-${counter}`\n const now = new Date().toISOString()\n const detail: ConversationDetail = {\n id,\n providerId: input.providerId,\n agentId: input.agentId,\n title: input.title ?? 'Untitled',\n createdAt: now,\n updatedAt: now,\n messageCount: 0,\n messages: [],\n }\n conversations.set(id, detail)\n return detail\n },\n\n async appendMessages(id, messages) {\n const conv = conversations.get(id)\n if (!conv) throw new Error(`Conversation not found: ${id}`)\n conv.messages.push(...messages)\n conv.messageCount = conv.messages.length\n conv.updatedAt = new Date().toISOString()\n },\n\n async update(id, patch) {\n const conv = conversations.get(id)\n if (!conv) throw new Error(`Conversation not found: ${id}`)\n if (patch.title !== undefined) conv.title = patch.title\n conv.updatedAt = new Date().toISOString()\n },\n\n async delete(id) {\n conversations.delete(id)\n },\n }\n}\n","/**\n * Active Work Tracking - manages in-flight AI operations.\n */\n\nexport type ActiveRuntimeWorkKind =\n | 'chat-panel-stream'\n | 'inline-chat-stream'\n | 'agent-task'\n | 'summary-generation'\n | 'embedding-indexing'\n | 'rerank-request'\n\nexport interface ActiveRuntimeWork {\n id: string\n kind: ActiveRuntimeWorkKind\n providerId: string\n startedAt: number\n abort: () => void\n}\n\nexport interface ActiveWorkTracker {\n register(work: ActiveRuntimeWork): void\n unregister(id: string): void\n list(): ActiveRuntimeWork[]\n listByProvider(providerId: string): ActiveRuntimeWork[]\n cancelAll(reason: string): Promise<void>\n cancelByProvider(providerId: string, reason: string): Promise<void>\n}\n\nexport function createActiveWorkTracker(): ActiveWorkTracker {\n const works = new Map<string, ActiveRuntimeWork>()\n\n return {\n register(work) {\n works.set(work.id, work)\n },\n\n unregister(id) {\n works.delete(id)\n },\n\n list() {\n return Array.from(works.values())\n },\n\n listByProvider(providerId) {\n return Array.from(works.values()).filter(w => w.providerId === providerId)\n },\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async cancelAll(_reason: string) {\n for (const work of works.values()) {\n work.abort()\n }\n works.clear()\n },\n\n async cancelByProvider(providerId: string) {\n for (const [id, work] of works.entries()) {\n if (work.providerId === providerId) {\n work.abort()\n works.delete(id)\n }\n }\n },\n }\n}\n","/**\n * AI Feature Readiness - replaces Sanqian-only feature readiness.\n */\n\nimport type { RuntimeProviderKind } from './profile'\nimport type { RuntimeProviderCapabilities } from './provider'\n\nexport interface AiFeatureRuntimeState {\n enabled: boolean\n activeProviderId: string | null\n activeProviderKind: RuntimeProviderKind | null\n ready: boolean\n capabilities: RuntimeProviderCapabilities\n source: 'runtime-provider' | 'sanqian-discovery' | 'manual-disabled'\n lastError?: string\n}\n\nexport const EMPTY_CAPABILITIES: RuntimeProviderCapabilities = {\n streamingText: false,\n reasoning: false,\n toolCalling: false,\n parallelToolCalls: false,\n toolArgsStreaming: false,\n abort: false,\n hitl: false,\n conversations: false,\n sessionResources: false,\n resourcePicker: false,\n embeddings: false,\n rerank: false,\n}\n\nexport function createDisabledState(): AiFeatureRuntimeState {\n return {\n enabled: false,\n activeProviderId: null,\n activeProviderKind: null,\n ready: false,\n capabilities: { ...EMPTY_CAPABILITIES },\n source: 'manual-disabled',\n }\n}\n","/**\n * Secret Store - host-supplied secret storage interface.\n */\n\nexport interface SecretRef {\n id: string\n providerInstanceId: string\n}\n\nexport interface SecretDescriptor {\n id: string\n providerInstanceId: string\n label?: string\n maskedValue?: string\n createdAt: number\n updatedAt: number\n}\n\nexport interface StoreSecretInput {\n providerInstanceId: string\n label?: string\n value: string\n}\n\nexport interface RuntimeSecretStore {\n put(input: StoreSecretInput): Promise<SecretRef>\n get(ref: SecretRef): Promise<string>\n delete(ref: SecretRef): Promise<void>\n describe(ref: SecretRef): Promise<SecretDescriptor>\n}\n\n/**\n * In-memory secret store for playground/testing. NOT for production.\n */\nexport function createMemorySecretStore(): RuntimeSecretStore {\n const secrets = new Map<string, { value: string; descriptor: SecretDescriptor }>()\n let counter = 0\n\n return {\n async put(input) {\n counter++\n const id = `secret-${counter}`\n const ref: SecretRef = { id, providerInstanceId: input.providerInstanceId }\n const now = Date.now()\n secrets.set(id, {\n value: input.value,\n descriptor: {\n id,\n providerInstanceId: input.providerInstanceId,\n label: input.label,\n maskedValue: input.value.slice(0, 4) + '****',\n createdAt: now,\n updatedAt: now,\n },\n })\n return ref\n },\n\n async get(ref) {\n const entry = secrets.get(ref.id)\n if (!entry) throw new Error(`Secret not found: ${ref.id}`)\n return entry.value\n },\n\n async delete(ref) {\n secrets.delete(ref.id)\n },\n\n async describe(ref) {\n const entry = secrets.get(ref.id)\n if (!entry) throw new Error(`Secret not found: ${ref.id}`)\n return entry.descriptor\n },\n }\n}\n","/**\n * Runtime Session Manager - provider switching state machine.\n */\n\nimport type { RuntimeProvider, RuntimeProviderDescriptor, RuntimeProviderCapabilities } from './provider'\nimport type { ActiveWorkTracker } from './active-work'\nimport type { AiFeatureRuntimeState } from './readiness'\nimport { createDisabledState } from './readiness'\n\nexport interface ProviderInstanceConfig {\n id: string\n provider: RuntimeProvider\n}\n\nexport interface SwitchOptions {\n ifBusy: 'cancel-active-work'\n timeoutMs?: number\n}\n\nexport interface SwitchResult {\n success: boolean\n previousProviderId?: string\n newProviderId?: string\n error?: string\n}\n\nexport interface ProviderChangedEvent {\n previousProviderId: string | null\n newProviderId: string | null\n capabilities: RuntimeProviderCapabilities\n}\n\nexport interface RuntimeSessionManager {\n getActiveProvider(): RuntimeProvider | null\n getActiveDescriptor(): RuntimeProviderDescriptor | null\n getRuntimeState(): AiFeatureRuntimeState\n switchProvider(config: ProviderInstanceConfig, options?: SwitchOptions): Promise<SwitchResult>\n cancelAll(reason: string): Promise<void>\n onProviderChanged(listener: (event: ProviderChangedEvent) => void): () => void\n}\n\nexport function createSessionManager(\n workTracker: ActiveWorkTracker\n): RuntimeSessionManager {\n let activeProvider: RuntimeProvider | null = null\n const listeners = new Set<(event: ProviderChangedEvent) => void>()\n\n function emit(event: ProviderChangedEvent): void {\n for (const listener of listeners) {\n listener(event)\n }\n }\n\n return {\n getActiveProvider() {\n return activeProvider\n },\n\n getActiveDescriptor() {\n if (!activeProvider) return null\n return {\n id: activeProvider.id,\n kind: activeProvider.kind,\n displayName: activeProvider.displayName,\n capabilities: activeProvider.capabilities,\n }\n },\n\n getRuntimeState(): AiFeatureRuntimeState {\n if (!activeProvider) return createDisabledState()\n return {\n enabled: true,\n activeProviderId: activeProvider.id,\n activeProviderKind: activeProvider.kind,\n ready: true,\n capabilities: activeProvider.capabilities,\n source: 'runtime-provider',\n }\n },\n\n async switchProvider(config, options) {\n const previousId = activeProvider?.id ?? null\n\n // Cancel active work if requested\n if (options?.ifBusy === 'cancel-active-work') {\n await workTracker.cancelAll('provider-switch')\n }\n\n // Validate new provider\n try {\n await config.provider.ensureReady()\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Provider readiness failed'\n return {\n success: false,\n previousProviderId: previousId ?? undefined,\n error: message,\n }\n }\n\n // Dispose old provider\n const oldProvider = activeProvider\n activeProvider = config.provider\n\n if (oldProvider?.dispose) {\n try {\n await oldProvider.dispose()\n } catch {\n // Best-effort disposal\n }\n }\n\n emit({\n previousProviderId: previousId,\n newProviderId: config.provider.id,\n capabilities: config.provider.capabilities,\n })\n\n return {\n success: true,\n previousProviderId: previousId ?? undefined,\n newProviderId: config.provider.id,\n }\n },\n\n async cancelAll(reason) {\n await workTracker.cancelAll(reason)\n },\n\n onProviderChanged(listener) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}\n","/**\n * Task Pipeline - two-step agent task flow (content agent -> formatter agent).\n */\n\nimport type { RuntimeAgentConfig } from './agents'\nimport type { RuntimeStreamEvent } from './events'\nimport type { RuntimeProvider, RuntimeToolDefinition, RuntimeMessage } from './provider'\n\nexport interface RuntimeTaskPipelineInput {\n taskId: string\n contentAgentId: string\n contentMessages: RuntimeMessage[]\n formatterConfig: RuntimeAgentConfig\n outputTools: RuntimeToolDefinition[]\n outputContext: unknown\n signal?: AbortSignal\n outputFormat?: 'auto' | 'paragraph' | 'list' | 'table' | 'code' | 'quote'\n}\n\nexport interface RuntimeTaskPipeline {\n executeWithFormatter(input: RuntimeTaskPipelineInput): AsyncIterable<RuntimeStreamEvent>\n}\n\n/**\n * Create a task pipeline that uses a RuntimeProvider for both content and formatter steps.\n *\n * The pipeline:\n * 1. Runs the content agent to generate raw text\n * 2. Runs the formatter agent with output tools to structure the result\n *\n * Cancellation via AbortSignal stops both steps.\n */\nexport function createTaskPipeline(\n getProvider: () => RuntimeProvider | null\n): RuntimeTaskPipeline {\n // Serialize formatter execution (one at a time)\n let formatterQueue: Promise<void> = Promise.resolve()\n\n return {\n async *executeWithFormatter(input) {\n const provider = getProvider()\n if (!provider) {\n yield { type: 'error', error: 'No active provider' }\n return\n }\n\n // Phase 1: content agent\n yield { type: 'start' }\n let resultText = ''\n\n const contentStream = provider.chatStream({\n agentId: input.contentAgentId,\n messages: input.contentMessages,\n signal: input.signal,\n })\n\n for await (const event of contentStream) {\n if (input.signal?.aborted) {\n yield { type: 'cancelled' }\n return\n }\n\n if (event.type === 'text') {\n resultText += event.content\n }\n\n if (event.type === 'error') {\n yield event\n return\n }\n\n yield event\n }\n\n if (!resultText || input.signal?.aborted) {\n if (input.signal?.aborted) {\n yield { type: 'cancelled' }\n }\n return\n }\n\n // Phase 2: formatter agent (serialized)\n const previousQueue = formatterQueue\n let releaseSlotFn: (() => void) | undefined\n const currentSlot = new Promise<void>(resolve => { releaseSlotFn = resolve })\n formatterQueue = previousQueue.catch(() => undefined).then(() => currentSlot)\n await previousQueue.catch(() => undefined)\n\n try {\n if (input.signal?.aborted) {\n yield { type: 'cancelled' }\n return\n }\n\n const formatterPrompt = buildFormatterPrompt(\n input.contentMessages[input.contentMessages.length - 1]?.content ?? '',\n resultText,\n input.outputFormat\n )\n\n const formatterStream = provider.chatStream({\n agentId: input.formatterConfig.id,\n messages: [\n { role: 'system', content: input.formatterConfig.systemPrompt },\n { role: 'user', content: formatterPrompt },\n ],\n tools: input.outputTools,\n signal: input.signal,\n })\n\n for await (const event of formatterStream) {\n if (input.signal?.aborted) {\n yield { type: 'cancelled' }\n return\n }\n yield event\n }\n\n yield { type: 'done', conversationId: '' }\n } finally {\n releaseSlotFn?.()\n }\n },\n }\n}\n\nfunction buildFormatterPrompt(\n userRequest: string,\n content: string,\n outputFormat?: string\n): string {\n let request = userRequest\n if (outputFormat && outputFormat !== 'auto') {\n const formatMap: Record<string, string> = {\n paragraph: 'paragraph format',\n list: 'list format',\n table: 'table format',\n code: 'code block format',\n quote: 'blockquote format',\n }\n const hint = formatMap[outputFormat] ?? outputFormat\n request = request ? `${request} (use ${hint})` : `Use ${hint}`\n }\n\n return `<user_request>\n${request || 'No specific request'}\n</user_request>\n\n<original_content>\n${content}\n</original_content>`\n}\n","/**\n * Embedding and Rerank Provider contracts.\n *\n * Notes owns the vector DB, chunks, indexing queue, and stale-vector cleanup.\n * The runtime owns provider contracts, readiness, and model-change signals.\n *\n * Key invariant: chat provider switching must NOT silently change\n * the embedding provider or mutate the vector index.\n */\n\nexport interface EmbeddingProviderConfig {\n id: string\n model: string\n dimensions: number\n apiUrl?: string\n apiKey?: string\n}\n\nexport interface EmbeddingProvider {\n readonly id: string\n readonly model: string\n readonly dimensions: number\n\n ensureReady(): Promise<void>\n dispose?(): Promise<void>\n\n /** Embed multiple texts in a single batch. */\n embedMany(texts: string[], options?: { signal?: AbortSignal }): Promise<number[][]>\n\n /** Embed a single text. */\n embed(text: string, options?: { signal?: AbortSignal }): Promise<number[]>\n\n /** Test the embedding API connection. */\n test?(): Promise<{ success: boolean; dimensions?: number; error?: string }>\n}\n\nexport interface RerankInput {\n query: string\n documents: Array<{ id: string; text: string }>\n topN?: number\n}\n\nexport interface RerankResultItem {\n id: string\n score: number\n index: number\n}\n\nexport interface RerankResult {\n results: RerankResultItem[]\n}\n\nexport interface RerankProvider {\n readonly id: string\n readonly model: string\n\n ensureReady(): Promise<void>\n dispose?(): Promise<void>\n\n rerank(input: RerankInput, options?: { signal?: AbortSignal }): Promise<RerankResult>\n\n /** Test the rerank API connection. */\n test?(): Promise<{ success: boolean; error?: string }>\n}\n\n/**\n * Model change event -- emitted when embedding model/dimensions change.\n * Notes should pause indexing, mark vectors stale, and schedule rebuild.\n */\nexport interface EmbeddingModelChangeEvent {\n previousModel: string | null\n previousDimensions: number | null\n newModel: string\n newDimensions: number\n}\n\n/**\n * Embedding session -- manages active embedding/rerank providers\n * separately from the chat provider.\n */\nexport interface EmbeddingSession {\n getEmbeddingProvider(): EmbeddingProvider | null\n getRerankProvider(): RerankProvider | null\n setEmbeddingProvider(provider: EmbeddingProvider): Promise<EmbeddingModelChangeEvent | null>\n setRerankProvider(provider: RerankProvider): Promise<void>\n clearEmbeddingProvider(): Promise<EmbeddingModelChangeEvent | null>\n clearRerankProvider(): Promise<void>\n onModelChange(listener: (event: EmbeddingModelChangeEvent) => void): () => void\n}\n\nexport function createEmbeddingSession(): EmbeddingSession {\n let embeddingProvider: EmbeddingProvider | null = null\n let rerankProvider: RerankProvider | null = null\n const listeners = new Set<(event: EmbeddingModelChangeEvent) => void>()\n\n function emit(event: EmbeddingModelChangeEvent): void {\n for (const listener of listeners) {\n listener(event)\n }\n }\n\n return {\n getEmbeddingProvider() {\n return embeddingProvider\n },\n\n getRerankProvider() {\n return rerankProvider\n },\n\n async setEmbeddingProvider(provider) {\n const prev = embeddingProvider\n await provider.ensureReady()\n\n const modelChanged = !prev\n || prev.model !== provider.model\n || prev.dimensions !== provider.dimensions\n\n if (prev?.dispose) {\n await prev.dispose().catch(() => {})\n }\n embeddingProvider = provider\n\n if (modelChanged) {\n const event: EmbeddingModelChangeEvent = {\n previousModel: prev?.model ?? null,\n previousDimensions: prev?.dimensions ?? null,\n newModel: provider.model,\n newDimensions: provider.dimensions,\n }\n emit(event)\n return event\n }\n return null\n },\n\n async setRerankProvider(provider) {\n const prev = rerankProvider\n await provider.ensureReady()\n if (prev?.dispose) {\n await prev.dispose().catch(() => {})\n }\n rerankProvider = provider\n },\n\n async clearEmbeddingProvider() {\n const prev = embeddingProvider\n if (!prev) return null\n if (prev.dispose) {\n await prev.dispose().catch(() => {})\n }\n embeddingProvider = null\n const event: EmbeddingModelChangeEvent = {\n previousModel: prev.model,\n previousDimensions: prev.dimensions,\n newModel: '',\n newDimensions: 0,\n }\n emit(event)\n return event\n },\n\n async clearRerankProvider() {\n const prev = rerankProvider\n if (prev?.dispose) {\n await prev.dispose().catch(() => {})\n }\n rerankProvider = null\n },\n\n onModelChange(listener) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n }\n}\n","/**\n * ChatRuntimeBridge - the interface sanqian-chat ChatPanel consumes.\n *\n * Replaces CommonChatSdk + StreamHandlerSdk at the main-process IPC layer.\n * The renderer ChatAdapter remains stable; only the IPC implementation\n * routes through this bridge.\n */\n\nimport type { RuntimeProviderCapabilities, RuntimeChatStreamRequest, RuntimePermissionResponse } from './provider'\nimport type { RuntimeStreamEvent } from './events'\nimport type { AiFeatureRuntimeState } from './readiness'\nimport type { ConversationPage, ConversationDetail, ListConversationsInput, GetConversationInput } from './conversations'\n\nexport interface ResourceProviderInfo {\n id: string\n name: string\n description: string\n appName: string\n hasGetList?: boolean\n hasGetCurrent?: boolean\n}\n\nexport interface ResourceListRequest {\n providerId: string\n query?: string\n offset?: number\n limit?: number\n}\n\nexport interface ResourceListPage {\n items: Array<{ id: string; title: string; summary?: string; [key: string]: unknown }>\n hasMore?: boolean\n}\n\nexport interface BridgeSessionResource {\n id: string\n title: string\n content: string\n summary?: string\n}\n\nexport interface RuntimeSessionResourceEvent {\n type: 'resource_pushed' | 'resource_removed' | 'resources_cleared'\n resource?: BridgeSessionResource\n resourceId?: string\n appName?: string\n}\n\nexport interface ChatRuntimeBridge {\n // Readiness\n ensureReady(): Promise<void>\n isConnected(): boolean\n getRuntimeState(): AiFeatureRuntimeState\n getCapabilities(): RuntimeProviderCapabilities\n\n // Chat\n chatStream(input: RuntimeChatStreamRequest): AsyncIterable<RuntimeStreamEvent>\n cancelStream?(input: { streamId?: string; runId?: string }): Promise<void>\n sendPermissionResponse?(input: RuntimePermissionResponse): Promise<void>\n\n // Conversations\n listConversations(input: ListConversationsInput): Promise<ConversationPage>\n getConversation(id: string, input?: GetConversationInput): Promise<ConversationDetail | null>\n deleteConversation(id: string): Promise<void>\n\n // Resource Picker (capability-gated)\n listResourceProviders?(): Promise<ResourceProviderInfo[]>\n getResourceList?(input: ResourceListRequest): Promise<ResourceListPage>\n\n // Session Resources (capability-gated)\n getSessionResources?(): BridgeSessionResource[]\n fetchSessionResources?(agentId?: string): Promise<BridgeSessionResource[]>\n removeSessionResource?(id: string): Promise<void>\n onSessionResourceEvent?(listener: (event: RuntimeSessionResourceEvent) => void): () => void\n}\n\n/**\n * Resolve AI feature visibility from runtime state.\n *\n * showAIFeatures=auto means:\n * - show if runtime provider is configured and ready, OR\n * - show if Sanqian is installed and usable\n */\nexport function resolveAiFeaturesFromRuntime(\n preference: 'auto' | 'enabled' | 'disabled',\n runtimeState: AiFeatureRuntimeState,\n sanqianInstalled: boolean\n): boolean {\n if (preference === 'enabled') return true\n if (preference === 'disabled') return false\n // auto: runtime provider ready OR Sanqian installed\n return runtimeState.ready || sanqianInstalled\n}\n","/**\n * ChatRuntimeBridge implementation -- connects RuntimeSessionManager\n * to the ChatRuntimeBridge interface that sanqian-chat ChatPanel consumes.\n *\n * Manages:\n * - Stream ID -> AbortController mapping (replaces Notes' activeStreams map)\n * - Stream ID -> runId mapping (for HITL routing)\n * - Capability-gated resource/session methods\n * - Conversation routing through ConversationStore\n */\n\nimport type {\n ChatRuntimeBridge,\n} from './bridge'\nimport type { RuntimeChatStreamRequest, RuntimeProviderCapabilities } from './provider'\nimport type { RuntimeStreamEvent } from './events'\nimport type { AiFeatureRuntimeState } from './readiness'\nimport { EMPTY_CAPABILITIES } from './readiness'\nimport type { ConversationStore } from './conversations'\nimport type { RuntimeSessionManager } from './session'\nimport type { PermissionGate } from './permissions'\n\nexport interface ActiveStream {\n streamId: string\n runId: string | null\n abortController: AbortController\n cancelled: boolean\n}\n\nexport interface ChatRuntimeBridgeConfig {\n sessionManager: RuntimeSessionManager\n conversationStore: ConversationStore\n permissionGate?: PermissionGate\n}\n\nexport function createChatRuntimeBridge(config: ChatRuntimeBridgeConfig): ChatRuntimeBridge & {\n /** Visible for testing: active stream tracking */\n getActiveStreams(): Map<string, ActiveStream>\n} {\n const { sessionManager, conversationStore, permissionGate } = config\n const activeStreams = new Map<string, ActiveStream>()\n\n return {\n getActiveStreams() {\n return activeStreams\n },\n\n async ensureReady() {\n const provider = sessionManager.getActiveProvider()\n if (!provider) throw new Error('No active provider')\n await provider.ensureReady()\n },\n\n isConnected() {\n return sessionManager.getActiveProvider() !== null\n },\n\n getRuntimeState(): AiFeatureRuntimeState {\n return sessionManager.getRuntimeState()\n },\n\n getCapabilities(): RuntimeProviderCapabilities {\n const provider = sessionManager.getActiveProvider()\n return provider?.capabilities ?? EMPTY_CAPABILITIES\n },\n\n async *chatStream(input: RuntimeChatStreamRequest): AsyncIterable<RuntimeStreamEvent> {\n const provider = sessionManager.getActiveProvider()\n if (!provider) {\n yield { type: 'error', error: 'No active provider' }\n return\n }\n\n // Create stream entry with its own AbortController\n const streamId = `stream-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\n const abortController = new AbortController()\n const streamEntry: ActiveStream = {\n streamId,\n runId: null,\n abortController,\n cancelled: false,\n }\n activeStreams.set(streamId, streamEntry)\n\n // Link external signal to internal abort\n if (input.signal) {\n input.signal.addEventListener('abort', () => {\n streamEntry.cancelled = true\n abortController.abort()\n }, { once: true })\n }\n\n try {\n const stream = provider.chatStream({\n ...input,\n signal: abortController.signal,\n })\n\n for await (const event of stream) {\n if (streamEntry.cancelled) {\n yield { type: 'cancelled', runId: streamEntry.runId ?? undefined }\n return\n }\n\n // Track runId from start event\n if (event.type === 'start' && 'runId' in event && event.runId) {\n streamEntry.runId = event.runId\n }\n\n yield event\n }\n } catch (error) {\n if (!streamEntry.cancelled) {\n yield { type: 'error', error: error instanceof Error ? error.message : 'Stream error' }\n }\n } finally {\n activeStreams.delete(streamId)\n }\n },\n\n async cancelStream(input) {\n // Find stream by streamId or runId\n if (input?.streamId) {\n const stream = activeStreams.get(input.streamId)\n if (stream) {\n stream.cancelled = true\n stream.abortController.abort()\n\n // Also cancel via provider if runId is available\n const provider = sessionManager.getActiveProvider()\n if (provider?.cancel && stream.runId) {\n await provider.cancel(stream.runId)\n }\n return\n }\n }\n\n if (input?.runId) {\n const provider = sessionManager.getActiveProvider()\n if (provider?.cancel) {\n await provider.cancel(input.runId)\n }\n // Find and mark the stream as cancelled\n for (const stream of activeStreams.values()) {\n if (stream.runId === input.runId) {\n stream.cancelled = true\n stream.abortController.abort()\n break\n }\n }\n }\n },\n\n async sendPermissionResponse(input) {\n // Route to permission gate first (local HITL)\n if (permissionGate) {\n permissionGate.resolvePermission(input.runId, input.decision)\n return\n }\n\n // Fall back to provider (Sanqian HITL)\n const provider = sessionManager.getActiveProvider()\n if (provider?.sendPermissionResponse) {\n await provider.sendPermissionResponse(input)\n }\n },\n\n async listConversations(input) {\n return conversationStore.list(input)\n },\n\n async getConversation(id, input) {\n return conversationStore.get(id, input)\n },\n\n async deleteConversation(id) {\n return conversationStore.delete(id)\n },\n\n // Resource picker -- capability-gated, not implemented for non-Sanqian\n // These methods are optional on ChatRuntimeBridge\n }\n}\n","/**\n * Output Operations Queue - manages formatter tool output operations.\n *\n * Mirrors Notes' editor-agent.ts: initTaskOutput -> queueOp -> commitTaskOutput.\n * The pipeline initializes a pending ops queue per task, formatter tools\n * append operations, and on completion the queue is committed (sent to editor).\n */\n\nexport type OutputOperationType =\n | 'paragraph' | 'list' | 'table' | 'html'\n | 'heading' | 'codeBlock' | 'blockquote' | 'noteRef'\n\nexport interface OutputOperation {\n type: OutputOperationType\n content: unknown\n}\n\nexport interface EditorOutputContext {\n targetBlockId: string\n blockIds?: string[]\n pageId: string\n notebookId: string | null\n processMode: 'append' | 'replace'\n outputBlockId: string | null\n}\n\nexport interface PendingOutputOps {\n context: EditorOutputContext\n operations: OutputOperation[]\n}\n\nexport interface InsertOutputData {\n taskId: string\n context: EditorOutputContext\n operations: OutputOperation[]\n}\n\n/**\n * Validate output operation content structure.\n * Returns error message if invalid, null if valid.\n */\nexport function validateOutputContent(type: OutputOperationType, content: unknown): string | null {\n if (content === null || content === undefined || typeof content !== 'object') {\n return `${type}: content must be an object`\n }\n const c = content as Record<string, unknown>\n switch (type) {\n case 'paragraph':\n if (!Array.isArray(c.paragraphs)) return 'paragraph: paragraphs must be an array'\n break\n case 'list':\n if (!Array.isArray(c.items)) return 'list: items must be an array'\n break\n case 'table':\n if (!Array.isArray(c.headers)) return 'table: headers must be an array'\n if (!Array.isArray(c.rows)) return 'table: rows must be an array'\n break\n case 'heading':\n if (typeof c.text !== 'string') return 'heading: text must be a string'\n break\n case 'codeBlock':\n if (typeof c.code !== 'string') return 'codeBlock: code must be a string'\n break\n case 'blockquote':\n if (typeof c.text !== 'string') return 'blockquote: text must be a string'\n break\n case 'html':\n if (typeof c.html !== 'string') return 'html: html must be a string'\n break\n case 'noteRef':\n if (typeof c.noteTitle !== 'string') return 'noteRef: noteTitle must be a string'\n break\n }\n return null\n}\n\n/**\n * Output Operations Manager - manages pending operations per task.\n *\n * Lifecycle:\n * 1. initTaskOutput(taskId, context) -- create pending queue\n * 2. queueOp(taskId, type, content) -- formatter tools call this\n * 3. commitTaskOutput(taskId) -- flush to editor\n * 4. clearTaskOutput(taskId) -- discard on cancel/error\n */\nexport interface OutputOperationsManager {\n initTaskOutput(taskId: string, context: EditorOutputContext): void\n queueOp(taskId: string, type: OutputOperationType, content: unknown): { success: boolean; error?: string }\n getTaskOutput(taskId: string): PendingOutputOps | null\n commitTaskOutput(taskId: string): InsertOutputData | null\n clearTaskOutput(taskId: string): void\n}\n\nexport function createOutputOperationsManager(): OutputOperationsManager {\n const pending = new Map<string, PendingOutputOps>()\n\n return {\n initTaskOutput(taskId, context) {\n pending.set(taskId, { context, operations: [] })\n },\n\n queueOp(taskId, type, content) {\n const entry = pending.get(taskId)\n if (!entry) {\n return { success: false, error: 'No pending context for task' }\n }\n const validationError = validateOutputContent(type, content)\n if (validationError) {\n return { success: false, error: validationError }\n }\n entry.operations.push({ type, content })\n return { success: true }\n },\n\n getTaskOutput(taskId) {\n return pending.get(taskId) ?? null\n },\n\n commitTaskOutput(taskId) {\n const entry = pending.get(taskId)\n if (!entry || entry.operations.length === 0) {\n pending.delete(taskId)\n return null\n }\n const data: InsertOutputData = {\n taskId,\n context: entry.context,\n operations: [...entry.operations],\n }\n pending.delete(taskId)\n return data\n },\n\n clearTaskOutput(taskId) {\n pending.delete(taskId)\n },\n }\n}\n","/**\n * Convert Sanqian SDK stream events to RuntimeStreamEvent.\n */\n\nimport type { RuntimeStreamEvent } from '../../contracts'\nimport type { SdkChatStreamEvent } from './sdk-port'\n\nexport function convertSdkStreamEvent(event: SdkChatStreamEvent): RuntimeStreamEvent | null {\n switch (event.type) {\n case 'start':\n return {\n type: 'start',\n runId: event.run_id,\n conversationId: event.conversationId,\n }\n\n case 'text':\n return {\n type: 'text',\n content: event.content ?? '',\n }\n\n case 'thinking':\n return {\n type: 'thinking',\n content: event.content ?? '',\n }\n\n case 'tool_call':\n if (!event.tool_call) return null\n return {\n type: 'tool_call',\n toolCall: {\n id: event.tool_call.id,\n name: event.tool_call.function.name,\n arguments: event.tool_call.function.arguments,\n },\n }\n\n case 'tool_args_chunk':\n return {\n type: 'tool_args_chunk',\n toolCallId: event.tool_call_id ?? '',\n toolName: event.tool_name ?? '',\n chunk: event.chunk ?? '',\n }\n\n case 'tool_args':\n return {\n type: 'tool_args',\n toolCallId: event.tool_call_id ?? '',\n toolName: event.tool_name ?? '',\n args: event.args ?? {},\n }\n\n case 'tool_result':\n return {\n type: 'tool_result',\n toolCallId: event.tool_call_id ?? '',\n result: event.result,\n success: event.success,\n error: event.error,\n status: event.status,\n actionRequired: event.action_required,\n settingsTab: event.settings_tab,\n settingsSubTab: event.settings_sub_tab,\n commandExitCode: event.command_exit_code,\n durationMs: event.duration_ms,\n sandboxed: event.sandboxed,\n timedOut: event.timed_out,\n truncated: event.truncated,\n stdoutPath: event.stdout_path,\n stderrPath: event.stderr_path,\n presentation: event.presentation,\n }\n\n case 'done':\n return {\n type: 'done',\n conversationId: event.conversationId ?? '',\n title: event.title,\n }\n\n case 'error':\n return {\n type: 'error',\n error: event.error ?? 'Unknown error',\n }\n\n case 'cancelled':\n return {\n type: 'cancelled',\n runId: event.run_id,\n }\n\n case 'interrupt':\n return {\n type: 'interrupt',\n runId: event.run_id,\n interrupt: {\n type: event.interrupt_type ?? '',\n payload: event.interrupt_payload,\n },\n }\n\n default:\n return null\n }\n}\n","/**\n * Agent ID Resolver - maps short runtime agent IDs to Sanqian registered IDs.\n *\n * Sanqian registers agents with format \"appName:agentId\" (e.g. \"sanqian-notes:assistant\").\n * The runtime uses short IDs (\"assistant\", \"writing\", etc.).\n * This resolver bridges the two.\n */\n\nimport type { AgentIdResolver, RuntimeAgentId } from '../../contracts'\n\nexport interface AgentIdMapping {\n shortId: RuntimeAgentId | string\n registeredId: string\n}\n\nexport function createSanqianAgentIdResolver(\n appName: string\n): AgentIdResolver & {\n setMapping(shortId: string, registeredId: string): void\n clearMappings(): void\n} {\n const mappings = new Map<string, string>()\n const reverseMappings = new Map<string, string>()\n\n const prefix = `${appName}:`\n\n return {\n setMapping(shortId: string, registeredId: string): void {\n mappings.set(shortId, registeredId)\n reverseMappings.set(registeredId, shortId)\n },\n\n clearMappings(): void {\n mappings.clear()\n reverseMappings.clear()\n },\n\n toRuntimeAgentId(input: string): RuntimeAgentId | string {\n // If it's already a short ID, return as-is\n if (!input.includes(':')) return input\n\n // Check reverse mapping first\n const short = reverseMappings.get(input)\n if (short) return short\n\n // Strip app prefix\n if (input.startsWith(prefix)) {\n return input.slice(prefix.length)\n }\n\n return input\n },\n\n async toProviderAgentId(shortId: RuntimeAgentId | string): Promise<string> {\n // Check mapping\n const registered = mappings.get(shortId)\n if (registered) return registered\n\n // If it already looks like a registered ID, return as-is\n if (shortId.includes(':')) return shortId\n\n // Default: prefix with app name\n return `${prefix}${shortId}`\n },\n\n isProviderManagedId(input: string): boolean {\n return input.includes(':')\n },\n }\n}\n","/**\n * SanqianProvider - RuntimeProvider backed by @yushaw/sanqian-sdk.\n *\n * Absorbs the responsibilities of SanqianAppClient:\n * - App registration with tools and contexts\n * - Private agent sync (assistant, writing, generator, formatter)\n * - Chat streaming with AbortSignal forwarding\n * - Event conversion to RuntimeStreamEvent\n * - Conversation proxy\n * - HITL proxy\n * - Session resource proxy\n * - Embedding/rerank config fetch\n */\n\nimport type {\n RuntimeProvider,\n RuntimeProviderCapabilities,\n RuntimeChatRequest,\n RuntimeChatResponse,\n RuntimeChatStreamRequest,\n RuntimePermissionResponse,\n RuntimeStreamEvent,\n RuntimeProviderKind,\n RuntimeAgentConfig,\n RuntimeConnectionSnapshot,\n RuntimeConnectionStatus,\n RuntimeConnectionErrorCode,\n} from '../../contracts'\nimport type {\n SanqianSdkPort,\n SdkAgentConfig,\n SdkToolDefinition,\n SdkContextProvider,\n SdkEmbeddingConfig,\n SdkRerankConfig,\n SdkConversationInfo,\n SdkConversationDetail,\n SdkStoredSessionResource,\n SdkSessionResource,\n} from './sdk-port'\nimport { convertSdkStreamEvent } from './event-converter'\nimport { createSanqianAgentIdResolver } from './agent-id-resolver'\n\nexport interface SanqianProviderConfig {\n /** Provider instance ID */\n id?: string\n /** Display name */\n displayName?: string\n /** App name for Sanqian registration */\n appName: string\n /** App version */\n appVersion: string\n /** SDK port (inject for testing, or create from real SDK) */\n sdk: SanqianSdkPort\n /** Agent configs to register */\n agents?: RuntimeAgentConfig[]\n /** Tool definitions to register with Sanqian */\n tools?: SdkToolDefinition[]\n /** Context providers to register with Sanqian */\n contexts?: SdkContextProvider[]\n}\n\nconst SANQIAN_CAPABILITIES: RuntimeProviderCapabilities = {\n streamingText: true,\n reasoning: true,\n toolCalling: true,\n parallelToolCalls: true,\n toolArgsStreaming: true,\n abort: true,\n hitl: true,\n conversations: true,\n sessionResources: true,\n resourcePicker: true,\n embeddings: true,\n rerank: true,\n}\n\nexport class SanqianProvider implements RuntimeProvider {\n readonly id: string\n readonly kind: RuntimeProviderKind = 'sanqian-sdk'\n readonly displayName: string\n readonly capabilities: RuntimeProviderCapabilities = SANQIAN_CAPABILITIES\n\n private sdk: SanqianSdkPort\n private appName: string\n private agentConfigs: RuntimeAgentConfig[]\n private agentIdResolver: ReturnType<typeof createSanqianAgentIdResolver>\n private disposed = false\n private ready = false\n private connectionStatus: RuntimeConnectionStatus\n private connectionError: string | undefined\n private connectionErrorCode: RuntimeConnectionErrorCode | undefined\n private connectionLastChangedAt = Date.now()\n private readonly connectionListeners = new Set<(snapshot: RuntimeConnectionSnapshot) => void>()\n private readonly handleSdkConnected = (): void => {\n this.updateConnection('connected')\n }\n private readonly handleSdkDisconnected = (): void => {\n const shouldReconnect = this.ready || this.connectionStatus === 'connected' || this.connectionStatus === 'reconnecting'\n this.ready = false\n this.updateConnection(!this.disposed && shouldReconnect ? 'reconnecting' : 'disconnected')\n }\n private readonly handleSdkError = (error: unknown): void => {\n if (!this.sdk.isConnected()) {\n this.ready = false\n }\n this.updateConnection('error', normalizeConnectionError(error))\n }\n\n constructor(config: SanqianProviderConfig) {\n this.id = config.id ?? 'sanqian'\n this.displayName = config.displayName ?? 'Sanqian'\n this.sdk = config.sdk\n this.appName = config.appName\n this.agentConfigs = config.agents ?? []\n this.agentIdResolver = createSanqianAgentIdResolver(config.appName)\n this.connectionStatus = this.sdk.isConnected() ? 'connected' : 'disconnected'\n this.registerConnectionEvents()\n }\n\n // --- Lifecycle ---\n\n async ensureReady(): Promise<void> {\n if (this.disposed) throw new Error('Provider disposed')\n if (this.ready && this.sdk.isConnected()) return\n if (this.ready && !this.sdk.isConnected()) {\n this.ready = false\n }\n\n this.updateConnection(this.sdk.isConnected() ? 'connected' : 'connecting')\n try {\n await this.sdk.ensureReady()\n this.updateConnection('connected')\n await this.syncAgents()\n this.ready = true\n } catch (error) {\n this.ready = false\n this.updateConnection('error', normalizeConnectionError(error))\n throw error\n }\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return\n this.disposed = true\n this.ready = false\n this.agentIdResolver.clearMappings()\n this.unregisterConnectionEvents()\n this.updateConnection('disconnected')\n this.sdk.removeAllListeners()\n await this.sdk.disconnect()\n }\n\n isDisposed(): boolean {\n return this.disposed\n }\n\n // --- Agent Sync ---\n\n private async syncAgents(): Promise<void> {\n for (const config of this.agentConfigs) {\n const sdkConfig: SdkAgentConfig = {\n agent_id: config.id,\n name: config.name,\n description: config.description,\n system_prompt: config.systemPrompt,\n tools: config.tools,\n }\n\n const result = await this.sdk.createAgent(sdkConfig)\n this.agentIdResolver.setMapping(config.id, result.agent_id)\n }\n }\n\n /**\n * Get the registered Sanqian agent ID for a runtime agent ID.\n */\n async resolveAgentId(shortId: string): Promise<string> {\n return this.agentIdResolver.toProviderAgentId(shortId)\n }\n\n /**\n * Get the runtime agent ID for a registered Sanqian agent ID.\n */\n normalizeAgentId(registeredId: string): string {\n return this.agentIdResolver.toRuntimeAgentId(registeredId) as string\n }\n\n // --- Chat ---\n\n async chat(input: RuntimeChatRequest): Promise<RuntimeChatResponse> {\n this.ensureNotDisposed()\n\n const agentId = await this.resolveAgentId(input.agentId)\n const messages = input.messages.map(m => ({ role: m.role, content: m.content }))\n\n const response = await this.sdk.chat(agentId, messages, {\n conversationId: input.conversationId ?? undefined,\n })\n\n return {\n content: response.message.content,\n conversationId: response.conversationId || undefined,\n usage: response.usage ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n } : undefined,\n }\n }\n\n async *chatStream(input: RuntimeChatStreamRequest): AsyncIterable<RuntimeStreamEvent> {\n this.ensureNotDisposed()\n\n const agentId = await this.resolveAgentId(input.agentId)\n const messages = input.messages.map(m => ({ role: m.role, content: m.content }))\n\n const stream = this.sdk.chatStream(agentId, messages, {\n conversationId: input.conversationId ?? undefined,\n signal: input.signal,\n attachedResources: input.resources?.map(r => `${r.providerId}:${r.resourceId}`),\n sessionResources: input.sessionResources?.map(r => r.id),\n })\n\n for await (const sdkEvent of stream) {\n if (input.signal?.aborted) {\n yield { type: 'cancelled' }\n return\n }\n\n const runtimeEvent = convertSdkStreamEvent(sdkEvent)\n if (runtimeEvent) {\n yield runtimeEvent\n }\n }\n }\n\n // --- Cancel / HITL ---\n\n async cancel(runId: string): Promise<void> {\n this.ensureNotDisposed()\n this.sdk.cancelRun(runId)\n }\n\n async sendPermissionResponse(input: RuntimePermissionResponse): Promise<void> {\n this.ensureNotDisposed()\n this.sdk.sendHitlResponse(input.runId, input.response ?? {\n approved: input.decision === 'approve',\n cancelled: input.decision === 'cancel',\n })\n }\n\n // --- Conversations ---\n\n async listConversations(options?: { agentId?: string; limit?: number; offset?: number }): Promise<{\n conversations: SdkConversationInfo[]\n total: number\n }> {\n this.ensureNotDisposed()\n return this.sdk.listConversations({\n agentId: options?.agentId,\n limit: options?.limit,\n offset: options?.offset,\n })\n }\n\n async getConversation(id: string, options?: { messageLimit?: number }): Promise<SdkConversationDetail> {\n this.ensureNotDisposed()\n return this.sdk.getConversation(id, options)\n }\n\n async deleteConversation(id: string): Promise<void> {\n this.ensureNotDisposed()\n return this.sdk.deleteConversation(id)\n }\n\n // --- Session Resources ---\n\n getSessionResources(): SdkStoredSessionResource[] {\n return this.sdk.getSessionResources()\n }\n\n async pushResource(resource: SdkSessionResource): Promise<SdkStoredSessionResource> {\n this.ensureNotDisposed()\n return this.sdk.pushResource(resource)\n }\n\n async removeResource(resourceId: string): Promise<void> {\n this.ensureNotDisposed()\n return this.sdk.removeResource(resourceId)\n }\n\n // --- Embedding / Rerank ---\n\n async getEmbeddingConfig(): Promise<SdkEmbeddingConfig | null> {\n try {\n return await this.sdk.getEmbeddingConfig()\n } catch {\n return null\n }\n }\n\n async getRerankConfig(): Promise<SdkRerankConfig | null> {\n try {\n return await this.sdk.getRerankConfig()\n } catch {\n return null\n }\n }\n\n // --- Connection lifecycle ---\n\n acquireReconnect(): void {\n this.sdk.acquireReconnect()\n }\n\n releaseReconnect(): void {\n this.sdk.releaseReconnect()\n }\n\n // --- Connection state ---\n\n isConnected(): boolean {\n return this.sdk.isConnected()\n }\n\n getConnectionSnapshot(): RuntimeConnectionSnapshot {\n return {\n status: this.connectionStatus,\n isConnected: this.sdk.isConnected(),\n error: this.connectionError,\n errorCode: this.connectionErrorCode,\n lastChangedAt: this.connectionLastChangedAt,\n }\n }\n\n onConnectionChange(callback: (snapshot: RuntimeConnectionSnapshot) => void): () => void {\n this.connectionListeners.add(callback)\n callback(this.getConnectionSnapshot())\n return () => {\n this.connectionListeners.delete(callback)\n }\n }\n\n // --- Events (Sanqian-specific, not on RuntimeProvider interface) ---\n\n on(event: string, handler: (...args: unknown[]) => void): void {\n this.sdk.on(event as Parameters<typeof this.sdk.on>[0], handler)\n }\n\n off(event: string, handler: (...args: unknown[]) => void): void {\n this.sdk.off(event as Parameters<typeof this.sdk.off>[0], handler)\n }\n\n // --- Capability discovery ---\n\n async listAvailableAgents(): Promise<unknown[]> {\n this.ensureNotDisposed()\n // Delegate to SDK if available (some SDK versions expose this)\n const sdk = this.sdk as SanqianSdkPort & {\n listAvailableAgents?(): Promise<unknown[]>\n }\n if (typeof sdk.listAvailableAgents === 'function') {\n return sdk.listAvailableAgents()\n }\n return []\n }\n\n // --- Internal ---\n\n private ensureNotDisposed(): void {\n if (this.disposed) throw new Error('Provider disposed')\n }\n\n private registerConnectionEvents(): void {\n this.sdk.on('connected', this.handleSdkConnected)\n this.sdk.on('disconnected', this.handleSdkDisconnected)\n this.sdk.on('error', this.handleSdkError)\n }\n\n private unregisterConnectionEvents(): void {\n this.sdk.off('connected', this.handleSdkConnected)\n this.sdk.off('disconnected', this.handleSdkDisconnected)\n this.sdk.off('error', this.handleSdkError)\n }\n\n private updateConnection(\n status: RuntimeConnectionStatus,\n options: { error?: string; errorCode?: RuntimeConnectionErrorCode } = {}\n ): void {\n const nextError = status === 'error' ? options.error : undefined\n const nextErrorCode = status === 'error' ? options.errorCode : undefined\n if (\n this.connectionStatus === status &&\n this.connectionError === nextError &&\n this.connectionErrorCode === nextErrorCode\n ) {\n return\n }\n this.connectionStatus = status\n this.connectionError = nextError\n this.connectionErrorCode = nextErrorCode\n this.connectionLastChangedAt = Date.now()\n const snapshot = this.getConnectionSnapshot()\n for (const listener of this.connectionListeners) {\n listener(snapshot)\n }\n }\n}\n\nfunction normalizeConnectionError(error: unknown): { error: string; errorCode: RuntimeConnectionErrorCode } {\n if (error instanceof Error) {\n const code = (error as Error & { code?: unknown }).code\n return {\n error: error.message || 'Connection failed',\n errorCode: typeof code === 'string' && code.trim() ? code : 'CONNECTION_FAILED',\n }\n }\n if (error && typeof error === 'object') {\n const record = error as Record<string, unknown>\n const message = typeof record.message === 'string' ? record.message : 'Connection failed'\n const code = typeof record.code === 'string' && record.code.trim() ? record.code : 'CONNECTION_FAILED'\n return { error: message, errorCode: code }\n }\n if (typeof error === 'string' && error.trim()) {\n return { error, errorCode: 'CONNECTION_FAILED' }\n }\n return { error: 'Connection failed', errorCode: 'CONNECTION_FAILED' }\n}\n","/**\n * MockSanqianSdk - deterministic SDK mock for testing SanqianProvider.\n *\n * Simulates Sanqian backend behavior without network or real backend.\n */\n\nimport type {\n SanqianSdkPort,\n SdkAgentConfig,\n SdkChatMessage,\n SdkChatResponse,\n SdkChatStreamEvent,\n SdkConversationInfo,\n SdkConversationDetail,\n SdkHitlResponse,\n SdkSessionResource,\n SdkStoredSessionResource,\n SdkEmbeddingConfig,\n SdkRerankConfig,\n SdkEventName,\n} from './sdk-port'\n\nexport interface MockScenario {\n agentId?: string\n chatResponse?: string\n streamEvents?: SdkChatStreamEvent[]\n error?: string\n}\n\nexport interface MockSdkConfig {\n appName?: string\n connected?: boolean\n readinessError?: string\n scenarios?: MockScenario[]\n embeddingConfig?: SdkEmbeddingConfig\n rerankConfig?: SdkRerankConfig\n}\n\nexport class MockSanqianSdk implements SanqianSdkPort {\n private appName: string\n private connected: boolean\n private readinessError: string | null\n private scenarios: MockScenario[]\n private agents = new Map<string, { agent_id: string }>()\n private conversations = new Map<string, SdkConversationDetail>()\n private sessionResources: SdkStoredSessionResource[] = []\n private listeners = new Map<string, Set<(...args: unknown[]) => void>>()\n private embeddingConfig: SdkEmbeddingConfig\n private rerankConfig: SdkRerankConfig\n\n // Tracking for assertions\n readonly connectCalls: number[] = []\n readonly disconnectCalls: number[] = []\n readonly ensureReadyCalls: number[] = []\n readonly createAgentCalls: SdkAgentConfig[] = []\n readonly chatCalls: Array<{ agentId: string; messages: SdkChatMessage[]; options?: unknown }> = []\n readonly chatStreamCalls: Array<{ agentId: string; messages: SdkChatMessage[]; options?: unknown }> = []\n readonly cancelRunCalls: string[] = []\n readonly hitlResponseCalls: Array<{ runId: string; response: SdkHitlResponse }> = []\n\n constructor(config: MockSdkConfig = {}) {\n this.appName = config.appName ?? 'test-app'\n this.connected = config.connected ?? false\n this.readinessError = config.readinessError ?? null\n this.scenarios = config.scenarios ?? []\n this.embeddingConfig = config.embeddingConfig ?? { available: false }\n this.rerankConfig = config.rerankConfig ?? { available: false }\n }\n\n // --- Connection ---\n\n async connect(): Promise<void> {\n this.connectCalls.push(Date.now())\n if (this.readinessError) throw new Error(this.readinessError)\n this.connected = true\n this.emit('connected')\n }\n\n async disconnect(): Promise<void> {\n this.disconnectCalls.push(Date.now())\n this.connected = false\n this.emit('disconnected')\n }\n\n async ensureReady(): Promise<void> {\n this.ensureReadyCalls.push(Date.now())\n if (this.readinessError) throw new Error(this.readinessError)\n if (!this.connected) {\n await this.connect()\n }\n }\n\n isConnected(): boolean {\n return this.connected\n }\n\n acquireReconnect(): void { /* no-op in mock */ }\n releaseReconnect(): void { /* no-op in mock */ }\n\n // --- Events ---\n\n on(event: SdkEventName, handler: (...args: unknown[]) => void): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n this.listeners.get(event)!.add(handler)\n }\n\n off(event: SdkEventName, handler: (...args: unknown[]) => void): void {\n this.listeners.get(event)?.delete(handler)\n }\n\n removeAllListeners(): void {\n this.listeners.clear()\n }\n\n private emit(event: string, ...args: unknown[]): void {\n const handlers = this.listeners.get(event)\n if (handlers) {\n for (const handler of handlers) {\n handler(...args)\n }\n }\n }\n\n // --- Agents ---\n\n async createAgent(config: SdkAgentConfig): Promise<{ agent_id: string }> {\n this.createAgentCalls.push(config)\n const registeredId = `${this.appName}:${config.agent_id}`\n this.agents.set(config.agent_id, { agent_id: registeredId })\n return { agent_id: registeredId }\n }\n\n // --- Chat ---\n\n async chat(\n agentId: string,\n messages: SdkChatMessage[],\n options?: { conversationId?: string; persistHistory?: boolean }\n ): Promise<SdkChatResponse> {\n this.chatCalls.push({ agentId, messages, options })\n\n const scenario = this.findScenario(agentId)\n if (scenario?.error) throw new Error(scenario.error)\n\n const content = scenario?.chatResponse ?? 'Mock response'\n return {\n message: { content, role: 'assistant' },\n conversationId: options?.conversationId ?? 'conv-mock',\n usage: { prompt_tokens: 10, completion_tokens: 5, total_tokens: 15 },\n }\n }\n\n async *chatStream(\n agentId: string,\n messages: SdkChatMessage[],\n options?: {\n conversationId?: string\n signal?: AbortSignal\n attachedResources?: string[]\n sessionResources?: string[]\n }\n ): AsyncGenerator<SdkChatStreamEvent> {\n this.chatStreamCalls.push({ agentId, messages, options })\n\n const scenario = this.findScenario(agentId)\n if (scenario?.error) {\n yield { type: 'error', error: scenario.error }\n return\n }\n\n if (scenario?.streamEvents) {\n for (const event of scenario.streamEvents) {\n if (options?.signal?.aborted) {\n yield { type: 'cancelled', run_id: 'run-mock' }\n return\n }\n yield event\n }\n return\n }\n\n // Default simple stream\n if (options?.signal?.aborted) {\n yield { type: 'cancelled', run_id: 'run-mock' }\n return\n }\n\n yield { type: 'start', run_id: 'run-mock' }\n\n if (options?.signal?.aborted) {\n yield { type: 'cancelled', run_id: 'run-mock' }\n return\n }\n\n yield { type: 'text', content: scenario?.chatResponse ?? 'Mock streamed response' }\n yield { type: 'done', conversationId: options?.conversationId ?? 'conv-mock' }\n }\n\n // --- Cancel / HITL ---\n\n cancelRun(runId: string): void {\n this.cancelRunCalls.push(runId)\n }\n\n sendHitlResponse(runId: string, response: SdkHitlResponse): void {\n this.hitlResponseCalls.push({ runId, response })\n }\n\n // --- Conversations ---\n\n async listConversations(options: { agentId?: string; limit?: number; offset?: number }): Promise<{\n conversations: SdkConversationInfo[]\n total: number\n }> {\n const all = Array.from(this.conversations.values())\n const filtered = options.agentId\n ? all.filter(c => c.agent_id === options.agentId)\n : all\n const offset = options.offset ?? 0\n const limit = options.limit ?? 20\n return {\n conversations: filtered.slice(offset, offset + limit),\n total: filtered.length,\n }\n }\n\n async getConversation(id: string): Promise<SdkConversationDetail> {\n const conv = this.conversations.get(id)\n if (!conv) throw new Error(`Conversation not found: ${id}`)\n return conv\n }\n\n async deleteConversation(id: string): Promise<void> {\n this.conversations.delete(id)\n }\n\n /** Test helper: seed a conversation */\n seedConversation(detail: SdkConversationDetail): void {\n this.conversations.set(detail.conversation_id, detail)\n }\n\n // --- Session Resources ---\n\n getSessionResources(): SdkStoredSessionResource[] {\n return [...this.sessionResources]\n }\n\n async pushResource(resource: SdkSessionResource): Promise<SdkStoredSessionResource> {\n const stored: SdkStoredSessionResource = {\n ...resource,\n fullId: `${this.appName}:${resource.id ?? `res-${Date.now()}`}`,\n appName: this.appName,\n pushedAt: new Date().toISOString(),\n }\n this.sessionResources.push(stored)\n this.emit('resourcePushed', stored)\n return stored\n }\n\n async removeResource(resourceId: string): Promise<void> {\n this.sessionResources = this.sessionResources.filter(r => r.fullId !== resourceId)\n this.emit('resourceRemoved', resourceId)\n }\n\n async fetchSessionResources(): Promise<SdkStoredSessionResource[]> {\n return [...this.sessionResources]\n }\n\n // --- Embedding / Rerank ---\n\n async getEmbeddingConfig(): Promise<SdkEmbeddingConfig> {\n return this.embeddingConfig\n }\n\n async getRerankConfig(): Promise<SdkRerankConfig> {\n return this.rerankConfig\n }\n\n // --- Helpers ---\n\n private findScenario(agentId: string): MockScenario | undefined {\n return this.scenarios.find(s => !s.agentId || s.agentId === agentId)\n }\n\n /** Simulate readiness failure for testing rollback */\n setReadinessError(error: string | null): void {\n this.readinessError = error\n }\n\n /** Force connection state for testing */\n setConnected(connected: boolean): void {\n this.connected = connected\n }\n}\n","/**\n * Sanqian Embedding Provider - uses embedding config from Sanqian backend.\n *\n * Calls OpenAI-compatible embedding API with config fetched from Sanqian SDK.\n * This is the same code path Notes currently uses in embedding/api.ts.\n */\n\nimport type { EmbeddingProvider } from '../../contracts'\n\nexport interface SanqianEmbeddingConfig {\n apiUrl: string\n apiKey: string\n modelName: string\n dimensions: number\n /** 'openai' | 'zhipu' | 'local' */\n apiType?: string\n}\n\nconst DEFAULT_BATCH_SIZE = 50\nconst DEFAULT_TIMEOUT = 30000\n\nexport class SanqianEmbeddingProvider implements EmbeddingProvider {\n readonly id: string\n readonly model: string\n readonly dimensions: number\n\n private config: SanqianEmbeddingConfig\n private disposed = false\n\n constructor(config: SanqianEmbeddingConfig, id?: string) {\n this.config = config\n this.id = id ?? 'sanqian-embedding'\n this.model = config.modelName\n this.dimensions = config.dimensions\n }\n\n async ensureReady(): Promise<void> {\n if (this.disposed) throw new Error('Provider disposed')\n if (!this.config.apiUrl) throw new Error('Embedding API URL not configured')\n if (this.config.apiType !== 'local' && !this.config.apiKey) {\n throw new Error('Embedding API Key not configured')\n }\n }\n\n async dispose(): Promise<void> {\n this.disposed = true\n }\n\n async embedMany(texts: string[], options?: { signal?: AbortSignal }): Promise<number[][]> {\n if (this.disposed) throw new Error('Provider disposed')\n if (texts.length === 0) return []\n\n if (texts.length <= DEFAULT_BATCH_SIZE) {\n return this.callApi(texts, options?.signal)\n }\n\n const allEmbeddings: number[][] = []\n for (let i = 0; i < texts.length; i += DEFAULT_BATCH_SIZE) {\n if (options?.signal?.aborted) throw new Error('Embedding request aborted')\n const batch = texts.slice(i, i + DEFAULT_BATCH_SIZE)\n const batchEmbeddings = await this.callApi(batch, options?.signal)\n allEmbeddings.push(...batchEmbeddings)\n }\n return allEmbeddings\n }\n\n async embed(text: string, options?: { signal?: AbortSignal }): Promise<number[]> {\n const [result] = await this.embedMany([text], options)\n if (!result) throw new Error('Failed to generate embedding')\n return result\n }\n\n async test(): Promise<{ success: boolean; dimensions?: number; error?: string }> {\n try {\n const embedding = await this.embed('Hello, this is a test.')\n return { success: true, dimensions: embedding.length }\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'Unknown error' }\n }\n }\n\n private async callApi(texts: string[], signal?: AbortSignal): Promise<number[][]> {\n const { apiUrl, apiKey, modelName, apiType } = this.config\n\n if (apiType === 'local') {\n return this.callOllama(texts, signal)\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n }\n\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({ input: texts, model: modelName }),\n signal: signal ?? AbortSignal.timeout(DEFAULT_TIMEOUT),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Embedding API error: ${response.status} - ${errorText.slice(0, 100)}`)\n }\n\n const data = await response.json() as {\n data: Array<{ embedding: number[]; index: number }>\n }\n\n const sorted = data.data.sort((a, b) => a.index - b.index)\n const embeddings = sorted.map(item => item.embedding)\n\n if (embeddings.length !== texts.length) {\n throw new Error(`Embedding count mismatch: expected ${texts.length}, got ${embeddings.length}`)\n }\n\n return embeddings\n }\n\n private async callOllama(texts: string[], signal?: AbortSignal): Promise<number[][]> {\n const { apiUrl, apiKey, modelName } = this.config\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (apiKey) headers['Authorization'] = `Bearer ${apiKey}`\n\n const embeddings: number[][] = []\n for (const text of texts) {\n if (signal?.aborted) throw new Error('Embedding request aborted')\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({ model: modelName, prompt: text }),\n signal: signal ?? AbortSignal.timeout(DEFAULT_TIMEOUT),\n })\n if (!response.ok) throw new Error(`Ollama API error: ${response.status}`)\n const data = await response.json() as { embedding: number[] }\n embeddings.push(data.embedding)\n }\n return embeddings\n }\n}\n","/**\n * Sanqian Rerank Provider - calls rerank API with config from Sanqian backend.\n *\n * Supports Zhipu BigModel, Cohere, and other OpenAI-compatible rerank APIs.\n */\n\nimport type { RerankProvider, RerankInput, RerankResult } from '../../contracts'\n\nexport interface SanqianRerankConfig {\n apiUrl: string\n apiKey: string\n modelName: string\n}\n\nexport class SanqianRerankProvider implements RerankProvider {\n readonly id: string\n readonly model: string\n\n private config: SanqianRerankConfig\n private disposed = false\n\n constructor(config: SanqianRerankConfig, id?: string) {\n this.id = id ?? 'sanqian-rerank'\n this.model = config.modelName\n this.config = config\n }\n\n async ensureReady(): Promise<void> {\n if (this.disposed) throw new Error('Provider disposed')\n if (!this.config.apiUrl) throw new Error('Rerank API URL not configured')\n if (!this.config.apiKey) throw new Error('Rerank API Key not configured')\n }\n\n async dispose(): Promise<void> {\n this.disposed = true\n }\n\n async rerank(input: RerankInput, options?: { signal?: AbortSignal }): Promise<RerankResult> {\n if (this.disposed) throw new Error('Provider disposed')\n if (input.documents.length === 0) return { results: [] }\n\n const { apiUrl, apiKey, modelName } = this.config\n\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: modelName,\n query: input.query,\n documents: input.documents.map(d => d.text),\n top_n: input.topN ?? input.documents.length,\n return_documents: false,\n }),\n signal: options?.signal,\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Rerank API error: ${response.status} - ${errorText.slice(0, 100)}`)\n }\n\n const data = await response.json() as {\n results: Array<{ index: number; relevance_score: number }>\n }\n\n if (!data.results?.length) return { results: [] }\n\n const results = data.results\n .filter(r => r.index >= 0 && r.index < input.documents.length)\n .sort((a, b) => b.relevance_score - a.relevance_score)\n .map(r => ({\n id: input.documents[r.index].id,\n score: r.relevance_score,\n index: r.index,\n }))\n\n return { results }\n }\n\n async test(): Promise<{ success: boolean; error?: string }> {\n try {\n const result = await this.rerank({\n query: 'test',\n documents: [{ id: '1', text: 'doc one' }, { id: '2', text: 'doc two' }],\n topN: 2,\n })\n return { success: result.results.length > 0 }\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'Unknown error' }\n }\n }\n}\n","// This file is validated by 15 real API integration tests in playground.\n/**\n * VercelProvider - RuntimeProvider backed by Vercel AI SDK.\n *\n * Uses @ai-sdk/openai-compatible for DeepSeek/OpenAI-compatible endpoints.\n * Supports local BYOK mode where users provide their own API keys.\n *\n * Key differences from SanqianProvider:\n * - Tool execution happens locally (not on a remote backend)\n * - Conversations are stored locally via ConversationStore\n * - HITL/permissions are enforced locally before tool execution\n * - No session resources or resource picker (capability-disabled)\n * - Formatter pipeline runs as two local streamText() calls\n */\n\nimport { streamText, generateText, stepCountIs } from 'ai'\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible'\nimport type {\n RuntimeProvider,\n RuntimeProviderCapabilities,\n RuntimeChatRequest,\n RuntimeChatResponse,\n RuntimeChatStreamRequest,\n RuntimePermissionResponse,\n RuntimeStreamEvent,\n RuntimeProviderKind,\n RuntimeToolRegistry,\n RuntimeAgentConfig,\n} from '../../contracts'\nimport { convertToolsForVercel } from './tool-converter'\n\nexport interface VercelProviderConfig {\n id?: string\n displayName?: string\n /** API key for the provider */\n apiKey: string\n /** Base URL (e.g. https://api.deepseek.com) */\n baseURL: string\n /** Model name (e.g. deepseek-chat) */\n model: string\n /** Provider name for display */\n providerName?: string\n /** Agent configs (system prompts, tool lists) */\n agents?: RuntimeAgentConfig[]\n /** Tool registry for local tool execution */\n toolRegistry?: RuntimeToolRegistry\n /** Max tool call steps per request */\n maxSteps?: number\n}\n\nconst VERCEL_CAPABILITIES: RuntimeProviderCapabilities = {\n streamingText: true,\n reasoning: true,\n toolCalling: true,\n parallelToolCalls: false, // serialize mutations for safety\n toolArgsStreaming: false,\n abort: true,\n hitl: false, // local permission policy, not backend HITL\n conversations: false, // needs local ConversationStore\n sessionResources: false,\n resourcePicker: false,\n embeddings: false,\n rerank: false,\n}\n\nconst DEFAULT_MAX_STEPS = 5\nconst TOOL_STEP_LIMIT_ERROR =\n 'Tool step limit reached before the model produced a final response.'\nconst TOOL_STEP_LIMIT_ERROR_CODE = 'TOOL_STEP_LIMIT'\n\nexport class VercelProvider implements RuntimeProvider {\n readonly id: string\n readonly kind: RuntimeProviderKind = 'vercel-ai-sdk'\n readonly displayName: string\n readonly capabilities: RuntimeProviderCapabilities = VERCEL_CAPABILITIES\n\n private apiKey: string\n private baseURL: string\n private modelName: string\n private providerName: string\n private agentConfigs: Map<string, RuntimeAgentConfig>\n private toolRegistry: RuntimeToolRegistry | null\n private maxSteps: number\n private disposed = false\n private ready = false\n\n constructor(config: VercelProviderConfig) {\n this.id = config.id ?? 'vercel'\n this.displayName = config.displayName ?? config.providerName ?? 'Vercel AI'\n this.apiKey = config.apiKey\n this.baseURL = config.baseURL\n this.modelName = config.model\n this.providerName = config.providerName ?? 'openai-compatible'\n this.toolRegistry = config.toolRegistry ?? null\n this.maxSteps = config.maxSteps ?? DEFAULT_MAX_STEPS\n this.agentConfigs = new Map()\n for (const agent of config.agents ?? []) {\n this.agentConfigs.set(agent.id, agent)\n }\n }\n\n // --- Lifecycle ---\n\n async ensureReady(): Promise<void> {\n if (this.disposed) throw new Error('Provider disposed')\n if (this.ready) return\n\n // Validate config\n if (!this.apiKey) throw new Error('API key is required')\n if (!this.baseURL) throw new Error('Base URL is required')\n if (!this.modelName) throw new Error('Model name is required')\n\n // Test connectivity with a minimal call\n const provider = this.createProvider()\n\n try {\n await generateText({\n model: provider.chatModel(this.modelName),\n prompt: 'Reply with OK',\n maxOutputTokens: 32,\n abortSignal: AbortSignal.timeout(15000),\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Provider readiness check failed'\n // Redact API key from error messages\n const redacted = message.replace(new RegExp(this.apiKey.slice(0, 8), 'g'), '****')\n throw new Error(`Provider readiness failed: ${redacted}`)\n }\n\n this.ready = true\n }\n\n async dispose(): Promise<void> {\n this.disposed = true\n this.ready = false\n }\n\n isDisposed(): boolean {\n return this.disposed\n }\n\n // --- Chat ---\n\n async chat(input: RuntimeChatRequest): Promise<RuntimeChatResponse> {\n this.ensureNotDisposed()\n\n const agentConfig = this.agentConfigs.get(input.agentId)\n const provider = this.createProvider()\n const model = provider.chatModel(this.modelName)\n\n const { system, userMessages } = this.buildMessages(input.messages, agentConfig)\n const tools = this.resolveTools(input, agentConfig)\n const maxSteps = tools ? this.maxSteps : 1\n\n const result = await generateText({\n model,\n system,\n messages: userMessages,\n tools: tools as Parameters<typeof generateText>[0]['tools'],\n stopWhen: stepCountIs(maxSteps),\n abortSignal: input.signal,\n })\n\n const resultWithSteps = result as typeof result & {\n finishReason?: string\n steps?: Array<unknown>\n }\n if (\n tools\n && resultWithSteps.finishReason === 'tool-calls'\n && (resultWithSteps.steps?.length ?? 0) >= maxSteps\n ) {\n throw new Error(TOOL_STEP_LIMIT_ERROR)\n }\n\n const usage = result.usage\n return {\n content: result.text,\n usage: usage ? {\n promptTokens: usage.inputTokens ?? 0,\n completionTokens: usage.outputTokens ?? 0,\n totalTokens: (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0),\n } : undefined,\n }\n }\n\n async *chatStream(input: RuntimeChatStreamRequest): AsyncIterable<RuntimeStreamEvent> {\n this.ensureNotDisposed()\n\n const agentConfig = this.agentConfigs.get(input.agentId)\n const provider = this.createProvider()\n const model = provider.chatModel(this.modelName)\n\n const { system, userMessages } = this.buildMessages(input.messages, agentConfig)\n const tools = this.resolveTools(input, agentConfig)\n const maxSteps = tools ? this.maxSteps : 1\n\n const runId = `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\n\n yield { type: 'start', runId }\n\n try {\n let completedSteps = 0\n let finishReason: string | undefined\n const result = streamText({\n model,\n system,\n messages: userMessages,\n tools: tools as Parameters<typeof streamText>[0]['tools'],\n stopWhen: stepCountIs(maxSteps),\n abortSignal: input.signal,\n })\n\n for await (const part of result.fullStream) {\n if (input.signal?.aborted) {\n yield { type: 'cancelled', runId }\n return\n }\n\n const partType = part.type\n\n // Vercel AI SDK v6 part types\n switch (partType) {\n case 'text-delta': {\n const textPart = part as unknown as { text: string }\n if (textPart.text) {\n yield { type: 'text', content: textPart.text }\n }\n break\n }\n\n case 'reasoning-delta': {\n const reasoningPart = part as unknown as { text: string }\n if (reasoningPart.text) {\n yield { type: 'thinking', content: reasoningPart.text }\n }\n break\n }\n\n case 'tool-call': {\n const toolPart = part as unknown as { toolCallId: string; toolName: string; input: unknown }\n yield {\n type: 'tool_call',\n toolCall: {\n id: toolPart.toolCallId,\n name: toolPart.toolName,\n arguments: JSON.stringify(toolPart.input),\n },\n }\n break\n }\n\n case 'tool-result': {\n const resultPart = part as unknown as { toolCallId: string; output: unknown }\n yield {\n type: 'tool_result',\n toolCallId: resultPart.toolCallId,\n result: resultPart.output,\n success: true,\n }\n break\n }\n\n case 'finish-step': {\n const finishPart = part as unknown as { finishReason?: string }\n completedSteps += 1\n finishReason = finishPart.finishReason\n break\n }\n\n case 'finish': {\n const finishPart = part as unknown as { finishReason?: string }\n finishReason = finishPart.finishReason\n break\n }\n\n case 'tool-error': {\n const errorPart = part as { id?: string; toolCallId?: string; error: unknown }\n const errMsg = errorPart.error instanceof Error\n ? errorPart.error.message\n : String(errorPart.error)\n yield {\n type: 'tool_result',\n toolCallId: errorPart.id ?? errorPart.toolCallId ?? '',\n success: false,\n error: this.redactSecrets(errMsg),\n }\n break\n }\n\n case 'error': {\n const errPart = part as { error?: unknown }\n const errorMessage = errPart.error instanceof Error\n ? errPart.error.message\n : String(errPart.error ?? 'Unknown error')\n yield { type: 'error', error: this.redactSecrets(errorMessage) }\n return\n }\n\n // text-start, text-end, reasoning-start, reasoning-end,\n // tool-input-start, tool-input-end, tool-input-delta,\n // start-step, source, file - skip\n default:\n break\n }\n }\n\n if (tools && finishReason === 'tool-calls' && completedSteps >= maxSteps) {\n yield {\n type: 'error',\n error: TOOL_STEP_LIMIT_ERROR,\n code: TOOL_STEP_LIMIT_ERROR_CODE,\n }\n return\n }\n\n yield { type: 'done', conversationId: input.conversationId ?? '' }\n } catch (error) {\n if (input.signal?.aborted) {\n yield { type: 'cancelled', runId }\n return\n }\n const message = error instanceof Error ? error.message : 'Stream error'\n yield { type: 'error', error: this.redactSecrets(message) }\n }\n }\n\n // --- Cancel ---\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async cancel(_runId: string): Promise<void> {\n // Vercel mode cancellation is via AbortSignal, not runId\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async sendPermissionResponse(_input: RuntimePermissionResponse): Promise<void> {\n // Local permission is enforced before tool execution, not via HITL\n }\n\n // --- Internal ---\n\n private createProvider() {\n return createOpenAICompatible({\n name: this.providerName,\n apiKey: this.apiKey,\n baseURL: this.baseURL,\n })\n }\n\n private buildMessages(\n messages: Array<{ role: string; content: string }>,\n agentConfig?: RuntimeAgentConfig\n ): { system: string | undefined; userMessages: Array<{ role: 'user' | 'assistant'; content: string }> } {\n // Collect system prompts\n const systemParts: string[] = []\n if (agentConfig?.systemPrompt) {\n systemParts.push(agentConfig.systemPrompt)\n }\n\n const userMessages: Array<{ role: 'user' | 'assistant'; content: string }> = []\n for (const msg of messages) {\n if (msg.role === 'system') {\n // Merge system messages into the system param\n if (!agentConfig?.systemPrompt || msg.content !== agentConfig.systemPrompt) {\n systemParts.push(msg.content)\n }\n } else {\n userMessages.push({\n role: msg.role as 'user' | 'assistant',\n content: msg.content,\n })\n }\n }\n\n return {\n system: systemParts.length > 0 ? systemParts.join('\\n\\n') : undefined,\n userMessages,\n }\n }\n\n private resolveTools(\n input: RuntimeChatRequest | RuntimeChatStreamRequest,\n agentConfig?: RuntimeAgentConfig\n ): Record<string, unknown> | undefined {\n // Use explicitly provided tools first, then agent config tools\n const toolDefs = input.tools\n if (toolDefs && toolDefs.length > 0) {\n return convertToolsForVercel(toolDefs, this.toolRegistry, { signal: input.signal })\n }\n\n // If agent has tool names and registry has them registered, resolve\n if (agentConfig?.tools && agentConfig.tools.length > 0 && this.toolRegistry) {\n const registeredTools = agentConfig.tools\n .map(name => this.toolRegistry!.get(name))\n .filter((t): t is NonNullable<typeof t> => t !== undefined)\n .map(t => t.definition)\n\n if (registeredTools.length > 0) {\n return convertToolsForVercel(registeredTools, this.toolRegistry, { signal: input.signal })\n }\n }\n\n return undefined\n }\n\n private redactSecrets(message: string): string {\n if (this.apiKey && this.apiKey.length > 8) {\n // Redact any occurrence of the first 8+ chars of the key\n const prefix = this.apiKey.slice(0, 8)\n return message.replace(new RegExp(prefix, 'g'), '****')\n }\n return message\n }\n\n private ensureNotDisposed(): void {\n if (this.disposed) throw new Error('Provider disposed')\n }\n}\n","/**\n * Convert runtime tool definitions to Vercel AI SDK tools.\n *\n * Bypasses the `tool()` helper because AI SDK v5/v6 has a bug where\n * `tool()` returns `{ parameters }` but `prepareToolsAndToolChoice`\n * reads `inputSchema` (vercel/ai#7924, PR #15249 -- canary only).\n *\n * Instead, we construct tool objects with `inputSchema` directly,\n * using zod v3 schemas for correct JSON Schema serialization.\n */\n\nimport { z } from 'zod'\nimport type { RuntimeToolDefinition } from '../../contracts'\nimport type { RuntimeToolRegistry } from '../../contracts'\n\n/**\n * Convert a JSON Schema to zod v3 schema.\n */\nfunction jsonSchemaToZod(schema: Record<string, unknown>): z.ZodTypeAny {\n switch (schema.type) {\n case 'string':\n return z.string()\n case 'number':\n return z.number()\n case 'integer':\n return z.number().int()\n case 'boolean':\n return z.boolean()\n case 'array': {\n const items = schema.items as Record<string, unknown> | undefined\n return z.array(items ? jsonSchemaToZod(items) : z.unknown())\n }\n case 'object':\n break\n }\n\n const properties = schema.properties as Record<string, Record<string, unknown>> | undefined\n const required = (schema.required as string[]) ?? []\n\n if (!properties || Object.keys(properties).length === 0) {\n return z.object({})\n }\n\n const shape: Record<string, z.ZodTypeAny> = {}\n for (const [key, prop] of Object.entries(properties)) {\n let field: z.ZodTypeAny\n switch (prop.type) {\n case 'string':\n field = z.string()\n break\n case 'number':\n case 'integer':\n field = z.number()\n break\n case 'boolean':\n field = z.boolean()\n break\n case 'array': {\n const items = prop.items as Record<string, unknown> | undefined\n field = z.array(items ? jsonSchemaToZod(items) : z.unknown())\n break\n }\n case 'object':\n field = jsonSchemaToZod(prop)\n break\n default:\n field = z.unknown()\n }\n if (prop.description) {\n field = field.describe(prop.description as string)\n }\n if (!required.includes(key)) {\n field = field.optional()\n }\n shape[key] = field\n }\n return z.object(shape)\n}\n\ninterface VercelToolLike {\n type: 'function'\n description: string\n inputSchema: z.ZodTypeAny\n execute?: (args: Record<string, unknown>) => Promise<unknown>\n}\n\n/**\n * Convert runtime tool definitions to Vercel AI SDK-compatible tool objects.\n *\n * Returns objects with `inputSchema` (not `parameters`) to match what\n * `prepareToolsAndToolChoice` expects internally.\n */\nexport function convertToolsForVercel(\n tools: RuntimeToolDefinition[],\n registry: RuntimeToolRegistry | null,\n options?: { signal?: AbortSignal }\n): Record<string, VercelToolLike> {\n const result: Record<string, VercelToolLike> = {}\n\n for (const tool of tools) {\n const zodSchema = jsonSchemaToZod(tool.parameters)\n\n if (registry) {\n const reg = registry\n result[tool.name] = {\n type: 'function' as const,\n description: tool.description,\n inputSchema: zodSchema,\n execute: async (args: Record<string, unknown>) => {\n const execResult = await reg.execute({\n toolCallId: `tc-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n name: tool.name,\n args,\n signal: options?.signal,\n })\n if (!execResult.success) {\n throw new Error(execResult.error ?? 'Tool execution failed')\n }\n return execResult.result\n },\n }\n } else {\n result[tool.name] = {\n type: 'function' as const,\n description: tool.description,\n inputSchema: zodSchema,\n }\n }\n }\n\n return result\n}\n","/**\n * Vercel Embedding Provider - uses Vercel AI SDK's embedMany for BYOK mode.\n *\n * Wraps @ai-sdk/openai-compatible to call any OpenAI-compatible embedding API\n * using the host's own API key.\n */\n\nimport { embedMany as aiEmbedMany, embed as aiEmbed } from 'ai'\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible'\nimport type { EmbeddingProvider } from '../../contracts'\n\nexport interface VercelEmbeddingConfig {\n apiKey: string\n baseURL: string\n model: string\n dimensions: number\n providerName?: string\n}\n\nexport class VercelEmbeddingProvider implements EmbeddingProvider {\n readonly id: string\n readonly model: string\n readonly dimensions: number\n\n private config: VercelEmbeddingConfig\n private disposed = false\n\n constructor(config: VercelEmbeddingConfig, id?: string) {\n this.id = id ?? 'vercel-embedding'\n this.model = config.model\n this.dimensions = config.dimensions\n this.config = config\n }\n\n async ensureReady(): Promise<void> {\n if (this.disposed) throw new Error('Provider disposed')\n if (!this.config.apiKey) throw new Error('Embedding API key is required')\n if (!this.config.baseURL) throw new Error('Embedding base URL is required')\n\n // Test with a minimal embedding\n try {\n const provider = this.createProvider()\n const result = await aiEmbed({\n model: provider.textEmbeddingModel(this.config.model),\n value: 'test',\n abortSignal: AbortSignal.timeout(15000),\n })\n if (!result.embedding?.length) throw new Error('Empty embedding result')\n } catch (error) {\n const msg = error instanceof Error ? error.message : 'Embedding readiness failed'\n throw new Error(`Embedding provider not ready: ${this.redact(msg)}`)\n }\n }\n\n async dispose(): Promise<void> {\n this.disposed = true\n }\n\n async embedMany(texts: string[], options?: { signal?: AbortSignal }): Promise<number[][]> {\n if (this.disposed) throw new Error('Provider disposed')\n if (texts.length === 0) return []\n\n const provider = this.createProvider()\n const result = await aiEmbedMany({\n model: provider.textEmbeddingModel(this.config.model),\n values: texts,\n abortSignal: options?.signal,\n })\n\n return result.embeddings\n }\n\n async embed(text: string, options?: { signal?: AbortSignal }): Promise<number[]> {\n if (this.disposed) throw new Error('Provider disposed')\n\n const provider = this.createProvider()\n const result = await aiEmbed({\n model: provider.textEmbeddingModel(this.config.model),\n value: text,\n abortSignal: options?.signal,\n })\n\n return result.embedding\n }\n\n async test(): Promise<{ success: boolean; dimensions?: number; error?: string }> {\n try {\n const embedding = await this.embed('Hello, this is a test.')\n return { success: true, dimensions: embedding.length }\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : 'Unknown error' }\n }\n }\n\n private createProvider() {\n return createOpenAICompatible({\n name: this.config.providerName ?? 'embedding-provider',\n apiKey: this.config.apiKey,\n baseURL: this.config.baseURL,\n })\n }\n\n private redact(message: string): string {\n if (this.config.apiKey?.length > 8) {\n return message.replace(new RegExp(this.config.apiKey.slice(0, 8), 'g'), '****')\n }\n return message\n }\n}\n"],"mappings":"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","names":["createOpenAICompatible"]}