@agimon-ai/log-sink-mcp 0.21.3 → 0.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- const e=require(`./node-CFha1yzq.cjs`),t=require(`./stdio-D2vdWaab.cjs`);let n=require(`zod`),r=require(`node:fs`),i=require(`node:fs/promises`);i=e.u(i,1);let a=require(`node:path`),o=require(`node:url`),s=require(`@agimon-ai/foundation-port-registry`),c=require(`@agimon-ai/foundation-process-registry`),l=require(`commander`),u=require(`@hono/node-server`),d=require(`node:crypto`),f=require(`hono`),p=require(`hono/cors`),m=require(`hono-rate-limiter`),h=require(`hono/html`),g=require(`hono/jsx/jsx-runtime`);function _(e){return e.option(`--config <path>`,`Path to .logsink.yaml`).option(`--global`,`Use the global log-sink instance`).option(`--instance <scope>`,`Force log-sink instance: local or global`)}function v(e){let t=e.instance?.trim();if(e.global&&t&&t.toLowerCase()!==`global`)throw Error(`Use either --global or --instance local, not both`);return e.global?`global`:t}function y(t,n=e.s){t.config&&(process.env.LOG_SINK_CONFIG=t.config);let r=v(t);return r&&(process.env.LOG_SINK_INSTANCE=r),e.c({configPath:t.config,packageName:n})}const b=[`error`,`fatal`];function x(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return null}}function S(e){if(e==null)return`unknown`;if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}}function C(e){return e.hook_event_name===`PostToolUseFailure`?`Current tool failure:\n- Tool: ${e.tool_name??`unknown tool`}\n- Error: ${S(e.error)}`:null}function w(e,t,n){let r=new Map;for(let t of e){let e=`${t.service}::${t.level}::${t.error_type??``}::${t.error_message??t.message}`,i=new Date(Number(t.created_at)).toISOString();r.has(e)||r.set(e,{key:e,count:0,service:t.service,level:t.level,errorType:t.error_type,errorMessage:t.error_message,message:t.message,firstSeen:i,lastSeen:i,traceIds:new Set,examples:[]});let a=r.get(e);a.count+=1,a.lastSeen=i,t.trace_id&&a.traceIds.add(t.trace_id),a.examples.length<n&&a.examples.push({id:t.id,timestamp:i,traceId:t.trace_id})}return Array.from(r.values()).sort((e,t)=>t.count-e.count||t.lastSeen.localeCompare(e.lastSeen)).slice(0,t)}function ee(e,t,n,r){let i=w(e,n,r),a=[];a.push(`Recent log errors (${e.length} new):`),t.tool_name&&a.push(`- Triggered after tool: ${t.tool_name}`);for(let[e,t]of i.entries()){a.push(`${e+1}. ${t.service} [${t.level}] x${t.count} ${t.errorType?`(${t.errorType}) `:``}${t.errorMessage??t.message}`),a.push(` First seen: ${t.firstSeen}`),a.push(` Last seen: ${t.lastSeen}`),t.traceIds.size>0&&a.push(` Trace IDs: ${Array.from(t.traceIds).slice(0,3).join(`, `)}`);for(let e of t.examples)a.push(` Example: ${e.timestamp} id=${e.id}${e.traceId?` trace=${e.traceId}`:``}`)}if(t.hook_event_name===`PostToolUseFailure`){let e=C(t);e&&a.push(``,e)}return a.join(`
2
+ const e=require(`./node-CFha1yzq.cjs`),t=require(`./stdio-CEClGGJy.cjs`);let n=require(`zod`),r=require(`node:fs`),i=require(`node:fs/promises`);i=e.u(i,1);let a=require(`node:path`),o=require(`node:url`),s=require(`@agimon-ai/foundation-port-registry`),c=require(`@agimon-ai/foundation-process-registry`),l=require(`commander`),u=require(`@hono/node-server`),d=require(`node:crypto`),f=require(`hono`),p=require(`hono/cors`),m=require(`hono-rate-limiter`),h=require(`hono/html`),g=require(`hono/jsx/jsx-runtime`);function _(e){return e.option(`--config <path>`,`Path to .logsink.yaml`).option(`--global`,`Use the global log-sink instance`).option(`--instance <scope>`,`Force log-sink instance: local or global`)}function v(e){let t=e.instance?.trim();if(e.global&&t&&t.toLowerCase()!==`global`)throw Error(`Use either --global or --instance local, not both`);return e.global?`global`:t}function y(t,n=e.s){t.config&&(process.env.LOG_SINK_CONFIG=t.config);let r=v(t);return r&&(process.env.LOG_SINK_INSTANCE=r),e.c({configPath:t.config,packageName:n})}const b=[`error`,`fatal`];function x(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return null}}function S(e){if(e==null)return`unknown`;if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}}function C(e){return e.hook_event_name===`PostToolUseFailure`?`Current tool failure:\n- Tool: ${e.tool_name??`unknown tool`}\n- Error: ${S(e.error)}`:null}function w(e,t,n){let r=new Map;for(let t of e){let e=`${t.service}::${t.level}::${t.error_type??``}::${t.error_message??t.message}`,i=new Date(Number(t.created_at)).toISOString();r.has(e)||r.set(e,{key:e,count:0,service:t.service,level:t.level,errorType:t.error_type,errorMessage:t.error_message,message:t.message,firstSeen:i,lastSeen:i,traceIds:new Set,examples:[]});let a=r.get(e);a.count+=1,a.lastSeen=i,t.trace_id&&a.traceIds.add(t.trace_id),a.examples.length<n&&a.examples.push({id:t.id,timestamp:i,traceId:t.trace_id})}return Array.from(r.values()).sort((e,t)=>t.count-e.count||t.lastSeen.localeCompare(e.lastSeen)).slice(0,t)}function ee(e,t,n,r){let i=w(e,n,r),a=[];a.push(`Recent log errors (${e.length} new):`),t.tool_name&&a.push(`- Triggered after tool: ${t.tool_name}`);for(let[e,t]of i.entries()){a.push(`${e+1}. ${t.service} [${t.level}] x${t.count} ${t.errorType?`(${t.errorType}) `:``}${t.errorMessage??t.message}`),a.push(` First seen: ${t.firstSeen}`),a.push(` Last seen: ${t.lastSeen}`),t.traceIds.size>0&&a.push(` Trace IDs: ${Array.from(t.traceIds).slice(0,3).join(`, `)}`);for(let e of t.examples)a.push(` Example: ${e.timestamp} id=${e.id}${e.traceId?` trace=${e.traceId}`:``}`)}if(t.hook_event_name===`PostToolUseFailure`){let e=C(t);e&&a.push(``,e)}return a.join(`
3
3
  `)}function te(t){if(t.session_id?.trim())return(0,s.normalizeRepositoryPath)(e.l(t.cwd?.trim()||process.cwd()))}async function ne(t,n){let i=v(n);if(n.dbPath){let e=i===`global`?`global`:`local`;return(0,r.existsSync)(n.dbPath)?{dbPath:n.dbPath,scope:e}:void 0}let a={...process.env};n.config&&(a.LOG_SINK_CONFIG=n.config),i&&(a.LOG_SINK_INSTANCE=i);let o=e.c({configPath:n.config,cwd:t.cwd??process.cwd(),env:a,packageName:e.s}),c=new s.PortRegistryService(a.PORT_REGISTRY_PATH??s.DEFAULT_REGISTRY_PATH);try{let e=await c.getPort({repositoryPath:o.repositoryPath,serviceName:`log-sink-mcp-http`,serviceType:`tool`,environment:a.NODE_ENV||`development`}),t=e.record?.metadata?.dbPath;if(e.success&&typeof t==`string`&&t&&(0,r.existsSync)(t))return{dbPath:t,scope:o.scope}}catch{}return(0,r.existsSync)(o.dbPath)?{dbPath:o.dbPath,scope:o.scope}:void 0}async function re(e,t,n,r,i,a){let o=e.getSqliteClient(),s=Date.now()-n*60*1e3,c=``;if(t){let e=o.prepare(`
4
4
  SELECT id, created_at
5
5
  FROM logs
package/dist/cli.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"./stdio-Bj5GoSEh.mjs";import{d as p,f as m,p as h,u as g}from"./node-B4HdfM_E.mjs";import{z as _}from"zod";import{existsSync as v,readFileSync as y}from"node:fs";import*as b from"node:fs/promises";import{dirname as x,join as ee}from"node:path";import{fileURLToPath as te}from"node:url";import{DEFAULT_PORT_RANGE as S,DEFAULT_REGISTRY_PATH as ne,PortRegistryService as re,normalizeRepositoryPath as ie}from"@agimon-ai/foundation-port-registry";import{createProcessLease as C,resolveSiblingRegistryPath as w}from"@agimon-ai/foundation-process-registry";import{Command as T,InvalidArgumentError as E}from"commander";import{serve as ae}from"@hono/node-server";import{createHash as oe}from"node:crypto";import{Hono as D}from"hono";import{cors as se}from"hono/cors";import{rateLimiter as ce}from"hono-rate-limiter";import{raw as le}from"hono/html";import{jsx as O,jsxs as k}from"hono/jsx/jsx-runtime";function A(e){return e.option(`--config <path>`,`Path to .logsink.yaml`).option(`--global`,`Use the global log-sink instance`).option(`--instance <scope>`,`Force log-sink instance: local or global`)}function j(e){let t=e.instance?.trim();if(e.global&&t&&t.toLowerCase()!==`global`)throw Error(`Use either --global or --instance local, not both`);return e.global?`global`:t}function M(e,t=p){e.config&&(process.env.LOG_SINK_CONFIG=e.config);let n=j(e);return n&&(process.env.LOG_SINK_INSTANCE=n),m({configPath:e.config,packageName:t})}const ue=[`error`,`fatal`];function de(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return null}}function fe(e){if(e==null)return`unknown`;if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}}function pe(e){return e.hook_event_name===`PostToolUseFailure`?`Current tool failure:\n- Tool: ${e.tool_name??`unknown tool`}\n- Error: ${fe(e.error)}`:null}function me(e,t,n){let r=new Map;for(let t of e){let e=`${t.service}::${t.level}::${t.error_type??``}::${t.error_message??t.message}`,i=new Date(Number(t.created_at)).toISOString();r.has(e)||r.set(e,{key:e,count:0,service:t.service,level:t.level,errorType:t.error_type,errorMessage:t.error_message,message:t.message,firstSeen:i,lastSeen:i,traceIds:new Set,examples:[]});let a=r.get(e);a.count+=1,a.lastSeen=i,t.trace_id&&a.traceIds.add(t.trace_id),a.examples.length<n&&a.examples.push({id:t.id,timestamp:i,traceId:t.trace_id})}return Array.from(r.values()).sort((e,t)=>t.count-e.count||t.lastSeen.localeCompare(e.lastSeen)).slice(0,t)}function he(e,t,n,r){let i=me(e,n,r),a=[];a.push(`Recent log errors (${e.length} new):`),t.tool_name&&a.push(`- Triggered after tool: ${t.tool_name}`);for(let[e,t]of i.entries()){a.push(`${e+1}. ${t.service} [${t.level}] x${t.count} ${t.errorType?`(${t.errorType}) `:``}${t.errorMessage??t.message}`),a.push(` First seen: ${t.firstSeen}`),a.push(` Last seen: ${t.lastSeen}`),t.traceIds.size>0&&a.push(` Trace IDs: ${Array.from(t.traceIds).slice(0,3).join(`, `)}`);for(let e of t.examples)a.push(` Example: ${e.timestamp} id=${e.id}${e.traceId?` trace=${e.traceId}`:``}`)}if(t.hook_event_name===`PostToolUseFailure`){let e=pe(t);e&&a.push(``,e)}return a.join(`
2
+ import{a as e,c as t,d as n,f as r,i,l as a,n as o,o as s,p as c,r as l,s as u,t as d,u as f}from"./stdio-BaJeLeLp.mjs";import{d as p,f as m,p as h,u as g}from"./node-B4HdfM_E.mjs";import{z as _}from"zod";import{existsSync as v,readFileSync as y}from"node:fs";import*as b from"node:fs/promises";import{dirname as x,join as ee}from"node:path";import{fileURLToPath as te}from"node:url";import{DEFAULT_PORT_RANGE as S,DEFAULT_REGISTRY_PATH as ne,PortRegistryService as re,normalizeRepositoryPath as ie}from"@agimon-ai/foundation-port-registry";import{createProcessLease as C,resolveSiblingRegistryPath as w}from"@agimon-ai/foundation-process-registry";import{Command as T,InvalidArgumentError as E}from"commander";import{serve as ae}from"@hono/node-server";import{createHash as oe}from"node:crypto";import{Hono as D}from"hono";import{cors as se}from"hono/cors";import{rateLimiter as ce}from"hono-rate-limiter";import{raw as le}from"hono/html";import{jsx as O,jsxs as k}from"hono/jsx/jsx-runtime";function A(e){return e.option(`--config <path>`,`Path to .logsink.yaml`).option(`--global`,`Use the global log-sink instance`).option(`--instance <scope>`,`Force log-sink instance: local or global`)}function j(e){let t=e.instance?.trim();if(e.global&&t&&t.toLowerCase()!==`global`)throw Error(`Use either --global or --instance local, not both`);return e.global?`global`:t}function M(e,t=p){e.config&&(process.env.LOG_SINK_CONFIG=e.config);let n=j(e);return n&&(process.env.LOG_SINK_INSTANCE=n),m({configPath:e.config,packageName:t})}const ue=[`error`,`fatal`];function de(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return null}}function fe(e){if(e==null)return`unknown`;if(typeof e==`string`)return e;try{return JSON.stringify(e,null,2)}catch{return String(e)}}function pe(e){return e.hook_event_name===`PostToolUseFailure`?`Current tool failure:\n- Tool: ${e.tool_name??`unknown tool`}\n- Error: ${fe(e.error)}`:null}function me(e,t,n){let r=new Map;for(let t of e){let e=`${t.service}::${t.level}::${t.error_type??``}::${t.error_message??t.message}`,i=new Date(Number(t.created_at)).toISOString();r.has(e)||r.set(e,{key:e,count:0,service:t.service,level:t.level,errorType:t.error_type,errorMessage:t.error_message,message:t.message,firstSeen:i,lastSeen:i,traceIds:new Set,examples:[]});let a=r.get(e);a.count+=1,a.lastSeen=i,t.trace_id&&a.traceIds.add(t.trace_id),a.examples.length<n&&a.examples.push({id:t.id,timestamp:i,traceId:t.trace_id})}return Array.from(r.values()).sort((e,t)=>t.count-e.count||t.lastSeen.localeCompare(e.lastSeen)).slice(0,t)}function he(e,t,n,r){let i=me(e,n,r),a=[];a.push(`Recent log errors (${e.length} new):`),t.tool_name&&a.push(`- Triggered after tool: ${t.tool_name}`);for(let[e,t]of i.entries()){a.push(`${e+1}. ${t.service} [${t.level}] x${t.count} ${t.errorType?`(${t.errorType}) `:``}${t.errorMessage??t.message}`),a.push(` First seen: ${t.firstSeen}`),a.push(` Last seen: ${t.lastSeen}`),t.traceIds.size>0&&a.push(` Trace IDs: ${Array.from(t.traceIds).slice(0,3).join(`, `)}`);for(let e of t.examples)a.push(` Example: ${e.timestamp} id=${e.id}${e.traceId?` trace=${e.traceId}`:``}`)}if(t.hook_event_name===`PostToolUseFailure`){let e=pe(t);e&&a.push(``,e)}return a.join(`
3
3
  `)}function ge(e){if(e.session_id?.trim())return ie(h(e.cwd?.trim()||process.cwd()))}async function _e(e,t){let n=j(t);if(t.dbPath){let e=n===`global`?`global`:`local`;return v(t.dbPath)?{dbPath:t.dbPath,scope:e}:void 0}let r={...process.env};t.config&&(r.LOG_SINK_CONFIG=t.config),n&&(r.LOG_SINK_INSTANCE=n);let i=m({configPath:t.config,cwd:e.cwd??process.cwd(),env:r,packageName:p}),a=new re(r.PORT_REGISTRY_PATH??ne);try{let e=await a.getPort({repositoryPath:i.repositoryPath,serviceName:`log-sink-mcp-http`,serviceType:`tool`,environment:r.NODE_ENV||`development`}),t=e.record?.metadata?.dbPath;if(e.success&&typeof t==`string`&&t&&v(t))return{dbPath:t,scope:i.scope}}catch{}return v(i.dbPath)?{dbPath:i.dbPath,scope:i.scope}:void 0}async function ve(e,t,n,r,i,a){let o=e.getSqliteClient(),s=Date.now()-n*60*1e3,c=``;if(t){let e=o.prepare(`
4
4
  SELECT id, created_at
5
5
  FROM logs
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./node-CFha1yzq.cjs`),t=require(`./stdio-D2vdWaab.cjs`);let n=require(`@opentelemetry/api`),r=require(`@opentelemetry/api-logs`);exports.SpanKind=n.SpanKind,exports.SpanStatusCode=n.SpanStatusCode,exports.StdioTransportHandler=t.t,exports.createNodeTelemetry=e.t,exports.createServer=t.n,exports.getLogSinkOtelEndpoint=e.n,exports.log=r.logs,exports.resolveLogSinkOtelEndpoint=e.a,exports.resolveLogSinkPort=e.o,exports.resolveNodeTelemetryEndpoints=e.r,exports.trace=n.trace;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./node-CFha1yzq.cjs`),t=require(`./stdio-CEClGGJy.cjs`);let n=require(`@opentelemetry/api`),r=require(`@opentelemetry/api-logs`);exports.SpanKind=n.SpanKind,exports.SpanStatusCode=n.SpanStatusCode,exports.StdioTransportHandler=t.t,exports.createNodeTelemetry=e.t,exports.createServer=t.n,exports.getLogSinkOtelEndpoint=e.n,exports.log=r.logs,exports.resolveLogSinkOtelEndpoint=e.a,exports.resolveLogSinkPort=e.o,exports.resolveNodeTelemetryEndpoints=e.r,exports.trace=n.trace;
package/dist/index.d.cts CHANGED
@@ -705,7 +705,7 @@ interface LogAggregation {
705
705
  * failures can be warning-level returned errors or INFO-level events with
706
706
  * success=false.
707
707
  */
708
- type AgentIssueCategory = 'tool_failure' | 'api_error' | 'api_refusal' | 'api_retries_exhausted' | 'tool_rejected' | 'log_error';
708
+ type AgentIssueCategory = 'tool_failure' | 'infrastructure_failure' | 'caller_error' | 'expected_failure' | 'page_state' | 'api_error' | 'api_refusal' | 'api_retries_exhausted' | 'tool_rejected' | 'log_error';
709
709
  /**
710
710
  * A single detected agent problem with the context needed to diagnose it.
711
711
  */
package/dist/index.d.mts CHANGED
@@ -705,7 +705,7 @@ interface LogAggregation {
705
705
  * failures can be warning-level returned errors or INFO-level events with
706
706
  * success=false.
707
707
  */
708
- type AgentIssueCategory = 'tool_failure' | 'api_error' | 'api_refusal' | 'api_retries_exhausted' | 'tool_rejected' | 'log_error';
708
+ type AgentIssueCategory = 'tool_failure' | 'infrastructure_failure' | 'caller_error' | 'expected_failure' | 'page_state' | 'api_error' | 'api_refusal' | 'api_retries_exhausted' | 'tool_rejected' | 'log_error';
709
709
  /**
710
710
  * A single detected agent problem with the context needed to diagnose it.
711
711
  */
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{n as e,t}from"./stdio-Bj5GoSEh.mjs";import{a as n,c as r,i,l as a,n as o,o as s,r as c,t as l,u}from"./node-B4HdfM_E.mjs";export{l as SpanKind,o as SpanStatusCode,t as StdioTransportHandler,c as createNodeTelemetry,e as createServer,i as getLogSinkOtelEndpoint,n as log,a as resolveLogSinkOtelEndpoint,u as resolveLogSinkPort,s as resolveNodeTelemetryEndpoints,r as trace};
1
+ import{n as e,t}from"./stdio-BaJeLeLp.mjs";import{a as n,c as r,i,l as a,n as o,o as s,r as c,t as l,u}from"./node-B4HdfM_E.mjs";export{l as SpanKind,o as SpanStatusCode,t as StdioTransportHandler,c as createNodeTelemetry,e as createServer,i as getLogSinkOtelEndpoint,n as log,a as resolveLogSinkOtelEndpoint,u as resolveLogSinkPort,s as resolveNodeTelemetryEndpoints,r as trace};
@@ -0,0 +1,321 @@
1
+ import{d as e,f as t,r as n}from"./node-B4HdfM_E.mjs";import r,{createRequire as i}from"node:module";import{coerceArgs as a,formatZodError as o}from"@agimon-ai/foundation-validator";import{Server as s}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as c,ListToolsRequestSchema as l}from"@modelcontextprotocol/sdk/types.js";import{z as u}from"zod";import{Container as d,ContainerModule as f,inject as p,injectable as m,unmanaged as h}from"inversify";import"reflect-metadata";import{existsSync as g,readFileSync as _}from"node:fs";import v,{mkdir as y,readFile as b,stat as ee,writeFile as te}from"node:fs/promises";import{homedir as ne}from"node:os";import x,{dirname as re,join as S}from"node:path";import{spawn as ie}from"node:child_process";import{fileURLToPath as ae}from"node:url";import{PortRegistryService as oe}from"@agimon-ai/foundation-port-registry";import{ProcessRegistryService as se,resolveSiblingRegistryPath as ce}from"@agimon-ai/foundation-process-registry";import{DatabaseSync as le}from"node:sqlite";import*as ue from"sqlite-vec";import{ulid as de}from"ulidx";import{StdioServerTransport as fe}from"@modelcontextprotocol/sdk/server/stdio.js";const C={LogStorageService:Symbol.for(`LogStorageService`),EmbeddingService:Symbol.for(`EmbeddingService`),LogQueryService:Symbol.for(`LogQueryService`),LogMetricsService:Symbol.for(`LogMetricsService`),LogSearchService:Symbol.for(`LogSearchService`),SemanticSearchService:Symbol.for(`SemanticSearchService`),LogRetentionService:Symbol.for(`LogRetentionService`),HttpServerHealthCheck:Symbol.for(`HttpServerHealthCheck`),HttpServerManager:Symbol.for(`HttpServerManager`),Database:Symbol.for(`Database`),Logger:Symbol.for(`Logger`),HttpServer:Symbol.for(`HttpServer`),McpServer:Symbol.for(`McpServer`)};function pe(e){return e?[`1`,`true`,`yes`,`on`].includes(e.trim().toLowerCase()):!1}function me(e=process.env){return pe(e.LOG_SINK_ENABLE_EMBEDDINGS)}function w(e,t){if(typeof Reflect==`object`&&typeof Reflect.metadata==`function`)return Reflect.metadata(e,t)}function T(e,t){return function(n,r){t(n,r,e)}}function E(e,t,n,r){var i=arguments.length,a=i<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,o;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}var D;function he(){let e=re(i(import.meta.url).resolve(`ruvector-onnx-embeddings-wasm`)),t=S(e,`ruvector_onnx_embeddings_wasm.js`),n=_(t,`utf-8`),a=new r(t);return a.filename=t,a.paths=r._nodeModulePaths(e),a._compile(n,t),a.exports}let O=class{static{D=this}static DEFAULT_MODEL=`all-MiniLM-L6-v2`;static VECTOR_DIMENSION=384;static CACHE_DIR=S(ne(),`.log-sink-mcp`);embedderPromise=null;modelUnavailable=!1;loaderPromise=null;constructor(e){this.storage=e}get modelName(){return process.env.LOG_SINK_EMBEDDING_MODEL??D.DEFAULT_MODEL}isEnabled(){return me()}async loadLoader(){return this.loaderPromise||=import(`ruvector-onnx-embeddings-wasm/loader.js`).catch(e=>{let t=e&&typeof e==`object`&&`code`in e?String(e.code):``,n=e instanceof Error?e.message:String(e);if(t===`ERR_MODULE_NOT_FOUND`||t===`MODULE_NOT_FOUND`||n.includes(`ruvector-onnx`))return null;throw e}),this.loaderPromise}async getEmbedder(){if(this.modelUnavailable)throw Error(`Embedding model is not available locally`);if(!this.isEnabled())throw this.modelUnavailable=!0,Error(`Embedding support is disabled until LOG_SINK_ENABLE_EMBEDDINGS is enabled`);if(!this.embedderPromise){let e=await this.loadLoader();if(!e)throw this.modelUnavailable=!0,Error(`Embedding model support is disabled because ruvector-onnx-embeddings-wasm is not installed`);await y(D.CACHE_DIR,{recursive:!0});let t=he();this.embedderPromise=this.createEmbedderWithCache(e,t).catch(e=>{throw this.embedderPromise=null,this.modelUnavailable=!0,e})}return this.embedderPromise}async createEmbedderWithCache(e,t){let n=this.modelName,r=e.MODELS[n];if(!r)throw Error(`Unknown embedding model: ${n}`);let i=S(D.CACHE_DIR,n),a=S(i,`model.onnx`),o=S(i,`tokenizer.json`),s,c;if(g(a)&&g(o))[s,c]=await Promise.all([b(a).then(e=>new Uint8Array(e)),b(o,`utf-8`)]);else{await y(i,{recursive:!0});let[e,t]=await Promise.all([fetch(r.model).then(e=>{if(!e.ok)throw Error(`Failed to download model: ${e.status}`);return e.arrayBuffer()}),fetch(r.tokenizer).then(e=>{if(!e.ok)throw Error(`Failed to download tokenizer: ${e.status}`);return e.text()})]);s=new Uint8Array(e),c=t,await Promise.all([te(a,s),te(o,c)])}let l=new t.WasmEmbedderConfig().setMaxLength(r.maxLength).setNormalize(!0).setPooling(0);return t.WasmEmbedder.withConfig(s,c,l)}async isAvailable(){if(this.modelUnavailable)return!1;try{return await this.getEmbedder(),!0}catch{return!1}}buildEmbeddingText(e){let t=e.metadata&&typeof e.metadata==`object`?JSON.stringify(e.metadata):e.metadata??``;return[`service: ${e.service}`,`level: ${e.level}`,`message: ${e.message}`,e.errorType?`errorType: ${e.errorType}`:null,e.errorMessage?`errorMessage: ${e.errorMessage}`:null,t?`metadata: ${t}`:null].filter(Boolean).join(`
2
+ `)}normalizeVector(e){let t=Math.sqrt(e.reduce((e,t)=>e+t*t,0));return t===0?e:e.map(e=>e/t)}toVector(e){if(e instanceof Float32Array||e instanceof Float64Array)return Array.from(e);if(Array.isArray(e)&&e.length>0&&typeof e[0]==`number`)return e;if(Array.isArray(e)&&e.length>0&&Array.isArray(e[0]))return e[0];throw Error(`Unexpected embedding output shape`)}async embedText(e){let t=await this.getEmbedder(),n=this.normalizeVector(this.toVector(t.embedOne(e)));if(n.length!==D.VECTOR_DIMENSION)throw Error(`Unexpected embedding dimension ${n.length}, expected ${D.VECTOR_DIMENSION}`);return n}async indexLogs(e){if(e.length!==0)try{let t=[];for(let n of e)t.push({log:n,embedding:await this.embedText(this.buildEmbeddingText(n))});let n=this.storage.getSqliteClient(),r=n.prepare(`
3
+ INSERT INTO log_embeddings (log_id, embedding, service, level, created_at)
4
+ VALUES (?, vec_f32(?), ?, ?, ?)
5
+ ON CONFLICT(log_id) DO UPDATE SET
6
+ embedding = excluded.embedding,
7
+ service = excluded.service,
8
+ level = excluded.level,
9
+ created_at = excluded.created_at
10
+ `);n.exec(`BEGIN`);try{for(let e of t)r.run(e.log.id,new Uint8Array(new Float32Array(e.embedding).buffer),e.log.service,e.log.level,Math.floor(e.log.createdAt.getTime()/1e3));n.exec(`COMMIT`)}catch(e){throw n.exec(`ROLLBACK`),e}}catch(e){console.warn(`Skipping semantic embedding indexing: ${e instanceof Error?e.message:String(e)}`)}}};O=D=E([m(),T(0,p(C.LogStorageService)),w(`design:paramtypes`,[Object])],O);let k=class{defaultTimeout=5e3;async check(e,t=this.defaultTimeout){try{let n=`http://localhost:${e}/health`,r=new AbortController,i=setTimeout(()=>r.abort(),t);try{let t=await fetch(n,{signal:r.signal,headers:{"Content-Type":`application/json`}});if(clearTimeout(i),!t.ok)return{healthy:!1,error:`HTTP error ${t.status}: ${t.statusText}`};let a=await t.json();return a.status===`healthy`?{healthy:!0,port:e,serviceName:a.serviceName??a.service}:{healthy:!1,error:`Unexpected health status: ${a.status||`unknown`}`}}catch(e){return clearTimeout(i),e instanceof Error?e.name===`AbortError`?{healthy:!1,error:`Health check timed out after ${t}ms`}:`code`in e&&e.code===`ECONNREFUSED`?{healthy:!1,error:`Connection refused - server not running`}:{healthy:!1,error:`Network error: ${e.message}`}:{healthy:!1,error:`Unknown error: ${String(e)}`}}}catch(e){return{healthy:!1,error:e instanceof Error?e.message:String(e)}}}};k=E([m()],k);const ge=ae(import.meta.url),A=x.dirname(ge);let j=class{repositoryPath;environment;serviceName=`log-sink-mcp-http`;serviceType=`tool`;host=`127.0.0.1`;defaultPort;defaultDbPath;registryPath;portRegistry;processRegistry;constructor(n,r,i){this.healthCheck=n;let a=t({cwd:r?x.resolve(r):process.cwd(),packageName:e});this.repositoryPath=a.repositoryPath,this.defaultPort=a.port,this.defaultDbPath=a.dbPath,this.environment=process.env.NODE_ENV||`development`,this.registryPath=i||process.env.PORT_REGISTRY_PATH,this.portRegistry=new oe(this.registryPath),this.processRegistry=new se(ce(this.registryPath,`processes.json`))}async getRegistration(){let e=await this.portRegistry.getPort({repositoryPath:this.repositoryPath,serviceName:this.serviceName,serviceType:this.serviceType,environment:this.environment});return!e.success||!e.record?null:{port:e.record.port,pid:e.record.pid,environment:e.record.environment??this.environment,host:e.record.host,metadata:e.record.metadata}}async releaseService(e){let t=await this.portRegistry.releasePort({repositoryPath:this.repositoryPath,serviceName:this.serviceName,serviceType:this.serviceType,environment:this.environment,...e?{pid:e}:{}});if(!t.success&&!t.error?.includes(`No matching registry entry`))throw Error(t.error||`Failed to release registry entry`)}async releaseProcess(e){let t=await this.processRegistry.releaseProcess({repositoryPath:this.repositoryPath,serviceName:this.serviceName,serviceType:this.serviceType,environment:this.environment,...e?{pid:e}:{},kill:!1,releasePort:!1});if(!t.success&&!t.error?.includes(`No matching process entry`))throw Error(t.error||`Failed to release process entry`)}async findAvailablePort(e){let t=await this.portRegistry.findAvailablePort({repositoryPath:this.repositoryPath,serviceName:this.serviceName,serviceType:this.serviceType,environment:this.environment,host:this.host,...e===void 0?{}:{preferredPort:e}});if(!t.success||!t.port)throw Error(e===void 0?`No available port found in registry range: ${t.error}`:`No available port found from ${e}: ${t.error}`);return t.port}async fileExists(e){try{return await v.access(e),!0}catch{return!1}}async startHttpServer(e,t){let n=[x.resolve(A,`cli.mjs`),x.resolve(A,`..`,`dist`,`cli.mjs`),x.resolve(A,`..`,`..`,`dist`,`cli.mjs`)],r=[x.resolve(A,`..`,`cli.ts`),x.resolve(A,`..`,`..`,`src`,`cli.ts`)],i;for(let e of n)if(await this.fileExists(e)){i=e;break}let a;if(!i){for(let e of r)if(await this.fileExists(e)){a=e;break}}let o,s;if(i)o=process.execPath,s=[i,`http-serve`,`--port`,e.toString()];else if(a)o=process.execPath,s=[`--import`,`tsx`,a,`http-serve`,`--port`,e.toString()];else throw Error(`Cannot find log-sink MCP CLI in any expected location`);let c=x.resolve(t);await v.mkdir(x.dirname(c),{recursive:!0});let l=ie(o,[...s,`--db-path`,c],{detached:!0,stdio:`ignore`,env:{...process.env,...this.registryPath?{PORT_REGISTRY_PATH:this.registryPath}:{},NODE_ENV:this.environment}});l.unref();let u=l.pid;if(!u)throw Error(`Failed to spawn HTTP server - no PID returned`);return u}async waitForRegisteredService(e,t,n=10,r=250){for(let i=0;i<n;i+=1){let n=await this.getRegistration();if(n?.pid===t&&n.port===e)return n;await new Promise(e=>setTimeout(e,r))}return null}async waitForServerStartup(e=4e3){await new Promise(t=>setTimeout(t,e))}async killProcess(e){try{process.kill(e,0),process.kill(e,`SIGTERM`),await new Promise(e=>setTimeout(e,1e3));try{process.kill(e,0),process.kill(e,`SIGKILL`)}catch{}}catch{}}async ensureRunning(e=this.defaultPort,t=this.defaultDbPath){try{let n=await this.getRegistration();if(n){let e=await this.healthCheck.check(n.port);if(e.healthy&&e.serviceName===this.serviceName)return{running:!0,port:n.port,pid:n.pid};n.pid&&await this.killProcess(n.pid),await this.releaseProcess(n.pid),await this.releaseService(n.pid)}let r=e;for(let e=0;e<3;e+=1){let e=await this.findAvailablePort(r),n=await this.startHttpServer(e,t);await this.waitForServerStartup();let i=await this.healthCheck.check(e);if(!i.healthy||i.serviceName!==this.serviceName){await this.killProcess(n),await this.releaseProcess(n),await this.releaseService(n),r=e+1;continue}if(!await this.waitForRegisteredService(e,n)){await this.killProcess(n),await this.releaseProcess(n),await this.releaseService(n),r=e+1;continue}return{running:!0,port:e,pid:n}}return{running:!1,error:`Failed to start log-sink-mcp HTTP server after retries`}}catch(e){return{running:!1,error:e instanceof Error?e.message:String(e)}}}async stop(){try{let e=await this.getRegistration();if(!e)return!1;try{if(e.pid&&process.kill(e.pid,`SIGTERM`),await new Promise(e=>setTimeout(e,1e3)),e.pid)try{process.kill(e.pid,0),process.kill(e.pid,`SIGKILL`)}catch{}}catch{}return await this.releaseProcess(e.pid),await this.releaseService(e.pid),!0}catch(e){throw Error(`Failed to stop HTTP server: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}startHealthMonitor(e,t=1e4){let n=!1,r=0,i=2e3,a=6e4,o=async()=>{if(!n)try{if((await this.getStatus()).running)r=0,n||setTimeout(()=>void o(),t);else{r++;let t=Math.min(i*2**(r-1),a);await this.ensureRunning(void 0,e),n||setTimeout(()=>void o(),t)}}catch{r++;let e=Math.min(i*2**(r-1),a);n||setTimeout(()=>void o(),e)}};return setTimeout(()=>void o(),t),()=>{n=!0}}async getStatus(){try{let e=await this.getRegistration();if(!e)return{running:!1,error:`No HTTP server registered`};let t=await this.healthCheck.check(e.port);return t.healthy&&t.serviceName===this.serviceName?{running:!0,port:e.port,pid:e.pid}:{running:!1,port:e.port,pid:e.pid,error:t.error}}catch(e){return{running:!1,error:e instanceof Error?e.message:String(e)}}}};j=E([m(),T(0,p(C.HttpServerHealthCheck)),T(1,h()),T(2,h()),w(`design:paramtypes`,[Object,String,String])],j);const M=`
11
+ id, timestamp, level, message, trace_id, span_id, parent_span_id,
12
+ service, hostname, pid, metadata, error_type, error_message, error_stack,
13
+ session_id, workflow_run_id, workflow_name, job_name, job_id, agent_name,
14
+ parent_session_id, workflow_run_key, workflow_id, workflow_workspace,
15
+ step_name, phase, signal_type, duration_ms, created_at
16
+ `;function N(e){return e}let P=class{constructor(e){this.storage=e}async getSqlite(){return await this.storage.ensureInitialized(),this.storage.getSqliteClient()}mapRow(e){return{id:e.id,timestamp:new Date(Number(e.timestamp)),level:e.level,message:e.message,traceId:e.trace_id,spanId:e.span_id,parentSpanId:e.parent_span_id,service:e.service,hostname:e.hostname,pid:e.pid,metadata:e.metadata?JSON.parse(e.metadata):null,errorType:e.error_type,errorMessage:e.error_message,errorStack:e.error_stack,sessionId:e.session_id,workflowRunId:e.workflow_run_id,workflowName:e.workflow_name,jobName:e.job_name,jobId:e.job_id,agentName:e.agent_name,parentSessionId:e.parent_session_id,workflowRunKey:e.workflow_run_key,workflowId:e.workflow_id,workflowWorkspace:e.workflow_workspace,stepName:e.step_name,phase:e.phase,signalType:e.signal_type??`log`,durationMs:e.duration_ms,createdAt:new Date(Number(e.created_at))}}buildWhereClause(e){let t=`WHERE 1 = 1`,n=[];if(e.level){let r=Array.isArray(e.level)?e.level:[e.level];t+=` AND level IN (${r.map(()=>`?`).join(`,`)})`,n.push(...r)}if(e.service){let r=Array.isArray(e.service)?e.service:[e.service];t+=` AND service IN (${r.map(()=>`?`).join(`,`)})`,n.push(...r)}return e.traceId&&(t+=` AND trace_id = ?`,n.push(e.traceId)),e.spanId&&(t+=` AND span_id = ?`,n.push(e.spanId)),`errorType`in e&&e.errorType&&(t+=` AND error_type = ?`,n.push(e.errorType)),e.sessionId&&(t+=` AND session_id = ?`,n.push(e.sessionId)),e.workflowRunId&&(t+=` AND workflow_run_id = ?`,n.push(e.workflowRunId)),e.workflowName&&(t+=` AND workflow_name = ?`,n.push(e.workflowName)),e.jobName&&(t+=` AND job_name = ?`,n.push(e.jobName)),e.jobId&&(t+=` AND job_id = ?`,n.push(e.jobId)),e.agentName&&(t+=` AND agent_name = ?`,n.push(e.agentName)),`parentSessionId`in e&&e.parentSessionId&&(t+=` AND parent_session_id = ?`,n.push(e.parentSessionId)),e.workflowRunKey&&(t+=` AND workflow_run_key = ?`,n.push(e.workflowRunKey)),`workflowId`in e&&e.workflowId&&(t+=` AND workflow_id = ?`,n.push(e.workflowId)),e.workflowWorkspace&&(t+=` AND workflow_workspace = ?`,n.push(e.workflowWorkspace)),e.stepName&&(t+=` AND step_name = ?`,n.push(e.stepName)),e.phase&&(t+=` AND phase = ?`,n.push(e.phase)),`signalType`in e&&e.signalType&&(t+=` AND COALESCE(signal_type, 'log') = ?`,n.push(e.signalType)),e.startTime&&(t+=` AND timestamp >= ?`,n.push(e.startTime.getTime())),e.endTime&&(t+=` AND timestamp <= ?`,n.push(e.endTime.getTime())),{whereSql:t,params:n}}async filterByLevel(e,t=100){try{let n=await this.getSqlite(),{whereSql:r,params:i}=this.buildWhereClause({level:e});return N(n.prepare(`
17
+ SELECT ${M}
18
+ FROM logs
19
+ ${r}
20
+ ORDER BY timestamp DESC
21
+ LIMIT ?
22
+ `).all(...i,t)).map(e=>this.mapRow(e))}catch(e){throw Error(`Failed to filter by level: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async filterByTrace(e){try{return N((await this.getSqlite()).prepare(`
23
+ SELECT ${M}
24
+ FROM logs
25
+ WHERE trace_id = ?
26
+ ORDER BY timestamp ASC
27
+ `).all(e)).map(e=>this.mapRow(e))}catch(e){throw Error(`Failed to filter by trace: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async filterByTimeRange(e,t){try{return N((await this.getSqlite()).prepare(`
28
+ SELECT ${M}
29
+ FROM logs
30
+ WHERE timestamp >= ? AND timestamp <= ?
31
+ ORDER BY timestamp ASC
32
+ `).all(e.getTime(),t.getTime())).map(e=>this.mapRow(e))}catch(e){throw Error(`Failed to filter by time range: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async filterByService(e){try{let t=await this.getSqlite(),n=Array.isArray(e)?e:[e];return N(t.prepare(`
33
+ SELECT ${M}
34
+ FROM logs
35
+ WHERE service IN (${n.map(()=>`?`).join(`,`)})
36
+ ORDER BY timestamp ASC
37
+ `).all(...n)).map(e=>this.mapRow(e))}catch(e){throw Error(`Failed to filter by service: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async filterByColumn(e,t,n=1e3){try{return N((await this.getSqlite()).prepare(`
38
+ SELECT ${M}
39
+ FROM logs
40
+ WHERE ${e} = ?
41
+ ORDER BY timestamp ASC
42
+ LIMIT ?
43
+ `).all(t,n)).map(e=>this.mapRow(e))}catch(t){throw Error(`Failed to filter by ${e}: ${t instanceof Error?t.message:String(t)}`,{cause:t})}}async filterBySession(e,t=1e3){return this.filterByColumn(`session_id`,e,t)}async filterByWorkflowRun(e,t=1e3){return this.filterByColumn(`workflow_run_id`,e,t)}async filterByWorkflowName(e,t=1e3){return this.filterByColumn(`workflow_name`,e,t)}classifyAgentIssue(e){let t=e.metadata??{},n=e.message??``,r=e=>e==null?null:String(e),i=r(t.tool_name)??r(t[`tool.name`]),a=r(t.error_type)??e.errorType,o=r(t.status_code),s=r(t.model),c=t.success,l=t[`tool.result.error`],u=c===!1||c===`false`||l===!0||l===`true`,d=r(t.decision),f=r(t[`browse_tool.error.category`]),p=null,m=null;if(f===`caller_validation`||f===`caller_execution`?(p=`caller_error`,m=r(t[`error.message`])??e.errorMessage):f===`spec_failure`?(p=`expected_failure`,m=r(t[`error.message`])??e.errorMessage):f===`page_state`?(p=`page_state`,m=r(t[`error.message`])??e.errorMessage):f===`infrastructure_failure`?(p=`infrastructure_failure`,m=r(t[`error.message`])??e.errorMessage):n.includes(`api_error`)?(p=`api_error`,m=r(t.error)??e.errorMessage):n.includes(`api_retries_exhausted`)?(p=`api_retries_exhausted`,m=r(t.error)):n.includes(`api_refusal`)?(p=`api_refusal`,m=r(t.category)??r(t.reason)):(n.includes(`tool_result`)||n.includes(`tool error`))&&u?(p=`tool_failure`,m=r(t.tool_input)??r(t.error)??e.errorMessage):n.includes(`tool_decision`)&&d===`reject`?(p=`tool_rejected`,m=r(t.source)):(e.level===`error`||e.level===`fatal`||e.errorType)&&(p=`log_error`,m=e.errorMessage??n),!p)return null;let h=(m??n).toLowerCase().replace(/[0-9a-f]{8}-[0-9a-f-]{27,}/g,`<id>`).replace(/\b\d+\b/g,`<n>`).slice(0,300),g=[p,e.service,i??``,a??``,h].join(`|`);return{category:p,timestamp:e.timestamp,level:e.level,message:n,service:e.service,sessionId:e.sessionId,workflowRunId:e.workflowRunId,workflowName:e.workflowName,jobName:e.jobName,jobId:e.jobId,agentName:e.agentName,stepName:e.stepName,tool:i,errorType:a,statusCode:o,model:s,detail:m?m.slice(0,500):null,traceId:e.traceId,spanId:e.spanId,fingerprint:g,occurrenceCount:1}}async analyzeAgentIssues(e={},t={}){try{let n=await this.getSqlite(),r=t.scanLimit??5e4,i=t.sampleLimit??100,{whereSql:a,params:o}=this.buildWhereClause({...e,signalType:`log`}),s=N(n.prepare(`
44
+ SELECT ${M}
45
+ FROM logs
46
+ ${a}
47
+ ORDER BY timestamp DESC
48
+ LIMIT ?
49
+ `).all(...o,r)),c=n.prepare(`SELECT COUNT(*) AS count FROM logs ${a}`).get(...o)?.count??s.length,l={},u={},d={},f={},p=[],m=new Map;for(let e of s){let t=this.classifyAgentIssue(this.mapRow(e));if(!t)continue;l[t.category]=(l[t.category]??0)+1,t.tool&&(u[t.tool]=(u[t.tool]??0)+1),t.errorType&&(d[t.errorType]=(d[t.errorType]??0)+1),t.sessionId&&(f[t.sessionId]=(f[t.sessionId]??0)+1),p.push(t);let n=`${t.traceId??t.sessionId??t.workflowRunId??`global`}|${t.fingerprint}`,r=m.get(n);r?r.occurrenceCount+=1:m.set(n,t)}return{scanned:s.length,matchingLogs:c,truncated:s.length<c,coveragePercent:c===0?100:Math.round(s.length/c*1e4)/100,oldestScannedTimestamp:s.length>0?new Date(Number(s[s.length-1].timestamp)):null,totalIssues:p.length,uniqueIncidents:m.size,byCategory:l,byTool:u,byErrorType:d,bySession:f,issues:[...m.values()].slice(0,i)}}catch(e){throw Error(`Failed to analyze agent issues: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async filterByJob(e,t=1e3){return this.filterByColumn(`job_name`,e,t)}async getTraceTimeline(e){try{let t=await this.filterByTrace(e),n=[];for(let e=0;e<t.length;e+=1){let r=t[e];n.push({timestamp:r.timestamp,service:r.service,spanId:r.spanId??null,parentSpanId:r.parentSpanId??null,level:r.level,message:r.message,duration:r.durationMs??void 0,signalType:r.signalType??`log`})}return n}catch(e){throw Error(`Failed to get trace timeline: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async getStatistics(e,t=`both`,n=`log`){try{let r=await this.getSqlite(),i=[],a=[];e&&(i.push(`timestamp >= ? AND timestamp <= ?`),a.push(e.start.getTime(),e.end.getTime())),n!==`all`&&(i.push(`COALESCE(signal_type, 'log') = ?`),a.push(n));let o=i.length>0?`WHERE ${i.join(` AND `)}`:``,s=`service, level, COUNT(*) as count`,c=`GROUP BY service, level`;return t===`level`?(s=`'' as service, level, COUNT(*) as count`,c=`GROUP BY level`):t===`service`?(s=`service, '' as level, COUNT(*) as count`,c=`GROUP BY service`):t===`agent`?(s=`COALESCE(agent_name, 'unknown') as service, '' as level, COUNT(*) as count`,c=`GROUP BY COALESCE(agent_name, 'unknown')`):t===`workflow`?(s=`COALESCE(workflow_name, workflow_id, 'unknown') as service, '' as level, COUNT(*) as count`,c=`GROUP BY COALESCE(workflow_name, workflow_id, 'unknown')`):t===`job`?(s=`COALESCE(job_name, 'unknown') as service, '' as level, COUNT(*) as count`,c=`GROUP BY COALESCE(job_name, 'unknown')`):t===`signal`&&(s=`COALESCE(signal_type, 'log') as service, '' as level, COUNT(*) as count`,c=`GROUP BY COALESCE(signal_type, 'log')`),N(r.prepare(`
50
+ SELECT ${s}
51
+ FROM logs
52
+ ${o}
53
+ ${c}
54
+ `).all(...a)).map(e=>({service:e.service,level:e.level,count:Number(e.count)}))}catch(e){throw Error(`Failed to get statistics: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async getActiveServices(){try{return N((await this.getSqlite()).prepare(`SELECT DISTINCT service FROM logs ORDER BY service ASC`).all()).map(e=>e.service)}catch(e){throw Error(`Failed to get active services: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async countByLevel(e){try{let t=await this.getSqlite(),n=Array.isArray(e)?e:[e],r=t.prepare(`
55
+ SELECT COUNT(*) as count
56
+ FROM logs
57
+ WHERE level IN (${n.map(()=>`?`).join(`,`)})
58
+ `).all(...n);return Number(N(r)[0]?.count??0)}catch(e){throw Error(`Failed to count by level: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async countByService(e){try{let t=await this.getSqlite(),n=Array.isArray(e)?e:[e],r=t.prepare(`
59
+ SELECT COUNT(*) as count
60
+ FROM logs
61
+ WHERE service IN (${n.map(()=>`?`).join(`,`)})
62
+ `).all(...n);return Number(N(r)[0]?.count??0)}catch(e){throw Error(`Failed to count by service: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async countByTrace(e){try{let t=N((await this.getSqlite()).prepare(`SELECT COUNT(*) as count FROM logs WHERE trace_id = ?`).all(e));return Number(t[0]?.count??0)}catch(e){throw Error(`Failed to count by trace: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async queryLogs(e){try{let t=await this.getSqlite(),{order:n=`desc`,limit:r=25,offset:i=0,...a}=e,o=n===`asc`?`ASC`:`DESC`,{whereSql:s,params:c}=this.buildWhereClause(a),l=N(t.prepare(`
63
+ SELECT COUNT(*) as count
64
+ FROM logs
65
+ ${s}
66
+ `).all(...c));return{logs:N(t.prepare(`
67
+ SELECT ${M}
68
+ FROM logs
69
+ ${s}
70
+ ORDER BY timestamp ${o}
71
+ LIMIT ?
72
+ OFFSET ?
73
+ `).all(...c,r,i)).map(e=>this.mapRow(e)),total:Number(l[0]?.count??0)}}catch(e){throw Error(`Failed to query logs: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}};P=E([m(),T(0,p(C.LogStorageService)),w(`design:paramtypes`,[Object])],P);const _e=[`gen_ai.usage.input_tokens`,`gen_ai.usage.prompt_tokens`,`llm.usage.input_tokens`,`input_tokens`,`prompt_tokens`,`usage.input_tokens`,`usage.prompt_tokens`,`response.usage.input_tokens`,`response.usage.prompt_tokens`,`usageMetadata.promptTokenCount`,`promptTokenCount`],ve=[`gen_ai.usage.output_tokens`,`gen_ai.usage.completion_tokens`,`llm.usage.output_tokens`,`output_tokens`,`completion_tokens`,`usage.output_tokens`,`usage.completion_tokens`,`response.usage.output_tokens`,`response.usage.completion_tokens`,`usageMetadata.candidatesTokenCount`,`candidatesTokenCount`],ye=[`gen_ai.usage.total_tokens`,`llm.usage.total_tokens`,`total_tokens`,`usage.total_tokens`,`response.usage.total_tokens`,`usageMetadata.totalTokenCount`,`totalTokenCount`],be=[`gen_ai.usage.cache_read.input_tokens`,`gen_ai.usage.cache_creation.input_tokens`,`input_tokens_details.cached_tokens`,`usage.input_tokens_details.cached_tokens`,`response.usage.input_tokens_details.cached_tokens`,`usage.metadata.cached_tokens`,`metadata.cached_tokens`,`cached_tokens`],xe=[`gen_ai.usage.reasoning.output_tokens`,`output_tokens_details.reasoning_tokens`,`usage.output_tokens_details.reasoning_tokens`,`response.usage.output_tokens_details.reasoning_tokens`,`usage.metadata.reasoning_tokens`,`metadata.reasoning_tokens`,`reasoning_tokens`],Se=[`model_proxy.model`,`gen_ai.response.model`,`gen_ai.request.model`,`llm.response.model`,`llm.request.model`,`response.model`,`model`,`modelVersion`,`requestedModel`],Ce=[`model_proxy.provider`,`gen_ai.system`,`llm.provider`,`provider`,`provider_name`,`model_provider`];function F(e){if(typeof e!=`string`)return e;let t=e.trim();if(!t||t[0]!==`{`&&t[0]!==`[`)return e;try{return JSON.parse(t)}catch{return e}}function we(e,t){let n=F(e);if(!n||typeof n!=`object`||Array.isArray(n))return;let r=n[t];if(r!==void 0)return F(r);let i=n;for(let e of t.split(`.`))if(i=F(i),!i||typeof i!=`object`||Array.isArray(i)||(i=i[e],i===void 0))return;return F(i)}function Te(e,t){for(let n of t){let t=we(e,n);if(t!=null&&t!==``)return t}}function Ee(e){if(typeof e==`number`&&Number.isFinite(e))return Math.max(0,e);if(typeof e==`bigint`)return Number(e);if(typeof e==`string`){let t=Number(e);if(Number.isFinite(t))return Math.max(0,t)}return null}function I(e,t){return Ee(Te(e,t))}function De(e,t){let n=Te(e,t);return typeof n==`string`&&n.trim().length>0?n.trim():typeof n==`number`||typeof n==`boolean`?String(n):null}function Oe(e){let t=I(e,_e),n=I(e,ve),r=I(e,ye),i=I(e,be),a=I(e,xe),o=t??0,s=n??0;return{inputTokens:o,outputTokens:s,totalTokens:r??o+s,cachedInputTokens:i??0,reasoningOutputTokens:a??0,hasUsage:t!==null||n!==null||r!==null||i!==null||a!==null}}function ke(e){return{model:De(e,Se),provider:De(e,Ce)}}function Ae(e){let t=e.toLowerCase();return t.includes(`gen_ai.usage`)||t.includes(`llm.usage`)||/(^|[._-])(input|output|prompt|completion|total|cached|reasoning|candidates?)_?tokens?($|[._-])/.test(t)||/(^|[._-])(prompt|candidates|total)tokencount($|[._-])/.test(t)}function je(e){return Ee(e)!==null}function Me(e){return e}function Ne(e){if(!e)return{};try{let t=JSON.parse(e);return t&&typeof t==`object`&&!Array.isArray(t)?t:{}}catch{return{}}}function Pe(e){let t=Oe(e);return{inputTokens:t.inputTokens,outputTokens:t.outputTokens,totalTokens:t.totalTokens,cachedInputTokens:t.cachedInputTokens,reasoningOutputTokens:t.reasoningOutputTokens,usageEventCount:+!!t.hasUsage,hasUsage:t.hasUsage}}function Fe(){return{inputTokens:0,outputTokens:0,totalTokens:0,cachedInputTokens:0,reasoningOutputTokens:0,usageEventCount:0}}function Ie(e,t){e.inputTokens+=t.inputTokens,e.outputTokens+=t.outputTokens,e.totalTokens+=t.totalTokens,e.cachedInputTokens+=t.cachedInputTokens,e.reasoningOutputTokens+=t.reasoningOutputTokens,e.usageEventCount+=t.usageEventCount}function L(e,t){t&&(e[t]=(e[t]??0)+1)}function R(e){return e?(Array.isArray(e)?e:[e]).flatMap(e=>e.split(`,`)).map(e=>e.trim()).filter(e=>e.length>0):[]}function Le(e,t){return t.length===0||e!==null&&t.includes(e)}function Re(e){return Math.round(e*100)/100}function z(e,t){if(e.length===0)return 0;let n=[...e].sort((e,t)=>e-t);return n[Math.min(n.length-1,Math.max(0,Math.ceil(n.length*t)-1))]??0}function ze(e){let t=e.map(e=>e.inputTokens),n=e.map(e=>e.outputTokens),r=e.map(e=>e.totalTokens),i=e=>e.reduce((e,t)=>e+t,0),a=e=>e.length===0?0:Re(i(e)/e.length);return{samples:e.length,avgInputTokens:a(t),p50InputTokens:z(t,.5),p90InputTokens:z(t,.9),avgOutputTokens:a(n),p50OutputTokens:z(n,.5),p90OutputTokens:z(n,.9),avgTotalTokens:a(r),p50TotalTokens:z(r,.5),p90TotalTokens:z(r,.9)}}function Be(e,t){return t===0?100:Re(e/t*100)}function Ve(e){return e.endsWith(`.tool_token_sample`)}function B(e,...t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim().length>0)return t.trim();if(typeof t==`number`||typeof t==`boolean`)return String(t)}return null}function He(e){let t=e.metadata,n=e.raw.message??``,r=B(t,`error_type`)??e.raw.error_type,i=t.success,a=t[`tool.result.error`],o=i===!1||i===`false`||a===!0||a===`true`,s=B(t,`decision`),c=B(t,`browse_tool.error.category`);return c===`caller_validation`||c===`caller_execution`?`caller_error`:c===`spec_failure`?`expected_failure`:c===`page_state`?`page_state`:c===`infrastructure_failure`?`infrastructure_failure`:n.includes(`api_error`)?`api_error`:n.includes(`api_retries_exhausted`)?`api_retries_exhausted`:n.includes(`api_refusal`)?`api_refusal`:(n.includes(`tool_result`)||n.includes(`tool error`))&&o?`tool_failure`:n.includes(`tool_decision`)&&s===`reject`?`tool_rejected`:e.raw.level===`error`||e.raw.level===`fatal`||r?`log_error`:null}function Ue(e,t){return e.message!==`Selected LLM provider`&&e.message!==`LLM provider attempt failed`?null:B(t,`tool`)}function We(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,` `)}function Ge(e,t){let n=t===`job`?`workflow.job.finished`:`workflow.run.finished`;if(e.raw.message!==n)return!1;let r=t===`job`?`workflow.job.outcome`:`workflow.outcome`;return B(e.metadata,r)===`failed`}let V=class{constructor(e){this.storage=e}async getMetrics(e={},t={}){await this.storage.ensureInitialized();let n=this.storage.getSqliteClient(),r=R(e.model),i=R(e.provider),{whereSql:a,params:o}=this.buildWhereClause(e),s=Me(n.prepare(`
74
+ SELECT
75
+ id, timestamp, level, message, service, metadata, error_type, error_message,
76
+ session_id, workflow_run_id, workflow_name, job_name, job_id, agent_name,
77
+ workflow_run_key, workflow_id, workflow_workspace, step_name, phase,
78
+ signal_type, duration_ms
79
+ FROM logs
80
+ ${a}
81
+ ORDER BY timestamp ASC
82
+ `).all(...o)),c=new Map;for(let e of s)if(e.workflow_run_key&&e.workflow_run_id){let t=c.get(e.workflow_run_key)??new Set;t.add(e.workflow_run_id),c.set(e.workflow_run_key,t)}let l=new Map,u=new Map;for(let e of s)e.workflow_run_id&&(e.message===`workflow.run.started`||e.message===`workflow.run.finished`)&&e.workflow_name&&(l.set(e.workflow_run_id,e.workflow_name),u.set(We(e.workflow_name),e.workflow_name));let d=s.map(e=>{let t=Ne(e.metadata),n=ke(t),r=Pe(t),i=e.workflow_run_key?c.get(e.workflow_run_key):void 0,a=e.workflow_run_id??(i?.size===1?[...i][0]:void 0)??null,o=(a?l.get(a):void 0)??(e.workflow_name?u.get(We(e.workflow_name))??e.workflow_name:null);return{raw:{...e,workflow_run_id:a,workflow_name:o},timestamp:new Date(Number(e.timestamp)),metadata:t,model:n.model,provider:n.provider??Ue(e,t),tokenUsage:r,hasUsage:r.hasUsage}}).filter(t=>(!e.workflowName||t.raw.workflow_name===e.workflowName)&&Le(t.model,r)&&Le(t.provider,i)),f=t.groupBy??`workflow-run`,p=t.sort??`last-seen`,m=t.toolSort??`p90-total-tokens`,h=t.limit??50,g=t.toolLimit??20,_=this.buildGroups(d,f),v=this.sortGroups(_,p),y=this.buildToolRows(d),b=this.sortToolRows(y,m),ee=this.buildTotals(_);return{generatedAt:new Date,groupBy:f,sort:p,toolSort:m,filters:{startTime:e.startTime?.toISOString(),endTime:e.endTime?.toISOString(),workflowRunId:e.workflowRunId,workflowName:e.workflowName,jobName:e.jobName,agentName:e.agentName,service:R(e.service),model:r,provider:i},totals:{...ee,returnedGroups:Math.min(v.length,h)},groups:v.slice(0,h),tools:{returnedTools:Math.min(b.length,g),rows:b.slice(0,g)}}}buildWhereClause(e){let t=`WHERE 1 = 1`,n=[],r=(e,r)=>{r&&(t+=` AND ${e} = ?`,n.push(r))},i=R(e.service);return i.length>0&&(t+=` AND service IN (${i.map(()=>`?`).join(`,`)})`,n.push(...i)),r(`session_id`,e.sessionId),r(`workflow_run_id`,e.workflowRunId),r(`job_name`,e.jobName),r(`job_id`,e.jobId),r(`agent_name`,e.agentName),r(`workflow_run_key`,e.workflowRunKey),r(`workflow_workspace`,e.workflowWorkspace),r(`step_name`,e.stepName),r(`phase`,e.phase),e.startTime&&(t+=` AND timestamp >= ?`,n.push(e.startTime.getTime())),e.endTime&&(t+=` AND timestamp <= ?`,n.push(e.endTime.getTime())),{whereSql:t,params:n}}buildGroups(e,t){let n=new Map;for(let r of e){let e=this.groupKey(r,t),i=n.get(e);i||(i=this.createGroup(e,r),n.set(e,i)),this.addRowToGroup(i,r,t)}return[...n.values()].map(e=>this.clearAmbiguousContext({...e,tokenCoveragePercent:e.usageEventCount>0?100:0},t))}groupKey(e,t){switch(t){case`workflow-name`:return e.raw.workflow_name??e.raw.workflow_id??`unknown`;case`job`:return[e.raw.workflow_run_id??e.raw.workflow_run_key??e.raw.workflow_name??`unknown`,e.raw.job_name??`unknown`].join(` / `);case`agent`:return e.raw.agent_name??e.raw.service??`unknown`;case`model`:return e.model??`unknown`;case`provider`:return e.provider??`unknown`;default:return e.raw.workflow_run_id??e.raw.workflow_run_key??e.raw.session_id??`unknown`}}createGroup(e,t){return{key:e,workflowRunKey:t.raw.workflow_run_key,workflowRunId:t.raw.workflow_run_id,workflowName:t.raw.workflow_name,jobName:t.raw.job_name,agentName:t.raw.agent_name,model:t.model,provider:t.provider,firstSeen:null,lastSeen:null,totalRecords:0,logRecords:0,spanRecords:0,issueCount:0,failed:!1,byCategory:{},models:{},providers:{},tokenCoveragePercent:0,...Fe()}}addRowToGroup(e,t,n){e.totalRecords+=1,(t.raw.signal_type??`log`)===`span`?e.spanRecords+=1:e.logRecords+=1,(!e.firstSeen||t.timestamp<e.firstSeen)&&(e.firstSeen=t.timestamp),(!e.lastSeen||t.timestamp>e.lastSeen)&&(e.lastSeen=t.timestamp),!e.workflowRunKey&&t.raw.workflow_run_key&&(e.workflowRunKey=t.raw.workflow_run_key),!e.workflowRunId&&t.raw.workflow_run_id&&(e.workflowRunId=t.raw.workflow_run_id),!e.workflowName&&t.raw.workflow_name&&(e.workflowName=t.raw.workflow_name),!e.jobName&&t.raw.job_name&&(e.jobName=t.raw.job_name),!e.agentName&&t.raw.agent_name&&(e.agentName=t.raw.agent_name),!e.model&&t.model&&(e.model=t.model),!e.provider&&t.provider&&(e.provider=t.provider),L(e.models,t.model),L(e.providers,t.provider),t.hasUsage&&!Ve(t.raw.message)&&Ie(e,t.tokenUsage);let r=He(t);r&&(e.issueCount+=1,e.byCategory[r]=(e.byCategory[r]??0)+1),Ge(t,n)&&(e.failed=!0)}clearAmbiguousContext(e,t){switch(t){case`workflow-name`:return{...e,workflowRunKey:null,workflowRunId:null,jobName:null,agentName:null,model:null,provider:null};case`job`:return{...e,agentName:null,model:null,provider:null};case`agent`:return{...e,workflowRunKey:null,workflowRunId:null,workflowName:null,jobName:null,model:null,provider:null};case`model`:return{...e,workflowRunKey:null,workflowRunId:null,workflowName:null,jobName:null,agentName:null,provider:null};case`provider`:return{...e,workflowRunKey:null,workflowRunId:null,workflowName:null,jobName:null,agentName:null,model:null};default:return{...e,jobName:null,agentName:null,model:null,provider:null}}}sortGroups(e,t){return[...e].sort((e,n)=>t===`total-tokens`?n.totalTokens-e.totalTokens||(n.lastSeen?.getTime()??0)-(e.lastSeen?.getTime()??0):t===`issues`&&n.issueCount-e.issueCount||(n.lastSeen?.getTime()??0)-(e.lastSeen?.getTime()??0))}buildTotals(e){let t={...Fe(),totalRecords:0,logRecords:0,spanRecords:0,groupCount:e.length,returnedGroups:e.length,failedGroups:0,issueCount:0,tokenCoveragePercent:100,models:{},providers:{}};for(let n of e){t.totalRecords+=n.totalRecords,t.logRecords+=n.logRecords,t.spanRecords+=n.spanRecords,t.issueCount+=n.issueCount,n.failed&&(t.failedGroups+=1),Ie(t,n);for(let[e,r]of Object.entries(n.models))t.models[e]=(t.models[e]??0)+r;for(let[e,r]of Object.entries(n.providers))t.providers[e]=(t.providers[e]??0)+r}return t.tokenCoveragePercent=Be(e.filter(e=>e.usageEventCount>0).length,e.length),t}buildToolRows(e){let t=new Map;for(let n of e){if(!Ve(n.raw.message)||!n.hasUsage)continue;let e=B(n.metadata,`model_proxy.tool.name`,`model_proxy.tool_name`,`codex.tool.name`,`tool.name`,`tool_name`)??`unknown`,r=B(n.metadata,`model_proxy.token_attribution`,`codex.token_attribution`,`token_attribution`)===`toolOutputImpact`?`toolOutputImpact`:`toolCallTurn`,i=t.get(e);i||(i={toolName:e,models:{},providers:{},samples:{toolCallTurn:[],toolOutputImpact:[]}},t.set(e,i)),L(i.models,n.model),L(i.providers,n.provider),i.samples[r].push(n.tokenUsage)}return[...t.values()].map(e=>({toolName:e.toolName,invocationCount:Math.max(e.samples.toolCallTurn.length,e.samples.toolOutputImpact.length),models:e.models,providers:e.providers,toolCallTurn:ze(e.samples.toolCallTurn),toolOutputImpact:ze(e.samples.toolOutputImpact)}))}sortToolRows(e,t){return[...e].sort((e,n)=>t===`avg-total-tokens`?Math.max(n.toolCallTurn.avgTotalTokens,n.toolOutputImpact.avgTotalTokens)-Math.max(e.toolCallTurn.avgTotalTokens,e.toolOutputImpact.avgTotalTokens)||n.invocationCount-e.invocationCount:t===`invocations`?n.invocationCount-e.invocationCount:Math.max(n.toolCallTurn.p90TotalTokens,n.toolOutputImpact.p90TotalTokens)-Math.max(e.toolCallTurn.p90TotalTokens,e.toolOutputImpact.p90TotalTokens)||n.invocationCount-e.invocationCount)}};V=E([m(),T(0,p(C.LogStorageService)),w(`design:paramtypes`,[Object])],V);let H=class{sizeRetentionTimer=null;sizeRetentionRunPromise=null;constructor(e){this.storage=e}async getSqlite(){return await this.storage.ensureInitialized(),this.storage.getSqliteClient()}async cleanupOldLogs(e){try{let t=await this.getSqlite(),n=new Date;n.setDate(n.getDate()-e);let r=t.prepare(`DELETE FROM logs WHERE timestamp <= ?`).run(n.getTime());return Number(r.changes??0)}catch(e){throw Error(`Failed to cleanup old logs: ${e instanceof Error?e.message:String(e)}`)}}async clearAllLogs(){try{return await this.storage.deleteAllLogs()}catch(e){throw Error(`Failed to clear all logs: ${e instanceof Error?e.message:String(e)}`)}}async cleanupOversizedDatabase(e){try{if(!Number.isFinite(e.maxBytes)||e.maxBytes<=0)throw Error(`maxBytes must be a positive number`);if(!Number.isFinite(e.intervalMs)||e.intervalMs<=0)throw Error(`intervalMs must be a positive number`);let t=e.batchSize??1e3,n=Math.min(e.targetBytes??Math.floor(e.maxBytes*.9),e.maxBytes),r=await this.storage.getDatabaseSizeBytes();if(r===null||r<=e.maxBytes)return{sizeBeforeBytes:r,sizeAfterBytes:r,deletedEntries:0,iterations:0,trimmed:!1};let i=r,a=0,o=0;for(;i>n;){let e=await this.storage.deleteOldestLogs(t);if(e===0)break;a+=e,o+=1,await this.storage.compactDatabase();let n=await this.storage.getDatabaseSizeBytes();n!==null&&(i=n)}return{sizeBeforeBytes:r,sizeAfterBytes:i,deletedEntries:a,iterations:o,trimmed:a>0}}catch(e){throw Error(`Failed to cleanup oversized database: ${e instanceof Error?e.message:String(e)}`)}}startSizeRetentionMonitor(e){this.stopSizeRetentionMonitor();let t=async()=>{this.sizeRetentionRunPromise||(this.sizeRetentionRunPromise=(async()=>{try{await this.cleanupOversizedDatabase(e)}catch(e){console.warn(`Failed to run periodic database retention: ${e instanceof Error?e.message:String(e)}`)}finally{this.sizeRetentionRunPromise=null}})(),await this.sizeRetentionRunPromise)};return t(),this.sizeRetentionTimer=setInterval(()=>{t()},e.intervalMs),this.sizeRetentionTimer.unref?.(),()=>{this.stopSizeRetentionMonitor()}}stopSizeRetentionMonitor(){this.sizeRetentionTimer&&=(clearInterval(this.sizeRetentionTimer),null)}};H=E([m(),T(0,p(C.LogStorageService)),w(`design:paramtypes`,[Object])],H);function Ke(e){return e}const qe=new Set([`AND`,`OR`,`NOT`]),Je=/^[A-Za-z0-9_]+\*?$/;function Ye(e,t){let n=``;for(let r=0;r<e.length;r+=1){let i=e[r];n+=i.charCodeAt(0)<=31?t:i}return n}function Xe(e){let t=Ye(e,` `).trim();return t?`"${t.replace(/"/g,`""`)}"`:``}function Ze(e){let t=[],n=``,r=``,i=!1,a=()=>{let e=n.trim();if(e)for(let n of e.split(/\s+/))t.push({value:n,quoted:!1});n=``},o=()=>{t.push({value:r,quoted:!0}),r=``};for(let t of e){if(t===`"`){i?o():a(),i=!i;continue}i?r+=t:n+=t}return i?o():a(),t}function Qe(e){return Ze(e).map(e=>{if(e.quoted)return Xe(e.value);let t=Ye(e.value,``).trim();return t?qe.has(t)||Je.test(t)?t:Xe(t):``}).filter(Boolean).join(` `).trim()}function U(e,t,n,r,i){let a=e[t];typeof a==`string`&&(r.push(`${n} = ?`),i.push(a))}let W=class{constructor(e){this.storage=e}async getSqlite(){return await this.storage.ensureInitialized(),this.storage.getSqliteClient()}buildSearchSql(e,t={}){let n=Qe(e);if(!n)throw Error(`Search query is empty after sanitization`);let r=[`logs_search MATCH ?`],i=[n];if(t.service){let e=Array.isArray(t.service)?t.service:[t.service];r.push(`logs.service IN (${e.map(()=>`?`).join(`,`)})`),i.push(...e)}if(t.level){let e=Array.isArray(t.level)?t.level:[t.level];r.push(`logs.level IN (${e.map(()=>`?`).join(`,`)})`),i.push(...e)}return U(t,`traceId`,`logs.trace_id`,r,i),U(t,`spanId`,`logs.span_id`,r,i),U(t,`errorType`,`logs.error_type`,r,i),U(t,`sessionId`,`logs.session_id`,r,i),U(t,`workflowRunId`,`logs.workflow_run_id`,r,i),U(t,`workflowName`,`logs.workflow_name`,r,i),U(t,`jobName`,`logs.job_name`,r,i),U(t,`jobId`,`logs.job_id`,r,i),U(t,`agentName`,`logs.agent_name`,r,i),U(t,`parentSessionId`,`logs.parent_session_id`,r,i),U(t,`workflowRunKey`,`logs.workflow_run_key`,r,i),U(t,`workflowId`,`logs.workflow_id`,r,i),U(t,`workflowWorkspace`,`logs.workflow_workspace`,r,i),U(t,`stepName`,`logs.step_name`,r,i),U(t,`phase`,`logs.phase`,r,i),U(t,`signalType`,`COALESCE(logs.signal_type, 'log')`,r,i),t.startTime&&(r.push(`logs.timestamp >= ?`),i.push(t.startTime.getTime())),t.endTime&&(r.push(`logs.timestamp <= ?`),i.push(t.endTime.getTime())),{whereSql:`WHERE ${r.join(` AND `)}`,params:i}}mapSearchRow(e){return{id:e.id,timestamp:new Date(e.timestamp),level:e.level,message:e.message,traceId:e.traceId,spanId:e.spanId,parentSpanId:e.parentSpanId,service:e.service,hostname:e.hostname,pid:e.pid,metadata:e.metadata?JSON.parse(e.metadata):null,errorType:e.errorType,errorMessage:e.errorMessage,errorStack:e.errorStack,sessionId:e.sessionId,workflowRunId:e.workflowRunId,workflowName:e.workflowName,jobName:e.jobName,jobId:e.jobId,agentName:e.agentName,parentSessionId:e.parentSessionId,workflowRunKey:e.workflowRunKey,workflowId:e.workflowId,workflowWorkspace:e.workflowWorkspace,stepName:e.stepName,phase:e.phase,signalType:e.signalType??`log`,durationMs:e.durationMs,createdAt:new Date(e.createdAt),rank:e.rank}}async searchLogs(e,t={},n=100){let{results:r}=await this.searchLogsPaginated(e,{...t,offset:0},n);return r}async searchLogsPaginated(e,t={},n=100){try{let r=await this.getSqlite(),{whereSql:i,params:a}=this.buildSearchSql(e,t),o=t.offset??0,s=`
83
+ SELECT COUNT(*) as total
84
+ FROM logs_search
85
+ JOIN logs ON logs.rowid = logs_search.rowid
86
+ ${i}
87
+ `,c=`
88
+ SELECT
89
+ logs.id as id,
90
+ logs.timestamp as timestamp,
91
+ logs.level as level,
92
+ logs.message as message,
93
+ logs.trace_id as traceId,
94
+ logs.span_id as spanId,
95
+ logs.parent_span_id as parentSpanId,
96
+ logs.service as service,
97
+ logs.hostname as hostname,
98
+ logs.pid as pid,
99
+ logs.metadata as metadata,
100
+ logs.error_type as errorType,
101
+ logs.error_message as errorMessage,
102
+ logs.error_stack as errorStack,
103
+ logs.session_id as sessionId,
104
+ logs.workflow_run_id as workflowRunId,
105
+ logs.workflow_name as workflowName,
106
+ logs.job_name as jobName,
107
+ logs.job_id as jobId,
108
+ logs.agent_name as agentName,
109
+ logs.parent_session_id as parentSessionId,
110
+ logs.workflow_run_key as workflowRunKey,
111
+ logs.workflow_id as workflowId,
112
+ logs.workflow_workspace as workflowWorkspace,
113
+ logs.step_name as stepName,
114
+ logs.phase as phase,
115
+ logs.signal_type as signalType,
116
+ logs.duration_ms as durationMs,
117
+ logs.created_at as createdAt,
118
+ logs_search.rank as rank
119
+ FROM logs_search
120
+ JOIN logs ON logs.rowid = logs_search.rowid
121
+ ${i}
122
+ ORDER BY rank
123
+ LIMIT ?
124
+ OFFSET ?
125
+ `,l=r.prepare(s).get(...a);return{results:Ke(r.prepare(c).all(...a,n,o)).map(e=>this.mapSearchRow(e)),total:Number(l.total??0)}}catch(e){throw Error(`Failed to search logs: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}rankResults(e){return e.sort((e,t)=>e.rank-t.rank)}};W=E([m(),T(0,p(C.LogStorageService)),w(`design:paramtypes`,[Object])],W);function $e(e){return e}let G=class{sqlite=null;embeddingWriter=null;databasePath=null;useInMemory=!1;setEmbeddingWriter(e){this.embeddingWriter=e}async initializeDatabase(e,t=!1){try{let n=t?`:memory:`:e;this.databasePath=n,this.useInMemory=t,t||await y(re(n),{recursive:!0}),this.sqlite=new le(n,{allowExtension:!0}),ue.load(this.sqlite),this.sqlite.exec(`PRAGMA busy_timeout = 5000`),t||this.sqlite.exec(`PRAGMA journal_mode = WAL`),this.sqlite.exec(`PRAGMA foreign_keys = ON`),this.sqlite.exec(`
126
+ CREATE TABLE IF NOT EXISTS logs (
127
+ id text PRIMARY KEY NOT NULL,
128
+ timestamp integer NOT NULL,
129
+ level text NOT NULL,
130
+ message text NOT NULL,
131
+ trace_id text,
132
+ span_id text,
133
+ parent_span_id text,
134
+ service text NOT NULL,
135
+ hostname text,
136
+ pid integer,
137
+ metadata text,
138
+ error_type text,
139
+ error_message text,
140
+ error_stack text,
141
+ session_id text,
142
+ workflow_run_id text,
143
+ workflow_name text,
144
+ job_name text,
145
+ job_id text,
146
+ agent_name text,
147
+ parent_session_id text,
148
+ workflow_run_key text,
149
+ workflow_id text,
150
+ workflow_workspace text,
151
+ step_name text,
152
+ phase text,
153
+ signal_type text,
154
+ duration_ms integer,
155
+ created_at integer NOT NULL
156
+ )
157
+ `),this.ensureLogColumns({session_id:`text`,workflow_run_id:`text`,workflow_name:`text`,job_name:`text`,job_id:`text`,agent_name:`text`,parent_session_id:`text`,workflow_run_key:`text`,workflow_id:`text`,workflow_workspace:`text`,step_name:`text`,phase:`text`,signal_type:`text`,duration_ms:`integer`}),this.sqlite.exec(`UPDATE logs SET timestamp = timestamp * 1000 WHERE timestamp < 100000000000`),this.sqlite.exec(`UPDATE logs SET created_at = created_at * 1000 WHERE created_at < 100000000000`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_timestamp_idx ON logs (timestamp)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_level_idx ON logs (level)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_trace_id_idx ON logs (trace_id)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_span_id_idx ON logs (span_id)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_parent_span_id_idx ON logs (parent_span_id)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_service_idx ON logs (service)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_error_type_idx ON logs (error_type)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_session_id_idx ON logs (session_id)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_workflow_run_id_idx ON logs (workflow_run_id)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_job_name_idx ON logs (job_name)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_agent_name_idx ON logs (agent_name)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_workflow_run_key_idx ON logs (workflow_run_key)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_workflow_workspace_idx ON logs (workflow_workspace)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_step_name_idx ON logs (step_name)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS logs_signal_type_idx ON logs (signal_type)`),this.sqlite.exec(`
158
+ CREATE TABLE IF NOT EXISTS hook_tracking (
159
+ session_id text NOT NULL,
160
+ workspace_key text NOT NULL,
161
+ checkpoint_id text NOT NULL,
162
+ updated_at integer NOT NULL,
163
+ PRIMARY KEY (session_id, workspace_key)
164
+ )
165
+ `),this.sqlite.exec(`
166
+ CREATE TABLE IF NOT EXISTS log_embeddings (
167
+ log_id text PRIMARY KEY NOT NULL,
168
+ embedding text NOT NULL,
169
+ service text NOT NULL,
170
+ level text NOT NULL,
171
+ created_at integer NOT NULL,
172
+ FOREIGN KEY (log_id) REFERENCES logs(id) ON DELETE CASCADE
173
+ ) STRICT
174
+ `),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS log_embeddings_service_idx ON log_embeddings (service)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS log_embeddings_level_idx ON log_embeddings (level)`),this.sqlite.exec(`CREATE INDEX IF NOT EXISTS log_embeddings_created_at_idx ON log_embeddings (created_at)`),this.sqlite.exec(`
175
+ CREATE VIRTUAL TABLE IF NOT EXISTS logs_search USING fts5(
176
+ id UNINDEXED,
177
+ message,
178
+ error_message,
179
+ content='logs',
180
+ content_rowid='rowid'
181
+ )
182
+ `),this.sqlite.exec(`
183
+ CREATE TRIGGER IF NOT EXISTS logs_ai AFTER INSERT ON logs BEGIN
184
+ INSERT INTO logs_search(rowid, id, message, error_message)
185
+ VALUES (new.rowid, new.id, new.message, new.error_message);
186
+ END;
187
+ `),this.sqlite.exec(`
188
+ CREATE TRIGGER IF NOT EXISTS logs_ad AFTER DELETE ON logs BEGIN
189
+ DELETE FROM logs_search WHERE rowid = old.rowid;
190
+ END;
191
+ `),this.sqlite.exec(`
192
+ CREATE TRIGGER IF NOT EXISTS logs_au AFTER UPDATE ON logs BEGIN
193
+ UPDATE logs_search SET message = new.message, error_message = new.error_message
194
+ WHERE rowid = new.rowid;
195
+ END;
196
+ `)}catch(e){throw Error(`Failed to initialize database: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}ensureLogColumns(e){if(!this.sqlite)return;let t=new Set(this.sqlite.prepare(`PRAGMA table_info(logs)`).all().map(e=>e.name));for(let[n,r]of Object.entries(e))t.has(n)||this.sqlite.exec(`ALTER TABLE logs ADD COLUMN ${n} ${r}`)}getDefaultDbPath(){return t({packageName:e}).dbPath}isInitialized(){return this.sqlite!==null}async ensureInitialized(){this.sqlite||await this.initializeDatabase(this.getDefaultDbPath())}mapRow(e){return{id:e.id,timestamp:new Date(Number(e.timestamp)),level:e.level,message:e.message,traceId:e.trace_id,spanId:e.span_id,parentSpanId:e.parent_span_id,service:e.service,hostname:e.hostname,pid:e.pid,metadata:e.metadata?JSON.parse(e.metadata):null,errorType:e.error_type,errorMessage:e.error_message,errorStack:e.error_stack,sessionId:e.session_id,workflowRunId:e.workflow_run_id,workflowName:e.workflow_name,jobName:e.job_name,jobId:e.job_id,agentName:e.agent_name,parentSessionId:e.parent_session_id,workflowRunKey:e.workflow_run_key,workflowId:e.workflow_id,workflowWorkspace:e.workflow_workspace,stepName:e.step_name,phase:e.phase,signalType:e.signal_type??`log`,durationMs:e.duration_ms,createdAt:new Date(Number(e.created_at))}}prepareLogRecord(e){let t=new Date;return{id:e.id??de(),timestamp:e.timestamp??t,level:e.level,message:e.message,traceId:e.traceId??null,spanId:e.spanId??null,parentSpanId:e.parentSpanId??null,service:e.service,hostname:e.hostname??null,pid:e.pid??null,metadata:e.metadata??null,errorType:e.errorType??null,errorMessage:e.errorMessage??null,errorStack:e.errorStack??null,sessionId:e.sessionId??null,workflowRunId:e.workflowRunId??null,workflowName:e.workflowName??null,jobName:e.jobName??null,jobId:e.jobId??null,agentName:e.agentName??null,parentSessionId:e.parentSessionId??null,workflowRunKey:e.workflowRunKey??null,workflowId:e.workflowId??null,workflowWorkspace:e.workflowWorkspace??null,stepName:e.stepName??null,phase:e.phase??null,signalType:e.signalType??`log`,durationMs:e.durationMs??null,createdAt:e.createdAt??t}}getDatabaseClient(){if(!this.sqlite)throw Error(`Database not initialized. Call initializeDatabase() first.`);return this.sqlite}getSqliteClient(){if(!this.sqlite)throw Error(`Database not initialized. Call initializeDatabase() first.`);return this.sqlite}getDatabasePath(){return this.useInMemory||this.databasePath===`:memory:`?null:this.databasePath}async getDatabaseSizeBytes(){let e=this.getDatabasePath();if(!e)return null;let t=[e,`${e}-wal`,`${e}-shm`];return(await Promise.all(t.map(async e=>{try{return(await ee(e)).size}catch{return 0}}))).reduce((e,t)=>e+t,0)}async deleteOldestLogs(e){try{if(!this.sqlite)throw Error(`Database not initialized`);if(!Number.isInteger(e)||e<=0)return 0;let t=this.sqlite.prepare(`
197
+ DELETE FROM logs
198
+ WHERE id IN (
199
+ SELECT id
200
+ FROM logs
201
+ ORDER BY timestamp ASC, created_at ASC, id ASC
202
+ LIMIT ?
203
+ )
204
+ `).run(e);return Number(t.changes??0)}catch(e){throw Error(`Failed to delete oldest logs: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async compactDatabase(){try{if(!this.sqlite)throw Error(`Database not initialized`);this.sqlite.exec(`PRAGMA wal_checkpoint(TRUNCATE)`),this.sqlite.exec(`VACUUM`)}catch(e){throw Error(`Failed to compact database: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async insertLog(e){try{let t=this.getSqliteClient(),n=this.prepareLogRecord(e);return t.prepare(`
205
+ INSERT INTO logs (
206
+ id, timestamp, level, message, trace_id, span_id, parent_span_id,
207
+ service, hostname, pid, metadata, error_type, error_message,
208
+ error_stack, session_id, workflow_run_id, workflow_name, job_name,
209
+ job_id, agent_name, parent_session_id, workflow_run_key, workflow_id,
210
+ workflow_workspace, step_name, phase, signal_type, duration_ms, created_at
211
+ )
212
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
213
+ `).run(n.id,n.timestamp.getTime(),n.level,n.message,n.traceId,n.spanId,n.parentSpanId,n.service,n.hostname,n.pid,n.metadata?JSON.stringify(n.metadata):null,n.errorType,n.errorMessage,n.errorStack,n.sessionId,n.workflowRunId,n.workflowName,n.jobName,n.jobId,n.agentName,n.parentSessionId,n.workflowRunKey,n.workflowId,n.workflowWorkspace,n.stepName,n.phase,n.signalType,n.durationMs,n.createdAt.getTime()),await this.tryIndexEmbeddings([n]),n}catch(e){throw Error(`Failed to insert log: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async insertBatch(e){try{if(e.length===0)return[];let t=this.getSqliteClient(),n=e.map(e=>this.prepareLogRecord(e));t.exec(`BEGIN`);try{let e=t.prepare(`
214
+ INSERT INTO logs (
215
+ id, timestamp, level, message, trace_id, span_id, parent_span_id,
216
+ service, hostname, pid, metadata, error_type, error_message,
217
+ error_stack, session_id, workflow_run_id, workflow_name, job_name,
218
+ job_id, agent_name, parent_session_id, workflow_run_key, workflow_id,
219
+ workflow_workspace, step_name, phase, signal_type, duration_ms, created_at
220
+ )
221
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
222
+ `);for(let t of n)e.run(t.id,t.timestamp.getTime(),t.level,t.message,t.traceId,t.spanId,t.parentSpanId,t.service,t.hostname,t.pid,t.metadata?JSON.stringify(t.metadata):null,t.errorType,t.errorMessage,t.errorStack,t.sessionId,t.workflowRunId,t.workflowName,t.jobName,t.jobId,t.agentName,t.parentSessionId,t.workflowRunKey,t.workflowId,t.workflowWorkspace,t.stepName,t.phase,t.signalType,t.durationMs,t.createdAt.getTime());t.exec(`COMMIT`)}catch(e){throw t.exec(`ROLLBACK`),e}return await this.tryIndexEmbeddings(n),n}catch(e){throw Error(`Failed to insert batch: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async tryIndexEmbeddings(e){!this.embeddingWriter||e.length===0||this.embeddingWriter(e).catch(e=>{console.warn(`Failed to index semantic embeddings: ${e instanceof Error?e.message:String(e)}`)})}async queryLogs(e={}){try{let t=this.getSqliteClient(),n=`WHERE 1 = 1`,r=[];if(e.level){let t=Array.isArray(e.level)?e.level:[e.level];t.length===1?(n+=` AND level = ?`,r.push(t[0])):(n+=` AND level IN (${t.map(()=>`?`).join(`,`)})`,r.push(...t))}if(e.service){let t=Array.isArray(e.service)?e.service:[e.service];t.length===1?(n+=` AND service = ?`,r.push(t[0])):(n+=` AND service IN (${t.map(()=>`?`).join(`,`)})`,r.push(...t))}e.traceId&&(n+=` AND trace_id = ?`,r.push(e.traceId)),e.spanId&&(n+=` AND span_id = ?`,r.push(e.spanId)),e.errorType&&(n+=` AND error_type = ?`,r.push(e.errorType)),e.sessionId&&(n+=` AND session_id = ?`,r.push(e.sessionId)),e.workflowRunId&&(n+=` AND workflow_run_id = ?`,r.push(e.workflowRunId)),e.workflowName&&(n+=` AND workflow_name = ?`,r.push(e.workflowName)),e.jobName&&(n+=` AND job_name = ?`,r.push(e.jobName));let i=[[`job_id`,e.jobId],[`agent_name`,e.agentName],[`parent_session_id`,e.parentSessionId],[`workflow_run_key`,e.workflowRunKey],[`workflow_id`,e.workflowId],[`workflow_workspace`,e.workflowWorkspace],[`step_name`,e.stepName],[`phase`,e.phase]];for(let[e,t]of i)t&&(n+=` AND ${e} = ?`,r.push(t));e.signalType&&(n+=` AND COALESCE(signal_type, 'log') = ?`,r.push(e.signalType)),e.startTime&&(n+=` AND timestamp >= ?`,r.push(e.startTime.getTime())),e.endTime&&(n+=` AND timestamp <= ?`,r.push(e.endTime.getTime()));let a=e.limit??100,o=e.offset??0;return $e(t.prepare(`
223
+ SELECT *
224
+ FROM logs
225
+ ${n}
226
+ ORDER BY timestamp DESC
227
+ LIMIT ?
228
+ OFFSET ?
229
+ `).all(...r,a,o)).map(e=>this.mapRow(e))}catch(e){throw Error(`Failed to query logs: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async deleteAllLogs(){try{let e=this.getSqliteClient().prepare(`DELETE FROM logs`).run();return Number(e.changes??0)}catch(e){throw Error(`Failed to delete all logs: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async getHookCheckpoint(e,t){try{return $e(this.getSqliteClient().prepare(`
230
+ SELECT checkpoint_id
231
+ FROM hook_tracking
232
+ WHERE session_id = ? AND workspace_key = ?
233
+ LIMIT 1
234
+ `).all(e,t))[0]?.checkpoint_id??null}catch(e){throw Error(`Failed to get hook checkpoint: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async setHookCheckpoint(e,t,n){try{this.getSqliteClient().prepare(`
235
+ INSERT INTO hook_tracking (session_id, workspace_key, checkpoint_id, updated_at)
236
+ VALUES (?, ?, ?, ?)
237
+ ON CONFLICT(session_id, workspace_key) DO UPDATE SET
238
+ checkpoint_id = excluded.checkpoint_id,
239
+ updated_at = excluded.updated_at
240
+ `).run(e,t,n,Math.floor(Date.now()/1e3))}catch(e){throw Error(`Failed to set hook checkpoint: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async disconnect(){this.sqlite&&(this.sqlite.close(),this.sqlite=null,this.databasePath=null,this.useInMemory=!1)}};G=E([m()],G);function et(e){return e}function K(e,t,n,r,i){let a=e[t];typeof a==`string`&&(r.push(`${n} = ?`),i.push(a))}let q=class{constructor(e,t,n){this.storage=e,this.searchService=t,this.embeddings=n}async isAvailable(){return this.embeddings.isAvailable()}mapRow(e){let t=1/(1+e.distance);return{id:e.id,timestamp:new Date(e.timestamp),level:e.level,message:e.message,traceId:e.traceId,spanId:e.spanId,parentSpanId:e.parentSpanId,service:e.service,hostname:e.hostname,pid:e.pid,metadata:e.metadata?JSON.parse(e.metadata):null,errorType:e.errorType,errorMessage:e.errorMessage,errorStack:e.errorStack,sessionId:e.sessionId,workflowRunId:e.workflowRunId,workflowName:e.workflowName,jobName:e.jobName,jobId:e.jobId,agentName:e.agentName,parentSessionId:e.parentSessionId,workflowRunKey:e.workflowRunKey,workflowId:e.workflowId,workflowWorkspace:e.workflowWorkspace,stepName:e.stepName,phase:e.phase,signalType:e.signalType??`log`,durationMs:e.durationMs,createdAt:new Date(e.createdAt),distance:e.distance,score:t}}mapFallbackRow(e){return{...e,distance:1/0,score:1/(1+Math.max(0,Math.abs(e.rank)))}}buildFilterSql(e={}){let t=[`1 = 1`],n=[];if(e.service){let r=Array.isArray(e.service)?e.service:[e.service];t.push(`logs.service IN (${r.map(()=>`?`).join(`,`)})`),n.push(...r)}if(e.level){let r=Array.isArray(e.level)?e.level:[e.level];t.push(`logs.level IN (${r.map(()=>`?`).join(`,`)})`),n.push(...r)}return K(e,`traceId`,`logs.trace_id`,t,n),K(e,`spanId`,`logs.span_id`,t,n),K(e,`errorType`,`logs.error_type`,t,n),K(e,`sessionId`,`logs.session_id`,t,n),K(e,`workflowRunId`,`logs.workflow_run_id`,t,n),K(e,`workflowName`,`logs.workflow_name`,t,n),K(e,`jobName`,`logs.job_name`,t,n),K(e,`jobId`,`logs.job_id`,t,n),K(e,`agentName`,`logs.agent_name`,t,n),K(e,`parentSessionId`,`logs.parent_session_id`,t,n),K(e,`workflowRunKey`,`logs.workflow_run_key`,t,n),K(e,`workflowId`,`logs.workflow_id`,t,n),K(e,`workflowWorkspace`,`logs.workflow_workspace`,t,n),K(e,`stepName`,`logs.step_name`,t,n),K(e,`phase`,`logs.phase`,t,n),K(e,`signalType`,`COALESCE(logs.signal_type, 'log')`,t,n),e.startTime&&(t.push(`logs.timestamp >= ?`),n.push(e.startTime.getTime())),e.endTime&&(t.push(`logs.timestamp <= ?`),n.push(e.endTime.getTime())),{whereSql:`WHERE ${t.join(` AND `)}`,params:n}}async indexMissingLogs(e={},t=100){let n=this.storage.getSqliteClient(),r=0;for(;;){let{whereSql:i,params:a}=this.buildFilterSql(e),o=et(n.prepare(`
241
+ SELECT
242
+ logs.id as id,
243
+ logs.timestamp as timestamp,
244
+ logs.level as level,
245
+ logs.message as message,
246
+ logs.trace_id as traceId,
247
+ logs.span_id as spanId,
248
+ logs.parent_span_id as parentSpanId,
249
+ logs.service as service,
250
+ logs.hostname as hostname,
251
+ logs.pid as pid,
252
+ logs.metadata as metadata,
253
+ logs.error_type as errorType,
254
+ logs.error_message as errorMessage,
255
+ logs.error_stack as errorStack,
256
+ logs.session_id as sessionId,
257
+ logs.workflow_run_id as workflowRunId,
258
+ logs.workflow_name as workflowName,
259
+ logs.job_name as jobName,
260
+ logs.job_id as jobId,
261
+ logs.agent_name as agentName,
262
+ logs.parent_session_id as parentSessionId,
263
+ logs.workflow_run_key as workflowRunKey,
264
+ logs.workflow_id as workflowId,
265
+ logs.workflow_workspace as workflowWorkspace,
266
+ logs.step_name as stepName,
267
+ logs.phase as phase,
268
+ logs.signal_type as signalType,
269
+ logs.duration_ms as durationMs,
270
+ logs.created_at as createdAt
271
+ FROM logs
272
+ LEFT JOIN log_embeddings ON log_embeddings.log_id = logs.id
273
+ ${i}
274
+ AND log_embeddings.log_id IS NULL
275
+ ORDER BY logs.timestamp ASC
276
+ LIMIT ?
277
+ `).all(...a,t));if(o.length===0)return r;await this.embeddings.indexLogs(o.map(e=>({id:e.id,timestamp:new Date(e.timestamp),level:e.level,message:e.message,traceId:e.traceId,spanId:e.spanId,parentSpanId:e.parentSpanId,service:e.service,hostname:e.hostname,pid:e.pid,metadata:e.metadata?JSON.parse(e.metadata):null,errorType:e.errorType,errorMessage:e.errorMessage,errorStack:e.errorStack,sessionId:e.sessionId,workflowRunId:e.workflowRunId,workflowName:e.workflowName,jobName:e.jobName,jobId:e.jobId,agentName:e.agentName,parentSessionId:e.parentSessionId,workflowRunKey:e.workflowRunKey,workflowId:e.workflowId,workflowWorkspace:e.workflowWorkspace,stepName:e.stepName,phase:e.phase,signalType:e.signalType??`log`,durationMs:e.durationMs,createdAt:new Date(e.createdAt)}))),r+=o.length}}async searchLogs(e,t={},n=100){let{results:r}=await this.searchLogsPaginated(e,{...t,offset:0},n);return r}async searchLogsPaginated(e,t={},n=100){try{if(await this.storage.ensureInitialized(),!await this.embeddings.isAvailable()){let r=await this.searchService.searchLogsPaginated(e,t,n);return{results:r.results.map(e=>this.mapFallbackRow(e)),total:r.total}}await this.indexMissingLogs(t);let r=this.storage.getSqliteClient(),i=await this.embeddings.embedText(e),a=JSON.stringify(i),{whereSql:o,params:s}=this.buildFilterSql(t),c=t.offset??0,l=`
278
+ SELECT COUNT(*) as total
279
+ FROM log_embeddings
280
+ JOIN logs ON logs.id = log_embeddings.log_id
281
+ ${o}
282
+ `,u=`
283
+ SELECT
284
+ logs.id as id,
285
+ logs.timestamp as timestamp,
286
+ logs.level as level,
287
+ logs.message as message,
288
+ logs.trace_id as traceId,
289
+ logs.span_id as spanId,
290
+ logs.parent_span_id as parentSpanId,
291
+ logs.service as service,
292
+ logs.hostname as hostname,
293
+ logs.pid as pid,
294
+ logs.metadata as metadata,
295
+ logs.error_type as errorType,
296
+ logs.error_message as errorMessage,
297
+ logs.error_stack as errorStack,
298
+ logs.session_id as sessionId,
299
+ logs.workflow_run_id as workflowRunId,
300
+ logs.workflow_name as workflowName,
301
+ logs.job_name as jobName,
302
+ logs.job_id as jobId,
303
+ logs.agent_name as agentName,
304
+ logs.parent_session_id as parentSessionId,
305
+ logs.workflow_run_key as workflowRunKey,
306
+ logs.workflow_id as workflowId,
307
+ logs.workflow_workspace as workflowWorkspace,
308
+ logs.step_name as stepName,
309
+ logs.phase as phase,
310
+ logs.signal_type as signalType,
311
+ logs.duration_ms as durationMs,
312
+ logs.created_at as createdAt,
313
+ vec_distance_cosine(log_embeddings.embedding, vec_f32(?)) as distance
314
+ FROM log_embeddings
315
+ JOIN logs ON logs.id = log_embeddings.log_id
316
+ ${o}
317
+ ORDER BY distance ASC
318
+ LIMIT ?
319
+ OFFSET ?
320
+ `,d=r.prepare(l).get(...s);return{results:et(r.prepare(u).all(a,...s,n,c)).map(e=>this.mapRow(e)),total:Number(d.total??0)}}catch(r){let i=await this.searchService.searchLogsPaginated(e,t,n);return console.warn(`Semantic search unavailable, falling back to FTS: ${r instanceof Error?r.message:String(r)}`),{results:i.results.map(e=>this.mapFallbackRow(e)),total:i.total}}}};q=E([m(),T(0,p(C.LogStorageService)),T(1,p(C.LogSearchService)),T(2,p(C.EmbeddingService)),w(`design:paramtypes`,[Object,Object,Object])],q);const tt=new f(e=>{e.bind(C.LogStorageService).to(G).inSingletonScope(),e.bind(C.EmbeddingService).to(O).inSingletonScope(),e.bind(C.LogQueryService).to(P).inSingletonScope(),e.bind(C.LogMetricsService).to(V).inSingletonScope(),e.bind(C.LogSearchService).to(W).inSingletonScope(),e.bind(C.SemanticSearchService).to(q).inSingletonScope(),e.bind(C.LogRetentionService).to(H).inSingletonScope(),e.bind(C.HttpServerHealthCheck).to(k).inSingletonScope(),e.bind(C.HttpServerManager).to(j).inSingletonScope()});function nt(){let e=new d;e.load(tt);let t=e.get(C.LogStorageService);if(me()){let n=e.get(C.EmbeddingService);t.setEmbeddingWriter(e=>n.indexLogs(e))}return e}const J=u.object({sessionId:u.string().optional().describe(`Agent session id to scope the analysis to one agent launch`),workflowRunId:u.string().optional().describe(`Workflow run id to scope to all jobs of one workflow run`),workflowName:u.string().optional().describe(`Workflow name to scope to all runs of a workflow type`),jobName:u.string().optional().describe(`Workflow job name to scope to a single job`),jobId:u.string().optional().describe(`Workflow job execution id to scope by`),agentName:u.string().optional().describe(`Agent identity to scope by`),workflowRunKey:u.string().optional().describe(`Workflow run key to scope by`),workflowWorkspace:u.string().optional().describe(`Workflow workspace to scope by`),stepName:u.string().optional().describe(`Workflow step name to scope by`),phase:u.string().optional().describe(`Workflow phase to scope by`),service:u.union([u.string(),u.array(u.string())]).optional().describe(`Agent/service name(s) to scope by (e.g. claude-code, codex)`),startTime:u.string().optional().describe(`Start time for the analysis window (ISO 8601 format)`),endTime:u.string().optional().describe(`End time for the analysis window (ISO 8601 format)`),limit:u.number().min(1).max(1e3).optional().default(100).describe(`Maximum number of issue samples to return`),scanLimit:u.number().min(1).max(1e5).optional().default(5e4).describe(`Maximum matching log records to scan; the response reports when this truncates the window`)});var rt=class e{static TOOL_NAME=`analyze_agent_issues`;queryService;constructor(e){this.queryService=e.get(C.LogQueryService)}getInputSchema(){return J}getDefinition(){return{name:e.TOOL_NAME,description:`Detect and aggregate agent-run problems (failed tool calls, API errors, refusals, retries exhausted, rejected tools, error logs) for reviewing agent performance and improving the repo harness. Filter by session id, workflow run id, workflow name, job name, or agent/service. Returns counts by category/tool/error-type plus sample issues with the tool, input, and error context needed to diagnose them.`,inputSchema:u.toJSONSchema(J,{reused:`inline`})}}async execute(e){try{let t=J.parse(e),n=await this.queryService.analyzeAgentIssues({sessionId:t.sessionId,workflowRunId:t.workflowRunId,workflowName:t.workflowName,jobName:t.jobName,jobId:t.jobId,agentName:t.agentName,workflowRunKey:t.workflowRunKey,workflowWorkspace:t.workflowWorkspace,stepName:t.stepName,phase:t.phase,service:t.service,startTime:t.startTime?new Date(t.startTime):void 0,endTime:t.endTime?new Date(t.endTime):void 0},{sampleLimit:t.limit,scanLimit:t.scanLimit});return{content:[{type:`text`,text:JSON.stringify({...n,issues:n.issues.map(e=>({...e,timestamp:e.timestamp.toISOString()}))},null,2)}]}}catch(e){return{content:[{type:`text`,text:`Error analyzing agent issues: ${e instanceof Error?e.message:`Unknown error`}`}],isError:!0}}}};const Y=u.object({startTime:u.string().optional().describe(`Start time for statistics (ISO 8601 format)`),endTime:u.string().optional().describe(`End time for statistics (ISO 8601 format)`),groupBy:u.enum([`level`,`service`,`both`,`agent`,`workflow`,`job`,`signal`]).optional().default(`both`).describe(`Dimension used to group statistics.`),signalType:u.enum([`log`,`span`,`all`]).optional().default(`log`).describe(`Count log records by default, span records, or 'all' signals.`)});var it=class e{static TOOL_NAME=`get_log_stats`;queryService;constructor(e){this.queryService=e.get(C.LogQueryService)}getInputSchema(){return Y}getDefinition(){return{name:e.TOOL_NAME,description:`Get aggregate log statistics including counts by level, service, or both. Useful for dashboards and monitoring.`,inputSchema:u.toJSONSchema(Y,{reused:`inline`})}}async execute(e){try{let t=Y.parse(e),n;(t.startTime||t.endTime)&&(n={start:t.startTime?new Date(t.startTime):new Date(0),end:t.endTime?new Date(t.endTime):new Date});let r=await this.queryService.getStatistics(n,t.groupBy,t.signalType);return{content:[{type:`text`,text:JSON.stringify({timeRange:n,groupBy:t.groupBy,signalType:t.signalType,totalEntries:r.reduce((e,t)=>e+t.count,0),statistics:r.map(e=>({service:e.service,level:e.level,count:e.count,value:t.groupBy===`level`?e.level:e.service}))},null,2)}]}}catch(e){return{content:[{type:`text`,text:`Error getting log stats: ${e instanceof Error?e.message:`Unknown error`}`}],isError:!0}}}};const at=u.object({});var ot=class e{static TOOL_NAME=`get_services`;queryService;constructor(e){this.queryService=e.get(C.LogQueryService)}getInputSchema(){return at}getDefinition(){return{name:e.TOOL_NAME,description:`List all active services that have sent logs. Returns service names sorted alphabetically.`,inputSchema:u.toJSONSchema(at,{reused:`inline`})}}async execute(e){try{let e=await this.queryService.getActiveServices();return{content:[{type:`text`,text:JSON.stringify({count:e.length,services:e.sort()},null,2)}]}}catch(e){return{content:[{type:`text`,text:`Error getting services: ${e instanceof Error?e.message:`Unknown error`}`}],isError:!0}}}};const X=u.object({traceId:u.string().describe(`OTEL trace ID (32 hex characters)`)});var Z=class e{static TOOL_NAME=`get_trace_timeline`;queryService;constructor(e){this.queryService=e.get(C.LogQueryService)}getInputSchema(){return X}getDefinition(){return{name:e.TOOL_NAME,description:`Reconstruct the chronological timeline of a distributed trace. Returns all spans in order with timing, service hops, and log messages.`,inputSchema:u.toJSONSchema(X,{reused:`inline`})}}async execute(e){try{let t=X.parse(e),n=await this.queryService.getTraceTimeline(t.traceId);return{content:[{type:`text`,text:JSON.stringify({traceId:t.traceId,count:n.length,timeline:n.map(e=>({timestamp:e.timestamp.toISOString(),service:e.service,spanId:e.spanId,parentSpanId:e.parentSpanId,level:e.level,message:e.message,duration:e.duration}))},null,2)}]}}catch(e){return{content:[{type:`text`,text:`Error getting trace timeline: ${e instanceof Error?e.message:`Unknown error`}`}],isError:!0}}}};let st=function(e){return e.TRACE=`trace`,e.DEBUG=`debug`,e.INFO=`info`,e.WARN=`warn`,e.ERROR=`error`,e.FATAL=`fatal`,e}({});const ct=u.enum([`trace`,`debug`,`info`,`warn`,`error`,`fatal`]),lt=u.enum([`fts`,`semantic`,`hybrid`]),Q=u.object({searchQuery:u.string().optional().describe(`Text to search for. Common punctuation such as hyphens is escaped safely; quoted phrases, prefix matching with *, and boolean operators AND/OR/NOT are supported.`),query:u.string().optional().describe(`Alias for searchQuery. Use this for full-text search while also applying structured filters.`),mode:lt.optional().default(`hybrid`).describe(`Search strategy to use`),service:u.union([u.string(),u.array(u.string())]).optional().describe(`Service name(s) to filter by`),level:u.union([ct,u.array(ct)]).optional().describe(`Log level(s) to filter by`),traceId:u.string().optional().describe(`Trace ID to filter by (OTEL format: 32 hex characters)`),spanId:u.string().optional().describe(`Span ID to filter by`),errorType:u.string().optional().describe(`Error type to filter by`),sessionId:u.string().optional().describe(`Agent session id to filter by`),workflowRunId:u.string().optional().describe(`Workflow run id to filter by`),workflowName:u.string().optional().describe(`Workflow name to filter by`),jobName:u.string().optional().describe(`Workflow job name to filter by`),jobId:u.string().optional().describe(`Workflow job execution id to filter by`),agentName:u.string().optional().describe(`Agent name to filter by`),parentSessionId:u.string().optional().describe(`Parent agent session id to filter by`),workflowRunKey:u.string().optional().describe(`Stable workflow run key to filter by`),workflowId:u.string().optional().describe(`Workflow file id to filter by`),workflowWorkspace:u.string().optional().describe(`Workflow workspace to filter by`),stepName:u.string().optional().describe(`Workflow step name to filter by`),phase:u.string().optional().describe(`Workflow phase to filter by`),signalType:u.enum([`log`,`span`]).optional().describe(`Telemetry signal type to filter by`),startTime:u.string().optional().describe(`Start time for log range (ISO 8601 format)`),endTime:u.string().optional().describe(`End time for log range (ISO 8601 format)`),limit:u.number().min(1).max(1e3).optional().default(100).describe(`Maximum number of search results to return`)});var ut=class e{static TOOL_NAME=`search_logs`;queryService;searchService;semanticSearchService;constructor(e){this.queryService=e.get(C.LogQueryService),this.searchService=e.get(C.LogSearchService),this.semanticSearchService=e.get(C.SemanticSearchService)}getInputSchema(){return Q}getDefinition(){return{name:e.TOOL_NAME,description:`Search and query log entries. Supports structured filters such as level, service, trace/session/workflow fields, time range, and optional full-text query using FTS5, local semantic embeddings, or both.`,inputSchema:u.toJSONSchema(Q,{reused:`inline`})}}async execute(e){try{let t=Q.parse(e),n=this.buildFilters(t),r=this.getSearchQuery(t),i=t.mode??`hybrid`,a=r?await this.searchByText(r,n,i,t.limit):await this.queryByFilters(n,t.limit);return{content:[{type:`text`,text:JSON.stringify({mode:r?i:`filter`,count:a.length,query:r,filters:Object.keys(n).length>0?this.serializeFilters(n):void 0,results:a.map(e=>this.serializeResult(e,!!r))},null,2)}]}}catch(e){return{content:[{type:`text`,text:`Error searching logs: ${e instanceof Error?e.message:`Unknown error`}`}],isError:!0}}}buildFilters(e){let t={};return e.service&&(t.service=e.service),e.level&&(t.level=e.level),e.traceId&&(t.traceId=e.traceId),e.spanId&&(t.spanId=e.spanId),e.errorType&&(t.errorType=e.errorType),e.sessionId&&(t.sessionId=e.sessionId),e.workflowRunId&&(t.workflowRunId=e.workflowRunId),e.workflowName&&(t.workflowName=e.workflowName),e.jobName&&(t.jobName=e.jobName),e.jobId&&(t.jobId=e.jobId),e.agentName&&(t.agentName=e.agentName),e.parentSessionId&&(t.parentSessionId=e.parentSessionId),e.workflowRunKey&&(t.workflowRunKey=e.workflowRunKey),e.workflowId&&(t.workflowId=e.workflowId),e.workflowWorkspace&&(t.workflowWorkspace=e.workflowWorkspace),e.stepName&&(t.stepName=e.stepName),e.phase&&(t.phase=e.phase),e.signalType&&(t.signalType=e.signalType),e.startTime&&(t.startTime=this.parseDate(e.startTime,`startTime`)),e.endTime&&(t.endTime=this.parseDate(e.endTime,`endTime`)),t}getSearchQuery(e){return(e.searchQuery??e.query)?.trim()||void 0}parseDate(e,t){let n=new Date(e);if(Number.isNaN(n.getTime()))throw Error(`Invalid ${t}: expected ISO 8601 timestamp`);return n}async queryByFilters(e,t){let n=Object.keys(e).length>0,r=!!(e.sessionId||e.workflowRunId||e.workflowName||e.jobName||e.traceId||e.spanId||e.startTime||e.endTime||e.service&&!e.level);return(await this.queryService.queryLogs({...e,level:n?e.level:[`info`,`warn`,`error`,`fatal`],order:r?`asc`:`desc`,limit:t})).logs}async searchByText(e,t,n,r){return n===`semantic`?this.semanticSearchService.searchLogs(e,t,r):n===`fts`?this.searchService.searchLogs(e,t,r):this.searchHybrid(e,t,r)}serializeFilters(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,t instanceof Date?t.toISOString():t]))}serializeResult(e,t){let n=typeof e.score==`number`?e.score:typeof e.rank==`number`?this.getFallbackScore(e.rank):void 0;return{...t?{score:n,rank:e.rank,distance:e.distance,sources:e.sources}:{},id:e.id,timestamp:e.timestamp.toISOString(),level:e.level,message:e.message,service:e.service,traceId:e.traceId,spanId:e.spanId,parentSpanId:e.parentSpanId,hostname:e.hostname,pid:e.pid,metadata:e.metadata,errorType:e.errorType,errorMessage:e.errorMessage,errorStack:e.errorStack,sessionId:e.sessionId,workflowRunId:e.workflowRunId,workflowName:e.workflowName,jobName:e.jobName,jobId:e.jobId,agentName:e.agentName,parentSessionId:e.parentSessionId,workflowRunKey:e.workflowRunKey,workflowId:e.workflowId,workflowWorkspace:e.workflowWorkspace,stepName:e.stepName,phase:e.phase,signalType:e.signalType,durationMs:e.durationMs}}getFallbackScore(e){return 1/(1+Math.max(0,Math.abs(e)))}async searchHybrid(e,t,n){let r=Math.max(n*2,50),i=this.searchService.searchLogs(e,t,r),a=await this.semanticSearchService.isAvailable(),o=await i;if(!a)return o;let s=await this.semanticSearchService.searchLogs(e,t,r),c=new Map;return o.forEach((e,t)=>{c.set(e.id,{result:e,score:.65*(1/(1+t)),rank:e.rank,sources:new Set([`fts`])})}),s.forEach((e,t)=>{let n=c.get(e.id),r=.35*(1/(1+t));n?(n.score+=r,n.sources.add(`semantic`),n.distance=e.distance,n.result={...n.result,...e}):c.set(e.id,{result:e,score:r,distance:e.distance,sources:new Set([`semantic`])})}),Array.from(c.values()).sort((e,t)=>t.score-e.score).slice(0,n).map(e=>({...e.result,score:e.score,sources:Array.from(e.sources),rank:e.rank,distance:e.distance}))}};const $=`@agimon-ai/log-sink-mcp`;let dt;function ft(){return dt??=n({serviceName:$,workspaceRoot:process.cwd(),discoverEndpoint:!1}),dt}async function pt(e,t,n){let r=await ft();return r.runInSpan(e,{attributes:t},async()=>{try{return await n()}catch(n){throw r.logger.error(`${e} failed`,{attributes:t,exception:n}),n}})}function mt(e){let t=new s({name:`log-sink-mcp`,version:`0.1.0`},{capabilities:{tools:{}}}),n=e??nt(),r=[new ut(n),new rt(n),new Z(n),new it(n),new ot(n)],i=new Map(r.map(e=>[e.getDefinition().name,e]));return t.setRequestHandler(l,async()=>pt(`mcp.server.list_tools`,{"mcp.service":$},async()=>({tools:r.map(e=>e.getDefinition())}))),t.setRequestHandler(c,async e=>{let{name:t,arguments:n}=e.params;return pt(`mcp.server.call_tool`,{"mcp.service":$,"mcp.tool.name":t},async()=>{let e=i.get(t);if(!e)return{content:[{type:`text`,text:`Unknown tool: ${t}`}],isError:!0};let r=a(n??{},e.getInputSchema());try{return await e.execute(r)}catch(n){return n instanceof u.ZodError?{content:[{type:`text`,text:o(n,{schemaName:t,schema:e.getInputSchema()})}],isError:!0}:{content:[{type:`text`,text:`Error executing tool ${t}: ${n instanceof Error?n.message:String(n)}`}],isError:!0}}})}),t}var ht=class{server;transport=null;constructor(e){this.server=e}async start(){this.transport=new fe,await this.server.connect(this.transport)}async stop(){this.transport&&=(await this.transport.close(),null)}};export{Z as a,rt as c,Ae as d,je as f,st as i,nt as l,mt as n,ot as o,C as p,ut as r,it as s,ht as t,G as u};
321
+ //# sourceMappingURL=stdio-BaJeLeLp.mjs.map