@jami-studio/core 0.92.26 → 0.92.28

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.
Files changed (66) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +23 -0
  3. package/corpus/core/package.json +2 -1
  4. package/corpus/core/src/deploy/build.ts +56 -2
  5. package/corpus/core/src/event-bus/bus.ts +138 -140
  6. package/corpus/core/src/event-bus/registry.ts +81 -79
  7. package/corpus/core/src/file-upload/registry.ts +135 -125
  8. package/corpus/core/src/notifications/registry.ts +218 -216
  9. package/corpus/core/src/observability/store.ts +1313 -1321
  10. package/corpus/core/src/private-blob/registry.ts +246 -242
  11. package/corpus/core/src/secrets/register.ts +132 -129
  12. package/corpus/core/src/shared/global-scope.ts +75 -0
  13. package/corpus/core/src/shared/init-memo.ts +94 -0
  14. package/corpus/core/src/sharing/registry.ts +193 -194
  15. package/corpus/core/src/tracking/providers.ts +425 -422
  16. package/corpus/core/src/tracking/registry.ts +102 -102
  17. package/dist/collab/routes.d.ts +1 -1
  18. package/dist/deploy/build.d.ts +23 -0
  19. package/dist/deploy/build.d.ts.map +1 -1
  20. package/dist/deploy/build.js +36 -2
  21. package/dist/deploy/build.js.map +1 -1
  22. package/dist/event-bus/bus.d.ts.map +1 -1
  23. package/dist/event-bus/bus.js +8 -6
  24. package/dist/event-bus/bus.js.map +1 -1
  25. package/dist/event-bus/registry.d.ts.map +1 -1
  26. package/dist/event-bus/registry.js +10 -6
  27. package/dist/event-bus/registry.js.map +1 -1
  28. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  29. package/dist/file-upload/registry.d.ts.map +1 -1
  30. package/dist/file-upload/registry.js +28 -8
  31. package/dist/file-upload/registry.js.map +1 -1
  32. package/dist/notifications/registry.d.ts.map +1 -1
  33. package/dist/notifications/registry.js +6 -5
  34. package/dist/notifications/registry.js.map +1 -1
  35. package/dist/observability/routes.d.ts +5 -5
  36. package/dist/observability/store.d.ts +1 -1
  37. package/dist/observability/store.d.ts.map +1 -1
  38. package/dist/observability/store.js +311 -316
  39. package/dist/observability/store.js.map +1 -1
  40. package/dist/private-blob/registry.d.ts.map +1 -1
  41. package/dist/private-blob/registry.js +18 -13
  42. package/dist/private-blob/registry.js.map +1 -1
  43. package/dist/progress/routes.d.ts +1 -1
  44. package/dist/resources/handlers.d.ts +2 -2
  45. package/dist/secrets/register.d.ts.map +1 -1
  46. package/dist/secrets/register.js +11 -7
  47. package/dist/secrets/register.js.map +1 -1
  48. package/dist/secrets/routes.d.ts +9 -9
  49. package/dist/shared/global-scope.d.ts +55 -0
  50. package/dist/shared/global-scope.d.ts.map +1 -0
  51. package/dist/shared/global-scope.js +70 -0
  52. package/dist/shared/global-scope.js.map +1 -0
  53. package/dist/shared/init-memo.d.ts +34 -0
  54. package/dist/shared/init-memo.d.ts.map +1 -0
  55. package/dist/shared/init-memo.js +80 -0
  56. package/dist/shared/init-memo.js.map +1 -0
  57. package/dist/sharing/registry.d.ts.map +1 -1
  58. package/dist/sharing/registry.js +2 -16
  59. package/dist/sharing/registry.js.map +1 -1
  60. package/dist/tracking/providers.d.ts.map +1 -1
  61. package/dist/tracking/providers.js +11 -9
  62. package/dist/tracking/providers.js.map +1 -1
  63. package/dist/tracking/registry.d.ts.map +1 -1
  64. package/dist/tracking/registry.js +5 -5
  65. package/dist/tracking/registry.js.map +1 -1
  66. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/observability/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * SQL persistence for the agent observability system.\r\n *\r\n * Creates and manages tables for traces, feedback, evals, experiments,\r\n * and satisfaction scores. Follows the same raw-SQL pattern as\r\n * run-store.ts and usage/store.ts — framework tables use getDbExec()\r\n * rather than Drizzle ORM (which is for template-level schemas).\r\n */\r\nimport {\r\n getDbExec,\r\n intType,\r\n isPostgres,\r\n retryOnDdlRace,\r\n} from \"../db/client.js\";\r\nimport {\r\n ensureTableExists,\r\n ensureColumnExists,\r\n ensureIndexExists,\r\n} from \"../db/ddl-guard.js\";\r\nimport { isDuplicateColumnError } from \"../db/migrations.js\";\r\nimport type {\r\n TraceSpan,\r\n TraceSummary,\r\n FeedbackEntry,\r\n SatisfactionScore,\r\n EvalResult,\r\n EvalDataset,\r\n Experiment,\r\n ExperimentAssignment,\r\n ExperimentMetricResult,\r\n} from \"./types.js\";\r\n\r\nfunction safeJsonParse<T>(value: unknown, fallback: T): T {\r\n if (!value) return fallback;\r\n try {\r\n return JSON.parse(String(value));\r\n } catch {\r\n return fallback;\r\n }\r\n}\r\n\r\n// Tables whose rows are owned by an end user — drives the boot-time\r\n// user_id ALTER loop and the per-user composite indexes below. Every\r\n// new user-owned observability table must be added here so the upgrade\r\n// path and the per-user query plan stay in sync.\r\nconst USER_SCOPED_TABLES = [\r\n \"agent_trace_spans\",\r\n \"agent_trace_summaries\",\r\n \"agent_satisfaction_scores\",\r\n \"agent_evals\",\r\n \"agent_feedback\",\r\n] as const;\r\n\r\n/**\r\n * Append an `AND user_id = ?` clause when a userId filter is requested.\r\n * Returns the fully-bound WHERE clause + args ready to splice into the\r\n * caller's SQL. Centralizes the pattern so tests can assert one shape.\r\n */\r\nfunction withUserFilter(\r\n baseWhere: string,\r\n baseArgs: any[],\r\n userId: string | undefined,\r\n): { where: string; args: any[] } {\r\n if (userId == null) return { where: baseWhere, args: baseArgs };\r\n return {\r\n where: `${baseWhere} AND user_id = ?`,\r\n args: [...baseArgs, userId],\r\n };\r\n}\r\n\r\nlet _initPromise: Promise<void> | undefined;\r\n\r\nexport async function ensureObservabilityTables(): Promise<void> {\r\n if (!_initPromise) {\r\n _initPromise = (async () => {\r\n const client = getDbExec();\r\n\r\n const traceSpansCreateSql = `\r\n CREATE TABLE IF NOT EXISTS agent_trace_spans (\r\n id TEXT PRIMARY KEY,\r\n run_id TEXT NOT NULL,\r\n thread_id TEXT,\r\n user_id TEXT,\r\n parent_span_id TEXT,\r\n span_type TEXT NOT NULL,\r\n name TEXT NOT NULL,\r\n input_tokens ${intType()} NOT NULL DEFAULT 0,\r\n output_tokens ${intType()} NOT NULL DEFAULT 0,\r\n cache_read_tokens ${intType()} NOT NULL DEFAULT 0,\r\n cache_write_tokens ${intType()} NOT NULL DEFAULT 0,\r\n cost_cents_x100 ${intType()} NOT NULL DEFAULT 0,\r\n duration_ms ${intType()} NOT NULL DEFAULT 0,\r\n status TEXT NOT NULL DEFAULT 'success',\r\n error_message TEXT,\r\n metadata TEXT,\r\n created_at ${intType()} NOT NULL\r\n )\r\n `;\r\n\r\n const traceSummariesCreateSql = `\r\n CREATE TABLE IF NOT EXISTS agent_trace_summaries (\r\n run_id TEXT PRIMARY KEY,\r\n thread_id TEXT,\r\n user_id TEXT,\r\n total_spans ${intType()} NOT NULL DEFAULT 0,\r\n llm_calls ${intType()} NOT NULL DEFAULT 0,\r\n tool_calls ${intType()} NOT NULL DEFAULT 0,\r\n successful_tools ${intType()} NOT NULL DEFAULT 0,\r\n failed_tools ${intType()} NOT NULL DEFAULT 0,\r\n total_duration_ms ${intType()} NOT NULL DEFAULT 0,\r\n total_cost_cents_x100 ${intType()} NOT NULL DEFAULT 0,\r\n total_input_tokens ${intType()} NOT NULL DEFAULT 0,\r\n total_output_tokens ${intType()} NOT NULL DEFAULT 0,\r\n model TEXT NOT NULL DEFAULT '',\r\n created_at ${intType()} NOT NULL\r\n )\r\n `;\r\n\r\n const feedbackCreateSql = `\r\n CREATE TABLE IF NOT EXISTS agent_feedback (\r\n id TEXT PRIMARY KEY,\r\n run_id TEXT,\r\n thread_id TEXT,\r\n message_seq ${intType()},\r\n feedback_type TEXT NOT NULL,\r\n value TEXT NOT NULL DEFAULT '',\r\n user_id TEXT,\r\n created_at ${intType()} NOT NULL\r\n )\r\n `;\r\n\r\n const satisfactionScoresCreateSql = `\r\n CREATE TABLE IF NOT EXISTS agent_satisfaction_scores (\r\n id TEXT PRIMARY KEY,\r\n thread_id TEXT NOT NULL,\r\n user_id TEXT,\r\n frustration_score REAL NOT NULL DEFAULT 0,\r\n rephrasing_score REAL NOT NULL DEFAULT 0,\r\n abandonment_score REAL NOT NULL DEFAULT 0,\r\n sentiment_score REAL NOT NULL DEFAULT 0,\r\n length_trend_score REAL NOT NULL DEFAULT 0,\r\n computed_at ${intType()} NOT NULL\r\n )\r\n `;\r\n\r\n const evalsCreateSql = `\r\n CREATE TABLE IF NOT EXISTS agent_evals (\r\n id TEXT PRIMARY KEY,\r\n run_id TEXT NOT NULL,\r\n thread_id TEXT,\r\n user_id TEXT,\r\n eval_type TEXT NOT NULL,\r\n criteria TEXT NOT NULL,\r\n score REAL NOT NULL DEFAULT 0,\r\n reasoning TEXT,\r\n metadata TEXT,\r\n created_at ${intType()} NOT NULL\r\n )\r\n `;\r\n\r\n const evalDatasetsCreateSql = `\r\n CREATE TABLE IF NOT EXISTS agent_eval_datasets (\r\n id TEXT PRIMARY KEY,\r\n name TEXT NOT NULL,\r\n description TEXT NOT NULL DEFAULT '',\r\n entries TEXT NOT NULL DEFAULT '[]',\r\n created_at ${intType()} NOT NULL,\r\n updated_at ${intType()} NOT NULL\r\n )\r\n `;\r\n\r\n const experimentsCreateSql = `\r\n CREATE TABLE IF NOT EXISTS agent_experiments (\r\n id TEXT PRIMARY KEY,\r\n name TEXT NOT NULL,\r\n status TEXT NOT NULL DEFAULT 'draft',\r\n variants TEXT NOT NULL DEFAULT '[]',\r\n metrics TEXT NOT NULL DEFAULT '[]',\r\n assignment_level TEXT NOT NULL DEFAULT 'user',\r\n started_at ${intType()},\r\n ended_at ${intType()},\r\n created_at ${intType()} NOT NULL,\r\n owner_email TEXT\r\n )\r\n `;\r\n\r\n const experimentAssignmentsCreateSql = `\r\n CREATE TABLE IF NOT EXISTS agent_experiment_assignments (\r\n experiment_id TEXT NOT NULL,\r\n user_id TEXT NOT NULL,\r\n variant_id TEXT NOT NULL,\r\n assigned_at ${intType()} NOT NULL,\r\n PRIMARY KEY (experiment_id, user_id)\r\n )\r\n `;\r\n\r\n const experimentResultsCreateSql = `\r\n CREATE TABLE IF NOT EXISTS agent_experiment_results (\r\n id TEXT PRIMARY KEY,\r\n experiment_id TEXT NOT NULL,\r\n variant_id TEXT NOT NULL,\r\n metric TEXT NOT NULL,\r\n value REAL NOT NULL DEFAULT 0,\r\n sample_size ${intType()} NOT NULL DEFAULT 0,\r\n confidence_low REAL NOT NULL DEFAULT 0,\r\n confidence_high REAL NOT NULL DEFAULT 0,\r\n computed_at ${intType()} NOT NULL\r\n )\r\n `;\r\n\r\n if (isPostgres()) {\r\n // PG guard: probe → guarded DDL → re-probe; skips lock on already-migrated path\r\n await ensureTableExists(\"agent_trace_spans\", traceSpansCreateSql);\r\n await ensureTableExists(\r\n \"agent_trace_summaries\",\r\n traceSummariesCreateSql,\r\n );\r\n await ensureTableExists(\"agent_feedback\", feedbackCreateSql);\r\n await ensureTableExists(\r\n \"agent_satisfaction_scores\",\r\n satisfactionScoresCreateSql,\r\n );\r\n await ensureTableExists(\"agent_evals\", evalsCreateSql);\r\n await ensureTableExists(\"agent_eval_datasets\", evalDatasetsCreateSql);\r\n await ensureTableExists(\"agent_experiments\", experimentsCreateSql);\r\n await ensureTableExists(\r\n \"agent_experiment_assignments\",\r\n experimentAssignmentsCreateSql,\r\n );\r\n await ensureTableExists(\r\n \"agent_experiment_results\",\r\n experimentResultsCreateSql,\r\n );\r\n await ensureColumnExists(\r\n \"agent_experiments\",\r\n \"owner_email\",\r\n `ALTER TABLE agent_experiments ADD COLUMN IF NOT EXISTS owner_email TEXT`,\r\n );\r\n for (const table of USER_SCOPED_TABLES) {\r\n await ensureColumnExists(\r\n table,\r\n \"user_id\",\r\n `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS user_id TEXT`,\r\n );\r\n }\r\n await ensureIndexExists(\r\n \"idx_trace_spans_run\",\r\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_run ON agent_trace_spans (run_id)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_trace_spans_thread\",\r\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_thread ON agent_trace_spans (thread_id)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_trace_spans_created\",\r\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_created ON agent_trace_spans (created_at)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_trace_summaries_created\",\r\n `CREATE INDEX IF NOT EXISTS idx_trace_summaries_created ON agent_trace_summaries (created_at)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_trace_summaries_user\",\r\n `CREATE INDEX IF NOT EXISTS idx_trace_summaries_user ON agent_trace_summaries (user_id, created_at)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_trace_spans_user\",\r\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_user ON agent_trace_spans (user_id)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_feedback_thread\",\r\n `CREATE INDEX IF NOT EXISTS idx_feedback_thread ON agent_feedback (thread_id)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_feedback_created\",\r\n `CREATE INDEX IF NOT EXISTS idx_feedback_created ON agent_feedback (created_at)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_feedback_user\",\r\n `CREATE INDEX IF NOT EXISTS idx_feedback_user ON agent_feedback (user_id, created_at)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_satisfaction_thread\",\r\n `CREATE INDEX IF NOT EXISTS idx_satisfaction_thread ON agent_satisfaction_scores (thread_id)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_satisfaction_user\",\r\n `CREATE INDEX IF NOT EXISTS idx_satisfaction_user ON agent_satisfaction_scores (user_id, computed_at)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_evals_run\",\r\n `CREATE INDEX IF NOT EXISTS idx_evals_run ON agent_evals (run_id)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_evals_created\",\r\n `CREATE INDEX IF NOT EXISTS idx_evals_created ON agent_evals (created_at)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_evals_user\",\r\n `CREATE INDEX IF NOT EXISTS idx_evals_user ON agent_evals (user_id, created_at)`,\r\n );\r\n await ensureIndexExists(\r\n \"idx_experiment_results_exp\",\r\n `CREATE INDEX IF NOT EXISTS idx_experiment_results_exp ON agent_experiment_results (experiment_id)`,\r\n );\r\n return;\r\n }\r\n\r\n // SQLite (local dev): no lock problem — keep the original behaviour.\r\n await retryOnDdlRace(() => client.execute(traceSpansCreateSql));\r\n\r\n await retryOnDdlRace(() => client.execute(traceSummariesCreateSql));\r\n\r\n await retryOnDdlRace(() => client.execute(feedbackCreateSql));\r\n\r\n await retryOnDdlRace(() => client.execute(satisfactionScoresCreateSql));\r\n\r\n await retryOnDdlRace(() => client.execute(evalsCreateSql));\r\n\r\n await retryOnDdlRace(() => client.execute(evalDatasetsCreateSql));\r\n\r\n await retryOnDdlRace(() => client.execute(experimentsCreateSql));\r\n\r\n // Additive migration for DBs created before the owner column shipped\r\n // (any pre-existing rows have NULL owner — see `updateExperiment` for\r\n // the migration semantics). Mutations on those rows fall back to the\r\n // standard authentication gate but cannot enforce per-owner scoping\r\n // until they're re-saved.\r\n try {\r\n await client.execute(\r\n `ALTER TABLE agent_experiments ADD COLUMN owner_email TEXT`,\r\n );\r\n } catch {\r\n // Column already exists — expected after first run.\r\n }\r\n\r\n await retryOnDdlRace(() =>\r\n client.execute(experimentAssignmentsCreateSql),\r\n );\r\n\r\n await retryOnDdlRace(() => client.execute(experimentResultsCreateSql));\r\n\r\n // Idempotent column upgrades for DBs created before per-user\r\n // isolation. SQLite has no `ADD COLUMN IF NOT EXISTS`; Postgres\r\n // surfaces \"column ... already exists\". `isDuplicateColumnError`\r\n // (from db/migrations.ts) recognizes both shapes.\r\n for (const table of USER_SCOPED_TABLES) {\r\n try {\r\n await client.execute(`ALTER TABLE ${table} ADD COLUMN user_id TEXT`);\r\n } catch (err) {\r\n if (isDuplicateColumnError(err)) continue;\r\n throw err;\r\n }\r\n }\r\n\r\n // Indexes for common query patterns\r\n const indexes = [\r\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_run ON agent_trace_spans (run_id)`,\r\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_thread ON agent_trace_spans (thread_id)`,\r\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_created ON agent_trace_spans (created_at)`,\r\n `CREATE INDEX IF NOT EXISTS idx_trace_summaries_created ON agent_trace_summaries (created_at)`,\r\n `CREATE INDEX IF NOT EXISTS idx_trace_summaries_user ON agent_trace_summaries (user_id, created_at)`,\r\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_user ON agent_trace_spans (user_id)`,\r\n `CREATE INDEX IF NOT EXISTS idx_feedback_thread ON agent_feedback (thread_id)`,\r\n `CREATE INDEX IF NOT EXISTS idx_feedback_created ON agent_feedback (created_at)`,\r\n `CREATE INDEX IF NOT EXISTS idx_feedback_user ON agent_feedback (user_id, created_at)`,\r\n `CREATE INDEX IF NOT EXISTS idx_satisfaction_thread ON agent_satisfaction_scores (thread_id)`,\r\n `CREATE INDEX IF NOT EXISTS idx_satisfaction_user ON agent_satisfaction_scores (user_id, computed_at)`,\r\n `CREATE INDEX IF NOT EXISTS idx_evals_run ON agent_evals (run_id)`,\r\n `CREATE INDEX IF NOT EXISTS idx_evals_created ON agent_evals (created_at)`,\r\n `CREATE INDEX IF NOT EXISTS idx_evals_user ON agent_evals (user_id, created_at)`,\r\n `CREATE INDEX IF NOT EXISTS idx_experiment_results_exp ON agent_experiment_results (experiment_id)`,\r\n ];\r\n for (const sql of indexes) {\r\n try {\r\n await client.execute(sql);\r\n } catch {\r\n // Index might already exist\r\n }\r\n }\r\n })().catch((err) => {\r\n _initPromise = undefined;\r\n throw err;\r\n });\r\n }\r\n return _initPromise;\r\n}\r\n\r\n// ─── Trace span CRUD ─────────────────────────────────────────────────\r\n\r\nexport async function insertTraceSpan(span: TraceSpan): Promise<void> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n await client.execute({\r\n sql: `INSERT INTO agent_trace_spans\r\n (id, run_id, thread_id, user_id, parent_span_id, span_type, name,\r\n input_tokens, output_tokens, cache_read_tokens, cache_write_tokens,\r\n cost_cents_x100, duration_ms, status, error_message, metadata, created_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\r\n args: [\r\n span.id,\r\n span.runId,\r\n span.threadId,\r\n span.userId,\r\n span.parentSpanId,\r\n span.spanType,\r\n span.name,\r\n span.inputTokens,\r\n span.outputTokens,\r\n span.cacheReadTokens,\r\n span.cacheWriteTokens,\r\n span.costCentsX100,\r\n span.durationMs,\r\n span.status,\r\n span.errorMessage,\r\n span.metadata ? JSON.stringify(span.metadata) : null,\r\n span.createdAt,\r\n ],\r\n });\r\n}\r\n\r\nexport async function upsertTraceSummary(summary: TraceSummary): Promise<void> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n // user_id is intentionally NOT updated on conflict — once a run's\r\n // owner is recorded it shouldn't change under us.\r\n if (isPostgres()) {\r\n await client.execute({\r\n sql: `INSERT INTO agent_trace_summaries\r\n (run_id, thread_id, user_id, total_spans, llm_calls, tool_calls,\r\n successful_tools, failed_tools, total_duration_ms,\r\n total_cost_cents_x100, total_input_tokens, total_output_tokens,\r\n model, created_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\r\n ON CONFLICT (run_id) DO UPDATE SET\r\n total_spans = EXCLUDED.total_spans,\r\n llm_calls = EXCLUDED.llm_calls,\r\n tool_calls = EXCLUDED.tool_calls,\r\n successful_tools = EXCLUDED.successful_tools,\r\n failed_tools = EXCLUDED.failed_tools,\r\n total_duration_ms = EXCLUDED.total_duration_ms,\r\n total_cost_cents_x100 = EXCLUDED.total_cost_cents_x100,\r\n total_input_tokens = EXCLUDED.total_input_tokens,\r\n total_output_tokens = EXCLUDED.total_output_tokens,\r\n model = EXCLUDED.model`,\r\n args: [\r\n summary.runId,\r\n summary.threadId,\r\n summary.userId,\r\n summary.totalSpans,\r\n summary.llmCalls,\r\n summary.toolCalls,\r\n summary.successfulTools,\r\n summary.failedTools,\r\n summary.totalDurationMs,\r\n summary.totalCostCentsX100,\r\n summary.totalInputTokens,\r\n summary.totalOutputTokens,\r\n summary.model,\r\n summary.createdAt,\r\n ],\r\n });\r\n } else {\r\n await client.execute({\r\n sql: `INSERT INTO agent_trace_summaries\r\n (run_id, thread_id, user_id, total_spans, llm_calls, tool_calls,\r\n successful_tools, failed_tools, total_duration_ms,\r\n total_cost_cents_x100, total_input_tokens, total_output_tokens,\r\n model, created_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\r\n ON CONFLICT (run_id) DO UPDATE SET\r\n total_spans = EXCLUDED.total_spans,\r\n llm_calls = EXCLUDED.llm_calls,\r\n tool_calls = EXCLUDED.tool_calls,\r\n successful_tools = EXCLUDED.successful_tools,\r\n failed_tools = EXCLUDED.failed_tools,\r\n total_duration_ms = EXCLUDED.total_duration_ms,\r\n total_cost_cents_x100 = EXCLUDED.total_cost_cents_x100,\r\n total_input_tokens = EXCLUDED.total_input_tokens,\r\n total_output_tokens = EXCLUDED.total_output_tokens,\r\n model = EXCLUDED.model`,\r\n args: [\r\n summary.runId,\r\n summary.threadId,\r\n summary.userId,\r\n summary.totalSpans,\r\n summary.llmCalls,\r\n summary.toolCalls,\r\n summary.successfulTools,\r\n summary.failedTools,\r\n summary.totalDurationMs,\r\n summary.totalCostCentsX100,\r\n summary.totalInputTokens,\r\n summary.totalOutputTokens,\r\n summary.model,\r\n summary.createdAt,\r\n ],\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Purge trace spans, summaries, and eval results older than `cutoffMs`\r\n * (a Unix epoch in milliseconds — rows with `created_at < cutoffMs` are\r\n * deleted). Returns the per-table deletion counts. Satisfies the span\r\n * retention TTL noted in /tmp/security-audit/12-mcp-a2a-agent.md\r\n * (MEDIUM #14): trace metadata can hold sensitive tool inputs, so we\r\n * cap the storage horizon. Feedback rows are retained — they're\r\n * intentionally durable for product analytics. Experiments and\r\n * datasets are also retained because they are user-authored\r\n * configuration, not call telemetry.\r\n */\r\nexport async function deleteOldTraceData(cutoffMs: number): Promise<{\r\n spans: number;\r\n summaries: number;\r\n evals: number;\r\n}> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const cutoff = Math.floor(cutoffMs);\r\n\r\n const [spansResult, summariesResult, evalsResult] = await Promise.all([\r\n client.execute({\r\n sql: `DELETE FROM agent_trace_spans WHERE created_at < ?`,\r\n args: [cutoff],\r\n }),\r\n client.execute({\r\n sql: `DELETE FROM agent_trace_summaries WHERE created_at < ?`,\r\n args: [cutoff],\r\n }),\r\n client.execute({\r\n sql: `DELETE FROM agent_evals WHERE created_at < ?`,\r\n args: [cutoff],\r\n }),\r\n ]);\r\n\r\n return {\r\n spans: Number(spansResult.rowsAffected ?? 0),\r\n summaries: Number(summariesResult.rowsAffected ?? 0),\r\n evals: Number(evalsResult.rowsAffected ?? 0),\r\n };\r\n}\r\n\r\nexport async function getTraceSpansForRun(\r\n runId: string,\r\n opts: { userId?: string } = {},\r\n): Promise<TraceSpan[]> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const { where, args } = withUserFilter(\"run_id = ?\", [runId], opts.userId);\r\n const { rows } = await client.execute({\r\n sql: `SELECT * FROM agent_trace_spans WHERE ${where} ORDER BY created_at ASC`,\r\n args,\r\n });\r\n return (rows as any[]).map(rowToTraceSpan);\r\n}\r\n\r\nexport async function getTraceSummaries(opts: {\r\n sinceMs?: number;\r\n limit?: number;\r\n userId?: string;\r\n}): Promise<TraceSummary[]> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const sinceMs = opts.sinceMs ?? 0;\r\n const limit = opts.limit ?? 100;\r\n const { where, args } = withUserFilter(\r\n \"created_at >= ?\",\r\n [sinceMs],\r\n opts.userId,\r\n );\r\n const { rows } = await client.execute({\r\n sql: `SELECT * FROM agent_trace_summaries\r\n WHERE ${where}\r\n ORDER BY created_at DESC\r\n LIMIT ?`,\r\n args: [...args, limit],\r\n });\r\n return (rows as any[]).map(rowToTraceSummary);\r\n}\r\n\r\nexport async function getTraceSummary(\r\n runId: string,\r\n opts: { userId?: string } = {},\r\n): Promise<TraceSummary | null> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const { where, args } = withUserFilter(\"run_id = ?\", [runId], opts.userId);\r\n const { rows } = await client.execute({\r\n sql: `SELECT * FROM agent_trace_summaries WHERE ${where}`,\r\n args,\r\n });\r\n if (rows.length === 0) return null;\r\n return rowToTraceSummary(rows[0] as any);\r\n}\r\n\r\n// ─── Feedback CRUD ───────────────────────────────────────────────────\r\n\r\nexport async function insertFeedback(entry: FeedbackEntry): Promise<void> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n await client.execute({\r\n sql: `INSERT INTO agent_feedback\r\n (id, run_id, thread_id, message_seq, feedback_type, value, user_id, created_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\r\n args: [\r\n entry.id,\r\n entry.runId,\r\n entry.threadId,\r\n entry.messageSeq,\r\n entry.feedbackType,\r\n entry.value,\r\n entry.userId,\r\n entry.createdAt,\r\n ],\r\n });\r\n}\r\n\r\nexport async function getFeedback(opts: {\r\n threadId?: string;\r\n sinceMs?: number;\r\n limit?: number;\r\n feedbackType?: string;\r\n userId?: string;\r\n}): Promise<FeedbackEntry[]> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const conditions: string[] = [];\r\n const args: any[] = [];\r\n if (opts.threadId) {\r\n conditions.push(\"thread_id = ?\");\r\n args.push(opts.threadId);\r\n }\r\n if (opts.sinceMs) {\r\n conditions.push(\"created_at >= ?\");\r\n args.push(opts.sinceMs);\r\n }\r\n if (opts.feedbackType) {\r\n conditions.push(\"feedback_type = ?\");\r\n args.push(opts.feedbackType);\r\n }\r\n if (opts.userId) {\r\n conditions.push(\"user_id = ?\");\r\n args.push(opts.userId);\r\n }\r\n const where =\r\n conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\r\n const limit = opts.limit ?? 100;\r\n const { rows } = await client.execute({\r\n sql: `SELECT * FROM agent_feedback ${where} ORDER BY created_at DESC LIMIT ?`,\r\n args: [...args, limit],\r\n });\r\n return (rows as any[]).map(rowToFeedback);\r\n}\r\n\r\nexport async function getFeedbackStats(\r\n sinceMs: number,\r\n opts: { userId?: string } = {},\r\n): Promise<{\r\n total: number;\r\n thumbsUp: number;\r\n thumbsDown: number;\r\n categories: Record<string, number>;\r\n}> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const { where, args } = withUserFilter(\r\n \"created_at >= ?\",\r\n [sinceMs],\r\n opts.userId,\r\n );\r\n const { rows } = await client.execute({\r\n sql: `SELECT feedback_type, value, COUNT(*) as cnt\r\n FROM agent_feedback WHERE ${where}\r\n GROUP BY feedback_type, value`,\r\n args,\r\n });\r\n let total = 0;\r\n let thumbsUp = 0;\r\n let thumbsDown = 0;\r\n const categories: Record<string, number> = {};\r\n for (const row of rows as any[]) {\r\n const cnt = Number(row.cnt);\r\n total += cnt;\r\n if (row.feedback_type === \"thumbs_up\") thumbsUp += cnt;\r\n else if (row.feedback_type === \"thumbs_down\") thumbsDown += cnt;\r\n else if (row.feedback_type === \"category\")\r\n categories[String(row.value)] = cnt;\r\n }\r\n return { total, thumbsUp, thumbsDown, categories };\r\n}\r\n\r\n// ─── Satisfaction scores CRUD ────────────────────────────────────────\r\n\r\nexport async function upsertSatisfactionScore(\r\n score: SatisfactionScore,\r\n): Promise<void> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n if (isPostgres()) {\r\n await client.execute({\r\n sql: `INSERT INTO agent_satisfaction_scores\r\n (id, thread_id, user_id, frustration_score, rephrasing_score,\r\n abandonment_score, sentiment_score, length_trend_score, computed_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\r\n ON CONFLICT (id) DO UPDATE SET\r\n frustration_score = EXCLUDED.frustration_score,\r\n rephrasing_score = EXCLUDED.rephrasing_score,\r\n abandonment_score = EXCLUDED.abandonment_score,\r\n sentiment_score = EXCLUDED.sentiment_score,\r\n length_trend_score = EXCLUDED.length_trend_score,\r\n computed_at = EXCLUDED.computed_at`,\r\n args: [\r\n score.id,\r\n score.threadId,\r\n score.userId,\r\n score.frustrationScore,\r\n score.rephrasingScore,\r\n score.abandonmentScore,\r\n score.sentimentScore,\r\n score.lengthTrendScore,\r\n score.computedAt,\r\n ],\r\n });\r\n } else {\r\n await client.execute({\r\n sql: `INSERT INTO agent_satisfaction_scores\r\n (id, thread_id, user_id, frustration_score, rephrasing_score,\r\n abandonment_score, sentiment_score, length_trend_score, computed_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\r\n ON CONFLICT (id) DO UPDATE SET\r\n frustration_score = EXCLUDED.frustration_score,\r\n rephrasing_score = EXCLUDED.rephrasing_score,\r\n abandonment_score = EXCLUDED.abandonment_score,\r\n sentiment_score = EXCLUDED.sentiment_score,\r\n length_trend_score = EXCLUDED.length_trend_score,\r\n computed_at = EXCLUDED.computed_at`,\r\n args: [\r\n score.id,\r\n score.threadId,\r\n score.userId,\r\n score.frustrationScore,\r\n score.rephrasingScore,\r\n score.abandonmentScore,\r\n score.sentimentScore,\r\n score.lengthTrendScore,\r\n score.computedAt,\r\n ],\r\n });\r\n }\r\n}\r\n\r\nexport async function getSatisfactionScores(opts: {\r\n sinceMs?: number;\r\n limit?: number;\r\n minFrustration?: number;\r\n userId?: string;\r\n}): Promise<SatisfactionScore[]> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const conditions: string[] = [];\r\n const args: any[] = [];\r\n if (opts.sinceMs) {\r\n conditions.push(\"computed_at >= ?\");\r\n args.push(opts.sinceMs);\r\n }\r\n if (opts.minFrustration != null) {\r\n conditions.push(\"frustration_score >= ?\");\r\n args.push(opts.minFrustration);\r\n }\r\n if (opts.userId) {\r\n conditions.push(\"user_id = ?\");\r\n args.push(opts.userId);\r\n }\r\n const where =\r\n conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\r\n const { rows } = await client.execute({\r\n sql: `SELECT * FROM agent_satisfaction_scores ${where}\r\n ORDER BY computed_at DESC LIMIT ?`,\r\n args: [...args, opts.limit ?? 100],\r\n });\r\n return (rows as any[]).map(rowToSatisfaction);\r\n}\r\n\r\n// ─── Evals CRUD ──────────────────────────────────────────────────────\r\n\r\nexport async function insertEvalResult(result: EvalResult): Promise<void> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n await client.execute({\r\n sql: `INSERT INTO agent_evals\r\n (id, run_id, thread_id, user_id, eval_type, criteria, score, reasoning, metadata, created_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\r\n args: [\r\n result.id,\r\n result.runId,\r\n result.threadId,\r\n result.userId,\r\n result.evalType,\r\n result.criteria,\r\n result.score,\r\n result.reasoning,\r\n result.metadata ? JSON.stringify(result.metadata) : null,\r\n result.createdAt,\r\n ],\r\n });\r\n}\r\n\r\nexport async function getEvalsForRun(\r\n runId: string,\r\n opts: { userId?: string } = {},\r\n): Promise<EvalResult[]> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const { where, args } = withUserFilter(\"run_id = ?\", [runId], opts.userId);\r\n const { rows } = await client.execute({\r\n sql: `SELECT * FROM agent_evals WHERE ${where} ORDER BY created_at ASC`,\r\n args,\r\n });\r\n return (rows as any[]).map(rowToEval);\r\n}\r\n\r\nexport async function getEvalStats(\r\n sinceMs: number,\r\n opts: { userId?: string } = {},\r\n): Promise<{\r\n totalEvals: number;\r\n avgScore: number;\r\n byCriteria: Array<{ criteria: string; avgScore: number; count: number }>;\r\n}> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const { where, args } = withUserFilter(\r\n \"created_at >= ?\",\r\n [sinceMs],\r\n opts.userId,\r\n );\r\n const { rows: totalRows } = await client.execute({\r\n sql: `SELECT COUNT(*) as cnt, AVG(score) as avg_score\r\n FROM agent_evals WHERE ${where}`,\r\n args,\r\n });\r\n const t = (totalRows[0] ?? {}) as Record<string, number | null>;\r\n\r\n const { rows: criteriaRows } = await client.execute({\r\n sql: `SELECT criteria, AVG(score) as avg_score, COUNT(*) as cnt\r\n FROM agent_evals WHERE ${where}\r\n GROUP BY criteria ORDER BY cnt DESC`,\r\n args,\r\n });\r\n\r\n return {\r\n totalEvals: Number(t.cnt ?? 0),\r\n avgScore: Number(t.avg_score ?? 0),\r\n byCriteria: (criteriaRows as any[]).map((r) => ({\r\n criteria: String(r.criteria),\r\n avgScore: Number(r.avg_score ?? 0),\r\n count: Number(r.cnt ?? 0),\r\n })),\r\n };\r\n}\r\n\r\n// ─── Eval datasets CRUD ──────────────────────────────────────────────\r\n\r\nexport async function insertEvalDataset(dataset: EvalDataset): Promise<void> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n await client.execute({\r\n sql: `INSERT INTO agent_eval_datasets\r\n (id, name, description, entries, created_at, updated_at)\r\n VALUES (?, ?, ?, ?, ?, ?)`,\r\n args: [\r\n dataset.id,\r\n dataset.name,\r\n dataset.description,\r\n JSON.stringify(dataset.entries),\r\n dataset.createdAt,\r\n dataset.updatedAt,\r\n ],\r\n });\r\n}\r\n\r\nexport async function listEvalDatasets(): Promise<EvalDataset[]> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const { rows } = await client.execute(\r\n `SELECT * FROM agent_eval_datasets ORDER BY updated_at DESC`,\r\n );\r\n return (rows as any[]).map(rowToDataset);\r\n}\r\n\r\nexport async function getEvalDataset(id: string): Promise<EvalDataset | null> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const { rows } = await client.execute({\r\n sql: `SELECT * FROM agent_eval_datasets WHERE id = ?`,\r\n args: [id],\r\n });\r\n if (rows.length === 0) return null;\r\n return rowToDataset(rows[0] as any);\r\n}\r\n\r\nexport async function updateEvalDataset(\r\n id: string,\r\n updates: Partial<Pick<EvalDataset, \"name\" | \"description\" | \"entries\">>,\r\n): Promise<void> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const sets: string[] = [];\r\n const args: any[] = [];\r\n if (updates.name !== undefined) {\r\n sets.push(\"name = ?\");\r\n args.push(updates.name);\r\n }\r\n if (updates.description !== undefined) {\r\n sets.push(\"description = ?\");\r\n args.push(updates.description);\r\n }\r\n if (updates.entries !== undefined) {\r\n sets.push(\"entries = ?\");\r\n args.push(JSON.stringify(updates.entries));\r\n }\r\n sets.push(\"updated_at = ?\");\r\n args.push(Date.now());\r\n args.push(id);\r\n await client.execute({\r\n sql: `UPDATE agent_eval_datasets SET ${sets.join(\", \")} WHERE id = ?`,\r\n args,\r\n });\r\n}\r\n\r\n// ─── Experiments CRUD ────────────────────────────────────────────────\r\n\r\nexport async function insertExperiment(exp: Experiment): Promise<void> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n await client.execute({\r\n sql: `INSERT INTO agent_experiments\r\n (id, name, status, variants, metrics, assignment_level,\r\n started_at, ended_at, created_at, owner_email)\r\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\r\n args: [\r\n exp.id,\r\n exp.name,\r\n exp.status,\r\n JSON.stringify(exp.variants),\r\n JSON.stringify(exp.metrics),\r\n exp.assignmentLevel,\r\n exp.startedAt,\r\n exp.endedAt,\r\n exp.createdAt,\r\n exp.ownerEmail ?? null,\r\n ],\r\n });\r\n}\r\n\r\nexport async function updateExperiment(\r\n id: string,\r\n updates: Partial<\r\n Pick<Experiment, \"name\" | \"status\" | \"variants\" | \"metrics\" | \"endedAt\">\r\n >,\r\n): Promise<void> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const sets: string[] = [];\r\n const args: any[] = [];\r\n if (updates.name !== undefined) {\r\n sets.push(\"name = ?\");\r\n args.push(updates.name);\r\n }\r\n if (updates.status !== undefined) {\r\n sets.push(\"status = ?\");\r\n args.push(updates.status);\r\n if (updates.status === \"running\" && !updates.endedAt) {\r\n sets.push(\"started_at = ?\");\r\n args.push(Date.now());\r\n }\r\n }\r\n if (updates.variants !== undefined) {\r\n sets.push(\"variants = ?\");\r\n args.push(JSON.stringify(updates.variants));\r\n }\r\n if (updates.metrics !== undefined) {\r\n sets.push(\"metrics = ?\");\r\n args.push(JSON.stringify(updates.metrics));\r\n }\r\n if (updates.endedAt !== undefined) {\r\n sets.push(\"ended_at = ?\");\r\n args.push(updates.endedAt);\r\n }\r\n if (sets.length === 0) return;\r\n args.push(id);\r\n await client.execute({\r\n sql: `UPDATE agent_experiments SET ${sets.join(\", \")} WHERE id = ?`,\r\n args,\r\n });\r\n}\r\n\r\nexport async function listExperiments(): Promise<Experiment[]> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const { rows } = await client.execute(\r\n `SELECT * FROM agent_experiments ORDER BY created_at DESC`,\r\n );\r\n return (rows as any[]).map(rowToExperiment);\r\n}\r\n\r\nexport async function getExperiment(id: string): Promise<Experiment | null> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const { rows } = await client.execute({\r\n sql: `SELECT * FROM agent_experiments WHERE id = ?`,\r\n args: [id],\r\n });\r\n if (rows.length === 0) return null;\r\n return rowToExperiment(rows[0] as any);\r\n}\r\n\r\n// ─── Experiment assignments CRUD ────────────────────────────────────\r\n\r\nexport async function upsertAssignment(\r\n assignment: ExperimentAssignment,\r\n): Promise<void> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n if (isPostgres()) {\r\n await client.execute({\r\n sql: `INSERT INTO agent_experiment_assignments\r\n (experiment_id, user_id, variant_id, assigned_at)\r\n VALUES (?, ?, ?, ?)\r\n ON CONFLICT (experiment_id, user_id) DO UPDATE SET\r\n variant_id = EXCLUDED.variant_id,\r\n assigned_at = EXCLUDED.assigned_at`,\r\n args: [\r\n assignment.experimentId,\r\n assignment.userId,\r\n assignment.variantId,\r\n assignment.assignedAt,\r\n ],\r\n });\r\n } else {\r\n await client.execute({\r\n sql: `INSERT OR REPLACE INTO agent_experiment_assignments\r\n (experiment_id, user_id, variant_id, assigned_at)\r\n VALUES (?, ?, ?, ?)`,\r\n args: [\r\n assignment.experimentId,\r\n assignment.userId,\r\n assignment.variantId,\r\n assignment.assignedAt,\r\n ],\r\n });\r\n }\r\n}\r\n\r\nexport async function getAssignment(\r\n experimentId: string,\r\n userId: string,\r\n): Promise<ExperimentAssignment | null> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const { rows } = await client.execute({\r\n sql: `SELECT * FROM agent_experiment_assignments\r\n WHERE experiment_id = ? AND user_id = ?`,\r\n args: [experimentId, userId],\r\n });\r\n if (rows.length === 0) return null;\r\n const r = rows[0] as any;\r\n return {\r\n experimentId: r.experiment_id,\r\n userId: r.user_id,\r\n variantId: r.variant_id,\r\n assignedAt: Number(r.assigned_at),\r\n };\r\n}\r\n\r\n// ─── Experiment results CRUD ─────────────────────────────────────────\r\n\r\nexport async function insertExperimentResult(\r\n result: ExperimentMetricResult,\r\n): Promise<void> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n await client.execute({\r\n sql: `INSERT INTO agent_experiment_results\r\n (id, experiment_id, variant_id, metric, value,\r\n sample_size, confidence_low, confidence_high, computed_at)\r\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\r\n args: [\r\n result.id,\r\n result.experimentId,\r\n result.variantId,\r\n result.metric,\r\n result.value,\r\n result.sampleSize,\r\n result.confidenceLow,\r\n result.confidenceHigh,\r\n result.computedAt,\r\n ],\r\n });\r\n}\r\n\r\nexport async function getExperimentResults(\r\n experimentId: string,\r\n): Promise<ExperimentMetricResult[]> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n const { rows } = await client.execute({\r\n sql: `SELECT * FROM agent_experiment_results\r\n WHERE experiment_id = ?\r\n ORDER BY computed_at DESC`,\r\n args: [experimentId],\r\n });\r\n return (rows as any[]).map(rowToExperimentResult);\r\n}\r\n\r\n// ─── Aggregate queries for dashboard ─────────────────────────────────\r\n\r\nexport async function getObservabilityOverview(\r\n sinceMs: number,\r\n opts: { userId?: string } = {},\r\n): Promise<{\r\n totalRuns: number;\r\n totalCostCents: number;\r\n avgDurationMs: number;\r\n toolSuccessRate: number;\r\n avgFrustrationScore: number;\r\n thumbsUpRate: number;\r\n avgEvalScore: number;\r\n}> {\r\n await ensureObservabilityTables();\r\n const client = getDbExec();\r\n\r\n // Three of the four sub-queries time-key on `created_at`; satisfaction\r\n // uses `computed_at`. Each gets its own `withUserFilter` invocation so\r\n // the args array isn't aliased across calls (some drivers mutate args\r\n // for prepared-statement caching).\r\n const created = withUserFilter(\"created_at >= ?\", [sinceMs], opts.userId);\r\n const computed = withUserFilter(\"computed_at >= ?\", [sinceMs], opts.userId);\r\n\r\n const [tracesResult, satisfactionResult, feedbackResult, evalsResult] =\r\n await Promise.all([\r\n client.execute({\r\n sql: `SELECT\r\n COUNT(*) as total_runs,\r\n COALESCE(SUM(total_cost_cents_x100), 0) as total_cost,\r\n COALESCE(AVG(total_duration_ms), 0) as avg_duration,\r\n COALESCE(SUM(successful_tools), 0) as success_tools,\r\n COALESCE(SUM(tool_calls), 0) as total_tools\r\n FROM agent_trace_summaries WHERE ${created.where}`,\r\n args: created.args,\r\n }),\r\n client.execute({\r\n sql: `SELECT COALESCE(AVG(frustration_score), 0) as avg_frustration\r\n FROM agent_satisfaction_scores WHERE ${computed.where}`,\r\n args: computed.args,\r\n }),\r\n client.execute({\r\n sql: `SELECT\r\n COALESCE(SUM(CASE WHEN feedback_type = 'thumbs_up' THEN 1 ELSE 0 END), 0) as up,\r\n COALESCE(SUM(CASE WHEN feedback_type IN ('thumbs_up', 'thumbs_down') THEN 1 ELSE 0 END), 0) as total\r\n FROM agent_feedback WHERE ${created.where}`,\r\n args: created.args,\r\n }),\r\n client.execute({\r\n sql: `SELECT COALESCE(AVG(score), 0) as avg_score\r\n FROM agent_evals WHERE ${created.where}`,\r\n args: created.args,\r\n }),\r\n ]);\r\n\r\n const t = (tracesResult.rows[0] ?? {}) as Record<string, number | null>;\r\n const s = (satisfactionResult.rows[0] ?? {}) as Record<string, number | null>;\r\n const f = (feedbackResult.rows[0] ?? {}) as Record<string, number | null>;\r\n const e = (evalsResult.rows[0] ?? {}) as Record<string, number | null>;\r\n\r\n const totalTools = Number(t.total_tools ?? 0);\r\n const successTools = Number(t.success_tools ?? 0);\r\n const feedbackTotal = Number(f.total ?? 0);\r\n const feedbackUp = Number(f.up ?? 0);\r\n\r\n return {\r\n totalRuns: Number(t.total_runs ?? 0),\r\n totalCostCents: Number(t.total_cost ?? 0) / 100,\r\n avgDurationMs: Number(t.avg_duration ?? 0),\r\n toolSuccessRate: totalTools > 0 ? successTools / totalTools : 1,\r\n avgFrustrationScore: Number(s.avg_frustration ?? 0),\r\n thumbsUpRate: feedbackTotal > 0 ? feedbackUp / feedbackTotal : 0,\r\n avgEvalScore: Number(e.avg_score ?? 0),\r\n };\r\n}\r\n\r\n// ─── Row mappers ─────────────────────────────────────────────────────\r\n\r\nfunction rowToTraceSpan(row: Record<string, any>): TraceSpan {\r\n return {\r\n id: String(row.id),\r\n runId: String(row.run_id),\r\n threadId: row.thread_id ? String(row.thread_id) : null,\r\n userId: row.user_id ? String(row.user_id) : null,\r\n parentSpanId: row.parent_span_id ? String(row.parent_span_id) : null,\r\n spanType: row.span_type as TraceSpan[\"spanType\"],\r\n name: String(row.name),\r\n inputTokens: Number(row.input_tokens ?? 0),\r\n outputTokens: Number(row.output_tokens ?? 0),\r\n cacheReadTokens: Number(row.cache_read_tokens ?? 0),\r\n cacheWriteTokens: Number(row.cache_write_tokens ?? 0),\r\n costCentsX100: Number(row.cost_cents_x100 ?? 0),\r\n durationMs: Number(row.duration_ms ?? 0),\r\n status: row.status as TraceSpan[\"status\"],\r\n errorMessage: row.error_message ? String(row.error_message) : null,\r\n metadata: safeJsonParse(row.metadata, null),\r\n createdAt: Number(row.created_at),\r\n };\r\n}\r\n\r\nfunction rowToTraceSummary(row: Record<string, any>): TraceSummary {\r\n return {\r\n runId: String(row.run_id),\r\n threadId: row.thread_id ? String(row.thread_id) : null,\r\n userId: row.user_id ? String(row.user_id) : null,\r\n totalSpans: Number(row.total_spans ?? 0),\r\n llmCalls: Number(row.llm_calls ?? 0),\r\n toolCalls: Number(row.tool_calls ?? 0),\r\n successfulTools: Number(row.successful_tools ?? 0),\r\n failedTools: Number(row.failed_tools ?? 0),\r\n totalDurationMs: Number(row.total_duration_ms ?? 0),\r\n totalCostCentsX100: Number(row.total_cost_cents_x100 ?? 0),\r\n totalInputTokens: Number(row.total_input_tokens ?? 0),\r\n totalOutputTokens: Number(row.total_output_tokens ?? 0),\r\n model: String(row.model ?? \"\"),\r\n createdAt: Number(row.created_at),\r\n };\r\n}\r\n\r\nfunction rowToFeedback(row: Record<string, any>): FeedbackEntry {\r\n return {\r\n id: String(row.id),\r\n runId: row.run_id ? String(row.run_id) : null,\r\n threadId: row.thread_id ? String(row.thread_id) : null,\r\n messageSeq: row.message_seq != null ? Number(row.message_seq) : null,\r\n feedbackType: row.feedback_type as FeedbackEntry[\"feedbackType\"],\r\n value: String(row.value ?? \"\"),\r\n userId: row.user_id ? String(row.user_id) : null,\r\n createdAt: Number(row.created_at),\r\n };\r\n}\r\n\r\nfunction rowToSatisfaction(row: Record<string, any>): SatisfactionScore {\r\n return {\r\n id: String(row.id),\r\n threadId: String(row.thread_id),\r\n userId: row.user_id ? String(row.user_id) : null,\r\n frustrationScore: Number(row.frustration_score ?? 0),\r\n rephrasingScore: Number(row.rephrasing_score ?? 0),\r\n abandonmentScore: Number(row.abandonment_score ?? 0),\r\n sentimentScore: Number(row.sentiment_score ?? 0),\r\n lengthTrendScore: Number(row.length_trend_score ?? 0),\r\n computedAt: Number(row.computed_at),\r\n };\r\n}\r\n\r\nfunction rowToEval(row: Record<string, any>): EvalResult {\r\n return {\r\n id: String(row.id),\r\n runId: String(row.run_id),\r\n threadId: row.thread_id ? String(row.thread_id) : null,\r\n userId: row.user_id ? String(row.user_id) : null,\r\n evalType: row.eval_type as EvalResult[\"evalType\"],\r\n criteria: String(row.criteria),\r\n score: Number(row.score ?? 0),\r\n reasoning: row.reasoning ? String(row.reasoning) : null,\r\n metadata: safeJsonParse(row.metadata, null),\r\n createdAt: Number(row.created_at),\r\n };\r\n}\r\n\r\nfunction rowToDataset(row: Record<string, any>): EvalDataset {\r\n return {\r\n id: String(row.id),\r\n name: String(row.name),\r\n description: String(row.description ?? \"\"),\r\n entries: safeJsonParse(row.entries, []),\r\n createdAt: Number(row.created_at),\r\n updatedAt: Number(row.updated_at),\r\n };\r\n}\r\n\r\nfunction rowToExperiment(row: Record<string, any>): Experiment {\r\n return {\r\n id: String(row.id),\r\n name: String(row.name),\r\n status: row.status as Experiment[\"status\"],\r\n variants: safeJsonParse(row.variants, []),\r\n metrics: safeJsonParse(row.metrics, []),\r\n assignmentLevel: (row.assignment_level as \"user\" | \"session\") ?? \"user\",\r\n startedAt: row.started_at ? Number(row.started_at) : null,\r\n endedAt: row.ended_at ? Number(row.ended_at) : null,\r\n createdAt: Number(row.created_at),\r\n ownerEmail:\r\n typeof row.owner_email === \"string\" && row.owner_email\r\n ? row.owner_email\r\n : null,\r\n };\r\n}\r\n\r\nfunction rowToExperimentResult(\r\n row: Record<string, any>,\r\n): ExperimentMetricResult {\r\n return {\r\n id: String(row.id),\r\n experimentId: String(row.experiment_id),\r\n variantId: String(row.variant_id),\r\n metric: String(row.metric),\r\n value: Number(row.value ?? 0),\r\n sampleSize: Number(row.sample_size ?? 0),\r\n confidenceLow: Number(row.confidence_low ?? 0),\r\n confidenceHigh: Number(row.confidence_high ?? 0),\r\n computedAt: Number(row.computed_at),\r\n };\r\n}\r\n"]}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/observability/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SQL persistence for the agent observability system.\n *\n * Creates and manages tables for traces, feedback, evals, experiments,\n * and satisfaction scores. Follows the same raw-SQL pattern as\n * run-store.ts and usage/store.ts — framework tables use getDbExec()\n * rather than Drizzle ORM (which is for template-level schemas).\n */\nimport {\n getDbExec,\n intType,\n isPostgres,\n retryOnDdlRace,\n} from \"../db/client.js\";\nimport {\n ensureTableExists,\n ensureColumnExists,\n ensureIndexExists,\n} from \"../db/ddl-guard.js\";\nimport { isDuplicateColumnError } from \"../db/migrations.js\";\nimport { createInitMemo } from \"../shared/init-memo.js\";\nimport type {\n TraceSpan,\n TraceSummary,\n FeedbackEntry,\n SatisfactionScore,\n EvalResult,\n EvalDataset,\n Experiment,\n ExperimentAssignment,\n ExperimentMetricResult,\n} from \"./types.js\";\n\nfunction safeJsonParse<T>(value: unknown, fallback: T): T {\n if (!value) return fallback;\n try {\n return JSON.parse(String(value));\n } catch {\n return fallback;\n }\n}\n\n// Tables whose rows are owned by an end user — drives the boot-time\n// user_id ALTER loop and the per-user composite indexes below. Every\n// new user-owned observability table must be added here so the upgrade\n// path and the per-user query plan stay in sync.\nconst USER_SCOPED_TABLES = [\n \"agent_trace_spans\",\n \"agent_trace_summaries\",\n \"agent_satisfaction_scores\",\n \"agent_evals\",\n \"agent_feedback\",\n] as const;\n\n/**\n * Append an `AND user_id = ?` clause when a userId filter is requested.\n * Returns the fully-bound WHERE clause + args ready to splice into the\n * caller's SQL. Centralizes the pattern so tests can assert one shape.\n */\nfunction withUserFilter(\n baseWhere: string,\n baseArgs: any[],\n userId: string | undefined,\n): { where: string; args: any[] } {\n if (userId == null) return { where: baseWhere, args: baseArgs };\n return {\n where: `${baseWhere} AND user_id = ?`,\n args: [...baseArgs, userId],\n };\n}\n\n// workerd-safe memo: the raw `let _initPromise` pattern wedged every agent\n// chat run on the unified Cloudflare runtime when an early-responding first\n// request created (and froze) the init promise — see shared/init-memo.ts.\nexport const ensureObservabilityTables = createInitMemo(\n async () => {\n const client = getDbExec();\n\n const traceSpansCreateSql = `\n CREATE TABLE IF NOT EXISTS agent_trace_spans (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n thread_id TEXT,\n user_id TEXT,\n parent_span_id TEXT,\n span_type TEXT NOT NULL,\n name TEXT NOT NULL,\n input_tokens ${intType()} NOT NULL DEFAULT 0,\n output_tokens ${intType()} NOT NULL DEFAULT 0,\n cache_read_tokens ${intType()} NOT NULL DEFAULT 0,\n cache_write_tokens ${intType()} NOT NULL DEFAULT 0,\n cost_cents_x100 ${intType()} NOT NULL DEFAULT 0,\n duration_ms ${intType()} NOT NULL DEFAULT 0,\n status TEXT NOT NULL DEFAULT 'success',\n error_message TEXT,\n metadata TEXT,\n created_at ${intType()} NOT NULL\n )\n `;\n\n const traceSummariesCreateSql = `\n CREATE TABLE IF NOT EXISTS agent_trace_summaries (\n run_id TEXT PRIMARY KEY,\n thread_id TEXT,\n user_id TEXT,\n total_spans ${intType()} NOT NULL DEFAULT 0,\n llm_calls ${intType()} NOT NULL DEFAULT 0,\n tool_calls ${intType()} NOT NULL DEFAULT 0,\n successful_tools ${intType()} NOT NULL DEFAULT 0,\n failed_tools ${intType()} NOT NULL DEFAULT 0,\n total_duration_ms ${intType()} NOT NULL DEFAULT 0,\n total_cost_cents_x100 ${intType()} NOT NULL DEFAULT 0,\n total_input_tokens ${intType()} NOT NULL DEFAULT 0,\n total_output_tokens ${intType()} NOT NULL DEFAULT 0,\n model TEXT NOT NULL DEFAULT '',\n created_at ${intType()} NOT NULL\n )\n `;\n\n const feedbackCreateSql = `\n CREATE TABLE IF NOT EXISTS agent_feedback (\n id TEXT PRIMARY KEY,\n run_id TEXT,\n thread_id TEXT,\n message_seq ${intType()},\n feedback_type TEXT NOT NULL,\n value TEXT NOT NULL DEFAULT '',\n user_id TEXT,\n created_at ${intType()} NOT NULL\n )\n `;\n\n const satisfactionScoresCreateSql = `\n CREATE TABLE IF NOT EXISTS agent_satisfaction_scores (\n id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n user_id TEXT,\n frustration_score REAL NOT NULL DEFAULT 0,\n rephrasing_score REAL NOT NULL DEFAULT 0,\n abandonment_score REAL NOT NULL DEFAULT 0,\n sentiment_score REAL NOT NULL DEFAULT 0,\n length_trend_score REAL NOT NULL DEFAULT 0,\n computed_at ${intType()} NOT NULL\n )\n `;\n\n const evalsCreateSql = `\n CREATE TABLE IF NOT EXISTS agent_evals (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n thread_id TEXT,\n user_id TEXT,\n eval_type TEXT NOT NULL,\n criteria TEXT NOT NULL,\n score REAL NOT NULL DEFAULT 0,\n reasoning TEXT,\n metadata TEXT,\n created_at ${intType()} NOT NULL\n )\n `;\n\n const evalDatasetsCreateSql = `\n CREATE TABLE IF NOT EXISTS agent_eval_datasets (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n description TEXT NOT NULL DEFAULT '',\n entries TEXT NOT NULL DEFAULT '[]',\n created_at ${intType()} NOT NULL,\n updated_at ${intType()} NOT NULL\n )\n `;\n\n const experimentsCreateSql = `\n CREATE TABLE IF NOT EXISTS agent_experiments (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'draft',\n variants TEXT NOT NULL DEFAULT '[]',\n metrics TEXT NOT NULL DEFAULT '[]',\n assignment_level TEXT NOT NULL DEFAULT 'user',\n started_at ${intType()},\n ended_at ${intType()},\n created_at ${intType()} NOT NULL,\n owner_email TEXT\n )\n `;\n\n const experimentAssignmentsCreateSql = `\n CREATE TABLE IF NOT EXISTS agent_experiment_assignments (\n experiment_id TEXT NOT NULL,\n user_id TEXT NOT NULL,\n variant_id TEXT NOT NULL,\n assigned_at ${intType()} NOT NULL,\n PRIMARY KEY (experiment_id, user_id)\n )\n `;\n\n const experimentResultsCreateSql = `\n CREATE TABLE IF NOT EXISTS agent_experiment_results (\n id TEXT PRIMARY KEY,\n experiment_id TEXT NOT NULL,\n variant_id TEXT NOT NULL,\n metric TEXT NOT NULL,\n value REAL NOT NULL DEFAULT 0,\n sample_size ${intType()} NOT NULL DEFAULT 0,\n confidence_low REAL NOT NULL DEFAULT 0,\n confidence_high REAL NOT NULL DEFAULT 0,\n computed_at ${intType()} NOT NULL\n )\n `;\n\n if (isPostgres()) {\n // PG guard: probe → guarded DDL → re-probe; skips lock on already-migrated path\n await ensureTableExists(\"agent_trace_spans\", traceSpansCreateSql);\n await ensureTableExists(\"agent_trace_summaries\", traceSummariesCreateSql);\n await ensureTableExists(\"agent_feedback\", feedbackCreateSql);\n await ensureTableExists(\n \"agent_satisfaction_scores\",\n satisfactionScoresCreateSql,\n );\n await ensureTableExists(\"agent_evals\", evalsCreateSql);\n await ensureTableExists(\"agent_eval_datasets\", evalDatasetsCreateSql);\n await ensureTableExists(\"agent_experiments\", experimentsCreateSql);\n await ensureTableExists(\n \"agent_experiment_assignments\",\n experimentAssignmentsCreateSql,\n );\n await ensureTableExists(\n \"agent_experiment_results\",\n experimentResultsCreateSql,\n );\n await ensureColumnExists(\n \"agent_experiments\",\n \"owner_email\",\n `ALTER TABLE agent_experiments ADD COLUMN IF NOT EXISTS owner_email TEXT`,\n );\n for (const table of USER_SCOPED_TABLES) {\n await ensureColumnExists(\n table,\n \"user_id\",\n `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS user_id TEXT`,\n );\n }\n await ensureIndexExists(\n \"idx_trace_spans_run\",\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_run ON agent_trace_spans (run_id)`,\n );\n await ensureIndexExists(\n \"idx_trace_spans_thread\",\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_thread ON agent_trace_spans (thread_id)`,\n );\n await ensureIndexExists(\n \"idx_trace_spans_created\",\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_created ON agent_trace_spans (created_at)`,\n );\n await ensureIndexExists(\n \"idx_trace_summaries_created\",\n `CREATE INDEX IF NOT EXISTS idx_trace_summaries_created ON agent_trace_summaries (created_at)`,\n );\n await ensureIndexExists(\n \"idx_trace_summaries_user\",\n `CREATE INDEX IF NOT EXISTS idx_trace_summaries_user ON agent_trace_summaries (user_id, created_at)`,\n );\n await ensureIndexExists(\n \"idx_trace_spans_user\",\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_user ON agent_trace_spans (user_id)`,\n );\n await ensureIndexExists(\n \"idx_feedback_thread\",\n `CREATE INDEX IF NOT EXISTS idx_feedback_thread ON agent_feedback (thread_id)`,\n );\n await ensureIndexExists(\n \"idx_feedback_created\",\n `CREATE INDEX IF NOT EXISTS idx_feedback_created ON agent_feedback (created_at)`,\n );\n await ensureIndexExists(\n \"idx_feedback_user\",\n `CREATE INDEX IF NOT EXISTS idx_feedback_user ON agent_feedback (user_id, created_at)`,\n );\n await ensureIndexExists(\n \"idx_satisfaction_thread\",\n `CREATE INDEX IF NOT EXISTS idx_satisfaction_thread ON agent_satisfaction_scores (thread_id)`,\n );\n await ensureIndexExists(\n \"idx_satisfaction_user\",\n `CREATE INDEX IF NOT EXISTS idx_satisfaction_user ON agent_satisfaction_scores (user_id, computed_at)`,\n );\n await ensureIndexExists(\n \"idx_evals_run\",\n `CREATE INDEX IF NOT EXISTS idx_evals_run ON agent_evals (run_id)`,\n );\n await ensureIndexExists(\n \"idx_evals_created\",\n `CREATE INDEX IF NOT EXISTS idx_evals_created ON agent_evals (created_at)`,\n );\n await ensureIndexExists(\n \"idx_evals_user\",\n `CREATE INDEX IF NOT EXISTS idx_evals_user ON agent_evals (user_id, created_at)`,\n );\n await ensureIndexExists(\n \"idx_experiment_results_exp\",\n `CREATE INDEX IF NOT EXISTS idx_experiment_results_exp ON agent_experiment_results (experiment_id)`,\n );\n return;\n }\n\n // SQLite (local dev): no lock problem — keep the original behaviour.\n await retryOnDdlRace(() => client.execute(traceSpansCreateSql));\n\n await retryOnDdlRace(() => client.execute(traceSummariesCreateSql));\n\n await retryOnDdlRace(() => client.execute(feedbackCreateSql));\n\n await retryOnDdlRace(() => client.execute(satisfactionScoresCreateSql));\n\n await retryOnDdlRace(() => client.execute(evalsCreateSql));\n\n await retryOnDdlRace(() => client.execute(evalDatasetsCreateSql));\n\n await retryOnDdlRace(() => client.execute(experimentsCreateSql));\n\n // Additive migration for DBs created before the owner column shipped\n // (any pre-existing rows have NULL owner — see `updateExperiment` for\n // the migration semantics). Mutations on those rows fall back to the\n // standard authentication gate but cannot enforce per-owner scoping\n // until they're re-saved.\n try {\n await client.execute(\n `ALTER TABLE agent_experiments ADD COLUMN owner_email TEXT`,\n );\n } catch {\n // Column already exists — expected after first run.\n }\n\n await retryOnDdlRace(() => client.execute(experimentAssignmentsCreateSql));\n\n await retryOnDdlRace(() => client.execute(experimentResultsCreateSql));\n\n // Idempotent column upgrades for DBs created before per-user\n // isolation. SQLite has no `ADD COLUMN IF NOT EXISTS`; Postgres\n // surfaces \"column ... already exists\". `isDuplicateColumnError`\n // (from db/migrations.ts) recognizes both shapes.\n for (const table of USER_SCOPED_TABLES) {\n try {\n await client.execute(`ALTER TABLE ${table} ADD COLUMN user_id TEXT`);\n } catch (err) {\n if (isDuplicateColumnError(err)) continue;\n throw err;\n }\n }\n\n // Indexes for common query patterns\n const indexes = [\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_run ON agent_trace_spans (run_id)`,\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_thread ON agent_trace_spans (thread_id)`,\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_created ON agent_trace_spans (created_at)`,\n `CREATE INDEX IF NOT EXISTS idx_trace_summaries_created ON agent_trace_summaries (created_at)`,\n `CREATE INDEX IF NOT EXISTS idx_trace_summaries_user ON agent_trace_summaries (user_id, created_at)`,\n `CREATE INDEX IF NOT EXISTS idx_trace_spans_user ON agent_trace_spans (user_id)`,\n `CREATE INDEX IF NOT EXISTS idx_feedback_thread ON agent_feedback (thread_id)`,\n `CREATE INDEX IF NOT EXISTS idx_feedback_created ON agent_feedback (created_at)`,\n `CREATE INDEX IF NOT EXISTS idx_feedback_user ON agent_feedback (user_id, created_at)`,\n `CREATE INDEX IF NOT EXISTS idx_satisfaction_thread ON agent_satisfaction_scores (thread_id)`,\n `CREATE INDEX IF NOT EXISTS idx_satisfaction_user ON agent_satisfaction_scores (user_id, computed_at)`,\n `CREATE INDEX IF NOT EXISTS idx_evals_run ON agent_evals (run_id)`,\n `CREATE INDEX IF NOT EXISTS idx_evals_created ON agent_evals (created_at)`,\n `CREATE INDEX IF NOT EXISTS idx_evals_user ON agent_evals (user_id, created_at)`,\n `CREATE INDEX IF NOT EXISTS idx_experiment_results_exp ON agent_experiment_results (experiment_id)`,\n ];\n for (const sql of indexes) {\n try {\n await client.execute(sql);\n } catch {\n // Index might already exist\n }\n }\n },\n { label: \"observability\" },\n);\n\n// ─── Trace span CRUD ─────────────────────────────────────────────────\n\nexport async function insertTraceSpan(span: TraceSpan): Promise<void> {\n await ensureObservabilityTables();\n const client = getDbExec();\n await client.execute({\n sql: `INSERT INTO agent_trace_spans\n (id, run_id, thread_id, user_id, parent_span_id, span_type, name,\n input_tokens, output_tokens, cache_read_tokens, cache_write_tokens,\n cost_cents_x100, duration_ms, status, error_message, metadata, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n span.id,\n span.runId,\n span.threadId,\n span.userId,\n span.parentSpanId,\n span.spanType,\n span.name,\n span.inputTokens,\n span.outputTokens,\n span.cacheReadTokens,\n span.cacheWriteTokens,\n span.costCentsX100,\n span.durationMs,\n span.status,\n span.errorMessage,\n span.metadata ? JSON.stringify(span.metadata) : null,\n span.createdAt,\n ],\n });\n}\n\nexport async function upsertTraceSummary(summary: TraceSummary): Promise<void> {\n await ensureObservabilityTables();\n const client = getDbExec();\n // user_id is intentionally NOT updated on conflict — once a run's\n // owner is recorded it shouldn't change under us.\n if (isPostgres()) {\n await client.execute({\n sql: `INSERT INTO agent_trace_summaries\n (run_id, thread_id, user_id, total_spans, llm_calls, tool_calls,\n successful_tools, failed_tools, total_duration_ms,\n total_cost_cents_x100, total_input_tokens, total_output_tokens,\n model, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (run_id) DO UPDATE SET\n total_spans = EXCLUDED.total_spans,\n llm_calls = EXCLUDED.llm_calls,\n tool_calls = EXCLUDED.tool_calls,\n successful_tools = EXCLUDED.successful_tools,\n failed_tools = EXCLUDED.failed_tools,\n total_duration_ms = EXCLUDED.total_duration_ms,\n total_cost_cents_x100 = EXCLUDED.total_cost_cents_x100,\n total_input_tokens = EXCLUDED.total_input_tokens,\n total_output_tokens = EXCLUDED.total_output_tokens,\n model = EXCLUDED.model`,\n args: [\n summary.runId,\n summary.threadId,\n summary.userId,\n summary.totalSpans,\n summary.llmCalls,\n summary.toolCalls,\n summary.successfulTools,\n summary.failedTools,\n summary.totalDurationMs,\n summary.totalCostCentsX100,\n summary.totalInputTokens,\n summary.totalOutputTokens,\n summary.model,\n summary.createdAt,\n ],\n });\n } else {\n await client.execute({\n sql: `INSERT INTO agent_trace_summaries\n (run_id, thread_id, user_id, total_spans, llm_calls, tool_calls,\n successful_tools, failed_tools, total_duration_ms,\n total_cost_cents_x100, total_input_tokens, total_output_tokens,\n model, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (run_id) DO UPDATE SET\n total_spans = EXCLUDED.total_spans,\n llm_calls = EXCLUDED.llm_calls,\n tool_calls = EXCLUDED.tool_calls,\n successful_tools = EXCLUDED.successful_tools,\n failed_tools = EXCLUDED.failed_tools,\n total_duration_ms = EXCLUDED.total_duration_ms,\n total_cost_cents_x100 = EXCLUDED.total_cost_cents_x100,\n total_input_tokens = EXCLUDED.total_input_tokens,\n total_output_tokens = EXCLUDED.total_output_tokens,\n model = EXCLUDED.model`,\n args: [\n summary.runId,\n summary.threadId,\n summary.userId,\n summary.totalSpans,\n summary.llmCalls,\n summary.toolCalls,\n summary.successfulTools,\n summary.failedTools,\n summary.totalDurationMs,\n summary.totalCostCentsX100,\n summary.totalInputTokens,\n summary.totalOutputTokens,\n summary.model,\n summary.createdAt,\n ],\n });\n }\n}\n\n/**\n * Purge trace spans, summaries, and eval results older than `cutoffMs`\n * (a Unix epoch in milliseconds — rows with `created_at < cutoffMs` are\n * deleted). Returns the per-table deletion counts. Satisfies the span\n * retention TTL noted in /tmp/security-audit/12-mcp-a2a-agent.md\n * (MEDIUM #14): trace metadata can hold sensitive tool inputs, so we\n * cap the storage horizon. Feedback rows are retained — they're\n * intentionally durable for product analytics. Experiments and\n * datasets are also retained because they are user-authored\n * configuration, not call telemetry.\n */\nexport async function deleteOldTraceData(cutoffMs: number): Promise<{\n spans: number;\n summaries: number;\n evals: number;\n}> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const cutoff = Math.floor(cutoffMs);\n\n const [spansResult, summariesResult, evalsResult] = await Promise.all([\n client.execute({\n sql: `DELETE FROM agent_trace_spans WHERE created_at < ?`,\n args: [cutoff],\n }),\n client.execute({\n sql: `DELETE FROM agent_trace_summaries WHERE created_at < ?`,\n args: [cutoff],\n }),\n client.execute({\n sql: `DELETE FROM agent_evals WHERE created_at < ?`,\n args: [cutoff],\n }),\n ]);\n\n return {\n spans: Number(spansResult.rowsAffected ?? 0),\n summaries: Number(summariesResult.rowsAffected ?? 0),\n evals: Number(evalsResult.rowsAffected ?? 0),\n };\n}\n\nexport async function getTraceSpansForRun(\n runId: string,\n opts: { userId?: string } = {},\n): Promise<TraceSpan[]> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const { where, args } = withUserFilter(\"run_id = ?\", [runId], opts.userId);\n const { rows } = await client.execute({\n sql: `SELECT * FROM agent_trace_spans WHERE ${where} ORDER BY created_at ASC`,\n args,\n });\n return (rows as any[]).map(rowToTraceSpan);\n}\n\nexport async function getTraceSummaries(opts: {\n sinceMs?: number;\n limit?: number;\n userId?: string;\n}): Promise<TraceSummary[]> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const sinceMs = opts.sinceMs ?? 0;\n const limit = opts.limit ?? 100;\n const { where, args } = withUserFilter(\n \"created_at >= ?\",\n [sinceMs],\n opts.userId,\n );\n const { rows } = await client.execute({\n sql: `SELECT * FROM agent_trace_summaries\n WHERE ${where}\n ORDER BY created_at DESC\n LIMIT ?`,\n args: [...args, limit],\n });\n return (rows as any[]).map(rowToTraceSummary);\n}\n\nexport async function getTraceSummary(\n runId: string,\n opts: { userId?: string } = {},\n): Promise<TraceSummary | null> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const { where, args } = withUserFilter(\"run_id = ?\", [runId], opts.userId);\n const { rows } = await client.execute({\n sql: `SELECT * FROM agent_trace_summaries WHERE ${where}`,\n args,\n });\n if (rows.length === 0) return null;\n return rowToTraceSummary(rows[0] as any);\n}\n\n// ─── Feedback CRUD ───────────────────────────────────────────────────\n\nexport async function insertFeedback(entry: FeedbackEntry): Promise<void> {\n await ensureObservabilityTables();\n const client = getDbExec();\n await client.execute({\n sql: `INSERT INTO agent_feedback\n (id, run_id, thread_id, message_seq, feedback_type, value, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n entry.id,\n entry.runId,\n entry.threadId,\n entry.messageSeq,\n entry.feedbackType,\n entry.value,\n entry.userId,\n entry.createdAt,\n ],\n });\n}\n\nexport async function getFeedback(opts: {\n threadId?: string;\n sinceMs?: number;\n limit?: number;\n feedbackType?: string;\n userId?: string;\n}): Promise<FeedbackEntry[]> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const conditions: string[] = [];\n const args: any[] = [];\n if (opts.threadId) {\n conditions.push(\"thread_id = ?\");\n args.push(opts.threadId);\n }\n if (opts.sinceMs) {\n conditions.push(\"created_at >= ?\");\n args.push(opts.sinceMs);\n }\n if (opts.feedbackType) {\n conditions.push(\"feedback_type = ?\");\n args.push(opts.feedbackType);\n }\n if (opts.userId) {\n conditions.push(\"user_id = ?\");\n args.push(opts.userId);\n }\n const where =\n conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n const limit = opts.limit ?? 100;\n const { rows } = await client.execute({\n sql: `SELECT * FROM agent_feedback ${where} ORDER BY created_at DESC LIMIT ?`,\n args: [...args, limit],\n });\n return (rows as any[]).map(rowToFeedback);\n}\n\nexport async function getFeedbackStats(\n sinceMs: number,\n opts: { userId?: string } = {},\n): Promise<{\n total: number;\n thumbsUp: number;\n thumbsDown: number;\n categories: Record<string, number>;\n}> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const { where, args } = withUserFilter(\n \"created_at >= ?\",\n [sinceMs],\n opts.userId,\n );\n const { rows } = await client.execute({\n sql: `SELECT feedback_type, value, COUNT(*) as cnt\n FROM agent_feedback WHERE ${where}\n GROUP BY feedback_type, value`,\n args,\n });\n let total = 0;\n let thumbsUp = 0;\n let thumbsDown = 0;\n const categories: Record<string, number> = {};\n for (const row of rows as any[]) {\n const cnt = Number(row.cnt);\n total += cnt;\n if (row.feedback_type === \"thumbs_up\") thumbsUp += cnt;\n else if (row.feedback_type === \"thumbs_down\") thumbsDown += cnt;\n else if (row.feedback_type === \"category\")\n categories[String(row.value)] = cnt;\n }\n return { total, thumbsUp, thumbsDown, categories };\n}\n\n// ─── Satisfaction scores CRUD ────────────────────────────────────────\n\nexport async function upsertSatisfactionScore(\n score: SatisfactionScore,\n): Promise<void> {\n await ensureObservabilityTables();\n const client = getDbExec();\n if (isPostgres()) {\n await client.execute({\n sql: `INSERT INTO agent_satisfaction_scores\n (id, thread_id, user_id, frustration_score, rephrasing_score,\n abandonment_score, sentiment_score, length_trend_score, computed_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (id) DO UPDATE SET\n frustration_score = EXCLUDED.frustration_score,\n rephrasing_score = EXCLUDED.rephrasing_score,\n abandonment_score = EXCLUDED.abandonment_score,\n sentiment_score = EXCLUDED.sentiment_score,\n length_trend_score = EXCLUDED.length_trend_score,\n computed_at = EXCLUDED.computed_at`,\n args: [\n score.id,\n score.threadId,\n score.userId,\n score.frustrationScore,\n score.rephrasingScore,\n score.abandonmentScore,\n score.sentimentScore,\n score.lengthTrendScore,\n score.computedAt,\n ],\n });\n } else {\n await client.execute({\n sql: `INSERT INTO agent_satisfaction_scores\n (id, thread_id, user_id, frustration_score, rephrasing_score,\n abandonment_score, sentiment_score, length_trend_score, computed_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (id) DO UPDATE SET\n frustration_score = EXCLUDED.frustration_score,\n rephrasing_score = EXCLUDED.rephrasing_score,\n abandonment_score = EXCLUDED.abandonment_score,\n sentiment_score = EXCLUDED.sentiment_score,\n length_trend_score = EXCLUDED.length_trend_score,\n computed_at = EXCLUDED.computed_at`,\n args: [\n score.id,\n score.threadId,\n score.userId,\n score.frustrationScore,\n score.rephrasingScore,\n score.abandonmentScore,\n score.sentimentScore,\n score.lengthTrendScore,\n score.computedAt,\n ],\n });\n }\n}\n\nexport async function getSatisfactionScores(opts: {\n sinceMs?: number;\n limit?: number;\n minFrustration?: number;\n userId?: string;\n}): Promise<SatisfactionScore[]> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const conditions: string[] = [];\n const args: any[] = [];\n if (opts.sinceMs) {\n conditions.push(\"computed_at >= ?\");\n args.push(opts.sinceMs);\n }\n if (opts.minFrustration != null) {\n conditions.push(\"frustration_score >= ?\");\n args.push(opts.minFrustration);\n }\n if (opts.userId) {\n conditions.push(\"user_id = ?\");\n args.push(opts.userId);\n }\n const where =\n conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n const { rows } = await client.execute({\n sql: `SELECT * FROM agent_satisfaction_scores ${where}\n ORDER BY computed_at DESC LIMIT ?`,\n args: [...args, opts.limit ?? 100],\n });\n return (rows as any[]).map(rowToSatisfaction);\n}\n\n// ─── Evals CRUD ──────────────────────────────────────────────────────\n\nexport async function insertEvalResult(result: EvalResult): Promise<void> {\n await ensureObservabilityTables();\n const client = getDbExec();\n await client.execute({\n sql: `INSERT INTO agent_evals\n (id, run_id, thread_id, user_id, eval_type, criteria, score, reasoning, metadata, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n result.id,\n result.runId,\n result.threadId,\n result.userId,\n result.evalType,\n result.criteria,\n result.score,\n result.reasoning,\n result.metadata ? JSON.stringify(result.metadata) : null,\n result.createdAt,\n ],\n });\n}\n\nexport async function getEvalsForRun(\n runId: string,\n opts: { userId?: string } = {},\n): Promise<EvalResult[]> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const { where, args } = withUserFilter(\"run_id = ?\", [runId], opts.userId);\n const { rows } = await client.execute({\n sql: `SELECT * FROM agent_evals WHERE ${where} ORDER BY created_at ASC`,\n args,\n });\n return (rows as any[]).map(rowToEval);\n}\n\nexport async function getEvalStats(\n sinceMs: number,\n opts: { userId?: string } = {},\n): Promise<{\n totalEvals: number;\n avgScore: number;\n byCriteria: Array<{ criteria: string; avgScore: number; count: number }>;\n}> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const { where, args } = withUserFilter(\n \"created_at >= ?\",\n [sinceMs],\n opts.userId,\n );\n const { rows: totalRows } = await client.execute({\n sql: `SELECT COUNT(*) as cnt, AVG(score) as avg_score\n FROM agent_evals WHERE ${where}`,\n args,\n });\n const t = (totalRows[0] ?? {}) as Record<string, number | null>;\n\n const { rows: criteriaRows } = await client.execute({\n sql: `SELECT criteria, AVG(score) as avg_score, COUNT(*) as cnt\n FROM agent_evals WHERE ${where}\n GROUP BY criteria ORDER BY cnt DESC`,\n args,\n });\n\n return {\n totalEvals: Number(t.cnt ?? 0),\n avgScore: Number(t.avg_score ?? 0),\n byCriteria: (criteriaRows as any[]).map((r) => ({\n criteria: String(r.criteria),\n avgScore: Number(r.avg_score ?? 0),\n count: Number(r.cnt ?? 0),\n })),\n };\n}\n\n// ─── Eval datasets CRUD ──────────────────────────────────────────────\n\nexport async function insertEvalDataset(dataset: EvalDataset): Promise<void> {\n await ensureObservabilityTables();\n const client = getDbExec();\n await client.execute({\n sql: `INSERT INTO agent_eval_datasets\n (id, name, description, entries, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)`,\n args: [\n dataset.id,\n dataset.name,\n dataset.description,\n JSON.stringify(dataset.entries),\n dataset.createdAt,\n dataset.updatedAt,\n ],\n });\n}\n\nexport async function listEvalDatasets(): Promise<EvalDataset[]> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const { rows } = await client.execute(\n `SELECT * FROM agent_eval_datasets ORDER BY updated_at DESC`,\n );\n return (rows as any[]).map(rowToDataset);\n}\n\nexport async function getEvalDataset(id: string): Promise<EvalDataset | null> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM agent_eval_datasets WHERE id = ?`,\n args: [id],\n });\n if (rows.length === 0) return null;\n return rowToDataset(rows[0] as any);\n}\n\nexport async function updateEvalDataset(\n id: string,\n updates: Partial<Pick<EvalDataset, \"name\" | \"description\" | \"entries\">>,\n): Promise<void> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const sets: string[] = [];\n const args: any[] = [];\n if (updates.name !== undefined) {\n sets.push(\"name = ?\");\n args.push(updates.name);\n }\n if (updates.description !== undefined) {\n sets.push(\"description = ?\");\n args.push(updates.description);\n }\n if (updates.entries !== undefined) {\n sets.push(\"entries = ?\");\n args.push(JSON.stringify(updates.entries));\n }\n sets.push(\"updated_at = ?\");\n args.push(Date.now());\n args.push(id);\n await client.execute({\n sql: `UPDATE agent_eval_datasets SET ${sets.join(\", \")} WHERE id = ?`,\n args,\n });\n}\n\n// ─── Experiments CRUD ────────────────────────────────────────────────\n\nexport async function insertExperiment(exp: Experiment): Promise<void> {\n await ensureObservabilityTables();\n const client = getDbExec();\n await client.execute({\n sql: `INSERT INTO agent_experiments\n (id, name, status, variants, metrics, assignment_level,\n started_at, ended_at, created_at, owner_email)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n exp.id,\n exp.name,\n exp.status,\n JSON.stringify(exp.variants),\n JSON.stringify(exp.metrics),\n exp.assignmentLevel,\n exp.startedAt,\n exp.endedAt,\n exp.createdAt,\n exp.ownerEmail ?? null,\n ],\n });\n}\n\nexport async function updateExperiment(\n id: string,\n updates: Partial<\n Pick<Experiment, \"name\" | \"status\" | \"variants\" | \"metrics\" | \"endedAt\">\n >,\n): Promise<void> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const sets: string[] = [];\n const args: any[] = [];\n if (updates.name !== undefined) {\n sets.push(\"name = ?\");\n args.push(updates.name);\n }\n if (updates.status !== undefined) {\n sets.push(\"status = ?\");\n args.push(updates.status);\n if (updates.status === \"running\" && !updates.endedAt) {\n sets.push(\"started_at = ?\");\n args.push(Date.now());\n }\n }\n if (updates.variants !== undefined) {\n sets.push(\"variants = ?\");\n args.push(JSON.stringify(updates.variants));\n }\n if (updates.metrics !== undefined) {\n sets.push(\"metrics = ?\");\n args.push(JSON.stringify(updates.metrics));\n }\n if (updates.endedAt !== undefined) {\n sets.push(\"ended_at = ?\");\n args.push(updates.endedAt);\n }\n if (sets.length === 0) return;\n args.push(id);\n await client.execute({\n sql: `UPDATE agent_experiments SET ${sets.join(\", \")} WHERE id = ?`,\n args,\n });\n}\n\nexport async function listExperiments(): Promise<Experiment[]> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const { rows } = await client.execute(\n `SELECT * FROM agent_experiments ORDER BY created_at DESC`,\n );\n return (rows as any[]).map(rowToExperiment);\n}\n\nexport async function getExperiment(id: string): Promise<Experiment | null> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM agent_experiments WHERE id = ?`,\n args: [id],\n });\n if (rows.length === 0) return null;\n return rowToExperiment(rows[0] as any);\n}\n\n// ─── Experiment assignments CRUD ────────────────────────────────────\n\nexport async function upsertAssignment(\n assignment: ExperimentAssignment,\n): Promise<void> {\n await ensureObservabilityTables();\n const client = getDbExec();\n if (isPostgres()) {\n await client.execute({\n sql: `INSERT INTO agent_experiment_assignments\n (experiment_id, user_id, variant_id, assigned_at)\n VALUES (?, ?, ?, ?)\n ON CONFLICT (experiment_id, user_id) DO UPDATE SET\n variant_id = EXCLUDED.variant_id,\n assigned_at = EXCLUDED.assigned_at`,\n args: [\n assignment.experimentId,\n assignment.userId,\n assignment.variantId,\n assignment.assignedAt,\n ],\n });\n } else {\n await client.execute({\n sql: `INSERT OR REPLACE INTO agent_experiment_assignments\n (experiment_id, user_id, variant_id, assigned_at)\n VALUES (?, ?, ?, ?)`,\n args: [\n assignment.experimentId,\n assignment.userId,\n assignment.variantId,\n assignment.assignedAt,\n ],\n });\n }\n}\n\nexport async function getAssignment(\n experimentId: string,\n userId: string,\n): Promise<ExperimentAssignment | null> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM agent_experiment_assignments\n WHERE experiment_id = ? AND user_id = ?`,\n args: [experimentId, userId],\n });\n if (rows.length === 0) return null;\n const r = rows[0] as any;\n return {\n experimentId: r.experiment_id,\n userId: r.user_id,\n variantId: r.variant_id,\n assignedAt: Number(r.assigned_at),\n };\n}\n\n// ─── Experiment results CRUD ─────────────────────────────────────────\n\nexport async function insertExperimentResult(\n result: ExperimentMetricResult,\n): Promise<void> {\n await ensureObservabilityTables();\n const client = getDbExec();\n await client.execute({\n sql: `INSERT INTO agent_experiment_results\n (id, experiment_id, variant_id, metric, value,\n sample_size, confidence_low, confidence_high, computed_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n result.id,\n result.experimentId,\n result.variantId,\n result.metric,\n result.value,\n result.sampleSize,\n result.confidenceLow,\n result.confidenceHigh,\n result.computedAt,\n ],\n });\n}\n\nexport async function getExperimentResults(\n experimentId: string,\n): Promise<ExperimentMetricResult[]> {\n await ensureObservabilityTables();\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT * FROM agent_experiment_results\n WHERE experiment_id = ?\n ORDER BY computed_at DESC`,\n args: [experimentId],\n });\n return (rows as any[]).map(rowToExperimentResult);\n}\n\n// ─── Aggregate queries for dashboard ─────────────────────────────────\n\nexport async function getObservabilityOverview(\n sinceMs: number,\n opts: { userId?: string } = {},\n): Promise<{\n totalRuns: number;\n totalCostCents: number;\n avgDurationMs: number;\n toolSuccessRate: number;\n avgFrustrationScore: number;\n thumbsUpRate: number;\n avgEvalScore: number;\n}> {\n await ensureObservabilityTables();\n const client = getDbExec();\n\n // Three of the four sub-queries time-key on `created_at`; satisfaction\n // uses `computed_at`. Each gets its own `withUserFilter` invocation so\n // the args array isn't aliased across calls (some drivers mutate args\n // for prepared-statement caching).\n const created = withUserFilter(\"created_at >= ?\", [sinceMs], opts.userId);\n const computed = withUserFilter(\"computed_at >= ?\", [sinceMs], opts.userId);\n\n const [tracesResult, satisfactionResult, feedbackResult, evalsResult] =\n await Promise.all([\n client.execute({\n sql: `SELECT\n COUNT(*) as total_runs,\n COALESCE(SUM(total_cost_cents_x100), 0) as total_cost,\n COALESCE(AVG(total_duration_ms), 0) as avg_duration,\n COALESCE(SUM(successful_tools), 0) as success_tools,\n COALESCE(SUM(tool_calls), 0) as total_tools\n FROM agent_trace_summaries WHERE ${created.where}`,\n args: created.args,\n }),\n client.execute({\n sql: `SELECT COALESCE(AVG(frustration_score), 0) as avg_frustration\n FROM agent_satisfaction_scores WHERE ${computed.where}`,\n args: computed.args,\n }),\n client.execute({\n sql: `SELECT\n COALESCE(SUM(CASE WHEN feedback_type = 'thumbs_up' THEN 1 ELSE 0 END), 0) as up,\n COALESCE(SUM(CASE WHEN feedback_type IN ('thumbs_up', 'thumbs_down') THEN 1 ELSE 0 END), 0) as total\n FROM agent_feedback WHERE ${created.where}`,\n args: created.args,\n }),\n client.execute({\n sql: `SELECT COALESCE(AVG(score), 0) as avg_score\n FROM agent_evals WHERE ${created.where}`,\n args: created.args,\n }),\n ]);\n\n const t = (tracesResult.rows[0] ?? {}) as Record<string, number | null>;\n const s = (satisfactionResult.rows[0] ?? {}) as Record<string, number | null>;\n const f = (feedbackResult.rows[0] ?? {}) as Record<string, number | null>;\n const e = (evalsResult.rows[0] ?? {}) as Record<string, number | null>;\n\n const totalTools = Number(t.total_tools ?? 0);\n const successTools = Number(t.success_tools ?? 0);\n const feedbackTotal = Number(f.total ?? 0);\n const feedbackUp = Number(f.up ?? 0);\n\n return {\n totalRuns: Number(t.total_runs ?? 0),\n totalCostCents: Number(t.total_cost ?? 0) / 100,\n avgDurationMs: Number(t.avg_duration ?? 0),\n toolSuccessRate: totalTools > 0 ? successTools / totalTools : 1,\n avgFrustrationScore: Number(s.avg_frustration ?? 0),\n thumbsUpRate: feedbackTotal > 0 ? feedbackUp / feedbackTotal : 0,\n avgEvalScore: Number(e.avg_score ?? 0),\n };\n}\n\n// ─── Row mappers ─────────────────────────────────────────────────────\n\nfunction rowToTraceSpan(row: Record<string, any>): TraceSpan {\n return {\n id: String(row.id),\n runId: String(row.run_id),\n threadId: row.thread_id ? String(row.thread_id) : null,\n userId: row.user_id ? String(row.user_id) : null,\n parentSpanId: row.parent_span_id ? String(row.parent_span_id) : null,\n spanType: row.span_type as TraceSpan[\"spanType\"],\n name: String(row.name),\n inputTokens: Number(row.input_tokens ?? 0),\n outputTokens: Number(row.output_tokens ?? 0),\n cacheReadTokens: Number(row.cache_read_tokens ?? 0),\n cacheWriteTokens: Number(row.cache_write_tokens ?? 0),\n costCentsX100: Number(row.cost_cents_x100 ?? 0),\n durationMs: Number(row.duration_ms ?? 0),\n status: row.status as TraceSpan[\"status\"],\n errorMessage: row.error_message ? String(row.error_message) : null,\n metadata: safeJsonParse(row.metadata, null),\n createdAt: Number(row.created_at),\n };\n}\n\nfunction rowToTraceSummary(row: Record<string, any>): TraceSummary {\n return {\n runId: String(row.run_id),\n threadId: row.thread_id ? String(row.thread_id) : null,\n userId: row.user_id ? String(row.user_id) : null,\n totalSpans: Number(row.total_spans ?? 0),\n llmCalls: Number(row.llm_calls ?? 0),\n toolCalls: Number(row.tool_calls ?? 0),\n successfulTools: Number(row.successful_tools ?? 0),\n failedTools: Number(row.failed_tools ?? 0),\n totalDurationMs: Number(row.total_duration_ms ?? 0),\n totalCostCentsX100: Number(row.total_cost_cents_x100 ?? 0),\n totalInputTokens: Number(row.total_input_tokens ?? 0),\n totalOutputTokens: Number(row.total_output_tokens ?? 0),\n model: String(row.model ?? \"\"),\n createdAt: Number(row.created_at),\n };\n}\n\nfunction rowToFeedback(row: Record<string, any>): FeedbackEntry {\n return {\n id: String(row.id),\n runId: row.run_id ? String(row.run_id) : null,\n threadId: row.thread_id ? String(row.thread_id) : null,\n messageSeq: row.message_seq != null ? Number(row.message_seq) : null,\n feedbackType: row.feedback_type as FeedbackEntry[\"feedbackType\"],\n value: String(row.value ?? \"\"),\n userId: row.user_id ? String(row.user_id) : null,\n createdAt: Number(row.created_at),\n };\n}\n\nfunction rowToSatisfaction(row: Record<string, any>): SatisfactionScore {\n return {\n id: String(row.id),\n threadId: String(row.thread_id),\n userId: row.user_id ? String(row.user_id) : null,\n frustrationScore: Number(row.frustration_score ?? 0),\n rephrasingScore: Number(row.rephrasing_score ?? 0),\n abandonmentScore: Number(row.abandonment_score ?? 0),\n sentimentScore: Number(row.sentiment_score ?? 0),\n lengthTrendScore: Number(row.length_trend_score ?? 0),\n computedAt: Number(row.computed_at),\n };\n}\n\nfunction rowToEval(row: Record<string, any>): EvalResult {\n return {\n id: String(row.id),\n runId: String(row.run_id),\n threadId: row.thread_id ? String(row.thread_id) : null,\n userId: row.user_id ? String(row.user_id) : null,\n evalType: row.eval_type as EvalResult[\"evalType\"],\n criteria: String(row.criteria),\n score: Number(row.score ?? 0),\n reasoning: row.reasoning ? String(row.reasoning) : null,\n metadata: safeJsonParse(row.metadata, null),\n createdAt: Number(row.created_at),\n };\n}\n\nfunction rowToDataset(row: Record<string, any>): EvalDataset {\n return {\n id: String(row.id),\n name: String(row.name),\n description: String(row.description ?? \"\"),\n entries: safeJsonParse(row.entries, []),\n createdAt: Number(row.created_at),\n updatedAt: Number(row.updated_at),\n };\n}\n\nfunction rowToExperiment(row: Record<string, any>): Experiment {\n return {\n id: String(row.id),\n name: String(row.name),\n status: row.status as Experiment[\"status\"],\n variants: safeJsonParse(row.variants, []),\n metrics: safeJsonParse(row.metrics, []),\n assignmentLevel: (row.assignment_level as \"user\" | \"session\") ?? \"user\",\n startedAt: row.started_at ? Number(row.started_at) : null,\n endedAt: row.ended_at ? Number(row.ended_at) : null,\n createdAt: Number(row.created_at),\n ownerEmail:\n typeof row.owner_email === \"string\" && row.owner_email\n ? row.owner_email\n : null,\n };\n}\n\nfunction rowToExperimentResult(\n row: Record<string, any>,\n): ExperimentMetricResult {\n return {\n id: String(row.id),\n experimentId: String(row.experiment_id),\n variantId: String(row.variant_id),\n metric: String(row.metric),\n value: Number(row.value ?? 0),\n sampleSize: Number(row.sample_size ?? 0),\n confidenceLow: Number(row.confidence_low ?? 0),\n confidenceHigh: Number(row.confidence_high ?? 0),\n computedAt: Number(row.computed_at),\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/private-blob/registry.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAmKpB,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,mBAAmB,GAC5B,IAAI,CAEN;AAED,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE9D;AAED,wBAAgB,wBAAwB,IAAI,mBAAmB,EAAE,CAEhE;AAED,wBAAgB,4BAA4B,IAAI,mBAAmB,GAAG,IAAI,CAKzE;AAED,wBAAgB,yCAAyC,CACvD,OAAO,EAAE,OAAO,GACf,IAAI,CAEN;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAQnC;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,qBAAqB,CAAC,CAOhC;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,uBAAuB,CAAC,CAYlC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/private-blob/registry.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAsKpB,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,mBAAmB,GAC5B,IAAI,CAEN;AAED,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE9D;AAED,wBAAgB,wBAAwB,IAAI,mBAAmB,EAAE,CAEhE;AAED,wBAAgB,4BAA4B,IAAI,mBAAmB,GAAG,IAAI,CAKzE;AAED,wBAAgB,yCAAyC,CACvD,OAAO,EAAE,OAAO,GACf,IAAI,CAEN;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAQnC;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,qBAAqB,CAAC,CAOhC;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,uBAAuB,CAAC,CAYlC"}
