@circuitwall/jarela 0.9.3 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +2 -2
  3. package/.next/standalone/.next/build-manifest.json +2 -2
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  6. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  16. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  17. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  18. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  20. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  22. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  23. package/.next/standalone/.next/server/app/api/v1/dashboard/metrics/route.js +72 -5
  24. package/.next/standalone/.next/server/app/api/v1/dashboard/metrics/route.js.map +1 -1
  25. package/.next/standalone/.next/server/app/api/v1/extensions/route.js +2 -2
  26. package/.next/standalone/.next/server/app/api/v1/extensions/tools/[name]/secrets/route.js +2 -2
  27. package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/run/route.js +136 -26
  28. package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/run/route.js.map +1 -1
  29. package/.next/standalone/.next/server/app/api/v1/tools/route.js +2 -2
  30. package/.next/standalone/.next/server/app/index.html +2 -2
  31. package/.next/standalone/.next/server/app/index.rsc +3 -3
  32. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  33. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  34. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  35. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  36. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  37. package/.next/standalone/.next/server/app/page.js +266 -40
  38. package/.next/standalone/.next/server/app/page.js.map +1 -1
  39. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/setup.html +1 -1
  42. package/.next/standalone/.next/server/app/setup.rsc +2 -2
  43. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +2 -2
  44. package/.next/standalone/.next/server/app/setup.segments/_head.segment.rsc +1 -1
  45. package/.next/standalone/.next/server/app/setup.segments/_index.segment.rsc +2 -2
  46. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  47. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +1 -1
  48. package/.next/standalone/.next/server/app/setup.segments/setup.segment.rsc +1 -1
  49. package/.next/standalone/.next/server/app-paths-manifest.json +2 -2
  50. package/.next/standalone/.next/server/chunks/210.js +1 -1
  51. package/.next/standalone/.next/server/chunks/2151.js +60 -2
  52. package/.next/standalone/.next/server/chunks/2151.js.map +1 -1
  53. package/.next/standalone/.next/server/chunks/614.js +336 -93
  54. package/.next/standalone/.next/server/chunks/614.js.map +1 -1
  55. package/.next/standalone/.next/server/chunks/6765.js +35 -0
  56. package/.next/standalone/.next/server/chunks/6765.js.map +1 -1
  57. package/.next/standalone/.next/server/chunks/8697.js +15246 -15002
  58. package/.next/standalone/.next/server/chunks/8697.js.map +1 -1
  59. package/.next/standalone/.next/server/middleware-build-manifest.js +2 -2
  60. package/.next/standalone/.next/server/pages/404.html +2 -2
  61. package/.next/standalone/.next/server/pages/500.html +1 -1
  62. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  63. package/.next/standalone/.next/static/chunks/{3741-344e2bfc5028b9c8.js → 3741-2d64471ff763b8fa.js} +36 -1
  64. package/.next/standalone/.next/static/chunks/3741-2d64471ff763b8fa.js.map +1 -0
  65. package/.next/standalone/.next/static/chunks/app/{page-c77ab600642bbfc2.js → page-318743bf47fac345.js} +267 -41
  66. package/.next/standalone/.next/static/chunks/app/page-318743bf47fac345.js.map +1 -0
  67. package/.next/standalone/.next/static/css/b6b85b0f13bc0e98.css +5 -0
  68. package/.next/standalone/.next/static/css/b6b85b0f13bc0e98.css.map +1 -0
  69. package/.next/standalone/package.json +1 -1
  70. package/CHANGELOG.md +48 -0
  71. package/README.md +2 -0
  72. package/api/client.ts +37 -1
  73. package/api/types.ts +18 -0
  74. package/app/api/v1/threads/[thread_id]/run/route.ts +69 -22
  75. package/components/agents/AgentEditor.tsx +7 -4
  76. package/components/chat/MessageBubble.tsx +108 -1
  77. package/components/dashboard/DashboardPanel.tsx +79 -21
  78. package/hooks/useSSE.ts +22 -9
  79. package/lib/agents/prepare/system-prompt.ts +30 -0
  80. package/lib/agents/run-registry.test.ts +94 -0
  81. package/lib/agents/run-registry.ts +60 -1
  82. package/lib/stores/dashboard-metrics.test.ts +33 -0
  83. package/lib/stores/dashboard-metrics.ts +93 -1
  84. package/lib/tools/exec.ts +9 -5
  85. package/lib/tools/files.ts +6 -0
  86. package/lib/tools/safety.test.ts +95 -0
  87. package/lib/tools/safety.ts +147 -0
  88. package/package.json +1 -1
  89. package/.next/standalone/.next/static/chunks/3741-344e2bfc5028b9c8.js.map +0 -1
  90. package/.next/standalone/.next/static/chunks/app/page-c77ab600642bbfc2.js.map +0 -1
  91. package/.next/standalone/.next/static/css/53f85613a5500253.css +0 -5
  92. package/.next/standalone/.next/static/css/53f85613a5500253.css.map +0 -1
  93. /package/.next/standalone/.next/static/{6uLoytvvEtLKIblEB53e0 → 8qTBpUDFnSMYwe3Zc0bGV}/_buildManifest.js +0 -0
  94. /package/.next/standalone/.next/static/{6uLoytvvEtLKIblEB53e0 → 8qTBpUDFnSMYwe3Zc0bGV}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"../app/api/v1/dashboard/metrics/route.js","mappings":"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BAAS;AACvB;AACA;AACA;AACA;AACA,KAAK;AACL,aAAa,OAAoC,IAAI,CAAE;AACvD,wBAAwB,MAAuC;AAC/D;AACA;AACA;AACA,cAAc,qBAAQ;AACtB;AACA;AACA;AACA;AACA,OAAO,MAAsD,GAAG,CAE3D,CAAC;AACN,CAAC;AACD;AACA;AACA;AACA,QAAQ,sDAAsD;AAC9D;AACA,WAAW,0BAAW;AACtB;AACA;AACA,KAAK;AACL;AAC0F;AACnF;AACP;AACA,QAAQ,+BAAc;AACtB;AACA;AACA,QAAQ,+BAAc;AACtB;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAqB,EAAE,EAE1B,CAAC;AACN;AACA;AACA;AACA,+BAA+B,KAAwC;AACvE;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6NAA6N;AACzO,8BAA8B,+BAAgB;AAC9C;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,2CAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6CAAqB;AAC7B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,mBAAmB,0BAAS;AAC5B;AACA;AACA,kCAAkC,+BAAc;AAChD,6BAA6B,+BAAc;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAe;AAC3C,4BAA4B,qBAAgB;AAC5C,oBAAoB,+BAAkB,kCAAkC,uCAAsB;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iEAAiE,wBAAc;AAC/E,+DAA+D,yCAAyC;AACxG;AACA;AACA;AACA;AACA,oCAAoC,QAAQ,EAAE,MAAM;AACpD;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB,uCAAuC,QAAQ,EAAE,QAAQ;AACzD;AACA,aAAa;AACb;AACA;AACA;AACA,+CAA+C,oBAAoB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uCAAyB;AACjE;AACA,oCAAoC,oCAAsB;AAC1D;AACA;AACA;AACA;AACA,sJAAsJ,4BAAc;AACpK,0IAA0I,4BAAc;AACxJ;AACA;AACA;AACA,sCAAsC,8BAAe;AACrD;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,8BAA8B,qCAAY;AAC1C;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,oCAAmB;AACjE;AACA;AACA,6BAA6B;AAC7B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,oBAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,qIAAqI,8BAAe;AACpJ;AACA,2GAA2G,iHAAiH;AAC5N;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,yCAA2B;AACvD;AACA,+BAA+B,oCAAsB;AACrD;AACA;AACA;AACA;AACA,6CAA6C,uCAAqB;AAClE;AACA,kBAAkB,qCAAY;AAC9B;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,6EAA6E,wBAAc;AAC3F,iCAAiC,QAAQ,EAAE,QAAQ;AACnD,0BAA0B,qBAAQ;AAClC;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,MAAM;AACN,6BAA6B,2CAAe;AAC5C;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAmB;AACrD;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,cAAc,qCAAY;AAC1B;AACA,SAAS;AACT;AACA;AACA;;AAEA;;;;;;;;AC7WA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA","sources":["webpack://@circuitwall/jarela/external commonjs \"next/dist/shared/lib/router/utils/app-paths\"","webpack://@circuitwall/jarela/external node-commonjs \"node:process\"","webpack://@circuitwall/jarela/external commonjs2 \"url\"","webpack://@circuitwall/jarela/external commonjs \"next/dist/server/app-render/after-task-async-storage.external.js\"","webpack://@circuitwall/jarela/external commonjs \"undici\"","webpack://@circuitwall/jarela/external commonjs \"next/dist/compiled/next-server/app-page.runtime.prod.js\"","webpack://@circuitwall/jarela/external node-commonjs \"node:async_hooks\"","webpack://@circuitwall/jarela/external commonjs2 \"stream\"","webpack://@circuitwall/jarela/external commonjs2 \"util\"","webpack://@circuitwall/jarela/external commonjs2 \"fs\"","webpack://@circuitwall/jarela/external commonjs \"next/dist/server/app-render/work-async-storage.external.js\"","webpack://@circuitwall/jarela/external node-commonjs \"node:child_process\"","webpack://@circuitwall/jarela/external commonjs2 \"path\"","webpack://@circuitwall/jarela/external node-commonjs \"node:http\"","webpack://@circuitwall/jarela/./lib/stores/agent-configs.ts","webpack://@circuitwall/jarela/external node-commonjs \"node:https\"","webpack://@circuitwall/jarela/external commonjs \"next/dist/compiled/next-server/app-route.runtime.prod.js\"","webpack://@circuitwall/jarela/external node-commonjs \"node:os\"","webpack://@circuitwall/jarela/./lib/stores/tool-stats.ts","webpack://@circuitwall/jarela/external node-commonjs \"node:fs/promises\"","webpack://@circuitwall/jarela/./lib/stores/dashboard-metrics.ts","webpack://@circuitwall/jarela/./app/api/v1/dashboard/metrics/route.ts","webpack://@circuitwall/jarela/?73e0","webpack://@circuitwall/jarela/external commonjs2 \"crypto\"","webpack://@circuitwall/jarela/external commonjs2 \"https\"","webpack://@circuitwall/jarela/external node-commonjs \"node:stream\"","webpack://@circuitwall/jarela/external node-commonjs \"node:util\"","webpack://@circuitwall/jarela/external commonjs \"next/dist/server/app-render/work-unit-async-storage.external.js\"","webpack://@circuitwall/jarela/external node-commonjs \"node:fs\"","webpack://@circuitwall/jarela/external node-commonjs \"node:url\"","webpack://@circuitwall/jarela/external node-commonjs \"node:worker_threads\"","webpack://@circuitwall/jarela/external node-commonjs \"node:path\"","webpack://@circuitwall/jarela/external node-commonjs \"node:crypto\"","webpack://@circuitwall/jarela/external commonjs2 \"buffer\"","webpack://@circuitwall/jarela/external node-commonjs \"node:sqlite\"","webpack://@circuitwall/jarela/external commonjs2 \"http\"","webpack://@circuitwall/jarela/external commonjs \"next/dist/shared/lib/no-fallback-error.external\"","webpack://@circuitwall/jarela/external commonjs2 \"events\""],"sourcesContent":["module.exports = require(\"next/dist/shared/lib/router/utils/app-paths\");","module.exports = require(\"node:process\");","module.exports = require(\"url\");","module.exports = require(\"next/dist/server/app-render/after-task-async-storage.external.js\");","module.exports = require(\"undici\");","module.exports = require(\"next/dist/compiled/next-server/app-page.runtime.prod.js\");","module.exports = require(\"node:async_hooks\");","module.exports = require(\"stream\");","module.exports = require(\"util\");","module.exports = require(\"fs\");","module.exports = require(\"next/dist/server/app-render/work-async-storage.external.js\");","module.exports = require(\"node:child_process\");","module.exports = require(\"path\");","module.exports = require(\"node:http\");","import { getDb } from \"@/lib/db\";\nimport { MBTI_PRESETS, type MbtiType } from \"@/lib/agents/adaptive-persona-presets\";\n\nconst now = () => new Date().toISOString();\n\nexport interface AgentConfigRow {\n id: string;\n name: string;\n icon: string | null;\n identity: string;\n instructions: string;\n tools: string; // JSON string[]\n model_config_name: string | null;\n is_default: number;\n history_limit: number; // 0 = unlimited\n history_window_hours: number; // 0 = no time bound\n never_reply: number; // 1 = run the agent but don't auto-send replies via bridges\n adaptive_persona_enabled: number; // 1 = use runtime mood/tone adaptation hints\n adaptive_persona_strength: number; // 0..100, how strongly to adapt to cues\n adaptive_empathy: number; // 0..100, baseline empathetic tone\n adaptive_expressiveness: number; // 0..100, restrained -> energetic\n adaptive_verbosity: number; // 0..100, concise -> detailed\n adaptive_mbti: string; // one of 16 MBTI types\n voice_enabled: number; // 1 = expose mic/play UI for this agent\n voice_model: string; // Gemini TTS model id\n voice_name: string; // Gemini prebuilt voice name (Kore, Puck, …)\n voice_stt_model: string; // Gemini multimodal model used for transcription\n voice_auto_speak: number; // 1 = auto-play reply when user sent voice\n display_filters: string | null; // JSON: Partial<DisplayFilters>; NULL = inherit defaults (ADR-0022)\n harness_id: string | null; // ADR-0033: per-agent harness override; NULL = inherit global default\n delegate_targets: string | null; // JSON string[] of agent ids this agent may delegate to; NULL/'[]' = none\n // ADR-0043. JSON-encoded `{ hot, warm, facts }` — any positive numbers; the\n // backend divides by sum so the UI can ship raw weights and never has to\n // reconcile to 100. NULL = inherit the model config's value.\n context_tier_proportions: string | null;\n created_at: string;\n updated_at: string;\n}\n\nexport interface AgentTierProportions {\n hot: number;\n warm: number;\n facts: number;\n}\n\n/**\n * Parse the JSON-encoded per-agent override of context tier proportions.\n * Returns `null` for NULL, blank, malformed JSON, or any payload that\n * doesn't have three finite non-negative numeric fields. Callers fall\n * back to the model config's value (or built-in defaults) on null.\n */\nexport function getAgentTierProportions(row: AgentConfigRow): AgentTierProportions | null {\n const raw = row.context_tier_proportions;\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<AgentTierProportions>;\n const hot = Number(parsed.hot);\n const warm = Number(parsed.warm);\n const facts = Number(parsed.facts);\n if (![hot, warm, facts].every((n) => Number.isFinite(n) && n >= 0)) return null;\n if (hot + warm + facts <= 0) return null;\n return { hot, warm, facts };\n } catch {\n return null;\n }\n}\n\nexport function listAgentConfigs(): AgentConfigRow[] {\n return getDb()\n .prepare(\"SELECT * FROM agent_configs ORDER BY is_default DESC, created_at ASC\")\n .all() as unknown as AgentConfigRow[];\n}\n\nexport function getDefaultAgentConfig(): AgentConfigRow | null {\n return (\n (getDb()\n .prepare(\"SELECT * FROM agent_configs WHERE is_default=1 LIMIT 1\")\n .get() as unknown as AgentConfigRow) ?? null\n );\n}\n\nexport function getAgentConfig(id: string): AgentConfigRow | null {\n return (\n (getDb()\n .prepare(\"SELECT * FROM agent_configs WHERE id=?\")\n .get(id) as unknown as AgentConfigRow) ?? null\n );\n}\n\nexport interface UpsertAgentInput {\n id: string;\n name: string;\n icon?: string | null;\n identity: string;\n instructions: string;\n tools: string[];\n model_config_name?: string | null;\n is_default?: boolean;\n history_limit?: number;\n history_window_hours?: number;\n never_reply?: boolean;\n adaptive_persona_enabled?: boolean;\n adaptive_persona_strength?: number;\n adaptive_empathy?: number;\n adaptive_expressiveness?: number;\n adaptive_verbosity?: number;\n adaptive_mbti?: MbtiType;\n voice_enabled?: boolean;\n voice_model?: string;\n voice_name?: string;\n voice_stt_model?: string;\n voice_auto_speak?: boolean;\n harness_id?: string | null;\n delegate_targets?: string[];\n // ADR-0043. Pass `null` to clear the override and inherit from the model.\n // Pass `undefined` to keep whatever's already on the row (PATCH semantics).\n context_tier_proportions?: AgentTierProportions | null;\n}\n\n/**\n * Parse the JSON-encoded delegate whitelist into a deduped string[]. Returns\n * an empty array for NULL, blank, or malformed JSON (delegation is opt-in).\n */\n/**\n * Parse the agent's tool allowlist (`tools` column, stored as a JSON string).\n * Returns an empty array on NULL/blank/malformed JSON — same defensive shape\n * as parseDelegateTargets. Callers that previously did `JSON.parse(cfg.tools)`\n * inline should switch to this getter so the serialization contract stays\n * owned by this store.\n */\nexport function getAgentTools(cfg: Pick<AgentConfigRow, \"tools\"> | null | undefined): string[] {\n if (!cfg?.tools) return [];\n try {\n const parsed = JSON.parse(cfg.tools);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((x): x is string => typeof x === \"string\" && x.length > 0);\n } catch {\n return [];\n }\n}\n\nexport function parseDelegateTargets(raw: string | null | undefined): string[] {\n if (!raw) return [];\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n const ids = parsed.filter((x): x is string => typeof x === \"string\" && x.length > 0);\n return Array.from(new Set(ids));\n } catch {\n return [];\n }\n}\n\nexport function upsertAgentConfig(input: UpsertAgentInput): AgentConfigRow {\n const t = now();\n const db = getDb();\n const existing = getAgentConfig(input.id);\n const created_at = existing?.created_at ?? t;\n const mbti = input.adaptive_mbti ?? toMbti(existing?.adaptive_mbti) ?? \"INTJ\";\n const preset = MBTI_PRESETS[mbti];\n const strength = input.adaptive_persona_strength ?? preset.strength;\n const empathy = input.adaptive_empathy ?? preset.empathy;\n const expressiveness = input.adaptive_expressiveness ?? preset.expressiveness;\n const verbosity = input.adaptive_verbosity ?? preset.verbosity;\n if (input.is_default) db.prepare(\"UPDATE agent_configs SET is_default=0\").run();\n // harness_id: explicit `undefined` means \"keep existing\"; explicit `null`\n // means \"use the global default\". Empty string is normalised to null too,\n // matching how the AgentEditor sends \"\" for the inherit option.\n const harnessId =\n input.harness_id === undefined\n ? (existing?.harness_id ?? null)\n : (input.harness_id && input.harness_id.length > 0 ? input.harness_id : null);\n // delegate_targets: undefined = keep existing; explicit empty array clears.\n const delegateTargets = input.delegate_targets === undefined\n ? (existing?.delegate_targets ?? null)\n : JSON.stringify(Array.from(new Set(input.delegate_targets.filter((id) => id && id !== input.id))));\n // context_tier_proportions: undefined = keep existing; null = clear and\n // inherit from the model; object = serialise as JSON. Negative values are\n // clamped to 0 so the upsert can't poison the column with bad data.\n const tierProportions =\n input.context_tier_proportions === undefined\n ? (existing?.context_tier_proportions ?? null)\n : input.context_tier_proportions === null\n ? null\n : JSON.stringify({\n hot: Math.max(0, Number(input.context_tier_proportions.hot) || 0),\n warm: Math.max(0, Number(input.context_tier_proportions.warm) || 0),\n facts: Math.max(0, Number(input.context_tier_proportions.facts) || 0),\n });\n db.prepare(\n `INSERT OR REPLACE INTO agent_configs\n (id, name, icon, identity, instructions, tools, model_config_name, is_default,\n history_limit, history_window_hours, never_reply,\n adaptive_persona_enabled, adaptive_persona_strength, adaptive_empathy, adaptive_expressiveness, adaptive_verbosity, adaptive_mbti,\n voice_enabled, voice_model, voice_name, voice_stt_model, voice_auto_speak,\n harness_id, delegate_targets, context_tier_proportions,\n created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`\n )\n .run(\n input.id,\n input.name,\n input.icon ?? null,\n input.identity,\n input.instructions,\n JSON.stringify(input.tools),\n input.model_config_name ?? null,\n input.is_default ? 1 : (existing?.is_default ?? 0),\n input.history_limit ?? existing?.history_limit ?? 50,\n input.history_window_hours ?? existing?.history_window_hours ?? 8,\n // never_reply is a boolean toggle — explicit `undefined` means \"keep existing\"\n // (important for PATCH-style updates that omit the field).\n input.never_reply === undefined\n ? (existing?.never_reply ?? 0)\n : (input.never_reply ? 1 : 0),\n input.adaptive_persona_enabled === undefined\n ? (existing?.adaptive_persona_enabled ?? 0)\n : (input.adaptive_persona_enabled ? 1 : 0),\n clampPercent(strength, existing?.adaptive_persona_strength ?? 50),\n clampPercent(empathy, existing?.adaptive_empathy ?? 50),\n clampPercent(expressiveness, existing?.adaptive_expressiveness ?? 50),\n clampPercent(verbosity, existing?.adaptive_verbosity ?? 50),\n mbti,\n input.voice_enabled === undefined\n ? (existing?.voice_enabled ?? 0)\n : (input.voice_enabled ? 1 : 0),\n (input.voice_model ?? existing?.voice_model ?? \"gemini-2.5-flash-preview-tts\").trim() ||\n \"gemini-2.5-flash-preview-tts\",\n (input.voice_name ?? existing?.voice_name ?? \"Kore\").trim() || \"Kore\",\n (input.voice_stt_model ?? existing?.voice_stt_model ?? \"gemini-2.5-flash\").trim() ||\n \"gemini-2.5-flash\",\n input.voice_auto_speak === undefined\n ? (existing?.voice_auto_speak ?? 1)\n : (input.voice_auto_speak ? 1 : 0),\n harnessId,\n delegateTargets,\n tierProportions,\n created_at,\n t,\n );\n return getAgentConfig(input.id)!;\n}\n\nfunction clampPercent(next: number | undefined, fallback: number): number {\n const n = Number.isFinite(next) ? Number(next) : fallback;\n return Math.max(0, Math.min(100, Math.round(n)));\n}\n\nfunction toMbti(v: string | null | undefined): MbtiType | null {\n if (!v) return null;\n return (v in MBTI_PRESETS ? v : null) as MbtiType | null;\n}\n\nexport function deleteAgentConfig(id: string): boolean {\n return (\n (getDb().prepare(\"DELETE FROM agent_configs WHERE id=?\").run(id) as { changes: number }).changes > 0\n );\n}\n\nexport function generateAgentId(name: string): string {\n const slug = name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 40);\n const suffix = Math.random().toString(36).slice(2, 6);\n return slug ? `${slug}-${suffix}` : `agent-${suffix}`;\n}\n\n// ── ADR-0022: per-agent message-channel display filters ─────────────────\n// Canonical channel keys mirrored in `hooks/useMessageFilters.ts`. Kept\n// in sync there by importing this constant — single source of truth.\nexport const DISPLAY_FILTER_KEYS = [\n \"scheduled_task\",\n \"watcher\",\n \"bridge\",\n \"synthetic\",\n \"tool_use\",\n \"thinking\",\n] as const;\nexport type DisplayFilterKey = (typeof DISPLAY_FILTER_KEYS)[number];\nexport type DisplayFilters = Record<DisplayFilterKey, boolean>;\n\nexport const DISPLAY_FILTER_DEFAULTS: DisplayFilters = {\n scheduled_task: true,\n watcher: true,\n bridge: true,\n synthetic: true,\n tool_use: true,\n thinking: true,\n};\n\nfunction parseDisplayFilters(raw: string | null | undefined): DisplayFilters {\n if (!raw) return { ...DISPLAY_FILTER_DEFAULTS };\n try {\n const parsed = JSON.parse(raw) as Partial<DisplayFilters>;\n // Merge over defaults so newly-added channels stay visible on old rows.\n return { ...DISPLAY_FILTER_DEFAULTS, ...parsed };\n } catch {\n return { ...DISPLAY_FILTER_DEFAULTS };\n }\n}\n\nexport function getAgentDisplayFilters(id: string): DisplayFilters | null {\n const row = getAgentConfig(id);\n if (!row) return null;\n return parseDisplayFilters(row.display_filters);\n}\n\n/**\n * Merge a partial filter map into the agent's stored prefs. Pass `null` to\n * reset to defaults (clears the column). Safe against concurrent toggles\n * from multiple browser tabs because the merge happens server-side.\n */\nexport function updateAgentDisplayFilters(\n id: string,\n patch: Partial<DisplayFilters> | null,\n): DisplayFilters | null {\n const row = getAgentConfig(id);\n if (!row) return null;\n if (patch === null) {\n getDb()\n .prepare(\"UPDATE agent_configs SET display_filters=NULL, updated_at=? WHERE id=?\")\n .run(now(), id);\n return { ...DISPLAY_FILTER_DEFAULTS };\n }\n const current = parseDisplayFilters(row.display_filters);\n const next: DisplayFilters = { ...current };\n for (const k of DISPLAY_FILTER_KEYS) {\n if (k in patch && typeof patch[k] === \"boolean\") next[k] = patch[k] as boolean;\n }\n getDb()\n .prepare(\"UPDATE agent_configs SET display_filters=?, updated_at=? WHERE id=?\")\n .run(JSON.stringify(next), now(), id);\n return next;\n}\n","module.exports = require(\"node:https\");","module.exports = require(\"next/dist/compiled/next-server/app-route.runtime.prod.js\");","module.exports = require(\"node:os\");","import type { PersistedToolEvent } from \"@/lib/stores/threads\";\nimport { getDb } from \"@/lib/db\";\n\nconst now = () => new Date().toISOString();\n\nexport interface ToolStatsRow {\n tool_name: string;\n call_count: number;\n success_count: number;\n error_count: number;\n used_count: number;\n last_called_at: string | null;\n updated_at: string;\n}\n\nexport interface ToolUsefulnessStats {\n call_count: number;\n success_count: number;\n error_count: number;\n used_count: number;\n success_rate: number;\n usefulness_rate: number;\n score: number;\n never_used: boolean;\n last_called_at: string | null;\n}\n\ninterface ToolUsageDelta {\n name: string;\n calls: number;\n successes: number;\n errors: number;\n used: number;\n}\n\nconst UPSERT_SQL = `\n INSERT INTO tool_stats\n (tool_name, call_count, success_count, error_count, used_count, last_called_at, updated_at)\n VALUES\n (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tool_name) DO UPDATE SET\n call_count = tool_stats.call_count + excluded.call_count,\n success_count = tool_stats.success_count + excluded.success_count,\n error_count = tool_stats.error_count + excluded.error_count,\n used_count = tool_stats.used_count + excluded.used_count,\n last_called_at = COALESCE(excluded.last_called_at, tool_stats.last_called_at),\n updated_at = excluded.updated_at\n`;\n\nexport function recordToolUsage(\n toolEvents: readonly PersistedToolEvent[],\n assistantContent: string,\n): void {\n const deltas = summarizeToolUsage(toolEvents, assistantContent);\n if (deltas.length === 0) return;\n\n const db = getDb();\n const stamp = now();\n const stmt = db.prepare(UPSERT_SQL);\n db.exec(\"BEGIN\");\n try {\n for (const row of deltas) {\n stmt.run(\n row.name,\n row.calls,\n row.successes,\n row.errors,\n row.used,\n row.calls > 0 ? stamp : null,\n stamp,\n );\n }\n db.exec(\"COMMIT\");\n } catch (err) {\n try { db.exec(\"ROLLBACK\"); } catch { /* ignore rollback failure */ }\n throw err;\n }\n}\n\nexport function listToolStats(): ToolStatsRow[] {\n return getDb()\n .prepare(\n `SELECT tool_name, call_count, success_count, error_count, used_count, last_called_at, updated_at\n FROM tool_stats`,\n )\n .all() as unknown as ToolStatsRow[];\n}\n\nexport function getToolStatsMap(names?: readonly string[]): Map<string, ToolUsefulnessStats> {\n const rows = names && names.length > 0\n ? getDb()\n .prepare(\n `SELECT tool_name, call_count, success_count, error_count, used_count, last_called_at, updated_at\n FROM tool_stats\n WHERE tool_name IN (${names.map(() => \"?\").join(\",\")})`,\n )\n .all(...names) as unknown as ToolStatsRow[]\n : listToolStats();\n\n const out = new Map<string, ToolUsefulnessStats>();\n for (const row of rows) out.set(row.tool_name, toStats(row));\n return out;\n}\n\nexport function defaultToolStats(): ToolUsefulnessStats {\n return {\n call_count: 0,\n success_count: 0,\n error_count: 0,\n used_count: 0,\n success_rate: 1,\n usefulness_rate: 1,\n score: 1,\n never_used: true,\n last_called_at: null,\n };\n}\n\nexport function toStats(row: ToolStatsRow): ToolUsefulnessStats {\n const calls = Math.max(0, row.call_count);\n if (calls === 0) return defaultToolStats();\n\n const successRate = clamp01(row.success_count / calls);\n const usefulnessRate = clamp01(row.used_count / calls);\n const score = clamp01((successRate * 0.65) + (usefulnessRate * 0.35));\n\n return {\n call_count: calls,\n success_count: row.success_count,\n error_count: row.error_count,\n used_count: row.used_count,\n success_rate: successRate,\n usefulness_rate: usefulnessRate,\n score,\n never_used: false,\n last_called_at: row.last_called_at,\n };\n}\n\nexport function summarizeToolUsage(\n toolEvents: readonly PersistedToolEvent[],\n assistantContent: string,\n): ToolUsageDelta[] {\n const byId = new Map<string, { name: string; successful: boolean; used: boolean }>();\n const assistantTerms = normalizeText(assistantContent);\n\n for (const ev of toolEvents) {\n if (!ev.name) continue;\n const key = ev.id || `${ev.phase}:${ev.name}`;\n const existing = byId.get(key) ?? { name: ev.name, successful: false, used: false };\n\n if (ev.phase === \"call\") {\n existing.name = ev.name;\n } else if (ev.phase === \"result\") {\n const successful = !isErrorPayload(ev.payload);\n existing.successful = successful;\n existing.used = successful && payloadLooksUsed(ev.payload, assistantTerms);\n }\n\n byId.set(key, existing);\n }\n\n const totals = new Map<string, ToolUsageDelta>();\n for (const ev of toolEvents) {\n if (ev.phase !== \"call\" || !ev.name) continue;\n const key = ev.id || `${ev.phase}:${ev.name}`;\n const outcome = byId.get(key);\n const next = totals.get(ev.name) ?? {\n name: ev.name,\n calls: 0,\n successes: 0,\n errors: 0,\n used: 0,\n };\n next.calls += 1;\n if (outcome?.successful) next.successes += 1;\n else next.errors += 1;\n if (outcome?.used) next.used += 1;\n totals.set(ev.name, next);\n }\n\n return [...totals.values()];\n}\n\nfunction payloadLooksUsed(payload: unknown, assistantTerms: Set<string>): boolean {\n if (assistantTerms.size === 0) return false;\n const candidates = extractPayloadTerms(payload);\n if (candidates.length === 0) return false;\n\n let matched = 0;\n for (const term of candidates) {\n if (assistantTerms.has(term)) matched += 1;\n if (matched >= 2) return true;\n }\n return false;\n}\n\nfunction extractPayloadTerms(payload: unknown): string[] {\n const raw = stringifyPayload(payload);\n if (!raw) return [];\n const unique = new Set<string>();\n for (const token of raw.toLowerCase().split(/[^a-z0-9_./:-]+/)) {\n if (token.length < 4) continue;\n if (/^\\d+$/.test(token) && token.length < 6) continue;\n unique.add(token);\n if (unique.size >= 24) break;\n }\n return [...unique];\n}\n\nfunction stringifyPayload(payload: unknown): string {\n if (typeof payload === \"string\") return payload;\n try {\n return JSON.stringify(payload);\n } catch {\n return \"\";\n }\n}\n\nfunction normalizeText(text: string): Set<string> {\n const out = new Set<string>();\n for (const token of text.toLowerCase().split(/[^a-z0-9_./:-]+/)) {\n if (token.length < 4) continue;\n out.add(token);\n }\n return out;\n}\n\nfunction isErrorPayload(payload: unknown): boolean {\n if (typeof payload === \"string\") return /\\berror\\b|\\bfailed\\b|\\bexception\\b/i.test(payload);\n if (!payload || typeof payload !== \"object\") return false;\n if (\"error\" in payload || \"errors\" in payload) return true;\n const status = \"status\" in payload ? (payload as { status?: unknown }).status : undefined;\n if (typeof status === \"string\" && /error|failed/i.test(status)) return true;\n return false;\n}\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}","module.exports = require(\"node:fs/promises\");","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getDb } from \"@/lib/db\";\nimport { listToolStats, toStats } from \"@/lib/stores/tool-stats\";\nimport type { PersistedToolEvent } from \"@/lib/stores/threads\";\n\nconst CHARS_PER_TOKEN = 4;\nconst DEFAULT_WINDOW_DAYS = 30;\n\nexport interface DashboardSeriesPoint {\n day: string;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n tool_calls: number;\n tool_successes: number;\n tool_errors: number;\n success_rate: number;\n error_rate: number;\n}\n\nexport interface DashboardToolTop {\n name: string;\n call_count: number;\n success_count: number;\n error_count: number;\n score: number;\n success_rate: number;\n last_called_at: string | null;\n}\n\nexport interface DashboardAgentTop {\n agent_id: string;\n agent_name: string;\n message_count: number;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n}\n\nexport interface DashboardProviderRate {\n provider: string;\n input_per_1m_usd: number | null;\n output_per_1m_usd: number | null;\n source: string;\n inferred: boolean;\n confidence: \"high\" | \"medium\" | \"low\";\n ok: boolean;\n status: number | null;\n error: string | null;\n}\n\nexport interface DashboardModelRate {\n provider: string;\n model_id: string;\n input_per_1m_usd: number | null;\n output_per_1m_usd: number | null;\n source: string;\n inferred: boolean;\n confidence: \"high\" | \"medium\" | \"low\";\n ok: boolean;\n status: number | null;\n error: string | null;\n}\n\nexport interface DashboardProviderBreakdown {\n provider: string;\n message_count: number;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n}\n\nexport interface DashboardModelBreakdown {\n model_config_name: string;\n provider: string;\n model_id: string;\n message_count: number;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n}\n\nexport interface DashboardDayBreakdown {\n day: string;\n summary: {\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n tool_calls: number;\n tool_successes: number;\n tool_errors: number;\n success_rate: number;\n error_rate: number;\n };\n top_agents: DashboardAgentTop[];\n by_provider: DashboardProviderBreakdown[];\n by_model: DashboardModelBreakdown[];\n}\n\nexport interface DashboardMetrics {\n generated_at: string;\n days: number;\n summary: {\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n tool_calls: number;\n tool_successes: number;\n tool_errors: number;\n success_rate: number;\n error_rate: number;\n };\n series: DashboardSeriesPoint[];\n top_tools: DashboardToolTop[];\n top_agents: DashboardAgentTop[];\n by_provider: DashboardProviderBreakdown[];\n by_model: DashboardModelBreakdown[];\n breakdowns_by_day: Record<string, DashboardDayBreakdown>;\n pricing: {\n snapshot_generated_at: string | null;\n rates: DashboardProviderRate[];\n model_rates: DashboardModelRate[];\n notes: string;\n };\n}\n\ntype UsageRow = {\n created_at: string;\n role: string;\n content: string;\n tool_events: string | null;\n thread_id: string;\n agent_id: string;\n agent_name: string | null;\n provider: string | null;\n model_id: string | null;\n model_config_name: string | null;\n // ADR-0041: when present, these snapshotted values are authoritative\n // for this assistant turn. Provider/model/agent_name override the JOIN.\n mu_input_tokens: number | null;\n mu_output_tokens: number | null;\n mu_cost_usd: number | null;\n mu_provider: string | null;\n mu_model_id: string | null;\n mu_model_config_name: string | null;\n mu_agent_id: string | null;\n mu_agent_name: string | null;\n};\n\ntype DayBucket = {\n inputTokens: number;\n outputTokens: number;\n estimatedCost: number;\n toolCalls: number;\n toolSuccesses: number;\n toolErrors: number;\n};\n\ntype AgentBucket = {\n agent_id: string;\n agent_name: string;\n message_count: number;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n};\n\ntype ProviderBucket = {\n provider: string;\n message_count: number;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n};\n\ntype ModelBucket = {\n model_config_name: string;\n provider: string;\n model_id: string;\n message_count: number;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n};\n\ntype ProviderRates = {\n inputPer1M: number | null;\n outputPer1M: number | null;\n source: string;\n inferred: boolean;\n confidence: \"high\" | \"medium\" | \"low\";\n ok: boolean;\n status: number | null;\n error: string | null;\n};\n\ntype PricingSnapshotSource = {\n id: string;\n pricing_url: string;\n resolved_url?: string | null;\n ok?: boolean;\n status?: number | null;\n error?: string | null;\n price_signals?: string[];\n model_rates?: Array<{\n model_id: string;\n input_per_1m_usd: number | null;\n output_per_1m_usd: number | null;\n inferred?: boolean;\n confidence?: \"high\" | \"medium\" | \"low\";\n }>;\n};\n\ntype PricingSnapshot = {\n generated_at?: string;\n sources?: PricingSnapshotSource[];\n};\n\nexport async function getDashboardMetrics(days = DEFAULT_WINDOW_DAYS): Promise<DashboardMetrics> {\n const now = new Date();\n const boundedDays = Number.isFinite(days) ? Math.min(120, Math.max(7, Math.floor(days))) : DEFAULT_WINDOW_DAYS;\n const since = new Date(now.getTime() - (boundedDays * 24 * 60 * 60 * 1000)).toISOString();\n\n const usageRows = getDb()\n .prepare(\n `SELECT m.created_at, m.role, m.content, m.tool_events, m.thread_id, t.agent_id,\n a.name AS agent_name, mc.provider AS provider,\n mc.model_id AS model_id,\n COALESCE(ta.model_config_name, a.model_config_name, dmc.name) AS model_config_name,\n mu.input_tokens AS mu_input_tokens,\n mu.output_tokens AS mu_output_tokens,\n mu.cost_usd AS mu_cost_usd,\n mu.provider AS mu_provider,\n mu.model_id AS mu_model_id,\n mu.model_config_name AS mu_model_config_name,\n mu.agent_id AS mu_agent_id,\n mu.agent_name AS mu_agent_name\n FROM messages m\n JOIN threads t ON t.thread_id = m.thread_id\n LEFT JOIN agent_configs a ON a.id = t.agent_id\n LEFT JOIN task_assignments ta ON ta.agent_id = t.agent_id\n LEFT JOIN model_configs dmc ON dmc.name = (\n SELECT name\n FROM model_configs\n WHERE is_default = 1\n ORDER BY updated_at DESC\n LIMIT 1\n )\n LEFT JOIN model_configs mc ON mc.name = COALESCE(ta.model_config_name, a.model_config_name, dmc.name)\n LEFT JOIN message_usage mu ON mu.message_id = m.msg_id\n WHERE m.created_at >= ?\n ORDER BY m.created_at ASC`,\n )\n .all(since) as UsageRow[];\n\n // ADR-0041: when an assistant turn has a snapshot, its `input_tokens`\n // already accounts for the entire prompt the model saw — so we must NOT\n // also count this thread's user messages via the content-length estimate\n // or we double-count. Track which threads have any snapshot in the\n // window and suppress their user-side estimates wholesale. Threads with\n // zero snapshots (legacy data, or recorded before the migration) fall\n // back to the old estimate path unchanged.\n const snapshotThreadIds = new Set<string>();\n for (const r of usageRows) {\n // A row with provider tokens (input_tokens > 0) is the authoritative\n // count the dashboard cares about. Snapshot-only rows persisted for\n // the per-tier context-usage bar carry input_tokens=0 + cost_usd=null\n // and must NOT suppress the content-length estimate for that thread.\n if (r.mu_input_tokens != null && r.mu_input_tokens > 0) {\n snapshotThreadIds.add(r.thread_id);\n }\n }\n\n const { byProvider, byProviderModel, byModel, generatedAt } = await loadProviderRates();\n const dayMap = seedDayBuckets(now, boundedDays);\n const agentMap = new Map<string, AgentBucket>();\n const providerMap = new Map<string, ProviderBucket>();\n const modelMap = new Map<string, ModelBucket>();\n // Per-day breakdown maps. Populated lazily — only days that saw traffic\n // get an entry. Each entry mirrors the global agent/provider/model maps\n // but scoped to that day so the UI can re-slice when a day is selected.\n type DayBreakdownBucket = {\n agents: Map<string, AgentBucket>;\n providers: Map<string, ProviderBucket>;\n models: Map<string, ModelBucket>;\n };\n const dayBreakdownMap = new Map<string, DayBreakdownBucket>();\n const ensureDayBreakdown = (day: string): DayBreakdownBucket => {\n let entry = dayBreakdownMap.get(day);\n if (!entry) {\n entry = { agents: new Map(), providers: new Map(), models: new Map() };\n dayBreakdownMap.set(day, entry);\n }\n return entry;\n };\n\n let totalInput = 0;\n let totalOutput = 0;\n let totalCost = 0;\n let totalCalls = 0;\n let totalSuccesses = 0;\n let totalErrors = 0;\n\n for (const row of usageRows) {\n const day = row.created_at.slice(0, 10);\n const dayBucket = dayMap.get(day);\n if (!dayBucket) continue;\n\n // ADR-0041: prefer snapshot when present. Snapshot rows are\n // authoritative for tokens, $, AND attribution (provider/model/agent\n // name) for that assistant turn — they survive reassignment, rename,\n // and pricing-snapshot refresh.\n const hasSnapshot = row.mu_input_tokens != null;\n const threadHasSnapshot = snapshotThreadIds.has(row.thread_id);\n\n let inputTokens = 0;\n let outputTokens = 0;\n let estCost = 0;\n let attribProvider: string | null = row.provider;\n let attribModelId: string | null = row.model_id;\n let attribModelConfig: string | null = row.model_config_name;\n let attribAgentId: string = row.agent_id;\n let attribAgentName: string | null = row.agent_name;\n\n if (hasSnapshot) {\n inputTokens = row.mu_input_tokens ?? 0;\n outputTokens = row.mu_output_tokens ?? 0;\n estCost = row.mu_cost_usd ?? 0;\n attribProvider = row.mu_provider ?? attribProvider;\n attribModelId = row.mu_model_id ?? attribModelId;\n attribModelConfig = row.mu_model_config_name ?? attribModelConfig;\n attribAgentId = row.mu_agent_id ?? attribAgentId;\n attribAgentName = row.mu_agent_name ?? attribAgentName;\n } else if (row.role === \"user\" && threadHasSnapshot) {\n // Suppressed: snapshotted assistant turns in this thread already\n // capture this user message's tokens in their input_tokens.\n // Still contributes message_count via the rest of the loop.\n } else {\n const tokenEstimate = estimateTokens(row.content);\n const isInput = row.role === \"user\";\n inputTokens = isInput ? tokenEstimate : 0;\n outputTokens = isInput ? 0 : tokenEstimate;\n const rates = modelRatesFor(byProvider, byProviderModel, byModel, row.provider, row.model_id);\n estCost = estimateCostUsd(inputTokens, outputTokens, rates);\n }\n\n dayBucket.inputTokens += inputTokens;\n dayBucket.outputTokens += outputTokens;\n dayBucket.estimatedCost += estCost;\n\n totalInput += inputTokens;\n totalOutput += outputTokens;\n totalCost += estCost;\n\n const agentName = attribAgentName?.trim() || attribAgentId;\n const agentBucket = agentMap.get(attribAgentId) ?? {\n agent_id: attribAgentId,\n agent_name: agentName,\n message_count: 0,\n input_tokens_est: 0,\n output_tokens_est: 0,\n estimated_cost_usd: 0,\n };\n agentBucket.message_count += 1;\n agentBucket.input_tokens_est += inputTokens;\n agentBucket.output_tokens_est += outputTokens;\n agentBucket.estimated_cost_usd += estCost;\n agentMap.set(attribAgentId, agentBucket);\n\n const providerName = attribProvider?.trim().toLowerCase() || \"unassigned\";\n const providerBucket = providerMap.get(providerName) ?? {\n provider: providerName,\n message_count: 0,\n input_tokens_est: 0,\n output_tokens_est: 0,\n estimated_cost_usd: 0,\n };\n providerBucket.message_count += 1;\n providerBucket.input_tokens_est += inputTokens;\n providerBucket.output_tokens_est += outputTokens;\n providerBucket.estimated_cost_usd += estCost;\n providerMap.set(providerName, providerBucket);\n\n const modelConfigName = attribModelConfig?.trim() || \"unassigned\";\n const modelId = attribModelId?.trim() || \"unknown\";\n const modelKey = `${providerName}::${modelConfigName}::${modelId}`;\n const modelBucket = modelMap.get(modelKey) ?? {\n model_config_name: modelConfigName,\n provider: providerName,\n model_id: modelId,\n message_count: 0,\n input_tokens_est: 0,\n output_tokens_est: 0,\n estimated_cost_usd: 0,\n };\n modelBucket.message_count += 1;\n modelBucket.input_tokens_est += inputTokens;\n modelBucket.output_tokens_est += outputTokens;\n modelBucket.estimated_cost_usd += estCost;\n modelMap.set(modelKey, modelBucket);\n\n const dayBreakdown = ensureDayBreakdown(day);\n const dayAgent = dayBreakdown.agents.get(attribAgentId) ?? {\n agent_id: attribAgentId,\n agent_name: agentName,\n message_count: 0,\n input_tokens_est: 0,\n output_tokens_est: 0,\n estimated_cost_usd: 0,\n };\n dayAgent.message_count += 1;\n dayAgent.input_tokens_est += inputTokens;\n dayAgent.output_tokens_est += outputTokens;\n dayAgent.estimated_cost_usd += estCost;\n dayBreakdown.agents.set(attribAgentId, dayAgent);\n\n const dayProvider = dayBreakdown.providers.get(providerName) ?? {\n provider: providerName,\n message_count: 0,\n input_tokens_est: 0,\n output_tokens_est: 0,\n estimated_cost_usd: 0,\n };\n dayProvider.message_count += 1;\n dayProvider.input_tokens_est += inputTokens;\n dayProvider.output_tokens_est += outputTokens;\n dayProvider.estimated_cost_usd += estCost;\n dayBreakdown.providers.set(providerName, dayProvider);\n\n const dayModel = dayBreakdown.models.get(modelKey) ?? {\n model_config_name: modelConfigName,\n provider: providerName,\n model_id: modelId,\n message_count: 0,\n input_tokens_est: 0,\n output_tokens_est: 0,\n estimated_cost_usd: 0,\n };\n dayModel.message_count += 1;\n dayModel.input_tokens_est += inputTokens;\n dayModel.output_tokens_est += outputTokens;\n dayModel.estimated_cost_usd += estCost;\n dayBreakdown.models.set(modelKey, dayModel);\n\n if (row.tool_events && row.tool_events.length > 1) {\n const usage = summarizeEvents(row.tool_events);\n if (usage.calls > 0) {\n dayBucket.toolCalls += usage.calls;\n dayBucket.toolSuccesses += usage.successes;\n dayBucket.toolErrors += usage.errors;\n totalCalls += usage.calls;\n totalSuccesses += usage.successes;\n totalErrors += usage.errors;\n }\n }\n }\n\n const series = [...dayMap.entries()].map(([day, b]) => {\n const successRate = b.toolCalls > 0 ? b.toolSuccesses / b.toolCalls : 1;\n const errorRate = b.toolCalls > 0 ? b.toolErrors / b.toolCalls : 0;\n return {\n day,\n input_tokens_est: b.inputTokens,\n output_tokens_est: b.outputTokens,\n estimated_cost_usd: b.estimatedCost,\n tool_calls: b.toolCalls,\n tool_successes: b.toolSuccesses,\n tool_errors: b.toolErrors,\n success_rate: round4(successRate),\n error_rate: round4(errorRate),\n } satisfies DashboardSeriesPoint;\n });\n\n const top_tools = listToolStats()\n .map((row) => {\n const stats = toStats(row);\n return {\n name: row.tool_name,\n call_count: row.call_count,\n success_count: row.success_count,\n error_count: row.error_count,\n score: round4(stats.score),\n success_rate: round4(stats.success_rate),\n last_called_at: row.last_called_at,\n } satisfies DashboardToolTop;\n })\n .sort((a, b) => {\n if (b.call_count !== a.call_count) return b.call_count - a.call_count;\n if (b.score !== a.score) return b.score - a.score;\n return a.name.localeCompare(b.name);\n })\n .slice(0, 10);\n\n const top_agents = [...agentMap.values()]\n .sort((a, b) => {\n if (b.estimated_cost_usd !== a.estimated_cost_usd) return b.estimated_cost_usd - a.estimated_cost_usd;\n if (b.message_count !== a.message_count) return b.message_count - a.message_count;\n return a.agent_name.localeCompare(b.agent_name);\n })\n .slice(0, 8)\n .map((row) => ({\n ...row,\n estimated_cost_usd: row.estimated_cost_usd,\n }));\n\n const by_provider = [...providerMap.values()]\n .sort((a, b) => {\n if (b.estimated_cost_usd !== a.estimated_cost_usd) return b.estimated_cost_usd - a.estimated_cost_usd;\n if (b.message_count !== a.message_count) return b.message_count - a.message_count;\n return a.provider.localeCompare(b.provider);\n })\n .map((row) => ({\n ...row,\n estimated_cost_usd: row.estimated_cost_usd,\n }));\n\n const by_model = [...modelMap.values()]\n .sort((a, b) => {\n if (b.estimated_cost_usd !== a.estimated_cost_usd) return b.estimated_cost_usd - a.estimated_cost_usd;\n if (b.message_count !== a.message_count) return b.message_count - a.message_count;\n return a.model_config_name.localeCompare(b.model_config_name);\n })\n .map((row) => ({\n ...row,\n estimated_cost_usd: row.estimated_cost_usd,\n }));\n\n const overallSuccessRate = totalCalls > 0 ? totalSuccesses / totalCalls : 1;\n const overallErrorRate = totalCalls > 0 ? totalErrors / totalCalls : 0;\n\n const seriesByDay = new Map(series.map((s) => [s.day, s]));\n const breakdowns_by_day: Record<string, DashboardDayBreakdown> = {};\n for (const [day, bucket] of dayBreakdownMap.entries()) {\n const dayPoint = seriesByDay.get(day);\n const dayAgents = [...bucket.agents.values()]\n .sort((a, b) => {\n if (b.estimated_cost_usd !== a.estimated_cost_usd) return b.estimated_cost_usd - a.estimated_cost_usd;\n if (b.message_count !== a.message_count) return b.message_count - a.message_count;\n return a.agent_name.localeCompare(b.agent_name);\n })\n .slice(0, 8);\n const dayProviders = [...bucket.providers.values()].sort((a, b) => {\n if (b.estimated_cost_usd !== a.estimated_cost_usd) return b.estimated_cost_usd - a.estimated_cost_usd;\n if (b.message_count !== a.message_count) return b.message_count - a.message_count;\n return a.provider.localeCompare(b.provider);\n });\n const dayModels = [...bucket.models.values()].sort((a, b) => {\n if (b.estimated_cost_usd !== a.estimated_cost_usd) return b.estimated_cost_usd - a.estimated_cost_usd;\n if (b.message_count !== a.message_count) return b.message_count - a.message_count;\n return a.model_config_name.localeCompare(b.model_config_name);\n });\n breakdowns_by_day[day] = {\n day,\n summary: {\n input_tokens_est: dayPoint?.input_tokens_est ?? 0,\n output_tokens_est: dayPoint?.output_tokens_est ?? 0,\n estimated_cost_usd: dayPoint?.estimated_cost_usd ?? 0,\n tool_calls: dayPoint?.tool_calls ?? 0,\n tool_successes: dayPoint?.tool_successes ?? 0,\n tool_errors: dayPoint?.tool_errors ?? 0,\n success_rate: dayPoint?.success_rate ?? 1,\n error_rate: dayPoint?.error_rate ?? 0,\n },\n top_agents: dayAgents,\n by_provider: dayProviders,\n by_model: dayModels,\n };\n }\n\n return {\n generated_at: now.toISOString(),\n days: boundedDays,\n summary: {\n input_tokens_est: totalInput,\n output_tokens_est: totalOutput,\n estimated_cost_usd: totalCost,\n tool_calls: totalCalls,\n tool_successes: totalSuccesses,\n tool_errors: totalErrors,\n success_rate: round4(overallSuccessRate),\n error_rate: round4(overallErrorRate),\n },\n series,\n top_tools,\n top_agents,\n by_provider,\n by_model,\n breakdowns_by_day,\n pricing: {\n snapshot_generated_at: generatedAt,\n rates: [...byProvider.entries()]\n .map(([provider, rates]) => ({\n provider,\n input_per_1m_usd: rates.inputPer1M,\n output_per_1m_usd: rates.outputPer1M,\n source: rates.source,\n inferred: rates.inferred,\n confidence: rates.confidence,\n ok: rates.ok,\n status: rates.status,\n error: rates.error,\n }))\n .sort((a, b) => a.provider.localeCompare(b.provider)),\n model_rates: [...byProviderModel.entries()]\n .map(([key, rates]) => {\n const splitAt = key.indexOf(\"::\");\n const provider = splitAt > -1 ? key.slice(0, splitAt) : key;\n const model_id = splitAt > -1 ? key.slice(splitAt + 2) : \"unknown\";\n return {\n provider,\n model_id,\n input_per_1m_usd: rates.inputPer1M,\n output_per_1m_usd: rates.outputPer1M,\n source: rates.source,\n inferred: rates.inferred,\n confidence: rates.confidence,\n ok: rates.ok,\n status: rates.status,\n error: rates.error,\n } satisfies DashboardModelRate;\n })\n .sort((a, b) => {\n if (a.provider !== b.provider) return a.provider.localeCompare(b.provider);\n return a.model_id.localeCompare(b.model_id);\n }),\n notes: \"Estimated costs are heuristic: token counts are content-length based and rates are inferred from pricing page signals (provider-model first, then provider fallback).\",\n },\n };\n}\n\nfunction seedDayBuckets(now: Date, days: number): Map<string, DayBucket> {\n const out = new Map<string, DayBucket>();\n for (let i = days - 1; i >= 0; i -= 1) {\n const d = new Date(now.getTime() - (i * 24 * 60 * 60 * 1000));\n const day = d.toISOString().slice(0, 10);\n out.set(day, {\n inputTokens: 0,\n outputTokens: 0,\n estimatedCost: 0,\n toolCalls: 0,\n toolSuccesses: 0,\n toolErrors: 0,\n });\n }\n return out;\n}\n\nfunction estimateTokens(text: string): number {\n const trimmed = text.trim();\n if (!trimmed) return 0;\n return Math.max(1, Math.ceil(trimmed.length / CHARS_PER_TOKEN));\n}\n\nfunction estimateCostUsd(inputTokens: number, outputTokens: number, rates: ProviderRates): number {\n const inputRate = rates.inputPer1M;\n const outputRate = rates.outputPer1M;\n if (inputRate == null && outputRate == null) return 0;\n const inCost = inputRate == null ? 0 : (inputTokens / 1_000_000) * inputRate;\n const outCost = outputRate == null ? 0 : (outputTokens / 1_000_000) * outputRate;\n return inCost + outCost;\n}\n\nfunction providerRatesFor(byProvider: Map<string, ProviderRates>, provider: string | null): ProviderRates {\n if (!provider) return { inputPer1M: null, outputPer1M: null, source: \"unknown\", inferred: true, confidence: \"low\", ok: false, status: null, error: \"no provider assigned\" };\n return byProvider.get(provider.toLowerCase())\n ?? { inputPer1M: null, outputPer1M: null, source: \"unknown\", inferred: true, confidence: \"low\", ok: false, status: null, error: \"provider missing in pricing snapshot\" };\n}\n\nfunction modelRatesFor(\n byProvider: Map<string, ProviderRates>,\n byProviderModel: Map<string, ProviderRates>,\n byModel: Map<string, ProviderRates>,\n provider: string | null,\n modelId: string | null,\n): ProviderRates {\n if (!modelId) {\n return providerRatesFor(byProvider, provider);\n }\n const modelKey = modelId.trim().toLowerCase();\n if (!modelKey) return providerRatesFor(byProvider, provider);\n\n // 1. Prefer (provider, model_id) when both are present.\n if (provider) {\n const providerKey = normalizeProvider(provider);\n if (providerKey) {\n const candidates = modelAliasCandidates(providerKey, modelKey);\n for (const candidate of candidates) {\n const exact = byProviderModel.get(`${providerKey}::${candidate}`);\n if (exact) return exact;\n }\n // GitHub Copilot model configs proxy multiple upstream providers.\n // If no direct copilot model rate exists, fall back to the upstream\n // provider/model inferred from the model id.\n if (providerKey === \"github-copilot\") {\n const upstream = inferProviderFromModelId(modelKey);\n if (upstream) {\n const upstreamCandidates = modelAliasCandidates(upstream, modelKey);\n for (const candidate of upstreamCandidates) {\n const viaUpstreamModel = byProviderModel.get(`${upstream}::${candidate}`);\n if (viaUpstreamModel) return viaUpstreamModel;\n }\n const upstreamProviderRate = byProvider.get(upstream);\n if (upstreamProviderRate && upstreamProviderRate.ok) return upstreamProviderRate;\n }\n }\n }\n }\n\n // 2. Aggregator-agnostic fallback: lookup by model_id alone. Covers\n // cases where the configured provider doesn't publish per-model\n // pricing but the same model id is rated by its upstream vendor.\n for (const candidate of modelAliasCandidates(provider ? (normalizeProvider(provider) ?? \"\") : \"\", modelKey)) {\n const viaModel = byModel.get(candidate);\n if (viaModel) return viaModel;\n }\n const directModel = byModel.get(modelKey);\n if (directModel) return directModel;\n\n return providerRatesFor(byProvider, provider);\n}\n\nfunction modelAliasCandidates(provider: string, modelId: string): string[] {\n const out = new Set<string>();\n const id = modelId.trim().toLowerCase();\n if (!id) return [];\n out.add(id);\n\n if (provider === \"deepseek\") {\n if (/reasoner/.test(id) || /r1/.test(id)) {\n out.add(\"deepseek-reasoner\");\n }\n if (/chat/.test(id) || /v[0-9]/.test(id) || /coder/.test(id)) {\n out.add(\"deepseek-chat\");\n }\n }\n\n return [...out];\n}\n\nfunction inferProviderFromModelId(modelId: string): string | null {\n const id = modelId.trim().toLowerCase();\n if (!id) return null;\n if (id.startsWith(\"gpt-\") || /^o[1-4](?:-|$)/.test(id)) return \"openai\";\n if (id.startsWith(\"claude-\")) return \"anthropic\";\n if (id.startsWith(\"gemini-\")) return \"google\";\n if (id.startsWith(\"deepseek-\")) return \"deepseek\";\n if (id.startsWith(\"command-\") || id.startsWith(\"embed-\")) return \"cohere\";\n return null;\n}\n\nfunction summarizeEvents(raw: string): { calls: number; successes: number; errors: number } {\n let events: PersistedToolEvent[] = [];\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (Array.isArray(parsed)) events = parsed as PersistedToolEvent[];\n } catch {\n return { calls: 0, successes: 0, errors: 0 };\n }\n\n const resultById = new Map<string, boolean>();\n for (const ev of events) {\n if (!ev || ev.phase !== \"result\") continue;\n const key = ev.id || `${ev.phase}:${ev.name}`;\n resultById.set(key, !isErrorPayload(ev.payload));\n }\n\n let calls = 0;\n let successes = 0;\n let errors = 0;\n\n for (const ev of events) {\n if (!ev || ev.phase !== \"call\") continue;\n calls += 1;\n const key = ev.id || `${ev.phase}:${ev.name}`;\n const ok = resultById.get(key);\n if (ok === true) successes += 1;\n else errors += 1;\n }\n\n return { calls, successes, errors };\n}\n\nfunction isErrorPayload(payload: unknown): boolean {\n if (typeof payload === \"string\") return /\\berror\\b|\\bfailed\\b|\\bexception\\b/i.test(payload);\n if (!payload || typeof payload !== \"object\") return false;\n if (\"error\" in payload || \"errors\" in payload) return true;\n const status = \"status\" in payload ? (payload as { status?: unknown }).status : undefined;\n return typeof status === \"string\" && /error|failed/i.test(status);\n}\n\nasync function loadProviderRates(): Promise<{\n byProvider: Map<string, ProviderRates>;\n byProviderModel: Map<string, ProviderRates>;\n byModel: Map<string, ProviderRates>;\n generatedAt: string | null;\n}> {\n const snapshot = await readPricingSnapshot();\n const out = new Map<string, ProviderRates>();\n const byProviderModel = new Map<string, ProviderRates>();\n const byModel = new Map<string, ProviderRates>();\n const expectedProviders = [\"openai\", \"anthropic\", \"google\", \"deepseek\", \"cohere\", \"github-copilot\"];\n\n for (const provider of expectedProviders) {\n out.set(provider, {\n inputPer1M: null,\n outputPer1M: null,\n source: \"snapshot-missing\",\n inferred: true,\n confidence: \"low\",\n ok: false,\n status: null,\n error: \"provider missing in pricing snapshot\",\n });\n }\n\n if (!snapshot?.sources) {\n return { byProvider: out, byProviderModel, byModel, generatedAt: null };\n }\n\n for (const source of snapshot.sources) {\n const key = normalizeProvider(source.id);\n if (!key) continue;\n const parsed = inferRatesFromSignals(source.price_signals ?? []);\n const modelInputRates = (source.model_rates ?? [])\n .map((m) => m.input_per_1m_usd)\n .filter((v): v is number => typeof v === \"number\" && Number.isFinite(v) && v > 0)\n .sort((a, b) => a - b);\n const modelOutputRates = (source.model_rates ?? [])\n .map((m) => m.output_per_1m_usd)\n .filter((v): v is number => typeof v === \"number\" && Number.isFinite(v) && v > 0)\n .sort((a, b) => a - b);\n\n const providerInput = parsed.inputPer1M ?? (modelInputRates[0] ?? null);\n const providerOutput = parsed.outputPer1M ?? (modelOutputRates[0] ?? null);\n const providerDerivedFromModels = parsed.inputPer1M == null && parsed.outputPer1M == null\n && (providerInput != null || providerOutput != null);\n\n out.set(key, {\n inputPer1M: providerInput,\n outputPer1M: providerOutput,\n source: source.resolved_url ?? source.pricing_url,\n inferred: providerDerivedFromModels ? true : parsed.inferred,\n confidence: providerDerivedFromModels ? \"medium\" : parsed.confidence,\n ok: source.ok !== false || providerDerivedFromModels,\n status: source.status ?? null,\n error: source.error ?? null,\n });\n\n for (const modelRate of source.model_rates ?? []) {\n const normalizedModel = modelRate.model_id?.trim().toLowerCase();\n if (!normalizedModel) continue;\n const entry: ProviderRates = {\n inputPer1M: modelRate.input_per_1m_usd,\n outputPer1M: modelRate.output_per_1m_usd,\n source: source.resolved_url ?? source.pricing_url,\n inferred: modelRate.inferred !== false,\n confidence: modelRate.confidence ?? \"low\",\n ok: source.ok !== false,\n status: source.status ?? null,\n error: source.error ?? null,\n };\n byProviderModel.set(`${key}::${normalizedModel}`, entry);\n const existing = byModel.get(normalizedModel);\n if (!existing || isBetterRate(entry, existing)) {\n byModel.set(normalizedModel, entry);\n }\n }\n }\n\n return { byProvider: out, byProviderModel, byModel, generatedAt: snapshot.generated_at ?? null };\n}\n\nfunction isBetterRate(next: ProviderRates, prev: ProviderRates): boolean {\n const nextHas = next.inputPer1M != null || next.outputPer1M != null;\n const prevHas = prev.inputPer1M != null || prev.outputPer1M != null;\n if (nextHas && !prevHas) return true;\n if (!nextHas && prevHas) return false;\n const rank = { high: 2, medium: 1, low: 0 } as const;\n return rank[next.confidence] > rank[prev.confidence];\n}\n\nasync function readPricingSnapshot(): Promise<PricingSnapshot | null> {\n try {\n const filePath = join(process.cwd(), \"docs\", \"journal\", \"pricing-snapshot.json\");\n const raw = await readFile(filePath, \"utf8\");\n return JSON.parse(raw) as PricingSnapshot;\n } catch {\n return null;\n }\n}\n\nfunction normalizeProvider(id: string): string | null {\n const lower = id.toLowerCase();\n if (lower.includes(\"github\") || lower.includes(\"copilot\")) return \"github-copilot\";\n if (lower.includes(\"google\") || lower.includes(\"gemini\")) return \"google\";\n if (lower.includes(\"openai\")) return \"openai\";\n if (lower.includes(\"anthropic\")) return \"anthropic\";\n if (lower.includes(\"cohere\")) return \"cohere\";\n if (lower.includes(\"deepseek\")) return \"deepseek\";\n return lower || null;\n}\n\nfunction inferRatesFromSignals(signals: string[]): {\n inputPer1M: number | null;\n outputPer1M: number | null;\n inferred: boolean;\n confidence: \"high\" | \"medium\" | \"low\";\n} {\n const tokenRates = signals\n .map((s) => {\n const m = /\\$\\s*([0-9]+(?:\\.[0-9]+)?)\\s*\\/?\\s*(?:1M\\s*tokens|M\\s*Tok|MTok)/i.exec(s);\n if (!m) return null;\n return Number(m[1]);\n })\n .filter((v): v is number => typeof v === \"number\" && Number.isFinite(v) && v > 0)\n .sort((a, b) => a - b);\n\n if (tokenRates.length === 0) return { inputPer1M: null, outputPer1M: null, inferred: true, confidence: \"low\" };\n if (tokenRates.length === 1) {\n return {\n inputPer1M: tokenRates[0],\n outputPer1M: tokenRates[0],\n inferred: true,\n confidence: \"low\",\n };\n }\n\n return {\n inputPer1M: tokenRates[0],\n outputPer1M: tokenRates[tokenRates.length - 1],\n inferred: true,\n confidence: \"medium\",\n };\n}\n\nfunction round4(value: number): number {\n return Math.round(value * 10_000) / 10_000;\n}\n","import { NextRequest } from \"next/server\";\nimport { cachedJson, errorResponse } from \"@/lib/api/responses\";\nimport { getDashboardMetrics } from \"@/lib/stores/dashboard-metrics\";\nimport { refreshPricingSnapshot } from \"@/lib/pricing/snapshot\";\nimport { getDefaultModelConfig, getModelConfig } from \"@/lib/stores/model-config\";\nimport { getDefaultAgentConfig } from \"@/lib/stores/agent-configs\";\n\nfunction defaultPricingProviders(): string[] {\n const providers = new Set<string>();\n\n const defaultModel = getDefaultModelConfig();\n if (defaultModel?.provider?.trim()) {\n providers.add(defaultModel.provider.trim().toLowerCase());\n }\n\n const defaultAgent = getDefaultAgentConfig();\n if (defaultAgent?.model_config_name?.trim()) {\n const cfg = getModelConfig(defaultAgent.model_config_name.trim());\n if (cfg?.provider?.trim()) {\n providers.add(cfg.provider.trim().toLowerCase());\n }\n }\n\n return [...providers];\n}\n\nexport async function GET(req: NextRequest) {\n try {\n await refreshPricingSnapshot({ force: false, providers: defaultPricingProviders() });\n const daysRaw = req.nextUrl.searchParams.get(\"days\");\n const days = daysRaw ? Number(daysRaw) : undefined;\n const metrics = await getDashboardMetrics(days);\n return cachedJson(metrics, 30);\n } catch (err) {\n console.error(\"[dashboard-metrics] failed:\", err);\n return errorResponse(\"Failed to load dashboard metrics\", 500);\n }\n}\n","import { AppRouteRouteModule } from \"next/dist/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta, setRequestMeta } from \"next/dist/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/lib/constants\";\nimport { NoFallbackError } from \"next/dist/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/server/response-cache\";\nimport * as userland from \"/home/runner/work/jarela/jarela/app/api/v1/dashboard/metrics/route.ts\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"standalone\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/v1/dashboard/metrics/route\",\n pathname: \"/api/v1/dashboard/metrics\",\n filename: \"route\",\n bundlePath: \"app/api/v1/dashboard/metrics/route\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"/home/runner/work/jarela/jarela/app/api/v1/dashboard/metrics/route.ts\",\n nextConfigOutput,\n // The static import is used for initialization (methods, dynamic, etc.).\n userland: userland,\n // In Turbopack dev mode, also provide a getter that calls require() on every\n // request. This re-reads from devModuleCache so HMR updates are picked up,\n // and the async wrapper unwraps async-module Promises (ESM-only\n // serverExternalPackages) automatically.\n ...process.env.TURBOPACK && process.env.__NEXT_DEV_SERVER ? {\n getUserland: ()=>import(\"/home/runner/work/jarela/jarela/app/api/v1/dashboard/metrics/route.ts\")\n } : {}\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (ctx.requestMeta) {\n setRequestMeta(req, ctx.requestMeta);\n }\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/v1/dashboard/metrics/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, deploymentId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const isWrappedByNextServer = Boolean(routerServerContext == null ? void 0 : routerServerContext.isWrappedByNextServer);\n const isMinimalMode = Boolean(getRequestMeta(req, 'minimalMode'));\n const incrementalCache = getRequestMeta(req, 'incrementalCache') || await routeModule.getIncrementalCache(req, nextConfig, prerenderManifest, isMinimalMode);\n incrementalCache == null ? void 0 : incrementalCache.resetRequestCache();\n globalThis.__incrementalCache = incrementalCache;\n const context = {\n params,\n previewProps: prerenderManifest.preview,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache,\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId,\n deploymentId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n let parentSpan;\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n // Propagate http.route to the parent span if one exists (e.g.\n // a platform-created HTTP span in adapter deployments).\n if (parentSpan && parentSpan !== span) {\n parentSpan.setAttribute('http.route', route);\n parentSpan.updateName(name);\n }\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (isWrappedByNextServer && activeSpan) {\n await handleResponse(activeSpan);\n } else {\n parentSpan = tracer.getActiveScopeSpan();\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse), undefined, !isWrappedByNextServer);\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n","module.exports = require(\"crypto\");","module.exports = require(\"https\");","module.exports = require(\"node:stream\");","module.exports = require(\"node:util\");","module.exports = require(\"next/dist/server/app-render/work-unit-async-storage.external.js\");","module.exports = require(\"node:fs\");","module.exports = require(\"node:url\");","module.exports = require(\"node:worker_threads\");","module.exports = require(\"node:path\");","module.exports = require(\"node:crypto\");","module.exports = require(\"buffer\");","module.exports = require(\"node:sqlite\");","module.exports = require(\"http\");","module.exports = require(\"next/dist/shared/lib/no-fallback-error.external\");","module.exports = require(\"events\");"],"names":["getDb","MBTI_PRESETS","now","Date","toISOString","getAgentTierProportions","row","raw","context_tier_proportions","parsed","JSON","parse","hot","Number","warm","facts","every","n","isFinite","listAgentConfigs","prepare","all","getDefaultAgentConfig","get","getAgentConfig","id","getAgentTools","cfg","tools","Array","isArray","filter","x","length","parseDelegateTargets","ids","from","Set","upsertAgentConfig","input","t","db","existing","created_at","mbti","adaptive_mbti","toMbti","preset","strength","adaptive_persona_strength","empathy","adaptive_empathy","expressiveness","adaptive_expressiveness","verbosity","adaptive_verbosity","is_default","run","harnessId","harness_id","undefined","delegateTargets","delegate_targets","stringify","tierProportions","Math","max","name","icon","identity","instructions","model_config_name","history_limit","history_window_hours","never_reply","adaptive_persona_enabled","clampPercent","voice_enabled","voice_model","trim","voice_name","voice_stt_model","voice_auto_speak","next","fallback","min","round","v","deleteAgentConfig","changes","generateAgentId","slug","toLowerCase","replace","slice","suffix","random","toString","DISPLAY_FILTER_KEYS","DISPLAY_FILTER_DEFAULTS","scheduled_task","watcher","bridge","synthetic","tool_use","thinking","parseDisplayFilters","getAgentDisplayFilters","display_filters","updateAgentDisplayFilters","patch","current","k","UPSERT_SQL","recordToolUsage","toolEvents","assistantContent","deltas","summarizeToolUsage","stamp","stmt","exec","calls","successes","errors","used","err","listToolStats","getToolStatsMap","names","rows","map","join","out","Map","set","tool_name","toStats","defaultToolStats","call_count","success_count","error_count","used_count","success_rate","usefulness_rate","score","never_used","last_called_at","successRate","clamp01","usefulnessRate","byId","assistantTerms","normalizeText","ev","key","phase","successful","isErrorPayload","payload","payloadLooksUsed","totals","outcome","values","size","candidates","extractPayloadTerms","matched","term","has","stringifyPayload","unique","token","split","test","add","text","status","value","readFile","CHARS_PER_TOKEN","DEFAULT_WINDOW_DAYS","getDashboardMetrics","days","boundedDays","floor","since","getTime","usageRows","snapshotThreadIds","r","mu_input_tokens","thread_id","byProvider","byProviderModel","byModel","generatedAt","loadProviderRates","dayMap","seedDayBuckets","agentMap","providerMap","modelMap","dayBreakdownMap","ensureDayBreakdown","day","entry","agents","providers","models","totalInput","totalOutput","totalCost","totalCalls","totalSuccesses","totalErrors","dayBucket","hasSnapshot","threadHasSnapshot","inputTokens","outputTokens","estCost","attribProvider","provider","attribModelId","model_id","attribModelConfig","attribAgentId","agent_id","attribAgentName","agent_name","mu_output_tokens","mu_cost_usd","mu_provider","mu_model_id","mu_model_config_name","mu_agent_id","mu_agent_name","role","tokenEstimate","estimateTokens","content","isInput","rates","modelRatesFor","estimateCostUsd","estimatedCost","agentName","agentBucket","message_count","input_tokens_est","output_tokens_est","estimated_cost_usd","providerName","providerBucket","modelConfigName","modelId","modelKey","modelBucket","dayBreakdown","dayAgent","dayProvider","dayModel","tool_events","usage","summarizeEvents","toolCalls","toolSuccesses","toolErrors","series","entries","b","errorRate","tool_calls","tool_successes","tool_errors","round4","error_rate","top_tools","stats","sort","a","localeCompare","top_agents","by_provider","by_model","overallSuccessRate","overallErrorRate","seriesByDay","s","breakdowns_by_day","bucket","dayPoint","dayAgents","dayProviders","dayModels","summary","generated_at","pricing","snapshot_generated_at","input_per_1m_usd","inputPer1M","output_per_1m_usd","outputPer1M","source","inferred","confidence","ok","error","model_rates","splitAt","indexOf","notes","i","d","trimmed","ceil","inputRate","outputRate","inCost","outCost","providerRatesFor","providerKey","normalizeProvider","modelAliasCandidates","candidate","exact","upstream","inferProviderFromModelId","upstreamCandidates","viaUpstreamModel","upstreamProviderRate","viaModel","directModel","startsWith","events","resultById","snapshot","readPricingSnapshot","expectedProviders","sources","inferRatesFromSignals","price_signals","modelInputRates","m","modelOutputRates","providerInput","providerOutput","providerDerivedFromModels","resolved_url","pricing_url","modelRate","normalizedModel","isBetterRate","prev","nextHas","prevHas","rank","high","medium","low","filePath","process","cwd","lower","includes","signals","tokenRates","cachedJson","errorResponse","refreshPricingSnapshot","getDefaultModelConfig","getModelConfig","defaultPricingProviders","defaultModel","defaultAgent","GET","req","force","daysRaw","nextUrl","searchParams","metrics","console"],"sourceRoot":"","ignoreList":[0,3,5,10,16,27,36]}
