@kb-labs/core-platform 1.0.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 +108 -0
- package/dist/adapters/index.cjs +26 -0
- package/dist/adapters/index.cjs.map +1 -0
- package/dist/adapters/index.d.cts +125 -0
- package/dist/adapters/index.d.ts +125 -0
- package/dist/adapters/index.js +21 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/artifacts-BUghvkUU.d.cts +273 -0
- package/dist/artifacts-Bd-1UVTw.d.ts +273 -0
- package/dist/artifacts-DrVnkLzu.d.cts +1374 -0
- package/dist/artifacts-DrVnkLzu.d.ts +1374 -0
- package/dist/core/index.cjs +4 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +2 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/database-DGV6a1nj.d.cts +427 -0
- package/dist/database-DGV6a1nj.d.ts +427 -0
- package/dist/index.cjs +1405 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +579 -0
- package/dist/index.d.ts +579 -0
- package/dist/index.js +1381 -0
- package/dist/index.js.map +1 -0
- package/dist/log-reader-BVohbSMB.d.cts +314 -0
- package/dist/log-reader-uOHBLBax.d.ts +314 -0
- package/dist/noop/adapters/index.cjs +656 -0
- package/dist/noop/adapters/index.cjs.map +1 -0
- package/dist/noop/adapters/index.d.cts +71 -0
- package/dist/noop/adapters/index.d.ts +71 -0
- package/dist/noop/adapters/index.js +637 -0
- package/dist/noop/adapters/index.js.map +1 -0
- package/dist/noop/core/index.cjs +217 -0
- package/dist/noop/core/index.cjs.map +1 -0
- package/dist/noop/core/index.d.cts +94 -0
- package/dist/noop/core/index.d.ts +94 -0
- package/dist/noop/core/index.js +212 -0
- package/dist/noop/core/index.js.map +1 -0
- package/dist/noop/index.cjs +806 -0
- package/dist/noop/index.cjs.map +1 -0
- package/dist/noop/index.d.cts +36 -0
- package/dist/noop/index.d.ts +36 -0
- package/dist/noop/index.js +787 -0
- package/dist/noop/index.js.map +1 -0
- package/dist/resources-DaufJFad.d.cts +419 -0
- package/dist/resources-DaufJFad.d.ts +419 -0
- package/dist/serializable/index.cjs +162 -0
- package/dist/serializable/index.cjs.map +1 -0
- package/dist/serializable/index.d.cts +352 -0
- package/dist/serializable/index.d.ts +352 -0
- package/dist/serializable/index.js +152 -0
- package/dist/serializable/index.js.map +1 -0
- package/dist/snapshot-provider--COac4P-.d.ts +923 -0
- package/dist/snapshot-provider-nE9wuc1C.d.cts +923 -0
- package/package.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/llm-types.ts","../src/wrappers/analytics-llm.ts","../src/wrappers/analytics-embeddings.ts","../src/wrappers/analytics-vector-store.ts","../src/wrappers/analytics-cache.ts","../src/wrappers/analytics-storage.ts","../src/wrappers/scoped-analytics.ts","../src/logging/prefixed-logger.ts","../src/learning/memory-history-store.ts","../src/learning/memory-feedback-store.ts","../src/learning/file-history-store.ts","../src/learning/file-feedback-store.ts","../src/runs/run-types.ts"],"names":["generateRequestId","path","createHash"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/core-platform/adapters/llm-types\n * LLM tier and capability types for adaptive model routing.\n *\n * These types define the abstract layer between plugins and LLM providers.\n * Plugins request tiers/capabilities, platform resolves to actual models.\n *\n * @example\n * ```typescript\n * import { LLMTier, LLMCapability, UseLLMOptions } from '@kb-labs/sdk';\n *\n * // Plugin requests by tier (user decides what model)\n * const llm = useLLM({ tier: 'small' });\n * const llm = useLLM({ tier: 'large', capabilities: ['reasoning'] });\n * ```\n */\n\nimport type { ILLM, LLMExecutionPolicy } from './llm.js';\n\n/**\n * Model quality tier - user-defined slots.\n *\n * Tiers are NOT tied to specific models. They are abstract slots\n * that the user fills with whatever models they want in config.\n *\n * Plugin intent:\n * - `small` - \"This task is simple, doesn't need much\"\n * - `medium` - \"Standard task\"\n * - `large` - \"Complex task, need maximum quality\"\n *\n * User decides what model maps to each tier in their config.\n */\nexport type LLMTier = \"small\" | \"medium\" | \"large\";\n\n/**\n * Model capabilities - task-optimized features.\n *\n * - `fast` - Lowest latency (for real-time responses)\n * - `reasoning` - Complex reasoning (o1, opus-level thinking)\n * - `coding` - Code-optimized (better at code generation/review)\n * - `vision` - Image input support\n */\nexport type LLMCapability = \"reasoning\" | \"coding\" | \"vision\" | \"fast\";\n\n/**\n * Options for useLLM() - plugin-facing API.\n *\n * Plugins specify what they need abstractly.\n * Platform resolves to actual provider/model based on user config.\n */\nexport interface UseLLMOptions {\n /**\n * Quality tier (user-defined slot).\n * Platform adapts if exact tier unavailable:\n * - Escalates up (small → medium) silently\n * - Degrades down (large → medium) with warning\n */\n tier?: LLMTier;\n\n /**\n * Required capabilities.\n * Platform selects model that supports ALL requested capabilities.\n */\n capabilities?: LLMCapability[];\n\n /**\n * Optional execution policy applied to this bound LLM instance.\n * Can be overridden per-call via LLMOptions.execution.\n */\n execution?: LLMExecutionPolicy;\n}\n\n/**\n * Resolution result from tier/capability matching.\n * Internal type used by LLMRouter.\n */\nexport interface LLMResolution {\n /** Resolved provider ID (e.g., 'openai', 'anthropic') */\n provider: string;\n /** Resolved model name */\n model: string;\n /** Resource name for ResourceBroker (e.g., 'llm:openai') */\n resource: string;\n /** Original requested tier */\n requestedTier: LLMTier | undefined;\n /** Actual tier being used */\n actualTier: LLMTier;\n /** Whether this was escalated/degraded */\n adapted: boolean;\n /** Warning message if degraded */\n warning?: string;\n}\n\n/**\n * Resolved adapter binding — immutable snapshot of a tier resolution.\n * Returned by resolveAdapter() to avoid global state mutation.\n */\nexport interface LLMAdapterBinding {\n /** The concrete adapter instance (already wrapped with analytics, etc.) */\n adapter: ILLM;\n /** Resolved model name */\n model: string;\n /** Actual tier used */\n tier: LLMTier;\n}\n\n/**\n * LLM Router interface - extends ILLM with routing capabilities.\n * Implemented by @kb-labs/llm-router.\n */\nexport interface ILLMRouter {\n /** Get configured tier (what user set in config) */\n getConfiguredTier(): LLMTier;\n\n /** Resolve tier request to actual model (mutates router state — legacy) */\n resolve(options?: UseLLMOptions): LLMResolution;\n\n /**\n * Resolve tier and return an immutable adapter binding.\n * Does NOT mutate router state — safe for concurrent useLLM() calls.\n */\n resolveAdapter(options?: UseLLMOptions): Promise<LLMAdapterBinding>;\n\n /** Check if capability is available */\n hasCapability(capability: LLMCapability): boolean;\n\n /** Get available capabilities */\n getCapabilities(): LLMCapability[];\n}\n\n/**\n * Tier order for resolution (lowest to highest).\n */\nexport const TIER_ORDER: readonly LLMTier[] = [\n \"small\",\n \"medium\",\n \"large\",\n] as const;\n\n/**\n * Check if tier A is higher than tier B.\n */\nexport function isTierHigher(a: LLMTier, b: LLMTier): boolean {\n return TIER_ORDER.indexOf(a) > TIER_ORDER.indexOf(b);\n}\n\n/**\n * Check if tier A is lower than tier B.\n */\nexport function isTierLower(a: LLMTier, b: LLMTier): boolean {\n return TIER_ORDER.indexOf(a) < TIER_ORDER.indexOf(b);\n}\n","/**\n * @module @kb-labs/core-platform/wrappers/analytics-llm\n * AnalyticsLLM - ILLM wrapper that tracks usage to analytics.\n */\n\nimport type {\n ILLM,\n LLMOptions,\n LLMResponse,\n LLMMessage,\n LLMToolCallOptions,\n LLMToolCallResponse,\n LLMProtocolCapabilities,\n} from '../adapters/llm.js';\nimport type { IAnalytics } from '../adapters/analytics.js';\n\n/**\n * ILLM wrapper that tracks all LLM calls to analytics.\n *\n * Features:\n * - Tracks every LLM completion with token usage\n * - Records model, prompt/completion tokens, timestamps\n * - Transparent (implements ILLM interface)\n * - Automatically calculates cost estimates\n *\n * Tracked metrics:\n * - llm.completion.started\n * - llm.completion.completed (with usage, duration, model)\n * - llm.completion.error (with error details)\n *\n * @example\n * ```typescript\n * const trackedLLM = new AnalyticsLLM(realLLM, analytics);\n *\n * // Automatically tracked\n * const response = await trackedLLM.complete('Hello');\n * // → Tracks: model, tokens, duration\n * ```\n */\nexport class AnalyticsLLM implements ILLM {\n constructor(\n private realLLM: ILLM,\n private analytics: IAnalytics\n ) {}\n\n async getProtocolCapabilities(): Promise<LLMProtocolCapabilities> {\n if (!this.realLLM.getProtocolCapabilities) {\n return {\n cache: { supported: false },\n stream: { supported: true },\n };\n }\n return this.realLLM.getProtocolCapabilities();\n }\n\n /**\n * Generate a completion with analytics tracking.\n */\n async complete(prompt: string, options?: LLMOptions): Promise<LLMResponse> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n // Extract routing metadata (set by LLMRouter)\n const metadata = options?.metadata;\n\n // Track start\n await this.analytics.track('llm.completion.started', {\n requestId,\n tier: metadata?.tier,\n provider: metadata?.provider,\n model: options?.model,\n cacheRequestedMode: metadata?.cacheDecisionTrace?.cacheRequestedMode,\n cacheAppliedMode: metadata?.cacheDecisionTrace?.cacheAppliedMode,\n streamRequestedMode: metadata?.cacheDecisionTrace?.streamRequestedMode,\n streamAppliedMode: metadata?.cacheDecisionTrace?.streamAppliedMode,\n streamFallback: metadata?.cacheDecisionTrace?.streamFallback,\n promptLength: prompt.length,\n maxTokens: options?.maxTokens,\n temperature: options?.temperature,\n });\n\n try {\n // Execute real LLM call\n const response = await this.realLLM.complete(prompt, options);\n await this.trackCacheOutcome(requestId, metadata, response);\n\n // Calculate duration\n const durationMs = Date.now() - startTime;\n\n // Track completion\n const usageMetrics = buildUsageAnalytics(response);\n await this.analytics.track('llm.completion.completed', {\n requestId,\n tier: metadata?.tier,\n provider: metadata?.provider,\n model: response.model,\n cacheRequestedMode: metadata?.cacheDecisionTrace?.cacheRequestedMode,\n cacheAppliedMode: metadata?.cacheDecisionTrace?.cacheAppliedMode,\n streamRequestedMode: metadata?.cacheDecisionTrace?.streamRequestedMode,\n streamAppliedMode: metadata?.cacheDecisionTrace?.streamAppliedMode,\n streamFallback: metadata?.cacheDecisionTrace?.streamFallback,\n ...usageMetrics,\n durationMs,\n });\n\n return response;\n } catch (error) {\n // Track error\n await this.analytics.track('llm.completion.error', {\n requestId,\n tier: metadata?.tier,\n provider: metadata?.provider,\n cacheRequestedMode: metadata?.cacheDecisionTrace?.cacheRequestedMode,\n cacheAppliedMode: metadata?.cacheDecisionTrace?.cacheAppliedMode,\n streamRequestedMode: metadata?.cacheDecisionTrace?.streamRequestedMode,\n streamAppliedMode: metadata?.cacheDecisionTrace?.streamAppliedMode,\n streamFallback: metadata?.cacheDecisionTrace?.streamFallback,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n\n throw error;\n }\n }\n\n /**\n * Stream a completion.\n * Note: Streaming is harder to track token-by-token, so we track start/end only.\n */\n async *stream(prompt: string, options?: LLMOptions): AsyncIterable<string> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n // Extract routing metadata (set by LLMRouter)\n const metadata = options?.metadata;\n\n await this.analytics.track('llm.stream.started', {\n requestId,\n tier: metadata?.tier,\n provider: metadata?.provider,\n model: options?.model,\n cacheRequestedMode: metadata?.cacheDecisionTrace?.cacheRequestedMode,\n cacheAppliedMode: metadata?.cacheDecisionTrace?.cacheAppliedMode,\n streamRequestedMode: metadata?.cacheDecisionTrace?.streamRequestedMode,\n streamAppliedMode: metadata?.cacheDecisionTrace?.streamAppliedMode,\n streamFallback: metadata?.cacheDecisionTrace?.streamFallback,\n promptLength: prompt.length,\n });\n\n try {\n let totalChunks = 0;\n let totalLength = 0;\n\n for await (const chunk of this.realLLM.stream(prompt, options)) {\n totalChunks++;\n totalLength += chunk.length;\n yield chunk;\n }\n\n await this.analytics.track('llm.stream.completed', {\n requestId,\n tier: metadata?.tier,\n provider: metadata?.provider,\n model: options?.model,\n cacheRequestedMode: metadata?.cacheDecisionTrace?.cacheRequestedMode,\n cacheAppliedMode: metadata?.cacheDecisionTrace?.cacheAppliedMode,\n streamRequestedMode: metadata?.cacheDecisionTrace?.streamRequestedMode,\n streamAppliedMode: metadata?.cacheDecisionTrace?.streamAppliedMode,\n streamFallback: metadata?.cacheDecisionTrace?.streamFallback,\n durationMs: Date.now() - startTime,\n totalChunks,\n totalLength,\n });\n } catch (error) {\n await this.analytics.track('llm.stream.error', {\n requestId,\n tier: metadata?.tier,\n provider: metadata?.provider,\n cacheRequestedMode: metadata?.cacheDecisionTrace?.cacheRequestedMode,\n cacheAppliedMode: metadata?.cacheDecisionTrace?.cacheAppliedMode,\n streamRequestedMode: metadata?.cacheDecisionTrace?.streamRequestedMode,\n streamAppliedMode: metadata?.cacheDecisionTrace?.streamAppliedMode,\n streamFallback: metadata?.cacheDecisionTrace?.streamFallback,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n\n throw error;\n }\n }\n\n /**\n * Chat with native tool calling support (optional).\n * Proxies to underlying LLM if it supports chatWithTools.\n */\n async chatWithTools(\n messages: LLMMessage[],\n options: LLMToolCallOptions\n ): Promise<LLMToolCallResponse> {\n // Check if underlying LLM supports chatWithTools\n if (!this.realLLM.chatWithTools) {\n throw new Error('Underlying LLM does not support chatWithTools');\n }\n\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n // Extract routing metadata (set by LLMRouter)\n const metadata = options?.metadata;\n\n // Track start\n await this.analytics.track('llm.chatWithTools.started', {\n requestId,\n tier: metadata?.tier,\n provider: metadata?.provider,\n model: options?.model,\n cacheRequestedMode: metadata?.cacheDecisionTrace?.cacheRequestedMode,\n cacheAppliedMode: metadata?.cacheDecisionTrace?.cacheAppliedMode,\n streamRequestedMode: metadata?.cacheDecisionTrace?.streamRequestedMode,\n streamAppliedMode: metadata?.cacheDecisionTrace?.streamAppliedMode,\n streamFallback: metadata?.cacheDecisionTrace?.streamFallback,\n messageCount: messages.length,\n toolCount: options.tools.length,\n toolChoice: options.toolChoice,\n maxTokens: options?.maxTokens,\n temperature: options?.temperature,\n });\n\n try {\n // Execute real LLM call with tools\n const response = await this.realLLM.chatWithTools(messages, options);\n await this.trackCacheOutcome(requestId, metadata, response);\n\n // Calculate duration\n const durationMs = Date.now() - startTime;\n\n // Track completion\n const usageMetrics = buildUsageAnalytics(response);\n await this.analytics.track('llm.chatWithTools.completed', {\n requestId,\n tier: metadata?.tier,\n provider: metadata?.provider,\n model: response.model,\n cacheRequestedMode: metadata?.cacheDecisionTrace?.cacheRequestedMode,\n cacheAppliedMode: metadata?.cacheDecisionTrace?.cacheAppliedMode,\n streamRequestedMode: metadata?.cacheDecisionTrace?.streamRequestedMode,\n streamAppliedMode: metadata?.cacheDecisionTrace?.streamAppliedMode,\n streamFallback: metadata?.cacheDecisionTrace?.streamFallback,\n ...usageMetrics,\n toolCallCount: response.toolCalls?.length ?? 0,\n toolNames: response.toolCalls?.map((tc) => tc.name) ?? [],\n durationMs,\n });\n\n return response;\n } catch (error) {\n // Track error\n await this.analytics.track('llm.chatWithTools.error', {\n requestId,\n tier: metadata?.tier,\n provider: metadata?.provider,\n cacheRequestedMode: metadata?.cacheDecisionTrace?.cacheRequestedMode,\n cacheAppliedMode: metadata?.cacheDecisionTrace?.cacheAppliedMode,\n streamRequestedMode: metadata?.cacheDecisionTrace?.streamRequestedMode,\n streamAppliedMode: metadata?.cacheDecisionTrace?.streamAppliedMode,\n streamFallback: metadata?.cacheDecisionTrace?.streamFallback,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n\n throw error;\n }\n }\n\n private async trackCacheOutcome(\n requestId: string,\n metadata: LLMOptions['metadata'],\n response: LLMResponse\n ): Promise<void> {\n const trace = metadata?.cacheDecisionTrace;\n if (!trace) {\n return;\n }\n\n const cacheReadTokens = response.usage.cacheReadTokens ?? 0;\n const cacheWriteTokens = response.usage.cacheWriteTokens ?? 0;\n const basePayload = {\n requestId,\n tier: metadata?.tier,\n provider: metadata?.provider,\n cacheRequestedMode: trace.cacheRequestedMode,\n cacheAppliedMode: trace.cacheAppliedMode,\n cacheSupported: trace.cacheSupported,\n cacheReadTokens,\n cacheWriteTokens,\n promptTokens: response.usage.promptTokens,\n completionTokens: response.usage.completionTokens,\n model: response.model,\n };\n\n if (trace.cacheAppliedMode === 'bypass' || trace.cacheRequestedMode === 'bypass') {\n await this.analytics.track('llm.cache.bypass', {\n ...basePayload,\n reason: trace.reason ?? 'CACHE_BYPASSED',\n });\n return;\n }\n\n if (cacheReadTokens > 0) {\n await this.analytics.track('llm.cache.hit', basePayload);\n return;\n }\n\n await this.analytics.track('llm.cache.miss', {\n ...basePayload,\n reason: trace.reason ?? 'NO_CACHE_READ_TOKENS',\n });\n }\n}\n\n/**\n * Generate unique request ID for tracking\n */\nfunction generateRequestId(): string {\n return `llm-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n}\n\n/**\n * Estimate cost based on model and token usage.\n * Prices as of 2025-01 (USD per 1M tokens).\n *\n * Note: OpenAI API returns versioned snapshot names (e.g., 'gpt-4o-mini-2024-07-18')\n * even when using aliases (e.g., 'gpt-4o-mini'). We match by prefix using longest-first\n * sorting to ensure specific models match before generic ones.\n *\n * See ADR-0041 for details: docs/adr/0041-llm-cost-calculation-fix.md\n */\nfunction buildUsageAnalytics(response: LLMResponse): Record<string, number> {\n const model = response.model.toLowerCase();\n const promptTokens = response.usage.promptTokens;\n const completionTokens = response.usage.completionTokens;\n const cacheReadTokens = response.usage.cacheReadTokens ?? 0;\n const cacheWriteTokens = response.usage.cacheWriteTokens ?? 0;\n const billablePromptTokens =\n response.usage.billablePromptTokens ?? Math.max(promptTokens - cacheReadTokens, 0);\n const totalTokens = promptTokens + completionTokens;\n const billableTotalTokens = billablePromptTokens + completionTokens;\n\n const pricing = getPricing(model);\n\n const normalInputTokens = Math.max(promptTokens - cacheReadTokens, 0);\n const cachedInputTokens = cacheReadTokens;\n const cachedInputRate = pricing.cachedInput ?? pricing.input;\n\n const inputCost =\n (normalInputTokens / 1_000_000) * pricing.input +\n (cachedInputTokens / 1_000_000) * cachedInputRate;\n const outputCost = (completionTokens / 1_000_000) * pricing.output;\n const estimatedCost = inputCost + outputCost;\n\n const uncachedInputCost = (promptTokens / 1_000_000) * pricing.input;\n const uncachedOutputCost = outputCost;\n const estimatedUncachedCost = uncachedInputCost + uncachedOutputCost;\n const estimatedCacheSavingsUsd = Math.max(estimatedUncachedCost - estimatedCost, 0);\n const estimatedSavedPromptTokens = Math.max(promptTokens - billablePromptTokens, 0);\n\n return {\n promptTokens,\n completionTokens,\n totalTokens,\n cacheReadTokens,\n cacheWriteTokens,\n billablePromptTokens,\n billableTotalTokens,\n estimatedSavedPromptTokens,\n estimatedCost,\n estimatedUncachedCost,\n estimatedCacheSavingsUsd,\n };\n}\n\nfunction getPricing(model: string): { input: number; output: number; cachedInput?: number } {\n // Pricing map (input / output per 1M tokens)\n // Source: vendor public pricing pages (approx; keep updated when changing model lineup)\n const pricing: Record<string, { input: number; output: number; cachedInput?: number }> = {\n // OpenAI models (2025-01 pricing)\n 'gpt-4o-mini': { input: 0.15, output: 0.60, cachedInput: 0.075 },\n 'gpt-4o': { input: 2.50, output: 10.00, cachedInput: 1.25 },\n 'gpt-4-turbo': { input: 10.00, output: 30.00 },\n 'gpt-4': { input: 30.00, output: 60.00 },\n 'gpt-3.5-turbo': { input: 0.50, output: 1.50 },\n\n // Claude models (2025-01 pricing)\n // Cached input discounts vary by policy (5m/1h), conservative defaults:\n // if unknown, keep cachedInput equal to input.\n 'claude-3-opus': { input: 15.00, output: 75.00 },\n 'claude-3-sonnet': { input: 3.00, output: 15.00 },\n 'claude-3-haiku': { input: 0.25, output: 1.25 },\n };\n\n // Sort keys by length (longest first) to match specific models before generic ones\n // Example: 'gpt-4o-mini' should match before 'gpt-4o'\n // This handles versioned names: 'gpt-4o-mini-2024-07-18' → 'gpt-4o-mini' ✅\n const sortedKeys = Object.keys(pricing).sort((a, b) => b.length - a.length);\n\n // Find matching pricing\n let modelPricing = pricing['gpt-4o-mini']!; // Default to cheapest OpenAI model\n for (const key of sortedKeys) {\n if (model.includes(key)) {\n modelPricing = pricing[key]!;\n break;\n }\n }\n\n return modelPricing;\n}\n","/**\n * @module @kb-labs/core-platform/wrappers/analytics-embeddings\n * Analytics wrapper for IEmbeddings that tracks usage\n */\n\nimport type { IEmbeddings } from '../adapters/embeddings.js';\nimport type { IAnalytics } from '../adapters/analytics.js';\n\n/**\n * Generate unique request ID for tracking\n */\nfunction generateRequestId(): string {\n return `emb_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Estimate cost for embeddings based on text length and provider\n * OpenAI text-embedding-3-small: $0.00002 per 1K tokens (~750 chars)\n */\nfunction estimateCost(textLength: number, provider = 'openai'): number {\n const pricing: Record<string, number> = {\n openai: 0.00002, // per 1K tokens\n cohere: 0.0001, // per 1K tokens\n };\n\n const pricePerK = pricing[provider] || pricing.openai!;\n const estimatedTokens = Math.ceil(textLength / 750); // rough estimate: 1 token ≈ 0.75 chars\n return (estimatedTokens / 1000) * pricePerK;\n}\n\n/**\n * Analytics wrapper for embeddings adapter.\n * Tracks all embedding operations to analytics.\n */\nexport class AnalyticsEmbeddings implements IEmbeddings {\n constructor(\n private realEmbeddings: IEmbeddings,\n private analytics: IAnalytics\n ) {}\n\n get dimensions(): number {\n return this.realEmbeddings.dimensions;\n }\n\n async getDimensions(): Promise<number> {\n return this.realEmbeddings.getDimensions();\n }\n\n async embed(text: string): Promise<number[]> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n // Track start\n await this.analytics.track('embeddings.embed.started', {\n requestId,\n textLength: text.length,\n batchSize: 1,\n });\n\n try {\n const result = await this.realEmbeddings.embed(text);\n const durationMs = Date.now() - startTime;\n\n // Track completion\n await this.analytics.track('embeddings.embed.completed', {\n requestId,\n textLength: text.length,\n dimensions: result.length,\n durationMs,\n estimatedCost: estimateCost(text.length),\n batchSize: 1,\n });\n\n return result;\n } catch (error) {\n await this.analytics.track('embeddings.embed.error', {\n requestId,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async embedBatch(texts: string[]): Promise<number[][]> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n const totalTextLength = texts.reduce((sum, text) => sum + text.length, 0);\n\n // Track start\n await this.analytics.track('embeddings.embedBatch.started', {\n requestId,\n totalTextLength,\n batchSize: texts.length,\n });\n\n try {\n const results = await this.realEmbeddings.embedBatch(texts);\n const durationMs = Date.now() - startTime;\n\n // Track completion\n await this.analytics.track('embeddings.embedBatch.completed', {\n requestId,\n totalTextLength,\n batchSize: texts.length,\n dimensions: results[0]?.length ?? 0,\n durationMs,\n estimatedCost: estimateCost(totalTextLength),\n avgTextLength: Math.round(totalTextLength / texts.length),\n });\n\n return results;\n } catch (error) {\n await this.analytics.track('embeddings.embedBatch.error', {\n requestId,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n batchSize: texts.length,\n });\n throw error;\n }\n }\n}\n","/**\n * @module @kb-labs/core-platform/wrappers/analytics-vector-store\n * Analytics wrapper for IVectorStore that tracks usage\n */\n\nimport type { IVectorStore, VectorRecord, VectorSearchResult, VectorFilter } from '../adapters/vector-store.js';\nimport type { IAnalytics } from '../adapters/analytics.js';\n\n/**\n * Generate unique request ID for tracking\n */\nfunction generateRequestId(): string {\n return `vec_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Analytics wrapper for vector store adapter.\n * Tracks all vector operations to analytics.\n */\nexport class AnalyticsVectorStore implements IVectorStore {\n constructor(\n private realVectorStore: IVectorStore,\n private analytics: IAnalytics\n ) {}\n\n async search(query: number[], limit: number, filter?: VectorFilter): Promise<VectorSearchResult[]> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n // Track start\n await this.analytics.track('vectorstore.search.started', {\n requestId,\n dimensions: query.length,\n limit,\n hasFilter: !!filter,\n });\n\n try {\n const results = await this.realVectorStore.search(query, limit, filter);\n const durationMs = Date.now() - startTime;\n\n // Calculate average score\n const avgScore = results.length > 0\n ? results.reduce((sum, r) => sum + r.score, 0) / results.length\n : 0;\n\n // Track completion\n await this.analytics.track('vectorstore.search.completed', {\n requestId,\n dimensions: query.length,\n limit,\n resultsCount: results.length,\n avgScore,\n durationMs,\n hasFilter: !!filter,\n });\n\n return results;\n } catch (error) {\n await this.analytics.track('vectorstore.search.error', {\n requestId,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async upsert(vectors: VectorRecord[]): Promise<void> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n // Track start\n await this.analytics.track('vectorstore.upsert.started', {\n requestId,\n vectorCount: vectors.length,\n });\n\n try {\n await this.realVectorStore.upsert(vectors);\n const durationMs = Date.now() - startTime;\n\n // Track completion\n await this.analytics.track('vectorstore.upsert.completed', {\n requestId,\n vectorCount: vectors.length,\n durationMs,\n });\n } catch (error) {\n await this.analytics.track('vectorstore.upsert.error', {\n requestId,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n vectorCount: vectors.length,\n });\n throw error;\n }\n }\n\n async delete(ids: string[]): Promise<void> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n // Track start\n await this.analytics.track('vectorstore.delete.started', {\n requestId,\n idsCount: ids.length,\n });\n\n try {\n await this.realVectorStore.delete(ids);\n const durationMs = Date.now() - startTime;\n\n // Track completion\n await this.analytics.track('vectorstore.delete.completed', {\n requestId,\n idsCount: ids.length,\n durationMs,\n });\n } catch (error) {\n await this.analytics.track('vectorstore.delete.error', {\n requestId,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async count(): Promise<number> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n const count = await this.realVectorStore.count();\n const durationMs = Date.now() - startTime;\n\n // Track count operation\n await this.analytics.track('vectorstore.count.completed', {\n requestId,\n count,\n durationMs,\n });\n\n return count;\n } catch (error) {\n await this.analytics.track('vectorstore.count.error', {\n requestId,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async get(ids: string[]): Promise<VectorRecord[]> {\n if (!this.realVectorStore.get) {\n throw new Error('get() not implemented by underlying vector store');\n }\n\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n const results = await this.realVectorStore.get(ids);\n const durationMs = Date.now() - startTime;\n\n await this.analytics.track('vectorstore.get.completed', {\n requestId,\n idsCount: ids.length,\n resultsCount: results.length,\n durationMs,\n });\n\n return results;\n } catch (error) {\n await this.analytics.track('vectorstore.get.error', {\n requestId,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async query(filter: VectorFilter): Promise<VectorRecord[]> {\n if (!this.realVectorStore.query) {\n throw new Error('query() not implemented by underlying vector store');\n }\n\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n const results = await this.realVectorStore.query(filter);\n const durationMs = Date.now() - startTime;\n\n await this.analytics.track('vectorstore.query.completed', {\n requestId,\n resultsCount: results.length,\n durationMs,\n });\n\n return results;\n } catch (error) {\n await this.analytics.track('vectorstore.query.error', {\n requestId,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n}\n","/**\n * @module @kb-labs/core-platform/wrappers/analytics-cache\n * Analytics wrapper for ICache that tracks usage\n */\n\nimport type { ICache } from '../adapters/cache.js';\nimport type { IAnalytics } from '../adapters/analytics.js';\n\n/**\n * Generate unique request ID for tracking\n */\nfunction generateRequestId(): string {\n return `cache_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Sampling strategy for high-frequency cache operations.\n *\n * - cache.get.hit / cache.set.completed: 1:100 (aggressive sampling for efficiency monitoring)\n * - cache.get.miss: 1:10 (more frequent to detect cache inefficiencies)\n * - cache.zrangebyscore.completed: DISABLED (generates 99% of events, no business value)\n * - cache.*.error: 1:1 (track all errors - important signals)\n * - Other operations: 1:1 (delete, clear, zadd, etc. are rare)\n *\n * Uses deterministic counter-based sampling for even distribution.\n */\nlet cacheCounter = 0;\nfunction shouldSampleCacheEvent(eventType: string): boolean {\n cacheCounter = (cacheCounter + 1) % 100;\n\n // High-frequency events (hit/set) - sample 1:100 for efficiency metrics\n if (eventType === 'cache.get.hit' || eventType === 'cache.set.completed') {\n return cacheCounter === 0; // Track every 100th event\n }\n\n // Miss events - sample 1:10 (more important for detecting cache issues)\n if (eventType === 'cache.get.miss') {\n return cacheCounter % 10 === 0; // Track every 10th miss\n }\n\n // Track all other events (errors, rare operations)\n return true;\n}\n\n/**\n * Time-based sampling for zrangebyscore (scheduler hot path).\n * Tracks last event timestamp per key - only emit 1 event per minute per key.\n * This reduces ~322k events to ~50-100 (based on unique keys).\n */\nconst lastZrangeTimestamp = new Map<string, number>();\nfunction shouldSampleZrangebyscore(key: string): boolean {\n const now = Date.now();\n const last = lastZrangeTimestamp.get(key) ?? 0;\n\n // Emit only once per minute for each key\n if (now - last > 60000) {\n lastZrangeTimestamp.set(key, now);\n return true;\n }\n return false;\n}\n\n/**\n * Analytics wrapper for cache adapter.\n * Tracks all cache operations including hit/miss rates.\n */\nexport class AnalyticsCache implements ICache {\n constructor(\n private realCache: ICache,\n private analytics: IAnalytics\n ) {}\n\n async get<T>(key: string): Promise<T | null> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n const result = await this.realCache.get<T>(key);\n const durationMs = Date.now() - startTime;\n const hit = result !== null;\n const eventType = hit ? 'cache.get.hit' : 'cache.get.miss';\n\n // Sample: hit/set 1:100, miss 1:10 (for cache efficiency monitoring)\n if (shouldSampleCacheEvent(eventType)) {\n await this.analytics.track(eventType, {\n requestId,\n key,\n durationMs,\n });\n }\n\n return result;\n } catch (error) {\n // Always track errors\n await this.analytics.track('cache.get.error', {\n requestId,\n key,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n await this.realCache.set(key, value, ttl);\n const durationMs = Date.now() - startTime;\n\n // Sample 1:100 for cache efficiency monitoring\n if (shouldSampleCacheEvent('cache.set.completed')) {\n await this.analytics.track('cache.set.completed', {\n requestId,\n key,\n ttl: ttl ?? null,\n durationMs,\n });\n }\n } catch (error) {\n // Always track errors\n await this.analytics.track('cache.set.error', {\n requestId,\n key,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async delete(key: string): Promise<void> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n await this.realCache.delete(key);\n const durationMs = Date.now() - startTime;\n\n // Track delete operation\n await this.analytics.track('cache.delete.completed', {\n requestId,\n key,\n durationMs,\n });\n } catch (error) {\n await this.analytics.track('cache.delete.error', {\n requestId,\n key,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async clear(pattern?: string): Promise<void> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n await this.realCache.clear(pattern);\n const durationMs = Date.now() - startTime;\n\n // Track clear operation\n await this.analytics.track('cache.clear.completed', {\n requestId,\n pattern: pattern ?? null,\n durationMs,\n });\n } catch (error) {\n await this.analytics.track('cache.clear.error', {\n requestId,\n pattern: pattern ?? null,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async zadd(key: string, score: number, member: string): Promise<void> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n await this.realCache.zadd(key, score, member);\n const durationMs = Date.now() - startTime;\n\n await this.analytics.track('cache.zadd.completed', {\n requestId,\n key,\n durationMs,\n });\n } catch (error) {\n await this.analytics.track('cache.zadd.error', {\n requestId,\n key,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async zrangebyscore(key: string, min: number, max: number): Promise<string[]> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n const results = await this.realCache.zrangebyscore(key, min, max);\n const durationMs = Date.now() - startTime;\n\n // DISABLED: zrangebyscore generates 99% of all analytics events (530k/day)\n // This overwhelms FileAnalytics (1.7M events total) causing OOM/timeouts\n // Cache operations are internal and don't provide business value for analytics\n // if (shouldSampleZrangebyscore(key)) {\n // await this.analytics.track('cache.zrangebyscore.completed', {\n // requestId,\n // key,\n // resultsCount: results.length,\n // durationMs,\n // });\n // }\n\n return results;\n } catch (error) {\n // Always track errors (important signal)\n await this.analytics.track('cache.zrangebyscore.error', {\n requestId,\n key,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async zrem(key: string, member: string): Promise<void> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n await this.realCache.zrem(key, member);\n const durationMs = Date.now() - startTime;\n\n await this.analytics.track('cache.zrem.completed', {\n requestId,\n key,\n durationMs,\n });\n } catch (error) {\n await this.analytics.track('cache.zrem.error', {\n requestId,\n key,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async setIfNotExists<T>(key: string, value: T, ttl?: number): Promise<boolean> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n const result = await this.realCache.setIfNotExists(key, value, ttl);\n const durationMs = Date.now() - startTime;\n\n await this.analytics.track('cache.setIfNotExists.completed', {\n requestId,\n key,\n success: result,\n ttl: ttl ?? null,\n durationMs,\n });\n\n return result;\n } catch (error) {\n await this.analytics.track('cache.setIfNotExists.error', {\n requestId,\n key,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n}\n","/**\n * @module @kb-labs/core-platform/wrappers/analytics-storage\n * Analytics wrapper for IStorage that tracks usage\n */\n\nimport type { IStorage } from '../adapters/storage.js';\nimport type { IAnalytics } from '../adapters/analytics.js';\n\n/**\n * Generate unique request ID for tracking\n */\nfunction generateRequestId(): string {\n return `storage_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Analytics wrapper for storage adapter.\n * Tracks all file operations including read/write bandwidth.\n */\nexport class AnalyticsStorage implements IStorage {\n constructor(\n private realStorage: IStorage,\n private analytics: IAnalytics\n ) {}\n\n async read(path: string): Promise<Buffer | null> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n const result = await this.realStorage.read(path);\n const durationMs = Date.now() - startTime;\n const bytesRead = result?.length ?? 0;\n\n // Track read operation\n await this.analytics.track('storage.read.completed', {\n requestId,\n path,\n bytesRead,\n durationMs,\n found: result !== null,\n });\n\n return result;\n } catch (error) {\n await this.analytics.track('storage.read.error', {\n requestId,\n path,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async write(path: string, data: Buffer): Promise<void> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n await this.realStorage.write(path, data);\n const durationMs = Date.now() - startTime;\n\n // Track write operation\n await this.analytics.track('storage.write.completed', {\n requestId,\n path,\n bytesWritten: data.length,\n durationMs,\n });\n } catch (error) {\n await this.analytics.track('storage.write.error', {\n requestId,\n path,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async delete(path: string): Promise<void> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n await this.realStorage.delete(path);\n const durationMs = Date.now() - startTime;\n\n // Track delete operation\n await this.analytics.track('storage.delete.completed', {\n requestId,\n path,\n durationMs,\n });\n } catch (error) {\n await this.analytics.track('storage.delete.error', {\n requestId,\n path,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async list(prefix: string): Promise<string[]> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n const results = await this.realStorage.list(prefix);\n const durationMs = Date.now() - startTime;\n\n // Track list operation\n await this.analytics.track('storage.list.completed', {\n requestId,\n prefix,\n filesCount: results.length,\n durationMs,\n });\n\n return results;\n } catch (error) {\n await this.analytics.track('storage.list.error', {\n requestId,\n prefix,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n\n async exists(path: string): Promise<boolean> {\n const startTime = Date.now();\n const requestId = generateRequestId();\n\n try {\n const result = await this.realStorage.exists(path);\n const durationMs = Date.now() - startTime;\n\n // Track exists check\n await this.analytics.track('storage.exists.completed', {\n requestId,\n path,\n exists: result,\n durationMs,\n });\n\n return result;\n } catch (error) {\n await this.analytics.track('storage.exists.error', {\n requestId,\n path,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n });\n throw error;\n }\n }\n}\n","/**\n * @module @kb-labs/core-platform/wrappers/scoped-analytics\n * Analytics wrapper that overrides source attribution for plugin execution\n *\n * Problem: All analytics events show source from root package.json (@kb-labs/ai-review)\n * Solution: Use IAnalytics.setSource() to override source.product with actual plugin ID\n *\n * Used by: core-sandbox/handler-executor to inject plugin-specific source\n */\n\nimport type {\n IAnalytics,\n EventsQuery,\n EventsResponse,\n EventsStats,\n BufferStatus,\n DlqStatus\n} from '../adapters/analytics.js';\n\n/**\n * ScopedAnalytics - wraps IAnalytics to override source attribution\n *\n * This wrapper uses the new setSource() method to modify the analytics\n * adapter's source before delegating all calls.\n *\n * Design:\n * - Calls setSource() on underlying adapter if available (FileAnalytics, future HTTP adapters)\n * - For adapters without setSource() (NoOpAnalytics), just delegates (no-op is fine)\n * - Transparently delegates all IAnalytics methods\n * - Safe to nest with other wrappers (AnalyticsEmbeddings, QueuedEmbeddings)\n *\n * Usage:\n * ```typescript\n * const scoped = new ScopedAnalytics(platform.analytics, {\n * product: '@kb-labs/mind',\n * version: '0.1.0'\n * });\n *\n * await scoped.track('mind.rag-index.started', { scope: 'default' });\n * // Event will have source.product = '@kb-labs/mind' instead of root package\n * ```\n */\nexport class ScopedAnalytics implements IAnalytics {\n constructor(\n private readonly realAnalytics: IAnalytics,\n private readonly scopedSource: { product: string; version: string }\n ) {\n // Try to override source in underlying adapter\n if (realAnalytics.setSource) {\n realAnalytics.setSource(scopedSource);\n }\n // If adapter doesn't support setSource (like NoOpAnalytics), that's fine\n // - NoOp doesn't track events anyway, so source doesn't matter\n }\n\n async track(event: string, properties?: Record<string, unknown>): Promise<void> {\n await this.realAnalytics.track(event, properties);\n }\n\n async identify(userId: string, traits?: Record<string, unknown>): Promise<void> {\n await this.realAnalytics.identify(userId, traits);\n }\n\n async flush(): Promise<void> {\n await this.realAnalytics.flush();\n }\n\n // Optional methods - delegate if available\n async getEvents(query?: EventsQuery): Promise<EventsResponse> {\n if (!this.realAnalytics.getEvents) {\n throw new Error('getEvents not supported by underlying analytics adapter');\n }\n return this.realAnalytics.getEvents(query);\n }\n\n async getStats(): Promise<EventsStats> {\n if (!this.realAnalytics.getStats) {\n throw new Error('getStats not supported by underlying analytics adapter');\n }\n return this.realAnalytics.getStats();\n }\n\n async getBufferStatus(): Promise<BufferStatus | null> {\n if (!this.realAnalytics.getBufferStatus) {\n return null;\n }\n return this.realAnalytics.getBufferStatus();\n }\n\n async getDlqStatus(): Promise<DlqStatus | null> {\n if (!this.realAnalytics.getDlqStatus) {\n return null;\n }\n return this.realAnalytics.getDlqStatus();\n }\n\n /**\n * Get current source from underlying adapter\n */\n getSource(): { product: string; version: string } | undefined {\n if (this.realAnalytics.getSource) {\n return this.realAnalytics.getSource();\n }\n // Fallback to our scoped source\n return this.scopedSource;\n }\n\n /**\n * Delegate setSource to underlying adapter\n */\n setSource(source: { product: string; version: string }): void {\n if (this.realAnalytics.setSource) {\n this.realAnalytics.setSource(source);\n }\n // Update our scoped source as well (for getScopedSource())\n (this as any).scopedSource = source;\n }\n\n /**\n * Get the scoped source (for testing/debugging)\n */\n getScopedSource(): { product: string; version: string } {\n return this.scopedSource;\n }\n\n /**\n * Get the underlying analytics adapter (for introspection)\n */\n getUnderlyingAdapter(): IAnalytics {\n return this.realAnalytics;\n }\n}\n\n/**\n * Create scoped analytics wrapper\n *\n * @param analytics - Original analytics adapter\n * @param scopedSource - Override source (plugin ID and version)\n * @returns Scoped analytics wrapper\n */\nexport function createScopedAnalytics(\n analytics: IAnalytics,\n scopedSource: { product: string; version: string }\n): ScopedAnalytics {\n return new ScopedAnalytics(analytics, scopedSource);\n}\n\n/**\n * Check if adapter is already scoped\n */\nexport function isScopedAnalytics(analytics: IAnalytics): analytics is ScopedAnalytics {\n return analytics instanceof ScopedAnalytics;\n}\n\n/**\n * Unwrap scoped analytics to get original adapter\n */\nexport function unwrapScopedAnalytics(analytics: IAnalytics): IAnalytics {\n if (isScopedAnalytics(analytics)) {\n return analytics.getUnderlyingAdapter();\n }\n return analytics;\n}\n","/**\n * @module @kb-labs/core-platform/logging/prefixed-logger\n *\n * Prefixed logger wrapper that prevents plugins from overriding system observability fields.\n *\n * ## Problem\n *\n * When plugins call `ctx.platform.logger.child({ reqId: 'custom' })`, they can accidentally\n * override system observability fields like `reqId`, `traceId`, `tenantId`, etc.\n *\n * ## Solution\n *\n * This wrapper automatically renames conflicting fields by adding a `plugin_` prefix:\n * - `reqId` → `plugin_reqId`\n * - `traceId` → `plugin_traceId`\n * - etc.\n *\n * Non-conflicting fields pass through unchanged.\n *\n * ## Example\n *\n * ```typescript\n * const baseLogger = platform.logger.child({ reqId: 'req-123', traceId: 'trace-456' });\n * const prefixed = createPrefixedLogger(baseLogger);\n *\n * // Plugin tries to override system fields\n * const pluginLogger = prefixed.child({ reqId: 'custom', userId: '789' });\n * pluginLogger.info('test');\n *\n * // Result:\n * {\n * reqId: 'req-123', // ← System field preserved\n * plugin_reqId: 'custom', // ← Plugin field renamed\n * userId: '789', // ← Non-conflicting field unchanged\n * msg: 'test'\n * }\n * ```\n */\n\nimport type { ILogger } from '../adapters/logger.js';\n\n/**\n * System observability fields that should not be overridden by plugins.\n *\n * These fields are set by the platform based on hostContext and should remain\n * immutable throughout the plugin execution lifecycle.\n */\nexport const SYSTEM_LOG_FIELDS = new Set([\n // Core observability\n 'reqId',\n 'requestId',\n 'traceId',\n 'spanId',\n 'parentSpanId',\n 'invocationId',\n 'executionId',\n 'tenantId',\n 'layer',\n\n // REST context\n 'method',\n 'url',\n\n // Workflow context\n 'workflowId',\n 'runId',\n 'stepId',\n 'jobId',\n 'attempt',\n\n // Webhook context\n 'event',\n 'source',\n\n // Cron context\n 'cronId',\n 'schedule',\n 'scheduledAt',\n 'lastRunAt',\n]);\n\n/**\n * Create a prefixed logger that renames conflicting fields.\n *\n * @param baseLogger - Base logger instance\n * @param options - Configuration options\n * @returns Wrapped logger with field prefixing\n *\n * @example\n * ```typescript\n * const enrichedLogger = platform.logger.child({ reqId: 'req-123' });\n * const prefixed = createPrefixedLogger(enrichedLogger);\n *\n * // Plugins can't override system fields\n * const userLogger = prefixed.child({ reqId: 'custom', foo: 'bar' });\n * // → { reqId: 'req-123', plugin_reqId: 'custom', foo: 'bar' }\n * ```\n */\nexport function createPrefixedLogger(\n baseLogger: ILogger,\n options: {\n /** Prefix for renamed fields (default: 'plugin_') */\n prefix?: string;\n /** Warn in development when renaming fields (default: true) */\n warnOnRename?: boolean;\n /** Custom set of protected fields (default: SYSTEM_LOG_FIELDS) */\n protectedFields?: Set<string>;\n } = {}\n): ILogger {\n const {\n prefix = 'plugin_',\n warnOnRename = true,\n protectedFields = SYSTEM_LOG_FIELDS,\n } = options;\n\n return {\n // Proxy all log methods (defensive check for bind)\n trace: baseLogger.trace?.bind ? baseLogger.trace.bind(baseLogger) : baseLogger.trace,\n debug: baseLogger.debug?.bind ? baseLogger.debug.bind(baseLogger) : baseLogger.debug,\n info: baseLogger.info?.bind ? baseLogger.info.bind(baseLogger) : baseLogger.info,\n warn: baseLogger.warn?.bind ? baseLogger.warn.bind(baseLogger) : baseLogger.warn,\n error: baseLogger.error?.bind ? baseLogger.error.bind(baseLogger) : baseLogger.error,\n fatal: baseLogger.fatal?.bind ? baseLogger.fatal.bind(baseLogger) : baseLogger.fatal,\n\n // Proxy optional log buffer\n getLogBuffer: baseLogger.getLogBuffer?.bind ? baseLogger.getLogBuffer.bind(baseLogger) : baseLogger.getLogBuffer,\n\n // Wrap child() to add prefixing\n child(fields: Record<string, unknown>): ILogger {\n const prefixed: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(fields)) {\n if (protectedFields.has(key)) {\n // Rename with prefix\n const newKey = `${prefix}${key}`;\n prefixed[newKey] = value;\n\n // Warn in development\n if (warnOnRename && process.env.NODE_ENV !== 'production') {\n console.warn(\n `[Logger] Field \"${key}\" is reserved for system observability. ` +\n `Renamed to \"${newKey}\".`\n );\n }\n } else {\n // Pass through unchanged\n prefixed[key] = value;\n }\n }\n\n // Recursively wrap child loggers\n return createPrefixedLogger(baseLogger.child(prefixed), options);\n },\n };\n}\n","import { createHash } from 'node:crypto';\nimport type { HistoryFindOptions, HistoryRecord, IHistoryStore } from './history-store.js';\n\n/**\n * In-memory history store with basic similarity search.\n * Intended as a fallback when persistent storage is not configured.\n */\nexport class MemoryHistoryStore implements IHistoryStore {\n private readonly entries: HistoryRecord[] = [];\n private readonly maxEntries: number;\n\n constructor(maxEntries: number = 10_000) {\n this.maxEntries = maxEntries;\n }\n\n async save(record: HistoryRecord): Promise<void> {\n this.entries.push(record);\n if (this.entries.length > this.maxEntries) {\n this.entries.shift();\n }\n }\n\n async find(options: HistoryFindOptions): Promise<HistoryRecord[]> {\n const { scopeId, queryHash, queryVector, limit = 10 } = options;\n\n let results = this.entries.filter((entry) => entry.scopeId === scopeId);\n\n if (queryHash) {\n results = results.filter((entry) => entry.queryHash === queryHash);\n }\n\n if (queryVector && queryVector.length > 0) {\n results = results\n .map((entry) => {\n const similarity = entry.queryVector ? this.cosineSimilarity(queryVector, entry.queryVector) : 0;\n return { entry, similarity };\n })\n .filter((item) => item.similarity > 0.7)\n .sort((a, b) => b.similarity - a.similarity)\n .slice(0, limit)\n .map((item) => item.entry);\n } else {\n results = results.slice(0, limit);\n }\n\n return results;\n }\n\n async popular(scopeId: string, limit: number = 20): Promise<Array<{ query: string; count: number }>> {\n const counts = new Map<string, number>();\n for (const entry of this.entries) {\n if (entry.scopeId !== scopeId) {continue;}\n const count = counts.get(entry.query) ?? 0;\n counts.set(entry.query, count + 1);\n }\n return Array.from(counts.entries())\n .map(([query, count]) => ({ query, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, limit);\n }\n\n async saveReasoningPlan(record: HistoryRecord): Promise<void> {\n const targetHash = record.queryHash ?? createHash('sha256').update(record.query.toLowerCase().trim()).digest('hex');\n const matches = this.entries.filter((entry) => entry.scopeId === record.scopeId && entry.queryHash === targetHash);\n if (matches.length === 0) {\n await this.save({ ...record, queryHash: targetHash });\n return;\n }\n for (const entry of matches) {\n entry.reasoningPlan = record.reasoningPlan;\n }\n }\n\n private cosineSimilarity(vec1: number[], vec2: number[]): number {\n if (vec1.length !== vec2.length) {return 0;}\n let dot = 0;\n let norm1 = 0;\n let norm2 = 0;\n for (let i = 0; i < vec1.length; i++) {\n dot += vec1[i]! * vec2[i]!;\n norm1 += vec1[i]! * vec1[i]!;\n norm2 += vec2[i]! * vec2[i]!;\n }\n const denom = Math.sqrt(norm1) * Math.sqrt(norm2);\n return denom === 0 ? 0 : dot / denom;\n }\n}\n\n","import type { FeedbackRecord, IFeedbackStore } from './feedback-store.js';\n\n/**\n * In-memory feedback store. Simple FIFO with optional cap.\n */\nexport class MemoryFeedbackStore implements IFeedbackStore {\n private readonly entries: FeedbackRecord[] = [];\n private readonly maxEntries: number;\n\n constructor(maxEntries: number = 10_000) {\n this.maxEntries = maxEntries;\n }\n\n async save(record: FeedbackRecord): Promise<void> {\n this.entries.push(record);\n if (this.entries.length > this.maxEntries) {\n this.entries.shift();\n }\n }\n\n async list(scopeId: string, limit: number = 100): Promise<FeedbackRecord[]> {\n const scoped = this.entries.filter((entry) => entry.scopeId === scopeId);\n return scoped.slice(-limit);\n }\n}\n\n","import path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport type { IStorage } from '../adapters/storage.js';\nimport type { HistoryFindOptions, HistoryRecord, IHistoryStore } from './history-store.js';\n\nexport interface FileHistoryStoreOptions {\n basePath?: string;\n filePrefix?: string;\n maxRecordsPerFile?: number;\n maxFiles?: number;\n}\n\n/**\n * File-based history store using platform.storage (JSONL segments with basic rotation).\n */\nexport class FileHistoryStore implements IHistoryStore {\n private readonly basePath: string;\n private readonly filePrefix: string;\n private readonly maxRecordsPerFile: number;\n private readonly maxFiles: number;\n\n constructor(private readonly storage: IStorage, options: FileHistoryStoreOptions = {}) {\n this.basePath = options.basePath ? this.ensureTrailingSlash(options.basePath) : '.kb/mind/learning/history/';\n this.filePrefix = options.filePrefix ?? 'history-';\n this.maxRecordsPerFile = options.maxRecordsPerFile ?? 1000;\n this.maxFiles = options.maxFiles ?? 30;\n }\n\n async save(record: HistoryRecord): Promise<void> {\n const target = await this.getWritableFile();\n const line = JSON.stringify({ v: 1, record }) + '\\n';\n try {\n const existing = await this.storage.read(target);\n const buffer = existing ? Buffer.concat([existing, Buffer.from(line, 'utf8')]) : Buffer.from(line, 'utf8');\n await this.storage.write(target, buffer);\n await this.enforceRotation();\n } catch (error) {\n // Log to stderr to avoid throwing (learning is non-critical)\n \n console.error('[FileHistoryStore] Failed to write history', {\n target,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n async find(options: HistoryFindOptions): Promise<HistoryRecord[]> {\n const files = await this.getFilesSorted();\n const results: HistoryRecord[] = [];\n for (const file of files) {\n if (options.limit && results.length >= options.limit) {break;}\n const buf = await this.storage.read(file);\n if (!buf) {continue;}\n const lines = buf.toString('utf8').split('\\n').filter(Boolean);\n for (const line of lines) {\n if (options.limit && results.length >= options.limit) {break;}\n try {\n const parsed = JSON.parse(line) as { v: number; record: HistoryRecord };\n const rec = parsed.record;\n if (rec.scopeId !== options.scopeId) {continue;}\n if (options.queryHash && rec.queryHash !== options.queryHash) {continue;}\n if (options.queryVector && options.queryVector.length > 0 && rec.queryVector) {\n const similarity = this.cosineSimilarity(options.queryVector, rec.queryVector);\n if (similarity <= 0.7) {continue;}\n }\n results.push(rec);\n } catch {\n continue;\n }\n }\n }\n return options.limit ? results.slice(0, options.limit) : results;\n }\n\n async popular(scopeId: string, limit: number = 20): Promise<Array<{ query: string; count: number }>> {\n const files = await this.getFilesSorted();\n const counts = new Map<string, number>();\n for (const file of files) {\n const buf = await this.storage.read(file);\n if (!buf) {continue;}\n const lines = buf.toString('utf8').split('\\n').filter(Boolean);\n for (const line of lines) {\n try {\n const parsed = JSON.parse(line) as { v: number; record: HistoryRecord };\n const rec = parsed.record;\n if (rec.scopeId !== scopeId) {continue;}\n counts.set(rec.query, (counts.get(rec.query) ?? 0) + 1);\n } catch {\n continue;\n }\n }\n }\n return Array.from(counts.entries())\n .map(([query, count]) => ({ query, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, limit);\n }\n\n async saveReasoningPlan(record: HistoryRecord): Promise<void> {\n const hash = record.queryHash ?? createHash('sha256').update(record.query.toLowerCase().trim()).digest('hex');\n await this.save({ ...record, queryHash: hash });\n }\n\n private async getWritableFile(): Promise<string> {\n const files = await this.getFilesSorted();\n if (files.length === 0) {\n return this.segmentPath(Date.now());\n }\n const latest = files[files.length - 1]!;\n const buf = await this.storage.read(latest);\n if (!buf) {return latest;}\n const count = buf.toString('utf8').split('\\n').filter(Boolean).length;\n if (count >= this.maxRecordsPerFile) {\n return this.segmentPath(Date.now());\n }\n return latest;\n }\n\n private async getFilesSorted(): Promise<string[]> {\n const files = await this.storage.list(this.basePath);\n return files\n .filter((f) => f.startsWith(this.basePath + this.filePrefix) && f.endsWith('.jsonl'))\n .sort();\n }\n\n private segmentPath(ts: number): string {\n const date = new Date(ts);\n const day = String(date.getDate()).padStart(2, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const year = date.getFullYear();\n const filename = `${this.filePrefix}${year}${month}${day}-${ts}.jsonl`;\n return path.posix.join(this.basePath, filename);\n }\n\n private async enforceRotation(): Promise<void> {\n const files = await this.getFilesSorted();\n if (files.length <= this.maxFiles) {return;}\n const excess = files.length - this.maxFiles;\n const toDelete = files.slice(0, excess);\n await Promise.all(toDelete.map((f) => this.storage.delete(f)));\n }\n\n private ensureTrailingSlash(p: string): string {\n return p.endsWith('/') ? p : `${p}/`;\n }\n\n private cosineSimilarity(vec1: number[], vec2: number[]): number {\n if (vec1.length !== vec2.length) {return 0;}\n let dot = 0;\n let norm1 = 0;\n let norm2 = 0;\n for (let i = 0; i < vec1.length; i++) {\n dot += vec1[i]! * vec2[i]!;\n norm1 += vec1[i]! * vec1[i]!;\n norm2 += vec2[i]! * vec2[i]!;\n }\n const denom = Math.sqrt(norm1) * Math.sqrt(norm2);\n return denom === 0 ? 0 : dot / denom;\n }\n}\n\n","import path from 'node:path';\nimport type { IStorage } from '../adapters/storage.js';\nimport type { FeedbackRecord, IFeedbackStore } from './feedback-store.js';\n\nexport interface FileFeedbackStoreOptions {\n basePath?: string;\n filePrefix?: string;\n maxRecordsPerFile?: number;\n maxFiles?: number;\n}\n\n/**\n * File-based feedback store using platform.storage (JSONL segments with basic rotation).\n */\nexport class FileFeedbackStore implements IFeedbackStore {\n private readonly basePath: string;\n private readonly filePrefix: string;\n private readonly maxRecordsPerFile: number;\n private readonly maxFiles: number;\n\n constructor(private readonly storage: IStorage, options: FileFeedbackStoreOptions = {}) {\n this.basePath = options.basePath ? this.ensureTrailingSlash(options.basePath) : '.kb/mind/learning/feedback/';\n this.filePrefix = options.filePrefix ?? 'feedback-';\n this.maxRecordsPerFile = options.maxRecordsPerFile ?? 1000;\n this.maxFiles = options.maxFiles ?? 30;\n }\n\n async save(record: FeedbackRecord): Promise<void> {\n const target = await this.getWritableFile();\n const line = JSON.stringify({ v: 1, record }) + '\\n';\n try {\n const existing = await this.storage.read(target);\n const buffer = existing ? Buffer.concat([existing, Buffer.from(line, 'utf8')]) : Buffer.from(line, 'utf8');\n await this.storage.write(target, buffer);\n await this.enforceRotation();\n } catch (error) {\n \n console.error('[FileFeedbackStore] Failed to write feedback', {\n target,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n async list(scopeId: string, limit: number = 100): Promise<FeedbackRecord[]> {\n const files = await this.getFilesSorted();\n const results: FeedbackRecord[] = [];\n for (const file of files) {\n if (results.length >= limit) {break;}\n const buf = await this.storage.read(file);\n if (!buf) {continue;}\n const lines = buf.toString('utf8').split('\\n').filter(Boolean);\n for (const line of lines) {\n if (results.length >= limit) {break;}\n try {\n const parsed = JSON.parse(line) as { v: number; record: FeedbackRecord };\n const rec = parsed.record;\n if (rec.scopeId !== scopeId) {continue;}\n results.push(rec);\n } catch {\n continue;\n }\n }\n }\n return results.slice(-limit);\n }\n\n private async getWritableFile(): Promise<string> {\n const files = await this.getFilesSorted();\n if (files.length === 0) {\n return this.segmentPath(Date.now());\n }\n const latest = files[files.length - 1]!;\n const buf = await this.storage.read(latest);\n if (!buf) {return latest;}\n const count = buf.toString('utf8').split('\\n').filter(Boolean).length;\n if (count >= this.maxRecordsPerFile) {\n return this.segmentPath(Date.now());\n }\n return latest;\n }\n\n private async getFilesSorted(): Promise<string[]> {\n const files = await this.storage.list(this.basePath);\n return files\n .filter((f) => f.startsWith(this.basePath + this.filePrefix) && f.endsWith('.jsonl'))\n .sort();\n }\n\n private segmentPath(ts: number): string {\n const date = new Date(ts);\n const day = String(date.getDate()).padStart(2, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const year = date.getFullYear();\n const filename = `${this.filePrefix}${year}${month}${day}-${ts}.jsonl`;\n return path.posix.join(this.basePath, filename);\n }\n\n private async enforceRotation(): Promise<void> {\n const files = await this.getFilesSorted();\n if (files.length <= this.maxFiles) {return;}\n const excess = files.length - this.maxFiles;\n const toDelete = files.slice(0, excess);\n await Promise.all(toDelete.map((f) => this.storage.delete(f)));\n }\n\n private ensureTrailingSlash(p: string): string {\n return p.endsWith('/') ? p : `${p}/`;\n }\n}\n\n","/**\n * @module @kb-labs/core-platform/runs/run-types\n * Full-cycle run state model and event schema.\n */\n\n/**\n * Top-level full-cycle run status.\n */\nexport type RunStatus =\n | \"queued\"\n | \"provisioning\"\n | \"executing\"\n | \"gating\"\n | \"human_review\"\n | \"finalizing\"\n | \"completed\"\n | \"failed\"\n | \"failed_by_review\"\n | \"cancelled\";\n\n/**\n * Run step status.\n */\nexport type RunStepStatus =\n | \"pending\"\n | \"in_progress\"\n | \"retrying\"\n | \"skipped\"\n | \"completed\"\n | \"failed\"\n | \"cancelled\";\n\n/**\n * Run step definition.\n */\nexport interface RunStepDefinition {\n id: string;\n name: string;\n plugin?: string;\n action?: string;\n timeoutMs?: number;\n retryLimit?: number;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Run creation request.\n */\nexport interface CreateRunRequest {\n taskRef: string;\n templateId: string;\n actorId?: string;\n tenantId?: string;\n priority?: \"low\" | \"medium\" | \"high\" | \"critical\";\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Run record.\n */\nexport interface RunRecord {\n runId: string;\n status: RunStatus;\n taskRef: string;\n templateId: string;\n actorId?: string;\n tenantId?: string;\n environmentId?: string;\n createdAt: string;\n updatedAt: string;\n startedAt?: string;\n completedAt?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Run step record.\n */\nexport interface RunStepRecord {\n runId: string;\n stepId: string;\n status: RunStepStatus;\n attempt: number;\n startedAt?: string;\n completedAt?: string;\n errorCode?: string;\n errorMessage?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Run event type.\n */\nexport type RunEventType =\n | \"run.created\"\n | \"run.status.changed\"\n | \"run.failed\"\n | \"run.completed\"\n | \"run.cancelled\"\n | \"run.review.approved\"\n | \"run.review.rejected\"\n | \"step.started\"\n | \"step.completed\"\n | \"step.failed\"\n | \"environment.provisioning\"\n | \"environment.ready\"\n | \"environment.destroyed\";\n\n/**\n * Timeline event for run auditability.\n */\nexport interface RunEvent {\n eventId: string;\n runId: string;\n type: RunEventType;\n at: string;\n fromStatus?: RunStatus;\n toStatus?: RunStatus;\n stepId?: string;\n environmentId?: string;\n reason?: string;\n payload?: Record<string, unknown>;\n}\n\n/**\n * Terminal run statuses.\n */\nexport const TERMINAL_RUN_STATUSES: ReadonlySet<RunStatus> = new Set([\n \"completed\",\n \"failed\",\n \"failed_by_review\",\n \"cancelled\",\n]);\n\n"]}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { a as LogQuery, L as LogRecord } from './artifacts-DrVnkLzu.cjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @module @kb-labs/core-platform/adapters/log-reader
|
|
5
|
+
* Read-only adapter interface for querying logs.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Abstract log storage backends (SQLite, ring buffer, remote API)
|
|
9
|
+
* - Provide unified read API for all log queries
|
|
10
|
+
* - Enable configuration-driven backend selection
|
|
11
|
+
*
|
|
12
|
+
* Separation Rationale:
|
|
13
|
+
* - ILogger: Write logs (info, error, warn) + extensions (buffer, persistence)
|
|
14
|
+
* - ILogReader: Read logs (query, getById, search) - this interface
|
|
15
|
+
*
|
|
16
|
+
* Design:
|
|
17
|
+
* - REST API and plugins use this adapter instead of directly accessing ILogBuffer or ILogPersistence
|
|
18
|
+
* - Implementation automatically selects best backend (persistence > buffer > error)
|
|
19
|
+
* - Graceful degradation if backends unavailable
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* // In REST API or plugin
|
|
24
|
+
* const reader = platform.getAdapter<ILogReader>('logReader');
|
|
25
|
+
*
|
|
26
|
+
* const logs = await reader.query(
|
|
27
|
+
* { level: 'error', from: Date.now() - 3600000 },
|
|
28
|
+
* { limit: 50 }
|
|
29
|
+
* );
|
|
30
|
+
*
|
|
31
|
+
* const log = await reader.getById('log-123');
|
|
32
|
+
*
|
|
33
|
+
* const results = await reader.search('authentication failed');
|
|
34
|
+
*
|
|
35
|
+
* const unsubscribe = reader.subscribe((log) => {
|
|
36
|
+
* console.log('New log:', log);
|
|
37
|
+
* });
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Query options for log retrieval.
|
|
43
|
+
*/
|
|
44
|
+
interface LogQueryOptions {
|
|
45
|
+
/** Maximum number of logs to return (default: 100) */
|
|
46
|
+
limit?: number;
|
|
47
|
+
/** Number of logs to skip for pagination (default: 0) */
|
|
48
|
+
offset?: number;
|
|
49
|
+
/** Sort by field (default: 'timestamp') */
|
|
50
|
+
sortBy?: "timestamp" | "level";
|
|
51
|
+
/** Sort order (default: 'desc' - newest first) */
|
|
52
|
+
sortOrder?: "asc" | "desc";
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Result of log query operation.
|
|
56
|
+
*/
|
|
57
|
+
interface LogQueryResult {
|
|
58
|
+
/** Logs matching query criteria */
|
|
59
|
+
logs: LogRecord[];
|
|
60
|
+
/** Total number of logs matching query (ignoring limit/offset) */
|
|
61
|
+
total: number;
|
|
62
|
+
/** True if more results are available (offset + logs.length < total) */
|
|
63
|
+
hasMore: boolean;
|
|
64
|
+
/** Source of data (for debugging/monitoring) */
|
|
65
|
+
source: "buffer" | "persistence" | "hybrid";
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Search options for full-text search.
|
|
69
|
+
*/
|
|
70
|
+
interface LogSearchOptions {
|
|
71
|
+
/** Maximum number of logs to return (default: 100) */
|
|
72
|
+
limit?: number;
|
|
73
|
+
/** Number of logs to skip for pagination (default: 0) */
|
|
74
|
+
offset?: number;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Result of log search operation.
|
|
78
|
+
*/
|
|
79
|
+
interface LogSearchResult {
|
|
80
|
+
/** Logs matching search query */
|
|
81
|
+
logs: LogRecord[];
|
|
82
|
+
/** Total number of logs matching search */
|
|
83
|
+
total: number;
|
|
84
|
+
/** True if more results are available */
|
|
85
|
+
hasMore: boolean;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Statistics about available log storage.
|
|
89
|
+
*/
|
|
90
|
+
interface LogStats {
|
|
91
|
+
/** Ring buffer statistics (if available) */
|
|
92
|
+
buffer?: {
|
|
93
|
+
/** Current number of logs in buffer */
|
|
94
|
+
size: number;
|
|
95
|
+
/** Maximum buffer capacity */
|
|
96
|
+
maxSize: number;
|
|
97
|
+
/** Timestamp of oldest log in buffer (null if empty) */
|
|
98
|
+
oldestTimestamp: number | null;
|
|
99
|
+
/** Timestamp of newest log in buffer (null if empty) */
|
|
100
|
+
newestTimestamp: number | null;
|
|
101
|
+
};
|
|
102
|
+
/** Persistent storage statistics (if available) */
|
|
103
|
+
persistence?: {
|
|
104
|
+
/** Total number of logs in storage */
|
|
105
|
+
totalLogs: number;
|
|
106
|
+
/** Timestamp of oldest log (0 if empty) */
|
|
107
|
+
oldestTimestamp: number;
|
|
108
|
+
/** Timestamp of newest log (0 if empty) */
|
|
109
|
+
newestTimestamp: number;
|
|
110
|
+
/** Storage size in bytes */
|
|
111
|
+
sizeBytes: number;
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Capabilities of available log backends.
|
|
116
|
+
*/
|
|
117
|
+
interface LogCapabilities {
|
|
118
|
+
/** Ring buffer available (real-time streaming) */
|
|
119
|
+
hasBuffer: boolean;
|
|
120
|
+
/** Persistent storage available (historical queries) */
|
|
121
|
+
hasPersistence: boolean;
|
|
122
|
+
/** Full-text search available (FTS) */
|
|
123
|
+
hasSearch: boolean;
|
|
124
|
+
/** Real-time streaming available (SSE) */
|
|
125
|
+
hasStreaming: boolean;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Read-only log adapter interface.
|
|
129
|
+
*
|
|
130
|
+
* This adapter abstracts log storage backends (SQLite, ring buffer, remote API, etc.).
|
|
131
|
+
* REST API and plugins use this instead of directly accessing ILogBuffer or ILogPersistence.
|
|
132
|
+
*
|
|
133
|
+
* Implementations automatically select best backend:
|
|
134
|
+
* 1. If persistence available → use it (complete historical data)
|
|
135
|
+
* 2. If only buffer available → use it (recent logs only)
|
|
136
|
+
* 3. If neither → error 503
|
|
137
|
+
*
|
|
138
|
+
* Common implementations:
|
|
139
|
+
* - HybridLogReader: Combines persistence + buffer with automatic fallback
|
|
140
|
+
* - PersistenceLogReader: SQLite/PostgreSQL only
|
|
141
|
+
* - BufferLogReader: Ring buffer only
|
|
142
|
+
* - RemoteLogReader: Fetch from remote API
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* ```typescript
|
|
146
|
+
* // Get adapter from platform
|
|
147
|
+
* const reader = platform.getAdapter<ILogReader>('logReader');
|
|
148
|
+
*
|
|
149
|
+
* // Query recent errors
|
|
150
|
+
* const errors = await reader.query(
|
|
151
|
+
* { level: 'error', from: Date.now() - 3600000 },
|
|
152
|
+
* { limit: 10 }
|
|
153
|
+
* );
|
|
154
|
+
*
|
|
155
|
+
* // Get specific log
|
|
156
|
+
* const log = await reader.getById('log-123');
|
|
157
|
+
*
|
|
158
|
+
* // Full-text search
|
|
159
|
+
* const results = await reader.search('authentication failed');
|
|
160
|
+
*
|
|
161
|
+
* // Subscribe to real-time stream
|
|
162
|
+
* const unsubscribe = reader.subscribe((log) => {
|
|
163
|
+
* if (log.level === 'error') {
|
|
164
|
+
* console.error('New error:', log);
|
|
165
|
+
* }
|
|
166
|
+
* });
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
interface ILogReader {
|
|
170
|
+
/**
|
|
171
|
+
* Query logs with filters and pagination.
|
|
172
|
+
*
|
|
173
|
+
* Automatically selects best backend:
|
|
174
|
+
* - Persistence (if available): complete historical data
|
|
175
|
+
* - Buffer (if available): recent logs only
|
|
176
|
+
* - Neither: throws error
|
|
177
|
+
*
|
|
178
|
+
* @param filters - Query filters (level, source, time range)
|
|
179
|
+
* @param options - Pagination and sorting options
|
|
180
|
+
* @returns Promise with logs, total count, and pagination info
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* ```typescript
|
|
184
|
+
* const reader = platform.getAdapter<ILogReader>('logReader');
|
|
185
|
+
*
|
|
186
|
+
* // Get last 50 error logs
|
|
187
|
+
* const result = await reader.query(
|
|
188
|
+
* { level: 'error' },
|
|
189
|
+
* { limit: 50, sortBy: 'timestamp', sortOrder: 'desc' }
|
|
190
|
+
* );
|
|
191
|
+
*
|
|
192
|
+
* console.log(result.logs); // Array of 50 logs
|
|
193
|
+
* console.log(result.total); // Total matching logs
|
|
194
|
+
* console.log(result.hasMore); // true if more pages exist
|
|
195
|
+
* console.log(result.source); // 'persistence' | 'buffer'
|
|
196
|
+
* ```
|
|
197
|
+
*/
|
|
198
|
+
query(filters: LogQuery, options?: LogQueryOptions): Promise<LogQueryResult>;
|
|
199
|
+
/**
|
|
200
|
+
* Get single log record by ID.
|
|
201
|
+
*
|
|
202
|
+
* Searches both ring buffer and persistence (if available).
|
|
203
|
+
*
|
|
204
|
+
* @param id - Log record ID
|
|
205
|
+
* @returns Promise with log record or null if not found
|
|
206
|
+
*
|
|
207
|
+
* @example
|
|
208
|
+
* ```typescript
|
|
209
|
+
* const log = await reader.getById('log-abc123');
|
|
210
|
+
* if (log) {
|
|
211
|
+
* console.log(log.message);
|
|
212
|
+
* console.log(log.fields);
|
|
213
|
+
* }
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
216
|
+
getById(id: string): Promise<LogRecord | null>;
|
|
217
|
+
/**
|
|
218
|
+
* Full-text search logs by text query.
|
|
219
|
+
*
|
|
220
|
+
* Uses database FTS (Full-Text Search) if available, otherwise falls back
|
|
221
|
+
* to simple text matching in buffer.
|
|
222
|
+
*
|
|
223
|
+
* @param searchText - Search query (database-specific syntax supported)
|
|
224
|
+
* @param options - Pagination options
|
|
225
|
+
* @returns Promise with matching logs
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* ```typescript
|
|
229
|
+
* // Simple search
|
|
230
|
+
* const results = await reader.search('authentication failed');
|
|
231
|
+
*
|
|
232
|
+
* // Advanced search (SQLite FTS5 syntax)
|
|
233
|
+
* const results = await reader.search('auth* AND (error OR warn)');
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
search(searchText: string, options?: LogSearchOptions): Promise<LogSearchResult>;
|
|
237
|
+
/**
|
|
238
|
+
* Subscribe to real-time log stream.
|
|
239
|
+
*
|
|
240
|
+
* Requires ring buffer to be available. If not, throws error.
|
|
241
|
+
*
|
|
242
|
+
* @param callback - Function to call on each new log
|
|
243
|
+
* @param filters - Optional filters to apply to stream
|
|
244
|
+
* @returns Unsubscribe function to stop receiving logs
|
|
245
|
+
*
|
|
246
|
+
* @example
|
|
247
|
+
* ```typescript
|
|
248
|
+
* // Subscribe to all logs
|
|
249
|
+
* const unsubscribe = reader.subscribe((log) => {
|
|
250
|
+
* console.log('New log:', log.message);
|
|
251
|
+
* });
|
|
252
|
+
*
|
|
253
|
+
* // Subscribe to errors only
|
|
254
|
+
* const unsubscribe = reader.subscribe(
|
|
255
|
+
* (log) => console.error('Error:', log),
|
|
256
|
+
* { level: 'error' }
|
|
257
|
+
* );
|
|
258
|
+
*
|
|
259
|
+
* // Later: unsubscribe()
|
|
260
|
+
* ```
|
|
261
|
+
*/
|
|
262
|
+
subscribe(callback: (log: LogRecord) => void, filters?: LogQuery): () => void;
|
|
263
|
+
/**
|
|
264
|
+
* Get statistics about available log storage.
|
|
265
|
+
*
|
|
266
|
+
* Returns combined statistics from both ring buffer and persistence
|
|
267
|
+
* (if available).
|
|
268
|
+
*
|
|
269
|
+
* @returns Promise with statistics
|
|
270
|
+
*
|
|
271
|
+
* @example
|
|
272
|
+
* ```typescript
|
|
273
|
+
* const stats = await reader.getStats();
|
|
274
|
+
*
|
|
275
|
+
* if (stats.buffer) {
|
|
276
|
+
* console.log('Buffer size:', stats.buffer.size);
|
|
277
|
+
* console.log('Buffer max:', stats.buffer.maxSize);
|
|
278
|
+
* }
|
|
279
|
+
*
|
|
280
|
+
* if (stats.persistence) {
|
|
281
|
+
* console.log('Total logs:', stats.persistence.totalLogs);
|
|
282
|
+
* console.log('DB size:', stats.persistence.sizeBytes);
|
|
283
|
+
* }
|
|
284
|
+
* ```
|
|
285
|
+
*/
|
|
286
|
+
getStats(): Promise<LogStats>;
|
|
287
|
+
/**
|
|
288
|
+
* Check which backends and features are available.
|
|
289
|
+
*
|
|
290
|
+
* Useful for conditionally enabling UI features or choosing query strategies.
|
|
291
|
+
*
|
|
292
|
+
* @returns Object with boolean flags for each capability
|
|
293
|
+
*
|
|
294
|
+
* @example
|
|
295
|
+
* ```typescript
|
|
296
|
+
* const caps = reader.getCapabilities();
|
|
297
|
+
*
|
|
298
|
+
* if (caps.hasSearch) {
|
|
299
|
+
* // Show search UI
|
|
300
|
+
* }
|
|
301
|
+
*
|
|
302
|
+
* if (caps.hasStreaming) {
|
|
303
|
+
* // Enable real-time log streaming
|
|
304
|
+
* }
|
|
305
|
+
*
|
|
306
|
+
* if (caps.hasPersistence) {
|
|
307
|
+
* // Show "View All Logs" button
|
|
308
|
+
* }
|
|
309
|
+
* ```
|
|
310
|
+
*/
|
|
311
|
+
getCapabilities(): LogCapabilities;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export type { ILogReader as I, LogCapabilities as L, LogQueryOptions as a, LogQueryResult as b, LogSearchOptions as c, LogSearchResult as d, LogStats as e };
|