@@ -1,12 +1,17 @@
1
1
  import { createCipheriv, createDecipheriv, randomBytes } from "node:crypto";
2
2
  import { uploadFile } from "../file-upload/index.js";
3
3
  import { decryptSecretValue, encryptSecretValue, getSecretEncryptionKey, } from "../secrets/crypto.js";
4
+ import { getScopedGlobal } from "../shared/global-scope.js";
4
5
  const PUBLIC_UPLOAD_HANDLE_PREFIX = "public-upload:v1:";
5
- const globals = globalThis;
6
- const providers = (globals.__agentNativePrivateBlobProviders ??= new Map());
7
- const publicUploadFallbackRef = (globals.__agentNativePrivateBlobPublicUploadFallback ??= {
8
- enabled: true,
9
- });
6
+ // globalThis-pinned so an app's multiple ESM graphs share one registry, but
7
+ // scope-aware + lazily resolved so unified workspace deployments (all apps
8
+ // in one isolate) keep per-app provider registries. See shared/global-scope.
9
+ function getProviders() {
10
+ return getScopedGlobal("agent-native.private-blob.providers", () => new Map());
11
+ }
12
+ function getPublicUploadFallbackRef() {
13
+ return getScopedGlobal("agent-native.private-blob.public-upload-fallback", () => ({ enabled: true }));
14
+ }
10
15
  function toBytes(data) {
11
16
  return data instanceof Uint8Array ? data : new Uint8Array(data);
12
17
  }