1
+ {"version":3,"file":"../app/api/v1/dashboard/metrics/route.js","mappings":"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C;AACqB;AACkB;AACvB;AACgB;AACT;AACK;AACmC;AACjD;AACO;AACf;AACsC;AACzB;AACM;AACC;AAChB;AACgC;AAClG;AACA;AACA;AACA,wBAAwB,mCAAmB;AAC3C;AACA,cAAc,oBAAS;AACvB;AACA;AACA;AACA;AACA,KAAK;AACL,aAAa,OAAoC,IAAI,CAAE;AACvD,wBAAwB,MAAuC;AAC/D;AACA;AACA;AACA,cAAc,qBAAQ;AACtB;AACA;AACA;AACA;AACA,OAAO,MAAsD,GAAG,CAE3D,CAAC;AACN,CAAC;AACD;AACA;AACA;AACA,QAAQ,sDAAsD;AAC9D;AACA,WAAW,0BAAW;AACtB;AACA;AACA,KAAK;AACL;AAC0F;AACnF;AACP;AACA,QAAQ,+BAAc;AACtB;AACA;AACA,QAAQ,+BAAc;AACtB;AACA;AACA;AACA;AACA;AACA,QAAQ,KAAqB,EAAE,EAE1B,CAAC;AACN;AACA;AACA;AACA,+BAA+B,KAAwC;AACvE;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,6NAA6N;AACzO,8BAA8B,+BAAgB;AAC9C;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,2CAAe;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,6CAAqB;AAC7B;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,mBAAmB,0BAAS;AAC5B;AACA;AACA,kCAAkC,+BAAc;AAChD,6BAA6B,+BAAc;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAe;AAC3C,4BAA4B,qBAAgB;AAC5C,oBAAoB,+BAAkB,kCAAkC,uCAAsB;AAC9F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,iEAAiE,wBAAc;AAC/E,+DAA+D,yCAAyC;AACxG;AACA;AACA;AACA;AACA,oCAAoC,QAAQ,EAAE,MAAM;AACpD;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB,uCAAuC,QAAQ,EAAE,QAAQ;AACzD;AACA,aAAa;AACb;AACA;AACA;AACA,+CAA+C,oBAAoB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,uCAAyB;AACjE;AACA,oCAAoC,oCAAsB;AAC1D;AACA;AACA;AACA;AACA,sJAAsJ,4BAAc;AACpK,0IAA0I,4BAAc;AACxJ;AACA;AACA;AACA,sCAAsC,8BAAe;AACrD;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,8BAA8B,qCAAY;AAC1C;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,oCAAmB;AACjE;AACA;AACA,6BAA6B;AAC7B,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,oBAAS;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,qIAAqI,8BAAe;AACpJ;AACA,2GAA2G,iHAAiH;AAC5N;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,yCAA2B;AACvD;AACA,+BAA+B,oCAAsB;AACrD;AACA;AACA;AACA;AACA,6CAA6C,uCAAqB;AAClE;AACA,kBAAkB,qCAAY;AAC9B;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,6EAA6E,wBAAc;AAC3F,iCAAiC,QAAQ,EAAE,QAAQ;AACnD,0BAA0B,qBAAQ;AAClC;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,MAAM;AACN,6BAA6B,2CAAe;AAC5C;AACA;AACA;AACA;AACA;AACA,kCAAkC,oCAAmB;AACrD;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA,cAAc,qCAAY;AAC1B;AACA,SAAS;AACT;AACA;AACA;;AAEA;;;;;;;;AC7WA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA;;;;;;;ACAA","sources":["webpack://@circuitwall/jarela/external commonjs \"next/dist/shared/lib/router/utils/app-paths\"","webpack://@circuitwall/jarela/external node-commonjs \"node:process\"","webpack://@circuitwall/jarela/external commonjs2 \"url\"","webpack://@circuitwall/jarela/external commonjs \"next/dist/server/app-render/after-task-async-storage.external.js\"","webpack://@circuitwall/jarela/external commonjs \"undici\"","webpack://@circuitwall/jarela/external commonjs \"next/dist/compiled/next-server/app-page.runtime.prod.js\"","webpack://@circuitwall/jarela/external node-commonjs \"node:async_hooks\"","webpack://@circuitwall/jarela/external commonjs2 \"stream\"","webpack://@circuitwall/jarela/external commonjs2 \"util\"","webpack://@circuitwall/jarela/external commonjs2 \"fs\"","webpack://@circuitwall/jarela/external commonjs \"next/dist/server/app-render/work-async-storage.external.js\"","webpack://@circuitwall/jarela/external node-commonjs \"node:child_process\"","webpack://@circuitwall/jarela/external commonjs2 \"path\"","webpack://@circuitwall/jarela/external node-commonjs \"node:http\"","webpack://@circuitwall/jarela/./lib/stores/agent-configs.ts","webpack://@circuitwall/jarela/external node-commonjs \"node:https\"","webpack://@circuitwall/jarela/external commonjs \"next/dist/compiled/next-server/app-route.runtime.prod.js\"","webpack://@circuitwall/jarela/external node-commonjs \"node:os\"","webpack://@circuitwall/jarela/./lib/stores/tool-stats.ts","webpack://@circuitwall/jarela/external node-commonjs \"node:fs/promises\"","webpack://@circuitwall/jarela/./lib/stores/dashboard-metrics.ts","webpack://@circuitwall/jarela/./app/api/v1/dashboard/metrics/route.ts","webpack://@circuitwall/jarela/?73e0","webpack://@circuitwall/jarela/external commonjs2 \"crypto\"","webpack://@circuitwall/jarela/external commonjs2 \"https\"","webpack://@circuitwall/jarela/external node-commonjs \"node:stream\"","webpack://@circuitwall/jarela/external node-commonjs \"node:util\"","webpack://@circuitwall/jarela/external commonjs \"next/dist/server/app-render/work-unit-async-storage.external.js\"","webpack://@circuitwall/jarela/external node-commonjs \"node:fs\"","webpack://@circuitwall/jarela/external node-commonjs \"node:url\"","webpack://@circuitwall/jarela/external node-commonjs \"node:worker_threads\"","webpack://@circuitwall/jarela/external node-commonjs \"node:path\"","webpack://@circuitwall/jarela/external node-commonjs \"node:crypto\"","webpack://@circuitwall/jarela/external commonjs2 \"buffer\"","webpack://@circuitwall/jarela/external node-commonjs \"node:sqlite\"","webpack://@circuitwall/jarela/external commonjs2 \"http\"","webpack://@circuitwall/jarela/external commonjs \"next/dist/shared/lib/no-fallback-error.external\"","webpack://@circuitwall/jarela/external commonjs2 \"events\""],"sourcesContent":["module.exports = require(\"next/dist/shared/lib/router/utils/app-paths\");","module.exports = require(\"node:process\");","module.exports = require(\"url\");","module.exports = require(\"next/dist/server/app-render/after-task-async-storage.external.js\");","module.exports = require(\"undici\");","module.exports = require(\"next/dist/compiled/next-server/app-page.runtime.prod.js\");","module.exports = require(\"node:async_hooks\");","module.exports = require(\"stream\");","module.exports = require(\"util\");","module.exports = require(\"fs\");","module.exports = require(\"next/dist/server/app-render/work-async-storage.external.js\");","module.exports = require(\"node:child_process\");","module.exports = require(\"path\");","module.exports = require(\"node:http\");","import { getDb } from \"@/lib/db\";\nimport { MBTI_PRESETS, type MbtiType } from \"@/lib/agents/adaptive-persona-presets\";\n\nconst now = () => new Date().toISOString();\n\nexport interface AgentConfigRow {\n id: string;\n name: string;\n icon: string | null;\n identity: string;\n instructions: string;\n tools: string; // JSON string[]\n model_config_name: string | null;\n is_default: number;\n history_limit: number; // 0 = unlimited\n history_window_hours: number; // 0 = no time bound\n never_reply: number; // 1 = run the agent but don't auto-send replies via bridges\n adaptive_persona_enabled: number; // 1 = use runtime mood/tone adaptation hints\n adaptive_persona_strength: number; // 0..100, how strongly to adapt to cues\n adaptive_empathy: number; // 0..100, baseline empathetic tone\n adaptive_expressiveness: number; // 0..100, restrained -> energetic\n adaptive_verbosity: number; // 0..100, concise -> detailed\n adaptive_mbti: string; // one of 16 MBTI types\n voice_enabled: number; // 1 = expose mic/play UI for this agent\n voice_model: string; // Gemini TTS model id\n voice_name: string; // Gemini prebuilt voice name (Kore, Puck, …)\n voice_stt_model: string; // Gemini multimodal model used for transcription\n voice_auto_speak: number; // 1 = auto-play reply when user sent voice\n display_filters: string | null; // JSON: Partial<DisplayFilters>; NULL = inherit defaults (ADR-0022)\n harness_id: string | null; // ADR-0033: per-agent harness override; NULL = inherit global default\n delegate_targets: string | null; // JSON string[] of agent ids this agent may delegate to; NULL/'[]' = none\n // ADR-0043. JSON-encoded `{ hot, warm, facts }` — any positive numbers; the\n // backend divides by sum so the UI can ship raw weights and never has to\n // reconcile to 100. NULL = inherit the model config's value.\n context_tier_proportions: string | null;\n created_at: string;\n updated_at: string;\n}\n\nexport interface AgentTierProportions {\n hot: number;\n warm: number;\n facts: number;\n}\n\n/**\n * Parse the JSON-encoded per-agent override of context tier proportions.\n * Returns `null` for NULL, blank, malformed JSON, or any payload that\n * doesn't have three finite non-negative numeric fields. Callers fall\n * back to the model config's value (or built-in defaults) on null.\n */\nexport function getAgentTierProportions(row: AgentConfigRow): AgentTierProportions | null {\n const raw = row.context_tier_proportions;\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw) as Partial<AgentTierProportions>;\n const hot = Number(parsed.hot);\n const warm = Number(parsed.warm);\n const facts = Number(parsed.facts);\n if (![hot, warm, facts].every((n) => Number.isFinite(n) && n >= 0)) return null;\n if (hot + warm + facts <= 0) return null;\n return { hot, warm, facts };\n } catch {\n return null;\n }\n}\n\nexport function listAgentConfigs(): AgentConfigRow[] {\n return getDb()\n .prepare(\"SELECT * FROM agent_configs ORDER BY is_default DESC, created_at ASC\")\n .all() as unknown as AgentConfigRow[];\n}\n\nexport function getDefaultAgentConfig(): AgentConfigRow | null {\n return (\n (getDb()\n .prepare(\"SELECT * FROM agent_configs WHERE is_default=1 LIMIT 1\")\n .get() as unknown as AgentConfigRow) ?? null\n );\n}\n\nexport function getAgentConfig(id: string): AgentConfigRow | null {\n return (\n (getDb()\n .prepare(\"SELECT * FROM agent_configs WHERE id=?\")\n .get(id) as unknown as AgentConfigRow) ?? null\n );\n}\n\nexport interface UpsertAgentInput {\n id: string;\n name: string;\n icon?: string | null;\n identity: string;\n instructions: string;\n tools: string[];\n model_config_name?: string | null;\n is_default?: boolean;\n history_limit?: number;\n history_window_hours?: number;\n never_reply?: boolean;\n adaptive_persona_enabled?: boolean;\n adaptive_persona_strength?: number;\n adaptive_empathy?: number;\n adaptive_expressiveness?: number;\n adaptive_verbosity?: number;\n adaptive_mbti?: MbtiType;\n voice_enabled?: boolean;\n voice_model?: string;\n voice_name?: string;\n voice_stt_model?: string;\n voice_auto_speak?: boolean;\n harness_id?: string | null;\n delegate_targets?: string[];\n // ADR-0043. Pass `null` to clear the override and inherit from the model.\n // Pass `undefined` to keep whatever's already on the row (PATCH semantics).\n context_tier_proportions?: AgentTierProportions | null;\n}\n\n/**\n * Parse the JSON-encoded delegate whitelist into a deduped string[]. Returns\n * an empty array for NULL, blank, or malformed JSON (delegation is opt-in).\n */\n/**\n * Parse the agent's tool allowlist (`tools` column, stored as a JSON string).\n * Returns an empty array on NULL/blank/malformed JSON — same defensive shape\n * as parseDelegateTargets. Callers that previously did `JSON.parse(cfg.tools)`\n * inline should switch to this getter so the serialization contract stays\n * owned by this store.\n */\nexport function getAgentTools(cfg: Pick<AgentConfigRow, \"tools\"> | null | undefined): string[] {\n if (!cfg?.tools) return [];\n try {\n const parsed = JSON.parse(cfg.tools);\n if (!Array.isArray(parsed)) return [];\n return parsed.filter((x): x is string => typeof x === \"string\" && x.length > 0);\n } catch {\n return [];\n }\n}\n\nexport function parseDelegateTargets(raw: string | null | undefined): string[] {\n if (!raw) return [];\n try {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n const ids = parsed.filter((x): x is string => typeof x === \"string\" && x.length > 0);\n return Array.from(new Set(ids));\n } catch {\n return [];\n }\n}\n\nexport function upsertAgentConfig(input: UpsertAgentInput): AgentConfigRow {\n const t = now();\n const db = getDb();\n const existing = getAgentConfig(input.id);\n const created_at = existing?.created_at ?? t;\n const mbti = input.adaptive_mbti ?? toMbti(existing?.adaptive_mbti) ?? \"INTJ\";\n const preset = MBTI_PRESETS[mbti];\n const strength = input.adaptive_persona_strength ?? preset.strength;\n const empathy = input.adaptive_empathy ?? preset.empathy;\n const expressiveness = input.adaptive_expressiveness ?? preset.expressiveness;\n const verbosity = input.adaptive_verbosity ?? preset.verbosity;\n if (input.is_default) db.prepare(\"UPDATE agent_configs SET is_default=0\").run();\n // harness_id: explicit `undefined` means \"keep existing\"; explicit `null`\n // means \"use the global default\". Empty string is normalised to null too,\n // matching how the AgentEditor sends \"\" for the inherit option.\n const harnessId =\n input.harness_id === undefined\n ? (existing?.harness_id ?? null)\n : (input.harness_id && input.harness_id.length > 0 ? input.harness_id : null);\n // delegate_targets: undefined = keep existing; explicit empty array clears.\n const delegateTargets = input.delegate_targets === undefined\n ? (existing?.delegate_targets ?? null)\n : JSON.stringify(Array.from(new Set(input.delegate_targets.filter((id) => id && id !== input.id))));\n // context_tier_proportions: undefined = keep existing; null = clear and\n // inherit from the model; object = serialise as JSON. Negative values are\n // clamped to 0 so the upsert can't poison the column with bad data.\n const tierProportions =\n input.context_tier_proportions === undefined\n ? (existing?.context_tier_proportions ?? null)\n : input.context_tier_proportions === null\n ? null\n : JSON.stringify({\n hot: Math.max(0, Number(input.context_tier_proportions.hot) || 0),\n warm: Math.max(0, Number(input.context_tier_proportions.warm) || 0),\n facts: Math.max(0, Number(input.context_tier_proportions.facts) || 0),\n });\n db.prepare(\n `INSERT OR REPLACE INTO agent_configs\n (id, name, icon, identity, instructions, tools, model_config_name, is_default,\n history_limit, history_window_hours, never_reply,\n adaptive_persona_enabled, adaptive_persona_strength, adaptive_empathy, adaptive_expressiveness, adaptive_verbosity, adaptive_mbti,\n voice_enabled, voice_model, voice_name, voice_stt_model, voice_auto_speak,\n harness_id, delegate_targets, context_tier_proportions,\n created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`\n )\n .run(\n input.id,\n input.name,\n input.icon ?? null,\n input.identity,\n input.instructions,\n JSON.stringify(input.tools),\n input.model_config_name ?? null,\n input.is_default ? 1 : (existing?.is_default ?? 0),\n input.history_limit ?? existing?.history_limit ?? 50,\n input.history_window_hours ?? existing?.history_window_hours ?? 8,\n // never_reply is a boolean toggle — explicit `undefined` means \"keep existing\"\n // (important for PATCH-style updates that omit the field).\n input.never_reply === undefined\n ? (existing?.never_reply ?? 0)\n : (input.never_reply ? 1 : 0),\n input.adaptive_persona_enabled === undefined\n ? (existing?.adaptive_persona_enabled ?? 0)\n : (input.adaptive_persona_enabled ? 1 : 0),\n clampPercent(strength, existing?.adaptive_persona_strength ?? 50),\n clampPercent(empathy, existing?.adaptive_empathy ?? 50),\n clampPercent(expressiveness, existing?.adaptive_expressiveness ?? 50),\n clampPercent(verbosity, existing?.adaptive_verbosity ?? 50),\n mbti,\n input.voice_enabled === undefined\n ? (existing?.voice_enabled ?? 0)\n : (input.voice_enabled ? 1 : 0),\n (input.voice_model ?? existing?.voice_model ?? \"gemini-2.5-flash-preview-tts\").trim() ||\n \"gemini-2.5-flash-preview-tts\",\n (input.voice_name ?? existing?.voice_name ?? \"Kore\").trim() || \"Kore\",\n (input.voice_stt_model ?? existing?.voice_stt_model ?? \"gemini-2.5-flash\").trim() ||\n \"gemini-2.5-flash\",\n input.voice_auto_speak === undefined\n ? (existing?.voice_auto_speak ?? 1)\n : (input.voice_auto_speak ? 1 : 0),\n harnessId,\n delegateTargets,\n tierProportions,\n created_at,\n t,\n );\n return getAgentConfig(input.id)!;\n}\n\nfunction clampPercent(next: number | undefined, fallback: number): number {\n const n = Number.isFinite(next) ? Number(next) : fallback;\n return Math.max(0, Math.min(100, Math.round(n)));\n}\n\nfunction toMbti(v: string | null | undefined): MbtiType | null {\n if (!v) return null;\n return (v in MBTI_PRESETS ? v : null) as MbtiType | null;\n}\n\nexport function deleteAgentConfig(id: string): boolean {\n return (\n (getDb().prepare(\"DELETE FROM agent_configs WHERE id=?\").run(id) as { changes: number }).changes > 0\n );\n}\n\nexport function generateAgentId(name: string): string {\n const slug = name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 40);\n const suffix = Math.random().toString(36).slice(2, 6);\n return slug ? `${slug}-${suffix}` : `agent-${suffix}`;\n}\n\n// ── ADR-0022: per-agent message-channel display filters ─────────────────\n// Canonical channel keys mirrored in `hooks/useMessageFilters.ts`. Kept\n// in sync there by importing this constant — single source of truth.\nexport const DISPLAY_FILTER_KEYS = [\n \"scheduled_task\",\n \"watcher\",\n \"bridge\",\n \"synthetic\",\n \"tool_use\",\n \"thinking\",\n] as const;\nexport type DisplayFilterKey = (typeof DISPLAY_FILTER_KEYS)[number];\nexport type DisplayFilters = Record<DisplayFilterKey, boolean>;\n\nexport const DISPLAY_FILTER_DEFAULTS: DisplayFilters = {\n scheduled_task: true,\n watcher: true,\n bridge: true,\n synthetic: true,\n tool_use: true,\n thinking: true,\n};\n\nfunction parseDisplayFilters(raw: string | null | undefined): DisplayFilters {\n if (!raw) return { ...DISPLAY_FILTER_DEFAULTS };\n try {\n const parsed = JSON.parse(raw) as Partial<DisplayFilters>;\n // Merge over defaults so newly-added channels stay visible on old rows.\n return { ...DISPLAY_FILTER_DEFAULTS, ...parsed };\n } catch {\n return { ...DISPLAY_FILTER_DEFAULTS };\n }\n}\n\nexport function getAgentDisplayFilters(id: string): DisplayFilters | null {\n const row = getAgentConfig(id);\n if (!row) return null;\n return parseDisplayFilters(row.display_filters);\n}\n\n/**\n * Merge a partial filter map into the agent's stored prefs. Pass `null` to\n * reset to defaults (clears the column). Safe against concurrent toggles\n * from multiple browser tabs because the merge happens server-side.\n */\nexport function updateAgentDisplayFilters(\n id: string,\n patch: Partial<DisplayFilters> | null,\n): DisplayFilters | null {\n const row = getAgentConfig(id);\n if (!row) return null;\n if (patch === null) {\n getDb()\n .prepare(\"UPDATE agent_configs SET display_filters=NULL, updated_at=? WHERE id=?\")\n .run(now(), id);\n return { ...DISPLAY_FILTER_DEFAULTS };\n }\n const current = parseDisplayFilters(row.display_filters);\n const next: DisplayFilters = { ...current };\n for (const k of DISPLAY_FILTER_KEYS) {\n if (k in patch && typeof patch[k] === \"boolean\") next[k] = patch[k] as boolean;\n }\n getDb()\n .prepare(\"UPDATE agent_configs SET display_filters=?, updated_at=? WHERE id=?\")\n .run(JSON.stringify(next), now(), id);\n return next;\n}\n","module.exports = require(\"node:https\");","module.exports = require(\"next/dist/compiled/next-server/app-route.runtime.prod.js\");","module.exports = require(\"node:os\");","import type { PersistedToolEvent } from \"@/lib/stores/threads\";\nimport { getDb } from \"@/lib/db\";\n\nconst now = () => new Date().toISOString();\n\nexport interface ToolStatsRow {\n tool_name: string;\n call_count: number;\n success_count: number;\n error_count: number;\n used_count: number;\n last_called_at: string | null;\n updated_at: string;\n}\n\nexport interface ToolUsefulnessStats {\n call_count: number;\n success_count: number;\n error_count: number;\n used_count: number;\n success_rate: number;\n usefulness_rate: number;\n score: number;\n never_used: boolean;\n last_called_at: string | null;\n}\n\ninterface ToolUsageDelta {\n name: string;\n calls: number;\n successes: number;\n errors: number;\n used: number;\n}\n\nconst UPSERT_SQL = `\n INSERT INTO tool_stats\n (tool_name, call_count, success_count, error_count, used_count, last_called_at, updated_at)\n VALUES\n (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(tool_name) DO UPDATE SET\n call_count = tool_stats.call_count + excluded.call_count,\n success_count = tool_stats.success_count + excluded.success_count,\n error_count = tool_stats.error_count + excluded.error_count,\n used_count = tool_stats.used_count + excluded.used_count,\n last_called_at = COALESCE(excluded.last_called_at, tool_stats.last_called_at),\n updated_at = excluded.updated_at\n`;\n\nexport function recordToolUsage(\n toolEvents: readonly PersistedToolEvent[],\n assistantContent: string,\n): void {\n const deltas = summarizeToolUsage(toolEvents, assistantContent);\n if (deltas.length === 0) return;\n\n const db = getDb();\n const stamp = now();\n const stmt = db.prepare(UPSERT_SQL);\n db.exec(\"BEGIN\");\n try {\n for (const row of deltas) {\n stmt.run(\n row.name,\n row.calls,\n row.successes,\n row.errors,\n row.used,\n row.calls > 0 ? stamp : null,\n stamp,\n );\n }\n db.exec(\"COMMIT\");\n } catch (err) {\n try { db.exec(\"ROLLBACK\"); } catch { /* ignore rollback failure */ }\n throw err;\n }\n}\n\nexport function listToolStats(): ToolStatsRow[] {\n return getDb()\n .prepare(\n `SELECT tool_name, call_count, success_count, error_count, used_count, last_called_at, updated_at\n FROM tool_stats`,\n )\n .all() as unknown as ToolStatsRow[];\n}\n\nexport function getToolStatsMap(names?: readonly string[]): Map<string, ToolUsefulnessStats> {\n const rows = names && names.length > 0\n ? getDb()\n .prepare(\n `SELECT tool_name, call_count, success_count, error_count, used_count, last_called_at, updated_at\n FROM tool_stats\n WHERE tool_name IN (${names.map(() => \"?\").join(\",\")})`,\n )\n .all(...names) as unknown as ToolStatsRow[]\n : listToolStats();\n\n const out = new Map<string, ToolUsefulnessStats>();\n for (const row of rows) out.set(row.tool_name, toStats(row));\n return out;\n}\n\nexport function defaultToolStats(): ToolUsefulnessStats {\n return {\n call_count: 0,\n success_count: 0,\n error_count: 0,\n used_count: 0,\n success_rate: 1,\n usefulness_rate: 1,\n score: 1,\n never_used: true,\n last_called_at: null,\n };\n}\n\nexport function toStats(row: ToolStatsRow): ToolUsefulnessStats {\n const calls = Math.max(0, row.call_count);\n if (calls === 0) return defaultToolStats();\n\n const successRate = clamp01(row.success_count / calls);\n const usefulnessRate = clamp01(row.used_count / calls);\n const score = clamp01((successRate * 0.65) + (usefulnessRate * 0.35));\n\n return {\n call_count: calls,\n success_count: row.success_count,\n error_count: row.error_count,\n used_count: row.used_count,\n success_rate: successRate,\n usefulness_rate: usefulnessRate,\n score,\n never_used: false,\n last_called_at: row.last_called_at,\n };\n}\n\nexport function summarizeToolUsage(\n toolEvents: readonly PersistedToolEvent[],\n assistantContent: string,\n): ToolUsageDelta[] {\n const byId = new Map<string, { name: string; successful: boolean; used: boolean }>();\n const assistantTerms = normalizeText(assistantContent);\n\n for (const ev of toolEvents) {\n if (!ev.name) continue;\n const key = ev.id || `${ev.phase}:${ev.name}`;\n const existing = byId.get(key) ?? { name: ev.name, successful: false, used: false };\n\n if (ev.phase === \"call\") {\n existing.name = ev.name;\n } else if (ev.phase === \"result\") {\n const successful = !isErrorPayload(ev.payload);\n existing.successful = successful;\n existing.used = successful && payloadLooksUsed(ev.payload, assistantTerms);\n }\n\n byId.set(key, existing);\n }\n\n const totals = new Map<string, ToolUsageDelta>();\n for (const ev of toolEvents) {\n if (ev.phase !== \"call\" || !ev.name) continue;\n const key = ev.id || `${ev.phase}:${ev.name}`;\n const outcome = byId.get(key);\n const next = totals.get(ev.name) ?? {\n name: ev.name,\n calls: 0,\n successes: 0,\n errors: 0,\n used: 0,\n };\n next.calls += 1;\n if (outcome?.successful) next.successes += 1;\n else next.errors += 1;\n if (outcome?.used) next.used += 1;\n totals.set(ev.name, next);\n }\n\n return [...totals.values()];\n}\n\nfunction payloadLooksUsed(payload: unknown, assistantTerms: Set<string>): boolean {\n if (assistantTerms.size === 0) return false;\n const candidates = extractPayloadTerms(payload);\n if (candidates.length === 0) return false;\n\n let matched = 0;\n for (const term of candidates) {\n if (assistantTerms.has(term)) matched += 1;\n if (matched >= 2) return true;\n }\n return false;\n}\n\nfunction extractPayloadTerms(payload: unknown): string[] {\n const raw = stringifyPayload(payload);\n if (!raw) return [];\n const unique = new Set<string>();\n for (const token of raw.toLowerCase().split(/[^a-z0-9_./:-]+/)) {\n if (token.length < 4) continue;\n if (/^\\d+$/.test(token) && token.length < 6) continue;\n unique.add(token);\n if (unique.size >= 24) break;\n }\n return [...unique];\n}\n\nfunction stringifyPayload(payload: unknown): string {\n if (typeof payload === \"string\") return payload;\n try {\n return JSON.stringify(payload);\n } catch {\n return \"\";\n }\n}\n\nfunction normalizeText(text: string): Set<string> {\n const out = new Set<string>();\n for (const token of text.toLowerCase().split(/[^a-z0-9_./:-]+/)) {\n if (token.length < 4) continue;\n out.add(token);\n }\n return out;\n}\n\nfunction isErrorPayload(payload: unknown): boolean {\n if (typeof payload === \"string\") return /\\berror\\b|\\bfailed\\b|\\bexception\\b/i.test(payload);\n if (!payload || typeof payload !== \"object\") return false;\n if (\"error\" in payload || \"errors\" in payload) return true;\n const status = \"status\" in payload ? (payload as { status?: unknown }).status : undefined;\n if (typeof status === \"string\" && /error|failed/i.test(status)) return true;\n return false;\n}\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, value));\n}","module.exports = require(\"node:fs/promises\");","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getDb } from \"@/lib/db\";\nimport { listToolStats, toStats } from \"@/lib/stores/tool-stats\";\nimport type { PersistedToolEvent } from \"@/lib/stores/threads\";\n\nconst CHARS_PER_TOKEN = 4;\nconst DEFAULT_WINDOW_DAYS = 30;\n\nexport interface DashboardTierTokens {\n hot_tokens: number;\n warm_tokens: number;\n facts_tokens: number;\n overhead_tokens: number;\n /** Sum of the four tiers — convenience for stacked-bar totals. */\n measured_input_tokens: number;\n}\n\nexport interface DashboardDataQuality {\n /** Assistant turns in the window that have an immutable message_usage snapshot. */\n measured_messages: number;\n /** Assistant turns falling back to content-length estimates. */\n estimated_messages: number;\n /** measured / (measured + estimated), 0..1; 1 when no traffic. */\n measured_pct: number;\n}\n\nexport interface DashboardSeriesPoint {\n day: string;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n tool_calls: number;\n tool_successes: number;\n tool_errors: number;\n success_rate: number;\n error_rate: number;\n /** Per-tier breakdown of authoritative snapshot input tokens for the\n * day. Zero for legacy rows with no message_usage entry — these are\n * surfaced via the `data_quality` chip instead so users know the bar\n * reflects only measured traffic. */\n tier_tokens: DashboardTierTokens;\n}\n\nexport interface DashboardToolTop {\n name: string;\n call_count: number;\n success_count: number;\n error_count: number;\n score: number;\n success_rate: number;\n last_called_at: string | null;\n}\n\nexport interface DashboardAgentTop {\n agent_id: string;\n agent_name: string;\n message_count: number;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n}\n\nexport interface DashboardProviderRate {\n provider: string;\n input_per_1m_usd: number | null;\n output_per_1m_usd: number | null;\n source: string;\n inferred: boolean;\n confidence: \"high\" | \"medium\" | \"low\";\n ok: boolean;\n status: number | null;\n error: string | null;\n}\n\nexport interface DashboardModelRate {\n provider: string;\n model_id: string;\n input_per_1m_usd: number | null;\n output_per_1m_usd: number | null;\n source: string;\n inferred: boolean;\n confidence: \"high\" | \"medium\" | \"low\";\n ok: boolean;\n status: number | null;\n error: string | null;\n}\n\nexport interface DashboardProviderBreakdown {\n provider: string;\n message_count: number;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n}\n\nexport interface DashboardModelBreakdown {\n model_config_name: string;\n provider: string;\n model_id: string;\n message_count: number;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n}\n\nexport interface DashboardDayBreakdown {\n day: string;\n summary: {\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n tool_calls: number;\n tool_successes: number;\n tool_errors: number;\n success_rate: number;\n error_rate: number;\n tier_tokens: DashboardTierTokens;\n };\n top_agents: DashboardAgentTop[];\n by_provider: DashboardProviderBreakdown[];\n by_model: DashboardModelBreakdown[];\n}\n\nexport interface DashboardMetrics {\n generated_at: string;\n days: number;\n summary: {\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n tool_calls: number;\n tool_successes: number;\n tool_errors: number;\n success_rate: number;\n error_rate: number;\n tier_tokens: DashboardTierTokens;\n data_quality: DashboardDataQuality;\n };\n series: DashboardSeriesPoint[];\n top_tools: DashboardToolTop[];\n top_agents: DashboardAgentTop[];\n by_provider: DashboardProviderBreakdown[];\n by_model: DashboardModelBreakdown[];\n breakdowns_by_day: Record<string, DashboardDayBreakdown>;\n pricing: {\n snapshot_generated_at: string | null;\n rates: DashboardProviderRate[];\n model_rates: DashboardModelRate[];\n notes: string;\n };\n}\n\ntype UsageRow = {\n created_at: string;\n role: string;\n content: string;\n tool_events: string | null;\n thread_id: string;\n agent_id: string;\n agent_name: string | null;\n provider: string | null;\n model_id: string | null;\n model_config_name: string | null;\n // ADR-0041: when present, these snapshotted values are authoritative\n // for this assistant turn. Provider/model/agent_name override the JOIN.\n mu_input_tokens: number | null;\n mu_output_tokens: number | null;\n mu_cost_usd: number | null;\n mu_provider: string | null;\n mu_model_id: string | null;\n mu_model_config_name: string | null;\n mu_agent_id: string | null;\n mu_agent_name: string | null;\n mu_hot_tokens: number | null;\n mu_warm_tokens: number | null;\n mu_facts_tokens: number | null;\n mu_overhead_tokens: number | null;\n};\n\ntype TierBucket = {\n hot: number;\n warm: number;\n facts: number;\n overhead: number;\n};\n\ntype DayBucket = {\n inputTokens: number;\n outputTokens: number;\n estimatedCost: number;\n toolCalls: number;\n toolSuccesses: number;\n toolErrors: number;\n tier: TierBucket;\n};\n\ntype AgentBucket = {\n agent_id: string;\n agent_name: string;\n message_count: number;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n};\n\ntype ProviderBucket = {\n provider: string;\n message_count: number;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n};\n\ntype ModelBucket = {\n model_config_name: string;\n provider: string;\n model_id: string;\n message_count: number;\n input_tokens_est: number;\n output_tokens_est: number;\n estimated_cost_usd: number;\n};\n\ntype ProviderRates = {\n inputPer1M: number | null;\n outputPer1M: number | null;\n source: string;\n inferred: boolean;\n confidence: \"high\" | \"medium\" | \"low\";\n ok: boolean;\n status: number | null;\n error: string | null;\n};\n\ntype PricingSnapshotSource = {\n id: string;\n pricing_url: string;\n resolved_url?: string | null;\n ok?: boolean;\n status?: number | null;\n error?: string | null;\n price_signals?: string[];\n model_rates?: Array<{\n model_id: string;\n input_per_1m_usd: number | null;\n output_per_1m_usd: number | null;\n inferred?: boolean;\n confidence?: \"high\" | \"medium\" | \"low\";\n }>;\n};\n\ntype PricingSnapshot = {\n generated_at?: string;\n sources?: PricingSnapshotSource[];\n};\n\nexport async function getDashboardMetrics(days = DEFAULT_WINDOW_DAYS): Promise<DashboardMetrics> {\n const now = new Date();\n const boundedDays = Number.isFinite(days) ? Math.min(120, Math.max(7, Math.floor(days))) : DEFAULT_WINDOW_DAYS;\n const since = new Date(now.getTime() - (boundedDays * 24 * 60 * 60 * 1000)).toISOString();\n\n const usageRows = getDb()\n .prepare(\n `SELECT m.created_at, m.role, m.content, m.tool_events, m.thread_id, t.agent_id,\n a.name AS agent_name, mc.provider AS provider,\n mc.model_id AS model_id,\n COALESCE(ta.model_config_name, a.model_config_name, dmc.name) AS model_config_name,\n mu.input_tokens AS mu_input_tokens,\n mu.output_tokens AS mu_output_tokens,\n mu.cost_usd AS mu_cost_usd,\n mu.provider AS mu_provider,\n mu.model_id AS mu_model_id,\n mu.model_config_name AS mu_model_config_name,\n mu.agent_id AS mu_agent_id,\n mu.agent_name AS mu_agent_name,\n mu.hot_tokens AS mu_hot_tokens,\n mu.warm_tokens AS mu_warm_tokens,\n mu.facts_tokens AS mu_facts_tokens,\n mu.overhead_tokens AS mu_overhead_tokens\n FROM messages m\n JOIN threads t ON t.thread_id = m.thread_id\n LEFT JOIN agent_configs a ON a.id = t.agent_id\n LEFT JOIN task_assignments ta ON ta.agent_id = t.agent_id\n LEFT JOIN model_configs dmc ON dmc.name = (\n SELECT name\n FROM model_configs\n WHERE is_default = 1\n ORDER BY updated_at DESC\n LIMIT 1\n )\n LEFT JOIN model_configs mc ON mc.name = COALESCE(ta.model_config_name, a.model_config_name, dmc.name)\n LEFT JOIN message_usage mu ON mu.message_id = m.msg_id\n WHERE m.created_at >= ?\n ORDER BY m.created_at ASC`,\n )\n .all(since) as UsageRow[];\n\n // ADR-0041: when an assistant turn has a snapshot, its `input_tokens`\n // already accounts for the entire prompt the model saw — so we must NOT\n // also count this thread's user messages via the content-length estimate\n // or we double-count. Track which threads have any snapshot in the\n // window and suppress their user-side estimates wholesale. Threads with\n // zero snapshots (legacy data, or recorded before the migration) fall\n // back to the old estimate path unchanged.\n const snapshotThreadIds = new Set<string>();\n for (const r of usageRows) {\n // A row with provider tokens (input_tokens > 0) is the authoritative\n // count the dashboard cares about. Snapshot-only rows persisted for\n // the per-tier context-usage bar carry input_tokens=0 + cost_usd=null\n // and must NOT suppress the content-length estimate for that thread.\n if (r.mu_input_tokens != null && r.mu_input_tokens > 0) {\n snapshotThreadIds.add(r.thread_id);\n }\n }\n\n const { byProvider, byProviderModel, byModel, generatedAt } = await loadProviderRates();\n const dayMap = seedDayBuckets(now, boundedDays);\n const agentMap = new Map<string, AgentBucket>();\n const providerMap = new Map<string, ProviderBucket>();\n const modelMap = new Map<string, ModelBucket>();\n // Per-day breakdown maps. Populated lazily — only days that saw traffic\n // get an entry. Each entry mirrors the global agent/provider/model maps\n // but scoped to that day so the UI can re-slice when a day is selected.\n type DayBreakdownBucket = {\n agents: Map<string, AgentBucket>;\n providers: Map<string, ProviderBucket>;\n models: Map<string, ModelBucket>;\n };\n const dayBreakdownMap = new Map<string, DayBreakdownBucket>();\n const ensureDayBreakdown = (day: string): DayBreakdownBucket => {\n let entry = dayBreakdownMap.get(day);\n if (!entry) {\n entry = { agents: new Map(), providers: new Map(), models: new Map() };\n dayBreakdownMap.set(day, entry);\n }\n return entry;\n };\n\n let totalInput = 0;\n let totalOutput = 0;\n let totalCost = 0;\n let totalCalls = 0;\n let totalSuccesses = 0;\n let totalErrors = 0;\n const tierTotals: TierBucket = { hot: 0, warm: 0, facts: 0, overhead: 0 };\n // Data-quality counters: only assistant turns are eligible since\n // user/system rows never carry a message_usage snapshot by design.\n let measuredAssistantMessages = 0;\n let estimatedAssistantMessages = 0;\n\n for (const row of usageRows) {\n const day = row.created_at.slice(0, 10);\n const dayBucket = dayMap.get(day);\n if (!dayBucket) continue;\n\n // ADR-0041: prefer snapshot when present. Snapshot rows are\n // authoritative for tokens, $, AND attribution (provider/model/agent\n // name) for that assistant turn — they survive reassignment, rename,\n // and pricing-snapshot refresh.\n const hasSnapshot = row.mu_input_tokens != null;\n const threadHasSnapshot = snapshotThreadIds.has(row.thread_id);\n\n let inputTokens = 0;\n let outputTokens = 0;\n let estCost = 0;\n let attribProvider: string | null = row.provider;\n let attribModelId: string | null = row.model_id;\n let attribModelConfig: string | null = row.model_config_name;\n let attribAgentId: string = row.agent_id;\n let attribAgentName: string | null = row.agent_name;\n\n if (hasSnapshot) {\n inputTokens = row.mu_input_tokens ?? 0;\n outputTokens = row.mu_output_tokens ?? 0;\n estCost = row.mu_cost_usd ?? 0;\n attribProvider = row.mu_provider ?? attribProvider;\n attribModelId = row.mu_model_id ?? attribModelId;\n attribModelConfig = row.mu_model_config_name ?? attribModelConfig;\n attribAgentId = row.mu_agent_id ?? attribAgentId;\n attribAgentName = row.mu_agent_name ?? attribAgentName;\n if (row.role === \"assistant\") measuredAssistantMessages += 1;\n // Accumulate tier breakdown — null columns (legacy snapshots\n // before the tier wire-up) contribute zero, which is the right\n // behaviour for a stacked bar that visualises *known* tier split.\n const hot = row.mu_hot_tokens ?? 0;\n const warm = row.mu_warm_tokens ?? 0;\n const facts = row.mu_facts_tokens ?? 0;\n const overhead = row.mu_overhead_tokens ?? 0;\n tierTotals.hot += hot;\n tierTotals.warm += warm;\n tierTotals.facts += facts;\n tierTotals.overhead += overhead;\n dayBucket.tier.hot += hot;\n dayBucket.tier.warm += warm;\n dayBucket.tier.facts += facts;\n dayBucket.tier.overhead += overhead;\n } else if (row.role === \"user\" && threadHasSnapshot) {\n // Suppressed: snapshotted assistant turns in this thread already\n // capture this user message's tokens in their input_tokens.\n // Still contributes message_count via the rest of the loop.\n } else {\n const tokenEstimate = estimateTokens(row.content);\n const isInput = row.role === \"user\";\n inputTokens = isInput ? tokenEstimate : 0;\n outputTokens = isInput ? 0 : tokenEstimate;\n const rates = modelRatesFor(byProvider, byProviderModel, byModel, row.provider, row.model_id);\n estCost = estimateCostUsd(inputTokens, outputTokens, rates);\n if (row.role === \"assistant\") estimatedAssistantMessages += 1;\n }\n\n dayBucket.inputTokens += inputTokens;\n dayBucket.outputTokens += outputTokens;\n dayBucket.estimatedCost += estCost;\n\n totalInput += inputTokens;\n totalOutput += outputTokens;\n totalCost += estCost;\n\n const agentName = attribAgentName?.trim() || attribAgentId;\n const agentBucket = agentMap.get(attribAgentId) ?? {\n agent_id: attribAgentId,\n agent_name: agentName,\n message_count: 0,\n input_tokens_est: 0,\n output_tokens_est: 0,\n estimated_cost_usd: 0,\n };\n agentBucket.message_count += 1;\n agentBucket.input_tokens_est += inputTokens;\n agentBucket.output_tokens_est += outputTokens;\n agentBucket.estimated_cost_usd += estCost;\n agentMap.set(attribAgentId, agentBucket);\n\n const providerName = attribProvider?.trim().toLowerCase() || \"unassigned\";\n const providerBucket = providerMap.get(providerName) ?? {\n provider: providerName,\n message_count: 0,\n input_tokens_est: 0,\n output_tokens_est: 0,\n estimated_cost_usd: 0,\n };\n providerBucket.message_count += 1;\n providerBucket.input_tokens_est += inputTokens;\n providerBucket.output_tokens_est += outputTokens;\n providerBucket.estimated_cost_usd += estCost;\n providerMap.set(providerName, providerBucket);\n\n const modelConfigName = attribModelConfig?.trim() || \"unassigned\";\n const modelId = attribModelId?.trim() || \"unknown\";\n const modelKey = `${providerName}::${modelConfigName}::${modelId}`;\n const modelBucket = modelMap.get(modelKey) ?? {\n model_config_name: modelConfigName,\n provider: providerName,\n model_id: modelId,\n message_count: 0,\n input_tokens_est: 0,\n output_tokens_est: 0,\n estimated_cost_usd: 0,\n };\n modelBucket.message_count += 1;\n modelBucket.input_tokens_est += inputTokens;\n modelBucket.output_tokens_est += outputTokens;\n modelBucket.estimated_cost_usd += estCost;\n modelMap.set(modelKey, modelBucket);\n\n const dayBreakdown = ensureDayBreakdown(day);\n const dayAgent = dayBreakdown.agents.get(attribAgentId) ?? {\n agent_id: attribAgentId,\n agent_name: agentName,\n message_count: 0,\n input_tokens_est: 0,\n output_tokens_est: 0,\n estimated_cost_usd: 0,\n };\n dayAgent.message_count += 1;\n dayAgent.input_tokens_est += inputTokens;\n dayAgent.output_tokens_est += outputTokens;\n dayAgent.estimated_cost_usd += estCost;\n dayBreakdown.agents.set(attribAgentId, dayAgent);\n\n const dayProvider = dayBreakdown.providers.get(providerName) ?? {\n provider: providerName,\n message_count: 0,\n input_tokens_est: 0,\n output_tokens_est: 0,\n estimated_cost_usd: 0,\n };\n dayProvider.message_count += 1;\n dayProvider.input_tokens_est += inputTokens;\n dayProvider.output_tokens_est += outputTokens;\n dayProvider.estimated_cost_usd += estCost;\n dayBreakdown.providers.set(providerName, dayProvider);\n\n const dayModel = dayBreakdown.models.get(modelKey) ?? {\n model_config_name: modelConfigName,\n provider: providerName,\n model_id: modelId,\n message_count: 0,\n input_tokens_est: 0,\n output_tokens_est: 0,\n estimated_cost_usd: 0,\n };\n dayModel.message_count += 1;\n dayModel.input_tokens_est += inputTokens;\n dayModel.output_tokens_est += outputTokens;\n dayModel.estimated_cost_usd += estCost;\n dayBreakdown.models.set(modelKey, dayModel);\n\n if (row.tool_events && row.tool_events.length > 1) {\n const usage = summarizeEvents(row.tool_events);\n if (usage.calls > 0) {\n dayBucket.toolCalls += usage.calls;\n dayBucket.toolSuccesses += usage.successes;\n dayBucket.toolErrors += usage.errors;\n totalCalls += usage.calls;\n totalSuccesses += usage.successes;\n totalErrors += usage.errors;\n }\n }\n }\n\n const series = [...dayMap.entries()].map(([day, b]) => {\n const successRate = b.toolCalls > 0 ? b.toolSuccesses / b.toolCalls : 1;\n const errorRate = b.toolCalls > 0 ? b.toolErrors / b.toolCalls : 0;\n return {\n day,\n input_tokens_est: b.inputTokens,\n output_tokens_est: b.outputTokens,\n estimated_cost_usd: b.estimatedCost,\n tool_calls: b.toolCalls,\n tool_successes: b.toolSuccesses,\n tool_errors: b.toolErrors,\n success_rate: round4(successRate),\n error_rate: round4(errorRate),\n tier_tokens: tierBucketToTokens(b.tier),\n } satisfies DashboardSeriesPoint;\n });\n\n const top_tools = listToolStats()\n .map((row) => {\n const stats = toStats(row);\n return {\n name: row.tool_name,\n call_count: row.call_count,\n success_count: row.success_count,\n error_count: row.error_count,\n score: round4(stats.score),\n success_rate: round4(stats.success_rate),\n last_called_at: row.last_called_at,\n } satisfies DashboardToolTop;\n })\n .sort((a, b) => {\n if (b.call_count !== a.call_count) return b.call_count - a.call_count;\n if (b.score !== a.score) return b.score - a.score;\n return a.name.localeCompare(b.name);\n })\n .slice(0, 10);\n\n const top_agents = [...agentMap.values()]\n .sort((a, b) => {\n if (b.estimated_cost_usd !== a.estimated_cost_usd) return b.estimated_cost_usd - a.estimated_cost_usd;\n if (b.message_count !== a.message_count) return b.message_count - a.message_count;\n return a.agent_name.localeCompare(b.agent_name);\n })\n .slice(0, 8)\n .map((row) => ({\n ...row,\n estimated_cost_usd: row.estimated_cost_usd,\n }));\n\n const by_provider = [...providerMap.values()]\n .sort((a, b) => {\n if (b.estimated_cost_usd !== a.estimated_cost_usd) return b.estimated_cost_usd - a.estimated_cost_usd;\n if (b.message_count !== a.message_count) return b.message_count - a.message_count;\n return a.provider.localeCompare(b.provider);\n })\n .map((row) => ({\n ...row,\n estimated_cost_usd: row.estimated_cost_usd,\n }));\n\n const by_model = [...modelMap.values()]\n .sort((a, b) => {\n if (b.estimated_cost_usd !== a.estimated_cost_usd) return b.estimated_cost_usd - a.estimated_cost_usd;\n if (b.message_count !== a.message_count) return b.message_count - a.message_count;\n return a.model_config_name.localeCompare(b.model_config_name);\n })\n .map((row) => ({\n ...row,\n estimated_cost_usd: row.estimated_cost_usd,\n }));\n\n const overallSuccessRate = totalCalls > 0 ? totalSuccesses / totalCalls : 1;\n const overallErrorRate = totalCalls > 0 ? totalErrors / totalCalls : 0;\n\n const seriesByDay = new Map(series.map((s) => [s.day, s]));\n const breakdowns_by_day: Record<string, DashboardDayBreakdown> = {};\n for (const [day, bucket] of dayBreakdownMap.entries()) {\n const dayPoint = seriesByDay.get(day);\n const dayAgents = [...bucket.agents.values()]\n .sort((a, b) => {\n if (b.estimated_cost_usd !== a.estimated_cost_usd) return b.estimated_cost_usd - a.estimated_cost_usd;\n if (b.message_count !== a.message_count) return b.message_count - a.message_count;\n return a.agent_name.localeCompare(b.agent_name);\n })\n .slice(0, 8);\n const dayProviders = [...bucket.providers.values()].sort((a, b) => {\n if (b.estimated_cost_usd !== a.estimated_cost_usd) return b.estimated_cost_usd - a.estimated_cost_usd;\n if (b.message_count !== a.message_count) return b.message_count - a.message_count;\n return a.provider.localeCompare(b.provider);\n });\n const dayModels = [...bucket.models.values()].sort((a, b) => {\n if (b.estimated_cost_usd !== a.estimated_cost_usd) return b.estimated_cost_usd - a.estimated_cost_usd;\n if (b.message_count !== a.message_count) return b.message_count - a.message_count;\n return a.model_config_name.localeCompare(b.model_config_name);\n });\n breakdowns_by_day[day] = {\n day,\n summary: {\n input_tokens_est: dayPoint?.input_tokens_est ?? 0,\n output_tokens_est: dayPoint?.output_tokens_est ?? 0,\n estimated_cost_usd: dayPoint?.estimated_cost_usd ?? 0,\n tool_calls: dayPoint?.tool_calls ?? 0,\n tool_successes: dayPoint?.tool_successes ?? 0,\n tool_errors: dayPoint?.tool_errors ?? 0,\n success_rate: dayPoint?.success_rate ?? 1,\n error_rate: dayPoint?.error_rate ?? 0,\n tier_tokens: dayPoint?.tier_tokens ?? emptyTierTokens(),\n },\n top_agents: dayAgents,\n by_provider: dayProviders,\n by_model: dayModels,\n };\n }\n\n return {\n generated_at: now.toISOString(),\n days: boundedDays,\n summary: {\n input_tokens_est: totalInput,\n output_tokens_est: totalOutput,\n estimated_cost_usd: totalCost,\n tool_calls: totalCalls,\n tool_successes: totalSuccesses,\n tool_errors: totalErrors,\n success_rate: round4(overallSuccessRate),\n error_rate: round4(overallErrorRate),\n tier_tokens: tierBucketToTokens(tierTotals),\n data_quality: computeDataQuality(measuredAssistantMessages, estimatedAssistantMessages),\n },\n series,\n top_tools,\n top_agents,\n by_provider,\n by_model,\n breakdowns_by_day,\n pricing: {\n snapshot_generated_at: generatedAt,\n rates: [...byProvider.entries()]\n .map(([provider, rates]) => ({\n provider,\n input_per_1m_usd: rates.inputPer1M,\n output_per_1m_usd: rates.outputPer1M,\n source: rates.source,\n inferred: rates.inferred,\n confidence: rates.confidence,\n ok: rates.ok,\n status: rates.status,\n error: rates.error,\n }))\n .sort((a, b) => a.provider.localeCompare(b.provider)),\n model_rates: [...byProviderModel.entries()]\n .map(([key, rates]) => {\n const splitAt = key.indexOf(\"::\");\n const provider = splitAt > -1 ? key.slice(0, splitAt) : key;\n const model_id = splitAt > -1 ? key.slice(splitAt + 2) : \"unknown\";\n return {\n provider,\n model_id,\n input_per_1m_usd: rates.inputPer1M,\n output_per_1m_usd: rates.outputPer1M,\n source: rates.source,\n inferred: rates.inferred,\n confidence: rates.confidence,\n ok: rates.ok,\n status: rates.status,\n error: rates.error,\n } satisfies DashboardModelRate;\n })\n .sort((a, b) => {\n if (a.provider !== b.provider) return a.provider.localeCompare(b.provider);\n return a.model_id.localeCompare(b.model_id);\n }),\n notes: \"Estimated costs are heuristic: token counts are content-length based and rates are inferred from pricing page signals (provider-model first, then provider fallback).\",\n },\n };\n}\n\nfunction seedDayBuckets(now: Date, days: number): Map<string, DayBucket> {\n const out = new Map<string, DayBucket>();\n for (let i = days - 1; i >= 0; i -= 1) {\n const d = new Date(now.getTime() - (i * 24 * 60 * 60 * 1000));\n const day = d.toISOString().slice(0, 10);\n out.set(day, {\n inputTokens: 0,\n outputTokens: 0,\n estimatedCost: 0,\n toolCalls: 0,\n toolSuccesses: 0,\n toolErrors: 0,\n tier: { hot: 0, warm: 0, facts: 0, overhead: 0 },\n });\n }\n return out;\n}\n\nfunction emptyTierTokens(): DashboardTierTokens {\n return { hot_tokens: 0, warm_tokens: 0, facts_tokens: 0, overhead_tokens: 0, measured_input_tokens: 0 };\n}\n\nfunction tierBucketToTokens(b: TierBucket): DashboardTierTokens {\n return {\n hot_tokens: b.hot,\n warm_tokens: b.warm,\n facts_tokens: b.facts,\n overhead_tokens: b.overhead,\n measured_input_tokens: b.hot + b.warm + b.facts + b.overhead,\n };\n}\n\nexport function computeDataQuality(measured: number, estimated: number): DashboardDataQuality {\n const total = measured + estimated;\n return {\n measured_messages: measured,\n estimated_messages: estimated,\n measured_pct: total === 0 ? 1 : round4(measured / total),\n };\n}\n\nfunction estimateTokens(text: string): number {\n const trimmed = text.trim();\n if (!trimmed) return 0;\n return Math.max(1, Math.ceil(trimmed.length / CHARS_PER_TOKEN));\n}\n\nfunction estimateCostUsd(inputTokens: number, outputTokens: number, rates: ProviderRates): number {\n const inputRate = rates.inputPer1M;\n const outputRate = rates.outputPer1M;\n if (inputRate == null && outputRate == null) return 0;\n const inCost = inputRate == null ? 0 : (inputTokens / 1_000_000) * inputRate;\n const outCost = outputRate == null ? 0 : (outputTokens / 1_000_000) * outputRate;\n return inCost + outCost;\n}\n\nfunction providerRatesFor(byProvider: Map<string, ProviderRates>, provider: string | null): ProviderRates {\n if (!provider) return { inputPer1M: null, outputPer1M: null, source: \"unknown\", inferred: true, confidence: \"low\", ok: false, status: null, error: \"no provider assigned\" };\n return byProvider.get(provider.toLowerCase())\n ?? { inputPer1M: null, outputPer1M: null, source: \"unknown\", inferred: true, confidence: \"low\", ok: false, status: null, error: \"provider missing in pricing snapshot\" };\n}\n\nfunction modelRatesFor(\n byProvider: Map<string, ProviderRates>,\n byProviderModel: Map<string, ProviderRates>,\n byModel: Map<string, ProviderRates>,\n provider: string | null,\n modelId: string | null,\n): ProviderRates {\n if (!modelId) {\n return providerRatesFor(byProvider, provider);\n }\n const modelKey = modelId.trim().toLowerCase();\n if (!modelKey) return providerRatesFor(byProvider, provider);\n\n // 1. Prefer (provider, model_id) when both are present.\n if (provider) {\n const providerKey = normalizeProvider(provider);\n if (providerKey) {\n const candidates = modelAliasCandidates(providerKey, modelKey);\n for (const candidate of candidates) {\n const exact = byProviderModel.get(`${providerKey}::${candidate}`);\n if (exact) return exact;\n }\n // GitHub Copilot model configs proxy multiple upstream providers.\n // If no direct copilot model rate exists, fall back to the upstream\n // provider/model inferred from the model id.\n if (providerKey === \"github-copilot\") {\n const upstream = inferProviderFromModelId(modelKey);\n if (upstream) {\n const upstreamCandidates = modelAliasCandidates(upstream, modelKey);\n for (const candidate of upstreamCandidates) {\n const viaUpstreamModel = byProviderModel.get(`${upstream}::${candidate}`);\n if (viaUpstreamModel) return viaUpstreamModel;\n }\n const upstreamProviderRate = byProvider.get(upstream);\n if (upstreamProviderRate && upstreamProviderRate.ok) return upstreamProviderRate;\n }\n }\n }\n }\n\n // 2. Aggregator-agnostic fallback: lookup by model_id alone. Covers\n // cases where the configured provider doesn't publish per-model\n // pricing but the same model id is rated by its upstream vendor.\n for (const candidate of modelAliasCandidates(provider ? (normalizeProvider(provider) ?? \"\") : \"\", modelKey)) {\n const viaModel = byModel.get(candidate);\n if (viaModel) return viaModel;\n }\n const directModel = byModel.get(modelKey);\n if (directModel) return directModel;\n\n return providerRatesFor(byProvider, provider);\n}\n\nfunction modelAliasCandidates(provider: string, modelId: string): string[] {\n const out = new Set<string>();\n const id = modelId.trim().toLowerCase();\n if (!id) return [];\n out.add(id);\n\n if (provider === \"deepseek\") {\n if (/reasoner/.test(id) || /r1/.test(id)) {\n out.add(\"deepseek-reasoner\");\n }\n if (/chat/.test(id) || /v[0-9]/.test(id) || /coder/.test(id)) {\n out.add(\"deepseek-chat\");\n }\n }\n\n return [...out];\n}\n\nfunction inferProviderFromModelId(modelId: string): string | null {\n const id = modelId.trim().toLowerCase();\n if (!id) return null;\n if (id.startsWith(\"gpt-\") || /^o[1-4](?:-|$)/.test(id)) return \"openai\";\n if (id.startsWith(\"claude-\")) return \"anthropic\";\n if (id.startsWith(\"gemini-\")) return \"google\";\n if (id.startsWith(\"deepseek-\")) return \"deepseek\";\n if (id.startsWith(\"command-\") || id.startsWith(\"embed-\")) return \"cohere\";\n return null;\n}\n\nfunction summarizeEvents(raw: string): { calls: number; successes: number; errors: number } {\n let events: PersistedToolEvent[] = [];\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (Array.isArray(parsed)) events = parsed as PersistedToolEvent[];\n } catch {\n return { calls: 0, successes: 0, errors: 0 };\n }\n\n const resultById = new Map<string, boolean>();\n for (const ev of events) {\n if (!ev || ev.phase !== \"result\") continue;\n const key = ev.id || `${ev.phase}:${ev.name}`;\n resultById.set(key, !isErrorPayload(ev.payload));\n }\n\n let calls = 0;\n let successes = 0;\n let errors = 0;\n\n for (const ev of events) {\n if (!ev || ev.phase !== \"call\") continue;\n calls += 1;\n const key = ev.id || `${ev.phase}:${ev.name}`;\n const ok = resultById.get(key);\n if (ok === true) successes += 1;\n else errors += 1;\n }\n\n return { calls, successes, errors };\n}\n\nfunction isErrorPayload(payload: unknown): boolean {\n if (typeof payload === \"string\") return /\\berror\\b|\\bfailed\\b|\\bexception\\b/i.test(payload);\n if (!payload || typeof payload !== \"object\") return false;\n if (\"error\" in payload || \"errors\" in payload) return true;\n const status = \"status\" in payload ? (payload as { status?: unknown }).status : undefined;\n return typeof status === \"string\" && /error|failed/i.test(status);\n}\n\nasync function loadProviderRates(): Promise<{\n byProvider: Map<string, ProviderRates>;\n byProviderModel: Map<string, ProviderRates>;\n byModel: Map<string, ProviderRates>;\n generatedAt: string | null;\n}> {\n const snapshot = await readPricingSnapshot();\n const out = new Map<string, ProviderRates>();\n const byProviderModel = new Map<string, ProviderRates>();\n const byModel = new Map<string, ProviderRates>();\n const expectedProviders = [\"openai\", \"anthropic\", \"google\", \"deepseek\", \"cohere\", \"github-copilot\"];\n\n for (const provider of expectedProviders) {\n out.set(provider, {\n inputPer1M: null,\n outputPer1M: null,\n source: \"snapshot-missing\",\n inferred: true,\n confidence: \"low\",\n ok: false,\n status: null,\n error: \"provider missing in pricing snapshot\",\n });\n }\n\n if (!snapshot?.sources) {\n return { byProvider: out, byProviderModel, byModel, generatedAt: null };\n }\n\n for (const source of snapshot.sources) {\n const key = normalizeProvider(source.id);\n if (!key) continue;\n const parsed = inferRatesFromSignals(source.price_signals ?? []);\n const modelInputRates = (source.model_rates ?? [])\n .map((m) => m.input_per_1m_usd)\n .filter((v): v is number => typeof v === \"number\" && Number.isFinite(v) && v > 0)\n .sort((a, b) => a - b);\n const modelOutputRates = (source.model_rates ?? [])\n .map((m) => m.output_per_1m_usd)\n .filter((v): v is number => typeof v === \"number\" && Number.isFinite(v) && v > 0)\n .sort((a, b) => a - b);\n\n const providerInput = parsed.inputPer1M ?? (modelInputRates[0] ?? null);\n const providerOutput = parsed.outputPer1M ?? (modelOutputRates[0] ?? null);\n const providerDerivedFromModels = parsed.inputPer1M == null && parsed.outputPer1M == null\n && (providerInput != null || providerOutput != null);\n\n out.set(key, {\n inputPer1M: providerInput,\n outputPer1M: providerOutput,\n source: source.resolved_url ?? source.pricing_url,\n inferred: providerDerivedFromModels ? true : parsed.inferred,\n confidence: providerDerivedFromModels ? \"medium\" : parsed.confidence,\n ok: source.ok !== false || providerDerivedFromModels,\n status: source.status ?? null,\n error: source.error ?? null,\n });\n\n for (const modelRate of source.model_rates ?? []) {\n const normalizedModel = modelRate.model_id?.trim().toLowerCase();\n if (!normalizedModel) continue;\n const entry: ProviderRates = {\n inputPer1M: modelRate.input_per_1m_usd,\n outputPer1M: modelRate.output_per_1m_usd,\n source: source.resolved_url ?? source.pricing_url,\n inferred: modelRate.inferred !== false,\n confidence: modelRate.confidence ?? \"low\",\n ok: source.ok !== false,\n status: source.status ?? null,\n error: source.error ?? null,\n };\n byProviderModel.set(`${key}::${normalizedModel}`, entry);\n const existing = byModel.get(normalizedModel);\n if (!existing || isBetterRate(entry, existing)) {\n byModel.set(normalizedModel, entry);\n }\n }\n }\n\n return { byProvider: out, byProviderModel, byModel, generatedAt: snapshot.generated_at ?? null };\n}\n\nfunction isBetterRate(next: ProviderRates, prev: ProviderRates): boolean {\n const nextHas = next.inputPer1M != null || next.outputPer1M != null;\n const prevHas = prev.inputPer1M != null || prev.outputPer1M != null;\n if (nextHas && !prevHas) return true;\n if (!nextHas && prevHas) return false;\n const rank = { high: 2, medium: 1, low: 0 } as const;\n return rank[next.confidence] > rank[prev.confidence];\n}\n\nasync function readPricingSnapshot(): Promise<PricingSnapshot | null> {\n try {\n const filePath = join(process.cwd(), \"docs\", \"journal\", \"pricing-snapshot.json\");\n const raw = await readFile(filePath, \"utf8\");\n return JSON.parse(raw) as PricingSnapshot;\n } catch {\n return null;\n }\n}\n\nfunction normalizeProvider(id: string): string | null {\n const lower = id.toLowerCase();\n if (lower.includes(\"github\") || lower.includes(\"copilot\")) return \"github-copilot\";\n if (lower.includes(\"google\") || lower.includes(\"gemini\")) return \"google\";\n if (lower.includes(\"openai\")) return \"openai\";\n if (lower.includes(\"anthropic\")) return \"anthropic\";\n if (lower.includes(\"cohere\")) return \"cohere\";\n if (lower.includes(\"deepseek\")) return \"deepseek\";\n return lower || null;\n}\n\nfunction inferRatesFromSignals(signals: string[]): {\n inputPer1M: number | null;\n outputPer1M: number | null;\n inferred: boolean;\n confidence: \"high\" | \"medium\" | \"low\";\n} {\n const tokenRates = signals\n .map((s) => {\n const m = /\\$\\s*([0-9]+(?:\\.[0-9]+)?)\\s*\\/?\\s*(?:1M\\s*tokens|M\\s*Tok|MTok)/i.exec(s);\n if (!m) return null;\n return Number(m[1]);\n })\n .filter((v): v is number => typeof v === \"number\" && Number.isFinite(v) && v > 0)\n .sort((a, b) => a - b);\n\n if (tokenRates.length === 0) return { inputPer1M: null, outputPer1M: null, inferred: true, confidence: \"low\" };\n if (tokenRates.length === 1) {\n return {\n inputPer1M: tokenRates[0],\n outputPer1M: tokenRates[0],\n inferred: true,\n confidence: \"low\",\n };\n }\n\n return {\n inputPer1M: tokenRates[0],\n outputPer1M: tokenRates[tokenRates.length - 1],\n inferred: true,\n confidence: \"medium\",\n };\n}\n\nfunction round4(value: number): number {\n return Math.round(value * 10_000) / 10_000;\n}\n","import { NextRequest } from \"next/server\";\nimport { cachedJson, errorResponse } from \"@/lib/api/responses\";\nimport { getDashboardMetrics } from \"@/lib/stores/dashboard-metrics\";\nimport { refreshPricingSnapshot } from \"@/lib/pricing/snapshot\";\nimport { getDefaultModelConfig, getModelConfig } from \"@/lib/stores/model-config\";\nimport { getDefaultAgentConfig } from \"@/lib/stores/agent-configs\";\n\nfunction defaultPricingProviders(): string[] {\n const providers = new Set<string>();\n\n const defaultModel = getDefaultModelConfig();\n if (defaultModel?.provider?.trim()) {\n providers.add(defaultModel.provider.trim().toLowerCase());\n }\n\n const defaultAgent = getDefaultAgentConfig();\n if (defaultAgent?.model_config_name?.trim()) {\n const cfg = getModelConfig(defaultAgent.model_config_name.trim());\n if (cfg?.provider?.trim()) {\n providers.add(cfg.provider.trim().toLowerCase());\n }\n }\n\n return [...providers];\n}\n\nexport async function GET(req: NextRequest) {\n try {\n await refreshPricingSnapshot({ force: false, providers: defaultPricingProviders() });\n const daysRaw = req.nextUrl.searchParams.get(\"days\");\n const days = daysRaw ? Number(daysRaw) : undefined;\n const metrics = await getDashboardMetrics(days);\n return cachedJson(metrics, 30);\n } catch (err) {\n console.error(\"[dashboard-metrics] failed:\", err);\n return errorResponse(\"Failed to load dashboard metrics\", 500);\n }\n}\n","import { AppRouteRouteModule } from \"next/dist/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta, setRequestMeta } from \"next/dist/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/lib/constants\";\nimport { NoFallbackError } from \"next/dist/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/server/response-cache\";\nimport * as userland from \"/home/runner/work/jarela/jarela/app/api/v1/dashboard/metrics/route.ts\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"standalone\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/v1/dashboard/metrics/route\",\n pathname: \"/api/v1/dashboard/metrics\",\n filename: \"route\",\n bundlePath: \"app/api/v1/dashboard/metrics/route\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"/home/runner/work/jarela/jarela/app/api/v1/dashboard/metrics/route.ts\",\n nextConfigOutput,\n // The static import is used for initialization (methods, dynamic, etc.).\n userland: userland,\n // In Turbopack dev mode, also provide a getter that calls require() on every\n // request. This re-reads from devModuleCache so HMR updates are picked up,\n // and the async wrapper unwraps async-module Promises (ESM-only\n // serverExternalPackages) automatically.\n ...process.env.TURBOPACK && process.env.__NEXT_DEV_SERVER ? {\n getUserland: ()=>import(\"/home/runner/work/jarela/jarela/app/api/v1/dashboard/metrics/route.ts\")\n } : {}\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (ctx.requestMeta) {\n setRequestMeta(req, ctx.requestMeta);\n }\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/v1/dashboard/metrics/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, deploymentId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const isWrappedByNextServer = Boolean(routerServerContext == null ? void 0 : routerServerContext.isWrappedByNextServer);\n const isMinimalMode = Boolean(getRequestMeta(req, 'minimalMode'));\n const incrementalCache = getRequestMeta(req, 'incrementalCache') || await routeModule.getIncrementalCache(req, nextConfig, prerenderManifest, isMinimalMode);\n incrementalCache == null ? void 0 : incrementalCache.resetRequestCache();\n globalThis.__incrementalCache = incrementalCache;\n const context = {\n params,\n previewProps: prerenderManifest.preview,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache,\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId,\n deploymentId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n let parentSpan;\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n // Propagate http.route to the parent span if one exists (e.g.\n // a platform-created HTTP span in adapter deployments).\n if (parentSpan && parentSpan !== span) {\n parentSpan.setAttribute('http.route', route);\n parentSpan.updateName(name);\n }\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (isWrappedByNextServer && activeSpan) {\n await handleResponse(activeSpan);\n } else {\n parentSpan = tracer.getActiveScopeSpan();\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse), undefined, !isWrappedByNextServer);\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n","module.exports = require(\"crypto\");","module.exports = require(\"https\");","module.exports = require(\"node:stream\");","module.exports = require(\"node:util\");","module.exports = require(\"next/dist/server/app-render/work-unit-async-storage.external.js\");","module.exports = require(\"node:fs\");","module.exports = require(\"node:url\");","module.exports = require(\"node:worker_threads\");","module.exports = require(\"node:path\");","module.exports = require(\"node:crypto\");","module.exports = require(\"buffer\");","module.exports = require(\"node:sqlite\");","module.exports = require(\"http\");","module.exports = require(\"next/dist/shared/lib/no-fallback-error.external\");","module.exports = require(\"events\");"],"names":["getDb","MBTI_PRESETS","now","Date","toISOString","getAgentTierProportions","row","raw","context_tier_proportions","parsed","JSON","parse","hot","Number","warm","facts","every","n","isFinite","listAgentConfigs","prepare","all","getDefaultAgentConfig","get","getAgentConfig","id","getAgentTools","cfg","tools","Array","isArray","filter","x","length","parseDelegateTargets","ids","from","Set","upsertAgentConfig","input","t","db","existing","created_at","mbti","adaptive_mbti","toMbti","preset","strength","adaptive_persona_strength","empathy","adaptive_empathy","expressiveness","adaptive_expressiveness","verbosity","adaptive_verbosity","is_default","run","harnessId","harness_id","undefined","delegateTargets","delegate_targets","stringify","tierProportions","Math","max","name","icon","identity","instructions","model_config_name","history_limit","history_window_hours","never_reply","adaptive_persona_enabled","clampPercent","voice_enabled","voice_model","trim","voice_name","voice_stt_model","voice_auto_speak","next","fallback","min","round","v","deleteAgentConfig","changes","generateAgentId","slug","toLowerCase","replace","slice","suffix","random","toString","DISPLAY_FILTER_KEYS","DISPLAY_FILTER_DEFAULTS","scheduled_task","watcher","bridge","synthetic","tool_use","thinking","parseDisplayFilters","getAgentDisplayFilters","display_filters","updateAgentDisplayFilters","patch","current","k","UPSERT_SQL","recordToolUsage","toolEvents","assistantContent","deltas","summarizeToolUsage","stamp","stmt","exec","calls","successes","errors","used","err","listToolStats","getToolStatsMap","names","rows","map","join","out","Map","set","tool_name","toStats","defaultToolStats","call_count","success_count","error_count","used_count","success_rate","usefulness_rate","score","never_used","last_called_at","successRate","clamp01","usefulnessRate","byId","assistantTerms","normalizeText","ev","key","phase","successful","isErrorPayload","payload","payloadLooksUsed","totals","outcome","values","size","candidates","extractPayloadTerms","matched","term","has","stringifyPayload","unique","token","split","test","add","text","status","value","readFile","CHARS_PER_TOKEN","DEFAULT_WINDOW_DAYS","getDashboardMetrics","days","boundedDays","floor","since","getTime","usageRows","snapshotThreadIds","r","mu_input_tokens","thread_id","byProvider","byProviderModel","byModel","generatedAt","loadProviderRates","dayMap","seedDayBuckets","agentMap","providerMap","modelMap","dayBreakdownMap","ensureDayBreakdown","day","entry","agents","providers","models","totalInput","totalOutput","totalCost","totalCalls","totalSuccesses","totalErrors","tierTotals","overhead","measuredAssistantMessages","estimatedAssistantMessages","dayBucket","hasSnapshot","threadHasSnapshot","inputTokens","outputTokens","estCost","attribProvider","provider","attribModelId","model_id","attribModelConfig","attribAgentId","agent_id","attribAgentName","agent_name","mu_output_tokens","mu_cost_usd","mu_provider","mu_model_id","mu_model_config_name","mu_agent_id","mu_agent_name","role","mu_hot_tokens","mu_warm_tokens","mu_facts_tokens","mu_overhead_tokens","tier","tokenEstimate","estimateTokens","content","isInput","rates","modelRatesFor","estimateCostUsd","estimatedCost","agentName","agentBucket","message_count","input_tokens_est","output_tokens_est","estimated_cost_usd","providerName","providerBucket","modelConfigName","modelId","modelKey","modelBucket","dayBreakdown","dayAgent","dayProvider","dayModel","tool_events","usage","summarizeEvents","toolCalls","toolSuccesses","toolErrors","series","entries","b","errorRate","tool_calls","tool_successes","tool_errors","round4","error_rate","tier_tokens","tierBucketToTokens","top_tools","stats","sort","a","localeCompare","top_agents","by_provider","by_model","overallSuccessRate","overallErrorRate","seriesByDay","s","breakdowns_by_day","bucket","dayPoint","dayAgents","dayProviders","dayModels","summary","emptyTierTokens","generated_at","data_quality","computeDataQuality","pricing","snapshot_generated_at","input_per_1m_usd","inputPer1M","output_per_1m_usd","outputPer1M","source","inferred","confidence","ok","error","model_rates","splitAt","indexOf","notes","i","d","hot_tokens","warm_tokens","facts_tokens","overhead_tokens","measured_input_tokens","measured","estimated","total","measured_messages","estimated_messages","measured_pct","trimmed","ceil","inputRate","outputRate","inCost","outCost","providerRatesFor","providerKey","normalizeProvider","modelAliasCandidates","candidate","exact","upstream","inferProviderFromModelId","upstreamCandidates","viaUpstreamModel","upstreamProviderRate","viaModel","directModel","startsWith","events","resultById","snapshot","readPricingSnapshot","expectedProviders","sources","inferRatesFromSignals","price_signals","modelInputRates","m","modelOutputRates","providerInput","providerOutput","providerDerivedFromModels","resolved_url","pricing_url","modelRate","normalizedModel","isBetterRate","prev","nextHas","prevHas","rank","high","medium","low","filePath","process","cwd","lower","includes","signals","tokenRates","cachedJson","errorResponse","refreshPricingSnapshot","getDefaultModelConfig","getModelConfig","defaultPricingProviders","defaultModel","defaultAgent","GET","req","force","daysRaw","nextUrl","searchParams","metrics","console"],"sourceRoot":"","ignoreList":[0,3,5,10,16,27,36]}