@@ -99,29 +104,29 @@ async function readViaEncryptedPublicUpload(handle) {
99
104
  };
100
105
  }
101
106
  export function registerPrivateBlobProvider(provider) {
102
- providers.set(provider.id, provider);
107
+ getProviders().set(provider.id, provider);
103
108
  }
104
109
  export function unregisterPrivateBlobProvider(id) {
105
- providers.delete(id);
110
+ getProviders().delete(id);
106
111
  }
107
112
  export function listPrivateBlobProviders() {
108
- return [...providers.values()];
113
+ return [...getProviders().values()];
109
114
  }
110
115
  export function getActivePrivateBlobProvider() {
111
- for (const provider of providers.values()) {
116
+ for (const provider of getProviders().values()) {
112
117
  if (provider.isConfigured())
113
118
  return provider;
114
119
  }
115
120
  return null;
116
121
  }
117
122
  export function setPrivateBlobPublicUploadFallbackEnabled(enabled) {
118
- publicUploadFallbackRef.enabled = enabled;
123
+ getPublicUploadFallbackRef().enabled = enabled;
119
124
  }
120
125
  export async function putPrivateBlob(input) {
121
126
  const provider = getActivePrivateBlobProvider();
122
127
  if (provider)
123
128
  return provider.put(input);
124
- if (!publicUploadFallbackRef.enabled)
129
+ if (!getPublicUploadFallbackRef().enabled)
125
130
  return null;
126
131
  if (process.env.AGENT_NATIVE_PRIVATE_BLOB_PUBLIC_UPLOAD_FALLBACK === "0") {
127
132
  return null;
@@ -129,7 +134,7 @@ export async function putPrivateBlob(input) {
129
134
  return putViaEncryptedPublicUpload(input);
130
135
  }
131
136
  export async function readPrivateBlob(handle) {
132
- const provider = providers.get(handle.provider);
137
+ const provider = getProviders().get(handle.provider);
133
138
  if (provider)
134
139
  return provider.read(handle);
135
140
  if (isPublicUploadFallbackHandle(handle)) {
@@ -138,7 +143,7 @@ export async function readPrivateBlob(handle) {
138
143
  throw new Error(`No private blob provider registered for ${handle.provider}`);
139
144
  }
140
145
  export async function deletePrivateBlob(handle) {
141
- const provider = providers.get(handle.provider);
146
+ const provider = getProviders().get(handle.provider);
142
147
  if (provider)
143
148
  return provider.delete(handle);
144
149
  if (isPublicUploadFallbackHandle(handle)) {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/private-blob/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipheriv, createDecipheriv, randomBytes } from \"node:crypto\";\r\n\r\nimport { uploadFile } from \"../file-upload/index.js\";\r\nimport {\r\n decryptSecretValue,\r\n encryptSecretValue,\r\n getSecretEncryptionKey,\r\n} from \"../secrets/crypto.js\";\r\nimport type {\r\n PrivateBlobDeleteResult,\r\n PrivateBlobHandle,\r\n PrivateBlobProvider,\r\n PrivateBlobPutInput,\r\n PrivateBlobReadResult,\r\n} from \"./types.js\";\r\n\r\ninterface PrivateBlobGlobals {\r\n __agentNativePrivateBlobProviders?: Map<string, PrivateBlobProvider>;\r\n __agentNativePrivateBlobPublicUploadFallback?: { enabled: boolean };\r\n}\r\n\r\ninterface EncryptedPayload {\r\n iv: string;\r\n tag: string;\r\n ciphertext: Uint8Array;\r\n}\r\n\r\ninterface EncryptionParams {\r\n iv: string;\r\n tag: string;\r\n}\r\n\r\ninterface PublicUploadDescriptor {\r\n kind: \"agent-native.private-blob.public-upload\";\r\n version: 1;\r\n url: string;\r\n uploadProvider: string;\r\n uploadId?: string;\r\n encryption: EncryptionParams;\r\n mimeType?: string;\r\n metadata?: PrivateBlobHandle[\"metadata\"];\r\n size: number;\r\n createdAt: string;\r\n}\r\n\r\nconst PUBLIC_UPLOAD_HANDLE_PREFIX = \"public-upload:v1:\";\r\nconst globals = globalThis as typeof globalThis & PrivateBlobGlobals;\r\nconst providers: Map<string, PrivateBlobProvider> =\r\n (globals.__agentNativePrivateBlobProviders ??= new Map());\r\nconst publicUploadFallbackRef: { enabled: boolean } =\r\n (globals.__agentNativePrivateBlobPublicUploadFallback ??= {\r\n enabled: true,\r\n });\r\n\r\nfunction toBytes(data: Uint8Array | Buffer): Uint8Array {\r\n return data instanceof Uint8Array ? data : new Uint8Array(data);\r\n}\r\n\r\nfunction encryptBytes(data: Uint8Array): EncryptedPayload {\r\n const iv = randomBytes(12);\r\n const cipher = createCipheriv(\"aes-256-gcm\", getSecretEncryptionKey(), iv);\r\n const ciphertext = Buffer.concat([\r\n cipher.update(Buffer.from(data)),\r\n cipher.final(),\r\n ]);\r\n return {\r\n iv: iv.toString(\"base64url\"),\r\n ciphertext: new Uint8Array(ciphertext),\r\n tag: cipher.getAuthTag().toString(\"base64url\"),\r\n };\r\n}\r\n\r\nfunction decryptBytes(\r\n params: EncryptionParams,\r\n ciphertext: Uint8Array,\r\n): Uint8Array {\r\n const decipher = createDecipheriv(\r\n \"aes-256-gcm\",\r\n getSecretEncryptionKey(),\r\n Buffer.from(params.iv, \"base64url\"),\r\n );\r\n decipher.setAuthTag(Buffer.from(params.tag, \"base64url\"));\r\n return new Uint8Array(\r\n Buffer.concat([decipher.update(Buffer.from(ciphertext)), decipher.final()]),\r\n );\r\n}\r\n\r\nfunction encodePublicUploadDescriptor(\r\n descriptor: PublicUploadDescriptor,\r\n): string {\r\n return `${PUBLIC_UPLOAD_HANDLE_PREFIX}${encryptSecretValue(\r\n JSON.stringify(descriptor),\r\n )}`;\r\n}\r\n\r\nfunction decodePublicUploadDescriptor(id: string): PublicUploadDescriptor {\r\n if (!id.startsWith(PUBLIC_UPLOAD_HANDLE_PREFIX)) {\r\n throw new Error(\r\n \"Private blob handle is not a public-upload fallback handle\",\r\n );\r\n }\r\n const raw = decryptSecretValue(id.slice(PUBLIC_UPLOAD_HANDLE_PREFIX.length));\r\n const descriptor = JSON.parse(raw) as PublicUploadDescriptor;\r\n if (\r\n descriptor?.kind !== \"agent-native.private-blob.public-upload\" ||\r\n descriptor.version !== 1 ||\r\n typeof descriptor.url !== \"string\"\r\n ) {\r\n throw new Error(\"Private blob handle descriptor is invalid\");\r\n }\r\n return descriptor;\r\n}\r\n\r\nfunction isPublicUploadFallbackHandle(handle: PrivateBlobHandle): boolean {\r\n return handle.id.startsWith(PUBLIC_UPLOAD_HANDLE_PREFIX);\r\n}\r\n\r\nasync function putViaEncryptedPublicUpload(\r\n input: PrivateBlobPutInput,\r\n): Promise<PrivateBlobHandle | null> {\r\n const bytes = toBytes(input.data);\r\n const encrypted = encryptBytes(bytes);\r\n const uploaded = await uploadFile({\r\n data: Buffer.from(encrypted.ciphertext),\r\n filename: input.filename ?? input.key ?? \"private-blob.bin\",\r\n mimeType: \"application/octet-stream\",\r\n ownerEmail: input.ownerEmail,\r\n recordAsset: false,\r\n });\r\n if (!uploaded) return null;\r\n\r\n const descriptor: PublicUploadDescriptor = {\r\n kind: \"agent-native.private-blob.public-upload\",\r\n version: 1,\r\n url: uploaded.url,\r\n uploadProvider: uploaded.provider,\r\n uploadId: uploaded.id,\r\n encryption: { iv: encrypted.iv, tag: encrypted.tag },\r\n mimeType: input.mimeType,\r\n metadata: input.metadata,\r\n size: bytes.byteLength,\r\n createdAt: new Date().toISOString(),\r\n };\r\n\r\n return {\r\n id: encodePublicUploadDescriptor(descriptor),\r\n provider: `public-upload:${uploaded.provider}`,\r\n opaque: true,\r\n encrypted: true,\r\n mimeType: input.mimeType,\r\n size: bytes.byteLength,\r\n createdAt: descriptor.createdAt,\r\n metadata: input.metadata,\r\n };\r\n}\r\n\r\nasync function readViaEncryptedPublicUpload(\r\n handle: PrivateBlobHandle,\r\n): Promise<PrivateBlobReadResult> {\r\n const descriptor = decodePublicUploadDescriptor(handle.id);\r\n const response = await fetch(descriptor.url);\r\n if (!response.ok) {\r\n throw new Error(\r\n `Private blob public-upload read failed (${response.status}): ${response.statusText}`,\r\n );\r\n }\r\n // The uploaded ciphertext is intentionally opaque; the descriptor carries\r\n // auth tag + IV separately so the backing public URL is useless by itself.\r\n const ciphertext = new Uint8Array(await response.arrayBuffer());\r\n return {\r\n data: decryptBytes(descriptor.encryption, ciphertext),\r\n mimeType: descriptor.mimeType,\r\n metadata: descriptor.metadata,\r\n handle,\r\n };\r\n}\r\n\r\nexport function registerPrivateBlobProvider(\r\n provider: PrivateBlobProvider,\r\n): void {\r\n providers.set(provider.id, provider);\r\n}\r\n\r\nexport function unregisterPrivateBlobProvider(id: string): void {\r\n providers.delete(id);\r\n}\r\n\r\nexport function listPrivateBlobProviders(): PrivateBlobProvider[] {\r\n return [...providers.values()];\r\n}\r\n\r\nexport function getActivePrivateBlobProvider(): PrivateBlobProvider | null {\r\n for (const provider of providers.values()) {\r\n if (provider.isConfigured()) return provider;\r\n }\r\n return null;\r\n}\r\n\r\nexport function setPrivateBlobPublicUploadFallbackEnabled(\r\n enabled: boolean,\r\n): void {\r\n publicUploadFallbackRef.enabled = enabled;\r\n}\r\n\r\nexport async function putPrivateBlob(\r\n input: PrivateBlobPutInput,\r\n): Promise<PrivateBlobHandle | null> {\r\n const provider = getActivePrivateBlobProvider();\r\n if (provider) return provider.put(input);\r\n if (!publicUploadFallbackRef.enabled) return null;\r\n if (process.env.AGENT_NATIVE_PRIVATE_BLOB_PUBLIC_UPLOAD_FALLBACK === \"0\") {\r\n return null;\r\n }\r\n return putViaEncryptedPublicUpload(input);\r\n}\r\n\r\nexport async function readPrivateBlob(\r\n handle: PrivateBlobHandle,\r\n): Promise<PrivateBlobReadResult> {\r\n const provider = providers.get(handle.provider);\r\n if (provider) return provider.read(handle);\r\n if (isPublicUploadFallbackHandle(handle)) {\r\n return readViaEncryptedPublicUpload(handle);\r\n }\r\n throw new Error(`No private blob provider registered for ${handle.provider}`);\r\n}\r\n\r\nexport async function deletePrivateBlob(\r\n handle: PrivateBlobHandle,\r\n): Promise<PrivateBlobDeleteResult> {\r\n const provider = providers.get(handle.provider);\r\n if (provider) return provider.delete(handle);\r\n if (isPublicUploadFallbackHandle(handle)) {\r\n return {\r\n deleted: false,\r\n provider: handle.provider,\r\n reason:\r\n \"delete is not supported by the encrypted public-upload fallback provider\",\r\n };\r\n }\r\n throw new Error(`No private blob provider registered for ${handle.provider}`);\r\n}\r\n"]}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/private-blob/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipheriv, createDecipheriv, randomBytes } from \"node:crypto\";\n\nimport { uploadFile } from \"../file-upload/index.js\";\nimport {\n decryptSecretValue,\n encryptSecretValue,\n getSecretEncryptionKey,\n} from \"../secrets/crypto.js\";\nimport { getScopedGlobal } from \"../shared/global-scope.js\";\nimport type {\n PrivateBlobDeleteResult,\n PrivateBlobHandle,\n PrivateBlobProvider,\n PrivateBlobPutInput,\n PrivateBlobReadResult,\n} from \"./types.js\";\n\ninterface EncryptedPayload {\n iv: string;\n tag: string;\n ciphertext: Uint8Array;\n}\n\ninterface EncryptionParams {\n iv: string;\n tag: string;\n}\n\ninterface PublicUploadDescriptor {\n kind: \"agent-native.private-blob.public-upload\";\n version: 1;\n url: string;\n uploadProvider: string;\n uploadId?: string;\n encryption: EncryptionParams;\n mimeType?: string;\n metadata?: PrivateBlobHandle[\"metadata\"];\n size: number;\n createdAt: string;\n}\n\nconst PUBLIC_UPLOAD_HANDLE_PREFIX = \"public-upload:v1:\";\n// globalThis-pinned so an app's multiple ESM graphs share one registry, but\n// scope-aware + lazily resolved so unified workspace deployments (all apps\n// in one isolate) keep per-app provider registries. See shared/global-scope.\nfunction getProviders(): Map<string, PrivateBlobProvider> {\n return getScopedGlobal(\n \"agent-native.private-blob.providers\",\n () => new Map<string, PrivateBlobProvider>(),\n );\n}\nfunction getPublicUploadFallbackRef(): { enabled: boolean } {\n return getScopedGlobal(\n \"agent-native.private-blob.public-upload-fallback\",\n () => ({ enabled: true }),\n );\n}\n\nfunction toBytes(data: Uint8Array | Buffer): Uint8Array {\n return data instanceof Uint8Array ? data : new Uint8Array(data);\n}\n\nfunction encryptBytes(data: Uint8Array): EncryptedPayload {\n const iv = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", getSecretEncryptionKey(), iv);\n const ciphertext = Buffer.concat([\n cipher.update(Buffer.from(data)),\n cipher.final(),\n ]);\n return {\n iv: iv.toString(\"base64url\"),\n ciphertext: new Uint8Array(ciphertext),\n tag: cipher.getAuthTag().toString(\"base64url\"),\n };\n}\n\nfunction decryptBytes(\n params: EncryptionParams,\n ciphertext: Uint8Array,\n): Uint8Array {\n const decipher = createDecipheriv(\n \"aes-256-gcm\",\n getSecretEncryptionKey(),\n Buffer.from(params.iv, \"base64url\"),\n );\n decipher.setAuthTag(Buffer.from(params.tag, \"base64url\"));\n return new Uint8Array(\n Buffer.concat([decipher.update(Buffer.from(ciphertext)), decipher.final()]),\n );\n}\n\nfunction encodePublicUploadDescriptor(\n descriptor: PublicUploadDescriptor,\n): string {\n return `${PUBLIC_UPLOAD_HANDLE_PREFIX}${encryptSecretValue(\n JSON.stringify(descriptor),\n )}`;\n}\n\nfunction decodePublicUploadDescriptor(id: string): PublicUploadDescriptor {\n if (!id.startsWith(PUBLIC_UPLOAD_HANDLE_PREFIX)) {\n throw new Error(\n \"Private blob handle is not a public-upload fallback handle\",\n );\n }\n const raw = decryptSecretValue(id.slice(PUBLIC_UPLOAD_HANDLE_PREFIX.length));\n const descriptor = JSON.parse(raw) as PublicUploadDescriptor;\n if (\n descriptor?.kind !== \"agent-native.private-blob.public-upload\" ||\n descriptor.version !== 1 ||\n typeof descriptor.url !== \"string\"\n ) {\n throw new Error(\"Private blob handle descriptor is invalid\");\n }\n return descriptor;\n}\n\nfunction isPublicUploadFallbackHandle(handle: PrivateBlobHandle): boolean {\n return handle.id.startsWith(PUBLIC_UPLOAD_HANDLE_PREFIX);\n}\n\nasync function putViaEncryptedPublicUpload(\n input: PrivateBlobPutInput,\n): Promise<PrivateBlobHandle | null> {\n const bytes = toBytes(input.data);\n const encrypted = encryptBytes(bytes);\n const uploaded = await uploadFile({\n data: Buffer.from(encrypted.ciphertext),\n filename: input.filename ?? input.key ?? \"private-blob.bin\",\n mimeType: \"application/octet-stream\",\n ownerEmail: input.ownerEmail,\n recordAsset: false,\n });\n if (!uploaded) return null;\n\n const descriptor: PublicUploadDescriptor = {\n kind: \"agent-native.private-blob.public-upload\",\n version: 1,\n url: uploaded.url,\n uploadProvider: uploaded.provider,\n uploadId: uploaded.id,\n encryption: { iv: encrypted.iv, tag: encrypted.tag },\n mimeType: input.mimeType,\n metadata: input.metadata,\n size: bytes.byteLength,\n createdAt: new Date().toISOString(),\n };\n\n return {\n id: encodePublicUploadDescriptor(descriptor),\n provider: `public-upload:${uploaded.provider}`,\n opaque: true,\n encrypted: true,\n mimeType: input.mimeType,\n size: bytes.byteLength,\n createdAt: descriptor.createdAt,\n metadata: input.metadata,\n };\n}\n\nasync function readViaEncryptedPublicUpload(\n handle: PrivateBlobHandle,\n): Promise<PrivateBlobReadResult> {\n const descriptor = decodePublicUploadDescriptor(handle.id);\n const response = await fetch(descriptor.url);\n if (!response.ok) {\n throw new Error(\n `Private blob public-upload read failed (${response.status}): ${response.statusText}`,\n );\n }\n // The uploaded ciphertext is intentionally opaque; the descriptor carries\n // auth tag + IV separately so the backing public URL is useless by itself.\n const ciphertext = new Uint8Array(await response.arrayBuffer());\n return {\n data: decryptBytes(descriptor.encryption, ciphertext),\n mimeType: descriptor.mimeType,\n metadata: descriptor.metadata,\n handle,\n };\n}\n\nexport function registerPrivateBlobProvider(\n provider: PrivateBlobProvider,\n): void {\n getProviders().set(provider.id, provider);\n}\n\nexport function unregisterPrivateBlobProvider(id: string): void {\n getProviders().delete(id);\n}\n\nexport function listPrivateBlobProviders(): PrivateBlobProvider[] {\n return [...getProviders().values()];\n}\n\nexport function getActivePrivateBlobProvider(): PrivateBlobProvider | null {\n for (const provider of getProviders().values()) {\n if (provider.isConfigured()) return provider;\n }\n return null;\n}\n\nexport function setPrivateBlobPublicUploadFallbackEnabled(\n enabled: boolean,\n): void {\n getPublicUploadFallbackRef().enabled = enabled;\n}\n\nexport async function putPrivateBlob(\n input: PrivateBlobPutInput,\n): Promise<PrivateBlobHandle | null> {\n const provider = getActivePrivateBlobProvider();\n if (provider) return provider.put(input);\n if (!getPublicUploadFallbackRef().enabled) return null;\n if (process.env.AGENT_NATIVE_PRIVATE_BLOB_PUBLIC_UPLOAD_FALLBACK === \"0\") {\n return null;\n }\n return putViaEncryptedPublicUpload(input);\n}\n\nexport async function readPrivateBlob(\n handle: PrivateBlobHandle,\n): Promise<PrivateBlobReadResult> {\n const provider = getProviders().get(handle.provider);\n if (provider) return provider.read(handle);\n if (isPublicUploadFallbackHandle(handle)) {\n return readViaEncryptedPublicUpload(handle);\n }\n throw new Error(`No private blob provider registered for ${handle.provider}`);\n}\n\nexport async function deletePrivateBlob(\n handle: PrivateBlobHandle,\n): Promise<PrivateBlobDeleteResult> {\n const provider = getProviders().get(handle.provider);\n if (provider) return provider.delete(handle);\n if (isPublicUploadFallbackHandle(handle)) {\n return {\n deleted: false,\n provider: handle.provider,\n reason:\n \"delete is not supported by the encrypted public-upload fallback provider\",\n };\n }\n throw new Error(`No private blob provider registered for ${handle.provider}`);\n}\n"]}
@@ -15,7 +15,7 @@ export declare function createProgressHandler(): import("h3").EventHandlerWithFe
15
15
  error: string;
16
16
  ok?: undefined;
17
17
  } | {
18
- ok: boolean;
19
18
  error?: undefined;
19
+ ok: boolean;
20
20
  }>>;
21
21
  //# sourceMappingURL=routes.d.ts.map
@@ -52,8 +52,8 @@ export declare function handleDeleteResource(event: any): Promise<{
52
52
  error: string;
53
53
  ok?: undefined;
54
54
  } | {
55
- ok: boolean;
56
55
  error?: undefined;
56
+ ok: boolean;
57
57
  }>;
58
58
  /** POST /_agent-native/resources/upload — upload a file as a resource */
59
59
  export declare function handleUploadResource(event: any): Promise<import("./store.js").Resource | {
@@ -74,10 +74,10 @@ export declare function handleUploadResource(event: any): Promise<import("./stor
74
74
  runId: string | null;
75
75
  expiresAt: number | null;
76
76
  metadata: string | null;
77
+ error?: undefined;
77
78
  url: string;
78
79
  provider: string;
79
80
  storageSetupRequired?: undefined;
80
- error?: undefined;
81
81
  } | {
82
82
  error: string;
83
83
  storageSetupRequired: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/secrets/register.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,KAAK,CAAC;AACvD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,CACE,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,GAAG,eAAe,GAAG,OAAO,CAAC;CACnE;AAED,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,KAAK,EAAE,WAAW,CAAC;IACnB,0EAA0E;IAC1E,IAAI,EAAE,UAAU,CAAC;IACjB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAgBD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAqCrE;AAED,2DAA2D;AAC3D,wBAAgB,mBAAmB,IAAI,gBAAgB,EAAE,CAExD;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE3E;AAED,sDAAsD;AACtD,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/secrets/register.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,KAAK,CAAC;AACvD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,CACE,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,GAAG,eAAe,GAAG,OAAO,CAAC;CACnE;AAED,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,KAAK,EAAE,WAAW,CAAC;IACnB,0EAA0E;IAC1E,IAAI,EAAE,UAAU,CAAC;IACjB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAiBD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAqCrE;AAED,2DAA2D;AAC3D,wBAAgB,mBAAmB,IAAI,gBAAgB,EAAE,CAExD;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE3E;AAED,sDAAsD;AACtD,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
@@ -6,14 +6,18 @@
6
6
  * read from this registry on every request so overrides and late-registered
7
7
  * secrets are picked up without a restart.
8
8
  */
9
+ import { getScopedGlobal } from "../shared/global-scope.js";
9
10
  // Pin the registry to globalThis so templates that load `@agent-native/core`
10
11
  // via more than one ESM graph (e.g. dev-mode Vite + Nitro, symlinked
11
12
  // node_modules, dist/ vs src/) share a single registry. Without this, a
12
13
  // template's `register-secrets.ts` side-effect module may populate one
13
14
  // registry instance while the /_agent-native/secrets route reads from
14
15
  // another — net effect: the UI sees an empty list.
15
- const REGISTRY_KEY = Symbol.for("@agent-native/core/secrets.registry");
16
- const registry = (globalThis[REGISTRY_KEY] ??= new Map());
16
+ // Scope-aware + lazily resolved so unified workspace deployments (all apps in
17
+ // one isolate) keep per-app secret registrations. See shared/global-scope.
18
+ function getSecretsRegistry() {
19
+ return getScopedGlobal("agent-native.secrets.registry", () => new Map());
20
+ }
17
21
  /**
18
22
  * Register (or override) a required secret.
19
23
  *
@@ -32,10 +36,10 @@ export function registerRequiredSecret(secret) {
32
36
  if (secret.kind !== "api-key" && secret.kind !== "oauth") {
33
37
  throw new Error(`registerRequiredSecret: secret.kind must be "api-key" or "oauth" (got "${secret.kind}")`);
34
38
  }
35
- if (registry.has(secret.key) && process.env.DEBUG) {
39
+ if (getSecretsRegistry().has(secret.key) && process.env.DEBUG) {
36
40
  console.log(`[agent-native] Overriding registered secret "${secret.key}" with new registration.`);
37
41
  }
38
- registry.set(secret.key, secret);
42
+ getSecretsRegistry().set(secret.key, secret);
39
43
  // Auto-inject an onboarding step for required secrets. Done via dynamic
40
44
  // import to avoid a load-order cycle between register and the onboarding
41
45
  // registry during module bootstrap.
@@ -51,14 +55,14 @@ export function registerRequiredSecret(secret) {
51
55
  }
52
56
  /** Return all registered secrets in registration order. */
53
57
  export function listRequiredSecrets() {
54
- return Array.from(registry.values());
58
+ return Array.from(getSecretsRegistry().values());
55
59
  }
56
60
  /** Look up a single registered secret by key. */
57
61
  export function getRequiredSecret(key) {
58
- return registry.get(key);
62
+ return getSecretsRegistry().get(key);
59
63
  }
60
64
  /** Test helper — clears the registry between runs. */
61
65
  export function __resetSecretsRegistry() {
62
- registry.clear();
66
+ getSecretsRegistry().clear();
63
67
  }
64
68
  //# sourceMappingURL=register.js.map