0xkobold 0.7.2 → 0.8.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 (252) hide show
  1. package/HEARTBEAT.md +239 -0
  2. package/IDENTITY.md +12 -0
  3. package/README.md +138 -4
  4. package/SOUL.md +21 -0
  5. package/dist/package.json +10 -5
  6. package/dist/src/agent/bootstrap-loader.js +295 -66
  7. package/dist/src/agent/bootstrap-loader.js.map +1 -1
  8. package/dist/src/agent/context-pruning.js +10 -5
  9. package/dist/src/agent/context-pruning.js.map +1 -1
  10. package/dist/src/agent/embedded-runner.js +29 -15
  11. package/dist/src/agent/embedded-runner.js.map +1 -1
  12. package/dist/src/agent/index.js +5 -2
  13. package/dist/src/agent/index.js.map +1 -1
  14. package/dist/src/agent/system-prompt.js +167 -20
  15. package/dist/src/agent/system-prompt.js.map +1 -1
  16. package/dist/src/agent/tools/spawn-agent.js +72 -5
  17. package/dist/src/agent/tools/spawn-agent.js.map +1 -1
  18. package/dist/src/channels/slack/webhook.js +2 -2
  19. package/dist/src/channels/slack/webhook.js.map +1 -1
  20. package/dist/src/channels/telegram/bot.js +4 -4
  21. package/dist/src/channels/telegram/bot.js.map +1 -1
  22. package/dist/src/channels/whatsapp/integration.js +4 -4
  23. package/dist/src/channels/whatsapp/integration.js.map +1 -1
  24. package/dist/src/cli/commands/gateway.js +9 -10
  25. package/dist/src/cli/commands/gateway.js.map +1 -1
  26. package/dist/src/cli/commands/init.js +90 -0
  27. package/dist/src/cli/commands/init.js.map +1 -1
  28. package/dist/src/cli/commands/setup.js +53 -0
  29. package/dist/src/cli/commands/setup.js.map +1 -1
  30. package/dist/src/cli/index.js +0 -0
  31. package/dist/src/config/unified-config.js +5 -0
  32. package/dist/src/config/unified-config.js.map +1 -1
  33. package/dist/src/cron/index.js +2 -0
  34. package/dist/src/cron/index.js.map +1 -1
  35. package/dist/src/cron/nl-parser.js +522 -0
  36. package/dist/src/cron/nl-parser.js.map +1 -0
  37. package/dist/src/cron/runner.js +6 -31
  38. package/dist/src/cron/runner.js.map +1 -1
  39. package/dist/src/event-bus/index.js.map +1 -1
  40. package/dist/src/extensions/core/agent-orchestrator-extension.js +200 -148
  41. package/dist/src/extensions/core/agent-orchestrator-extension.js.map +1 -1
  42. package/dist/src/extensions/core/diagnostics-extension.js +93 -56
  43. package/dist/src/extensions/core/diagnostics-extension.js.map +1 -1
  44. package/dist/src/extensions/core/draconic-safety-extension.js +256 -3
  45. package/dist/src/extensions/core/draconic-safety-extension.js.map +1 -1
  46. package/dist/src/extensions/core/heartbeat-extension.js +416 -150
  47. package/dist/src/extensions/core/heartbeat-extension.js.map +1 -1
  48. package/dist/src/extensions/core/{generative-agents-extension.js → learning-extension.js} +90 -128
  49. package/dist/src/extensions/core/learning-extension.js.map +1 -0
  50. package/dist/src/extensions/core/perennial-memory-extension.js +884 -87
  51. package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -1
  52. package/dist/src/extensions/core/routed-ollama-extension.js +345 -0
  53. package/dist/src/extensions/core/routed-ollama-extension.js.map +1 -0
  54. package/dist/src/extensions/core/task-manager-extension.js +25 -2
  55. package/dist/src/extensions/core/task-manager-extension.js.map +1 -1
  56. package/dist/src/extensions/core/websearch-enhanced-extension.js +81 -23
  57. package/dist/src/extensions/core/websearch-enhanced-extension.js.map +1 -1
  58. package/dist/src/extensions/core/workspace-footer-extension.js +40 -63
  59. package/dist/src/extensions/core/workspace-footer-extension.js.map +1 -1
  60. package/dist/src/extensions/loader.js +5 -1
  61. package/dist/src/extensions/loader.js.map +1 -1
  62. package/dist/src/gateway/gateway-server.js +74 -3
  63. package/dist/src/gateway/gateway-server.js.map +1 -1
  64. package/dist/src/gateway/index.js +2 -2
  65. package/dist/src/gateway/index.js.map +1 -1
  66. package/dist/src/gateway/methods/agent.js +1 -1
  67. package/dist/src/gateway/methods/agent.js.map +1 -1
  68. package/dist/src/gateway/methods/index.js +4 -0
  69. package/dist/src/gateway/methods/index.js.map +1 -1
  70. package/dist/src/gateway/methods/node.js +261 -0
  71. package/dist/src/gateway/methods/node.js.map +1 -0
  72. package/dist/src/gateway/queue-modes.js +356 -0
  73. package/dist/src/gateway/queue-modes.js.map +1 -0
  74. package/dist/src/index.js +47 -6
  75. package/dist/src/index.js.map +1 -1
  76. package/dist/src/llm/community-analytics.js +569 -0
  77. package/dist/src/llm/community-analytics.js.map +1 -0
  78. package/dist/src/llm/index.js +28 -4
  79. package/dist/src/llm/index.js.map +1 -1
  80. package/dist/src/llm/model-discovery.js +335 -0
  81. package/dist/src/llm/model-discovery.js.map +1 -0
  82. package/dist/src/llm/model-popularity.js +566 -0
  83. package/dist/src/llm/model-popularity.js.map +1 -0
  84. package/dist/src/llm/model-scoring-db.js +553 -0
  85. package/dist/src/llm/model-scoring-db.js.map +1 -0
  86. package/dist/src/llm/multi-provider.js +258 -0
  87. package/dist/src/llm/multi-provider.js.map +1 -0
  88. package/dist/src/llm/ollama.js +133 -187
  89. package/dist/src/llm/ollama.js.map +1 -1
  90. package/dist/src/llm/router-commands.js +773 -0
  91. package/dist/src/llm/router-commands.js.map +1 -0
  92. package/dist/src/llm/router-core.js +600 -0
  93. package/dist/src/llm/router-core.js.map +1 -0
  94. package/dist/src/memory/checkpoint-manager.js +278 -0
  95. package/dist/src/memory/checkpoint-manager.js.map +1 -0
  96. package/dist/src/memory/conflict-detector.js +279 -0
  97. package/dist/src/memory/conflict-detector.js.map +1 -0
  98. package/dist/src/memory/context-graph.js +360 -0
  99. package/dist/src/memory/context-graph.js.map +1 -0
  100. package/dist/src/memory/dialectic/benchmark-cli.js +200 -0
  101. package/dist/src/memory/dialectic/benchmark-cli.js.map +1 -0
  102. package/dist/src/memory/dialectic/debug-reasoning.js +37 -0
  103. package/dist/src/memory/dialectic/debug-reasoning.js.map +1 -0
  104. package/dist/src/memory/dialectic/index.js +135 -0
  105. package/dist/src/memory/dialectic/index.js.map +1 -0
  106. package/dist/src/memory/dialectic/nudges.js +380 -0
  107. package/dist/src/memory/dialectic/nudges.js.map +1 -0
  108. package/dist/src/memory/dialectic/reasoning-engine.js +607 -0
  109. package/dist/src/memory/dialectic/reasoning-engine.js.map +1 -0
  110. package/dist/src/memory/dialectic/reasoning.js +390 -0
  111. package/dist/src/memory/dialectic/reasoning.js.map +1 -0
  112. package/dist/src/memory/dialectic/skill-creation.js +481 -0
  113. package/dist/src/memory/dialectic/skill-creation.js.map +1 -0
  114. package/dist/src/memory/dialectic/store.js +663 -0
  115. package/dist/src/memory/dialectic/store.js.map +1 -0
  116. package/dist/src/memory/dialectic/types.js +11 -0
  117. package/dist/src/memory/dialectic/types.js.map +1 -0
  118. package/dist/src/memory/index.js +24 -2
  119. package/dist/src/memory/index.js.map +1 -1
  120. package/dist/src/memory/memory-decay.js +350 -0
  121. package/dist/src/memory/memory-decay.js.map +1 -0
  122. package/dist/src/memory/memory-integration.js +5 -5
  123. package/dist/src/memory/memory-integration.js.map +1 -1
  124. package/dist/src/memory/migrate-memory-stream.js +97 -0
  125. package/dist/src/memory/migrate-memory-stream.js.map +1 -0
  126. package/dist/src/memory/session-memory-bridge.js +49 -5
  127. package/dist/src/memory/session-memory-bridge.js.map +1 -1
  128. package/dist/src/memory/session-store.js +123 -0
  129. package/dist/src/memory/session-store.js.map +1 -1
  130. package/dist/src/memory/smart-write-rules.js +164 -0
  131. package/dist/src/memory/smart-write-rules.js.map +1 -0
  132. package/dist/src/memory/tiered-memory.js +436 -0
  133. package/dist/src/memory/tiered-memory.js.map +1 -0
  134. package/dist/src/memory/types.js +6 -0
  135. package/dist/src/memory/types.js.map +1 -0
  136. package/dist/src/memory/verify-migration.js +99 -0
  137. package/dist/src/memory/verify-migration.js.map +1 -0
  138. package/dist/src/pi-config.js +11 -9
  139. package/dist/src/pi-config.js.map +1 -1
  140. package/dist/src/skills/conditional-skills.js +464 -0
  141. package/dist/src/skills/conditional-skills.js.map +1 -0
  142. package/dist/src/skills/index.js +5 -0
  143. package/dist/src/skills/index.js.map +1 -1
  144. package/dist/src/skills/loader.js +56 -0
  145. package/dist/src/skills/loader.js.map +1 -1
  146. package/dist/src/skills/skill-manage.js +417 -0
  147. package/dist/src/skills/skill-manage.js.map +1 -0
  148. package/dist/src/tui/commands/orchestration-commands.js +62 -0
  149. package/dist/src/tui/commands/orchestration-commands.js.map +1 -1
  150. package/package.json +10 -5
  151. package/skills/model-router-test.ts +65 -0
  152. package/dist/src/extensions/core/auto-security-scan-extension.js +0 -41
  153. package/dist/src/extensions/core/auto-security-scan-extension.js.map +0 -1
  154. package/dist/src/extensions/core/cloudflare-browser-extension.js +0 -389
  155. package/dist/src/extensions/core/cloudflare-browser-extension.js.map +0 -1
  156. package/dist/src/extensions/core/compaction-safeguard.js +0 -223
  157. package/dist/src/extensions/core/compaction-safeguard.js.map +0 -1
  158. package/dist/src/extensions/core/generative-agents-extension.js.map +0 -1
  159. package/dist/src/extensions/core/obsidian-bridge-extension.js +0 -488
  160. package/dist/src/extensions/core/obsidian-bridge-extension.js.map +0 -1
  161. package/dist/src/llm/router.js +0 -145
  162. package/dist/src/llm/router.js.map +0 -1
  163. package/skills/kobold-scan-skill/node_modules/.package-lock.json +0 -172
  164. package/skills/kobold-scan-skill/node_modules/ansi-styles/index.d.ts +0 -345
  165. package/skills/kobold-scan-skill/node_modules/ansi-styles/index.js +0 -163
  166. package/skills/kobold-scan-skill/node_modules/ansi-styles/license +0 -9
  167. package/skills/kobold-scan-skill/node_modules/ansi-styles/package.json +0 -56
  168. package/skills/kobold-scan-skill/node_modules/ansi-styles/readme.md +0 -152
  169. package/skills/kobold-scan-skill/node_modules/balanced-match/.github/FUNDING.yml +0 -2
  170. package/skills/kobold-scan-skill/node_modules/balanced-match/LICENSE.md +0 -21
  171. package/skills/kobold-scan-skill/node_modules/balanced-match/README.md +0 -97
  172. package/skills/kobold-scan-skill/node_modules/balanced-match/index.js +0 -62
  173. package/skills/kobold-scan-skill/node_modules/balanced-match/package.json +0 -48
  174. package/skills/kobold-scan-skill/node_modules/brace-expansion/.github/FUNDING.yml +0 -2
  175. package/skills/kobold-scan-skill/node_modules/brace-expansion/LICENSE +0 -21
  176. package/skills/kobold-scan-skill/node_modules/brace-expansion/README.md +0 -135
  177. package/skills/kobold-scan-skill/node_modules/brace-expansion/index.js +0 -203
  178. package/skills/kobold-scan-skill/node_modules/brace-expansion/package.json +0 -49
  179. package/skills/kobold-scan-skill/node_modules/chalk/index.d.ts +0 -415
  180. package/skills/kobold-scan-skill/node_modules/chalk/license +0 -9
  181. package/skills/kobold-scan-skill/node_modules/chalk/package.json +0 -68
  182. package/skills/kobold-scan-skill/node_modules/chalk/readme.md +0 -341
  183. package/skills/kobold-scan-skill/node_modules/chalk/source/index.js +0 -229
  184. package/skills/kobold-scan-skill/node_modules/chalk/source/templates.js +0 -134
  185. package/skills/kobold-scan-skill/node_modules/chalk/source/util.js +0 -39
  186. package/skills/kobold-scan-skill/node_modules/color-convert/CHANGELOG.md +0 -54
  187. package/skills/kobold-scan-skill/node_modules/color-convert/LICENSE +0 -21
  188. package/skills/kobold-scan-skill/node_modules/color-convert/README.md +0 -68
  189. package/skills/kobold-scan-skill/node_modules/color-convert/conversions.js +0 -839
  190. package/skills/kobold-scan-skill/node_modules/color-convert/index.js +0 -81
  191. package/skills/kobold-scan-skill/node_modules/color-convert/package.json +0 -48
  192. package/skills/kobold-scan-skill/node_modules/color-convert/route.js +0 -97
  193. package/skills/kobold-scan-skill/node_modules/color-name/LICENSE +0 -8
  194. package/skills/kobold-scan-skill/node_modules/color-name/README.md +0 -11
  195. package/skills/kobold-scan-skill/node_modules/color-name/index.js +0 -152
  196. package/skills/kobold-scan-skill/node_modules/color-name/package.json +0 -28
  197. package/skills/kobold-scan-skill/node_modules/commander/LICENSE +0 -22
  198. package/skills/kobold-scan-skill/node_modules/commander/Readme.md +0 -1129
  199. package/skills/kobold-scan-skill/node_modules/commander/esm.mjs +0 -16
  200. package/skills/kobold-scan-skill/node_modules/commander/index.js +0 -27
  201. package/skills/kobold-scan-skill/node_modules/commander/lib/argument.js +0 -147
  202. package/skills/kobold-scan-skill/node_modules/commander/lib/command.js +0 -2179
  203. package/skills/kobold-scan-skill/node_modules/commander/lib/error.js +0 -45
  204. package/skills/kobold-scan-skill/node_modules/commander/lib/help.js +0 -461
  205. package/skills/kobold-scan-skill/node_modules/commander/lib/option.js +0 -326
  206. package/skills/kobold-scan-skill/node_modules/commander/lib/suggestSimilar.js +0 -100
  207. package/skills/kobold-scan-skill/node_modules/commander/package-support.json +0 -16
  208. package/skills/kobold-scan-skill/node_modules/commander/package.json +0 -80
  209. package/skills/kobold-scan-skill/node_modules/commander/typings/index.d.ts +0 -891
  210. package/skills/kobold-scan-skill/node_modules/fs.realpath/LICENSE +0 -43
  211. package/skills/kobold-scan-skill/node_modules/fs.realpath/README.md +0 -33
  212. package/skills/kobold-scan-skill/node_modules/fs.realpath/index.js +0 -66
  213. package/skills/kobold-scan-skill/node_modules/fs.realpath/old.js +0 -303
  214. package/skills/kobold-scan-skill/node_modules/fs.realpath/package.json +0 -26
  215. package/skills/kobold-scan-skill/node_modules/glob/LICENSE +0 -15
  216. package/skills/kobold-scan-skill/node_modules/glob/README.md +0 -399
  217. package/skills/kobold-scan-skill/node_modules/glob/common.js +0 -244
  218. package/skills/kobold-scan-skill/node_modules/glob/glob.js +0 -790
  219. package/skills/kobold-scan-skill/node_modules/glob/package.json +0 -55
  220. package/skills/kobold-scan-skill/node_modules/glob/sync.js +0 -486
  221. package/skills/kobold-scan-skill/node_modules/has-flag/index.d.ts +0 -39
  222. package/skills/kobold-scan-skill/node_modules/has-flag/index.js +0 -8
  223. package/skills/kobold-scan-skill/node_modules/has-flag/license +0 -9
  224. package/skills/kobold-scan-skill/node_modules/has-flag/package.json +0 -46
  225. package/skills/kobold-scan-skill/node_modules/has-flag/readme.md +0 -89
  226. package/skills/kobold-scan-skill/node_modules/inflight/LICENSE +0 -15
  227. package/skills/kobold-scan-skill/node_modules/inflight/README.md +0 -37
  228. package/skills/kobold-scan-skill/node_modules/inflight/inflight.js +0 -54
  229. package/skills/kobold-scan-skill/node_modules/inflight/package.json +0 -29
  230. package/skills/kobold-scan-skill/node_modules/inherits/LICENSE +0 -16
  231. package/skills/kobold-scan-skill/node_modules/inherits/README.md +0 -42
  232. package/skills/kobold-scan-skill/node_modules/inherits/inherits.js +0 -9
  233. package/skills/kobold-scan-skill/node_modules/inherits/inherits_browser.js +0 -27
  234. package/skills/kobold-scan-skill/node_modules/inherits/package.json +0 -29
  235. package/skills/kobold-scan-skill/node_modules/minimatch/LICENSE +0 -15
  236. package/skills/kobold-scan-skill/node_modules/minimatch/README.md +0 -259
  237. package/skills/kobold-scan-skill/node_modules/minimatch/lib/path.js +0 -4
  238. package/skills/kobold-scan-skill/node_modules/minimatch/minimatch.js +0 -944
  239. package/skills/kobold-scan-skill/node_modules/minimatch/package.json +0 -35
  240. package/skills/kobold-scan-skill/node_modules/once/LICENSE +0 -15
  241. package/skills/kobold-scan-skill/node_modules/once/README.md +0 -79
  242. package/skills/kobold-scan-skill/node_modules/once/once.js +0 -42
  243. package/skills/kobold-scan-skill/node_modules/once/package.json +0 -33
  244. package/skills/kobold-scan-skill/node_modules/supports-color/browser.js +0 -5
  245. package/skills/kobold-scan-skill/node_modules/supports-color/index.js +0 -135
  246. package/skills/kobold-scan-skill/node_modules/supports-color/license +0 -9
  247. package/skills/kobold-scan-skill/node_modules/supports-color/package.json +0 -53
  248. package/skills/kobold-scan-skill/node_modules/supports-color/readme.md +0 -76
  249. package/skills/kobold-scan-skill/node_modules/wrappy/LICENSE +0 -15
  250. package/skills/kobold-scan-skill/node_modules/wrappy/README.md +0 -36
  251. package/skills/kobold-scan-skill/node_modules/wrappy/package.json +0 -29
  252. package/skills/kobold-scan-skill/node_modules/wrappy/wrappy.js +0 -33
@@ -0,0 +1,553 @@
1
+ /**
2
+ * Model Scoring Database - Persistent Model Performance Tracking
3
+ *
4
+ * Stores and retrieves model performance data for adaptive routing.
5
+ * Enables long-term learning and AI-generated tier lists.
6
+ *
7
+ * Database: ~/.0xkobold/model-scoring.db
8
+ */
9
+ import { Database } from 'bun:sqlite';
10
+ import { homedir } from 'os';
11
+ import { join } from 'path';
12
+ import { mkdirSync, existsSync } from 'fs';
13
+ // ============================================================================
14
+ // Database Schema
15
+ // ============================================================================
16
+ const DB_PATH = join(homedir(), '.0xkobold', 'model-scoring.db');
17
+ const SCHEMA = `
18
+ -- Individual performance records
19
+ CREATE TABLE IF NOT EXISTS performance_history (
20
+ id TEXT PRIMARY KEY,
21
+ model_name TEXT NOT NULL,
22
+ task_type TEXT DEFAULT 'chat',
23
+ complexity TEXT DEFAULT 'medium',
24
+ latency_ms INTEGER DEFAULT 0,
25
+ input_tokens INTEGER DEFAULT 0,
26
+ output_tokens INTEGER DEFAULT 0,
27
+ timestamp INTEGER NOT NULL,
28
+ user_rating INTEGER,
29
+ success INTEGER DEFAULT 1,
30
+ session_id TEXT
31
+ );
32
+
33
+ CREATE INDEX IF NOT EXISTS idx_perf_model ON performance_history(model_name);
34
+ CREATE INDEX IF NOT EXISTS idx_perf_time ON performance_history(timestamp);
35
+ CREATE INDEX IF NOT EXISTS idx_perf_task ON performance_history(task_type);
36
+ CREATE INDEX IF NOT EXISTS idx_perf_session ON performance_history(session_id);
37
+
38
+ -- Aggregated scores (updated periodically)
39
+ CREATE TABLE IF NOT EXISTS model_scores (
40
+ model_name TEXT PRIMARY KEY,
41
+ avg_latency REAL DEFAULT 0,
42
+ avg_quality REAL DEFAULT 0,
43
+ usage_count INTEGER DEFAULT 0,
44
+ success_rate REAL DEFAULT 0,
45
+ score REAL DEFAULT 0,
46
+ last_used INTEGER,
47
+ last_updated INTEGER
48
+ );
49
+
50
+ -- Task-specific performance
51
+ CREATE TABLE IF NOT EXISTS task_performance (
52
+ id TEXT PRIMARY KEY,
53
+ model_name TEXT NOT NULL,
54
+ task_type TEXT NOT NULL,
55
+ avg_latency REAL DEFAULT 0,
56
+ avg_quality REAL DEFAULT 0,
57
+ usage_count INTEGER DEFAULT 0,
58
+ success_rate REAL DEFAULT 0,
59
+ score REAL DEFAULT 0,
60
+ last_updated INTEGER,
61
+ UNIQUE(model_name, task_type)
62
+ );
63
+
64
+ CREATE INDEX IF NOT EXISTS idx_task_perf_model ON task_performance(model_name);
65
+ CREATE INDEX IF NOT EXISTS idx_task_perf_type ON task_performance(task_type);
66
+
67
+ -- User feedback history
68
+ CREATE TABLE IF NOT EXISTS user_feedback (
69
+ id TEXT PRIMARY KEY,
70
+ model_name TEXT NOT NULL,
71
+ rating INTEGER NOT NULL,
72
+ task_type TEXT,
73
+ context TEXT,
74
+ timestamp INTEGER NOT NULL
75
+ );
76
+
77
+ CREATE INDEX IF NOT EXISTS idx_feedback_model ON user_feedback(model_name);
78
+ CREATE INDEX IF NOT EXISTS idx_feedback_time ON user_feedback(timestamp);
79
+
80
+ -- Tier list snapshots (AI-generated)
81
+ CREATE TABLE IF NOT EXISTS tier_lists (
82
+ id TEXT PRIMARY KEY,
83
+ generated_at INTEGER NOT NULL,
84
+ period TEXT NOT NULL,
85
+ tiers TEXT NOT NULL, -- JSON array of ModelTier
86
+ summary TEXT,
87
+ total_samples INTEGER DEFAULT 0
88
+ );
89
+
90
+ CREATE INDEX IF NOT EXISTS idx_tier_time ON tier_lists(generated_at);
91
+ `;
92
+ // ============================================================================
93
+ // Model Scoring Database Class
94
+ // ============================================================================
95
+ class ModelScoringDB {
96
+ db;
97
+ initialized = false;
98
+ constructor(dbPath = DB_PATH) {
99
+ const dir = join(homedir(), '.0xkobold');
100
+ if (!existsSync(dir)) {
101
+ mkdirSync(dir, { recursive: true });
102
+ }
103
+ this.db = new Database(dbPath);
104
+ this.db.exec("PRAGMA journal_mode = WAL;");
105
+ this.db.exec("PRAGMA synchronous = NORMAL;");
106
+ this.initialize();
107
+ }
108
+ initialize() {
109
+ this.db.exec(SCHEMA);
110
+ this.initialized = true;
111
+ console.log('[ModelScoringDB] Initialized');
112
+ }
113
+ // ============================================================================
114
+ // Performance Recording
115
+ // ============================================================================
116
+ recordPerformance(perf) {
117
+ const id = `perf-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
118
+ this.db.query(`
119
+ INSERT INTO performance_history (
120
+ id, model_name, task_type, complexity, latency_ms,
121
+ input_tokens, output_tokens, timestamp, user_rating, success, session_id
122
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
123
+ `).run(id, perf.modelName, perf.taskType, perf.complexity, perf.latencyMs, perf.inputTokens, perf.outputTokens, perf.timestamp || Date.now(), perf.userRating ?? null, perf.success ? 1 : 0, perf.sessionId ?? null);
124
+ // Update aggregated scores asynchronously
125
+ this.updateModelScore(perf.modelName);
126
+ return id;
127
+ }
128
+ addFeedback(modelName, rating, taskType, context) {
129
+ const id = `fb-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
130
+ this.db.query(`
131
+ INSERT INTO user_feedback (id, model_name, rating, task_type, context, timestamp)
132
+ VALUES (?, ?, ?, ?, ?, ?)
133
+ `).run(id, modelName, rating, taskType ?? null, context ?? null, Date.now());
134
+ // Update quality score
135
+ this.updateModelScore(modelName);
136
+ return id;
137
+ }
138
+ // ============================================================================
139
+ // Aggregated Scores
140
+ // ============================================================================
141
+ updateModelScore(modelName) {
142
+ // Calculate aggregated metrics
143
+ const stats = this.db.query(`
144
+ SELECT
145
+ AVG(latency_ms) as avg_latency,
146
+ AVG(CASE WHEN user_rating IS NOT NULL THEN user_rating ELSE NULL END) as avg_quality,
147
+ COUNT(*) as usage_count,
148
+ SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) * 1.0 / COUNT(*) as success_rate,
149
+ MAX(timestamp) as last_used
150
+ FROM performance_history
151
+ WHERE model_name = ?
152
+ `).get(modelName);
153
+ // Calculate overall score
154
+ const avgRating = stats?.avg_quality ?? 3;
155
+ const avgLatency = stats?.avg_latency ?? 0;
156
+ const successRate = stats?.success_rate ?? 0.5;
157
+ const usageCount = stats?.usage_count ?? 0;
158
+ // Score formula: 40% quality + 30% success rate + 20% speed + 10% reliability
159
+ const normalizedLatency = avgLatency > 0 ? Math.max(0, 1 - (avgLatency / 10000)) : 0.5;
160
+ const qualityScore = avgRating / 5;
161
+ const score = qualityScore * 0.40 +
162
+ successRate * 0.30 +
163
+ normalizedLatency * 0.20 +
164
+ Math.min(usageCount / 100, 1) * 0.10;
165
+ // Upsert to model_scores
166
+ this.db.query(`
167
+ INSERT INTO model_scores (
168
+ model_name, avg_latency, avg_quality, usage_count, success_rate, score, last_used, last_updated
169
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
170
+ ON CONFLICT(model_name) DO UPDATE SET
171
+ avg_latency = excluded.avg_latency,
172
+ avg_quality = excluded.avg_quality,
173
+ usage_count = excluded.usage_count,
174
+ success_rate = excluded.success_rate,
175
+ score = excluded.score,
176
+ last_used = excluded.last_used,
177
+ last_updated = excluded.last_updated
178
+ `).run(modelName, avgLatency, avgRating, usageCount, successRate, score, stats?.last_used ?? Date.now(), Date.now());
179
+ }
180
+ getModelScore(modelName) {
181
+ const row = this.db.query(`
182
+ SELECT model_name, avg_latency, avg_quality, usage_count, success_rate, score, last_used
183
+ FROM model_scores WHERE model_name = ?
184
+ `).get(modelName);
185
+ if (!row)
186
+ return null;
187
+ return {
188
+ modelName: row.model_name,
189
+ avgLatency: row.avg_latency,
190
+ avgQuality: row.avg_quality,
191
+ usageCount: row.usage_count,
192
+ successRate: row.success_rate,
193
+ score: row.score,
194
+ lastUsed: row.last_used,
195
+ };
196
+ }
197
+ getAllScores() {
198
+ const rows = this.db.query(`
199
+ SELECT model_name, avg_latency, avg_quality, usage_count, success_rate, score, last_used
200
+ FROM model_scores
201
+ ORDER BY score DESC
202
+ `).all();
203
+ return rows.map(row => ({
204
+ modelName: row.model_name,
205
+ avgLatency: row.avg_latency,
206
+ avgQuality: row.avg_quality,
207
+ usageCount: row.usage_count,
208
+ successRate: row.success_rate,
209
+ score: row.score,
210
+ lastUsed: row.last_used,
211
+ }));
212
+ }
213
+ // ============================================================================
214
+ // Task-Specific Performance
215
+ // ============================================================================
216
+ updateTaskPerformance(modelName, taskType) {
217
+ const stats = this.db.query(`
218
+ SELECT
219
+ AVG(latency_ms) as avg_latency,
220
+ AVG(CASE WHEN user_rating IS NOT NULL THEN user_rating ELSE NULL END) as avg_quality,
221
+ COUNT(*) as usage_count,
222
+ SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) * 1.0 / COUNT(*) as success_rate
223
+ FROM performance_history
224
+ WHERE model_name = ? AND task_type = ?
225
+ `).get(modelName, taskType);
226
+ if (!stats || stats.usage_count === 0)
227
+ return;
228
+ const avgRating = stats?.avg_quality ?? 3;
229
+ const successRate = stats?.success_rate ?? 0.5;
230
+ const score = (avgRating / 5) * 0.5 + successRate * 0.5;
231
+ const id = `tp-${modelName}-${taskType}`;
232
+ this.db.query(`
233
+ INSERT INTO task_performance (
234
+ id, model_name, task_type, avg_latency, avg_quality, usage_count, success_rate, score, last_updated
235
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
236
+ ON CONFLICT(model_name, task_type) DO UPDATE SET
237
+ avg_latency = excluded.avg_latency,
238
+ avg_quality = excluded.avg_quality,
239
+ usage_count = excluded.usage_count,
240
+ success_rate = excluded.success_rate,
241
+ score = excluded.score,
242
+ last_updated = excluded.last_updated
243
+ `).run(id, modelName, taskType, stats.avg_latency, avgRating, stats.usage_count, successRate, score, Date.now());
244
+ }
245
+ getTaskPerformance(modelName, taskType) {
246
+ const row = this.db.query(`
247
+ SELECT model_name, avg_latency, avg_quality, usage_count, success_rate, score
248
+ FROM task_performance
249
+ WHERE model_name = ? AND task_type = ?
250
+ `).get(modelName, taskType);
251
+ if (!row)
252
+ return null;
253
+ return {
254
+ modelName: row.model_name,
255
+ avgLatency: row.avg_latency,
256
+ avgQuality: row.avg_quality,
257
+ usageCount: row.usage_count,
258
+ successRate: row.success_rate,
259
+ score: row.score,
260
+ lastUsed: Date.now(),
261
+ };
262
+ }
263
+ getBestForTask(taskType, minSamples = 3) {
264
+ const row = this.db.query(`
265
+ SELECT model_name, avg_latency, avg_quality, usage_count, success_rate, score
266
+ FROM task_performance
267
+ WHERE task_type = ? AND usage_count >= ?
268
+ ORDER BY score DESC
269
+ LIMIT 1
270
+ `).get(taskType, minSamples);
271
+ if (!row)
272
+ return null;
273
+ return {
274
+ modelName: row.model_name,
275
+ avgLatency: row.avg_latency,
276
+ avgQuality: row.avg_quality,
277
+ usageCount: row.usage_count,
278
+ successRate: row.success_rate,
279
+ score: row.score,
280
+ lastUsed: Date.now(),
281
+ };
282
+ }
283
+ // ============================================================================
284
+ // Tier List Generation
285
+ // ============================================================================
286
+ generateTierList(period = 'all') {
287
+ const now = Date.now();
288
+ let sinceTime;
289
+ switch (period) {
290
+ case 'day':
291
+ sinceTime = now - 24 * 60 * 60 * 1000;
292
+ break;
293
+ case 'week':
294
+ sinceTime = now - 7 * 24 * 60 * 60 * 1000;
295
+ break;
296
+ case 'month':
297
+ sinceTime = now - 30 * 24 * 60 * 60 * 1000;
298
+ break;
299
+ default:
300
+ sinceTime = 0;
301
+ }
302
+ const rows = this.db.query(`
303
+ SELECT
304
+ model_name,
305
+ AVG(latency_ms) as avg_latency,
306
+ AVG(CASE WHEN user_rating IS NOT NULL THEN user_rating ELSE 3 END) as avg_quality,
307
+ COUNT(*) as usage_count,
308
+ SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) * 1.0 / COUNT(*) as success_rate,
309
+ MAX(timestamp) as last_used
310
+ FROM performance_history
311
+ WHERE timestamp >= ?
312
+ GROUP BY model_name
313
+ HAVING usage_count >= 2
314
+ ORDER BY
315
+ (AVG(CASE WHEN user_rating IS NOT NULL THEN user_rating ELSE 3 END) / 5.0) * 0.4 +
316
+ (SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) * 1.0 / COUNT(*)) * 0.3 +
317
+ (1 - AVG(latency_ms) / 10000.0) * 0.2 +
318
+ (MIN(COUNT(*) / 50.0, 1.0)) * 0.1
319
+ DESC
320
+ `).all(sinceTime);
321
+ const tiers = [];
322
+ const tierThresholds = {
323
+ S: 0.85,
324
+ A: 0.70,
325
+ B: 0.55,
326
+ C: 0.40,
327
+ D: 0,
328
+ };
329
+ for (const row of rows) {
330
+ const qualityScore = (row.avg_quality ?? 3) / 5;
331
+ const successRate = row.success_rate;
332
+ const normalizedLatency = row.avg_latency > 0
333
+ ? Math.max(0, 1 - (row.avg_latency / 10000))
334
+ : 0.5;
335
+ const reliabilityBonus = Math.min(row.usage_count / 50, 1);
336
+ const score = qualityScore * 0.40 +
337
+ successRate * 0.30 +
338
+ normalizedLatency * 0.20 +
339
+ reliabilityBonus * 0.10;
340
+ // Determine tier
341
+ let tier = 'D';
342
+ if (score >= tierThresholds.S)
343
+ tier = 'S';
344
+ else if (score >= tierThresholds.A)
345
+ tier = 'A';
346
+ else if (score >= tierThresholds.B)
347
+ tier = 'B';
348
+ else if (score >= tierThresholds.C)
349
+ tier = 'C';
350
+ // Determine strengths and weaknesses
351
+ const strengths = [];
352
+ const weaknesses = [];
353
+ if (successRate > 0.9)
354
+ strengths.push('Reliable');
355
+ if (row.avg_latency < 2000)
356
+ strengths.push('Fast');
357
+ if (qualityScore > 0.8)
358
+ strengths.push('High Quality');
359
+ if (row.usage_count > 50)
360
+ strengths.push('Well-tested');
361
+ if (successRate < 0.7)
362
+ weaknesses.push('Unreliable');
363
+ if (row.avg_latency > 5000)
364
+ weaknesses.push('Slow');
365
+ if (qualityScore < 0.6)
366
+ weaknesses.push('Low Quality');
367
+ if (row.usage_count < 5)
368
+ weaknesses.push('Limited Data');
369
+ // Recommend based on performance profile
370
+ const recommendedFor = [];
371
+ if (row.avg_latency < 3000 && successRate > 0.8)
372
+ recommendedFor.push('Quick Tasks');
373
+ if (qualityScore > 0.75 && row.usage_count > 10)
374
+ recommendedFor.push('Complex Tasks');
375
+ if (successRate > 0.9)
376
+ recommendedFor.push('Critical Operations');
377
+ if (row.avg_latency < 1500)
378
+ recommendedFor.push('Real-time');
379
+ tiers.push({
380
+ modelName: row.model_name,
381
+ tier,
382
+ score,
383
+ avgLatency: row.avg_latency,
384
+ avgQuality: row.avg_quality,
385
+ usageCount: row.usage_count,
386
+ successRate: row.success_rate,
387
+ strengths,
388
+ weaknesses,
389
+ recommendedFor,
390
+ });
391
+ }
392
+ // Save tier list snapshot
393
+ this.saveTierList(tiers, period);
394
+ return tiers;
395
+ }
396
+ saveTierList(tiers, period) {
397
+ const id = `tier-${Date.now()}`;
398
+ this.db.query(`
399
+ INSERT INTO tier_lists (id, generated_at, period, tiers, summary, total_samples)
400
+ VALUES (?, ?, ?, ?, ?, ?)
401
+ `).run(id, Date.now(), period, JSON.stringify(tiers), `Generated ${tiers.length} model rankings for period: ${period}`, tiers.reduce((sum, t) => sum + t.usageCount, 0));
402
+ }
403
+ getLatestTierList() {
404
+ const row = this.db.query(`
405
+ SELECT generated_at, period, tiers
406
+ FROM tier_lists
407
+ ORDER BY generated_at DESC
408
+ LIMIT 1
409
+ `).get();
410
+ if (!row)
411
+ return null;
412
+ return {
413
+ tiers: JSON.parse(row.tiers),
414
+ generatedAt: row.generated_at,
415
+ period: row.period,
416
+ };
417
+ }
418
+ // ============================================================================
419
+ // Statistics & Reporting
420
+ // ============================================================================
421
+ getPerformanceHistory(limit = 100) {
422
+ const rows = this.db.query(`
423
+ SELECT * FROM performance_history
424
+ ORDER BY timestamp DESC
425
+ LIMIT ?
426
+ `).all(limit);
427
+ return rows.map(row => ({
428
+ id: row.id,
429
+ modelName: row.model_name,
430
+ taskType: row.task_type,
431
+ complexity: row.complexity,
432
+ latencyMs: row.latency_ms,
433
+ inputTokens: row.input_tokens,
434
+ outputTokens: row.output_tokens,
435
+ timestamp: row.timestamp,
436
+ userRating: row.user_rating,
437
+ success: row.success === 1,
438
+ sessionId: row.session_id,
439
+ }));
440
+ }
441
+ getRecentFeedback(limit = 50) {
442
+ const rows = this.db.query(`
443
+ SELECT model_name, rating, task_type, timestamp
444
+ FROM user_feedback
445
+ ORDER BY timestamp DESC
446
+ LIMIT ?
447
+ `).all(limit);
448
+ return rows.map(row => ({
449
+ modelName: row.model_name,
450
+ rating: row.rating,
451
+ taskType: row.task_type,
452
+ timestamp: row.timestamp,
453
+ }));
454
+ }
455
+ getModelStats(modelName) {
456
+ const stats = this.db.query(`
457
+ SELECT
458
+ COUNT(*) as total_usage,
459
+ AVG(latency_ms) as avg_latency,
460
+ AVG(CASE WHEN user_rating IS NOT NULL THEN user_rating ELSE NULL END) as avg_rating,
461
+ SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) * 1.0 / COUNT(*) as success_rate
462
+ FROM performance_history
463
+ WHERE model_name = ?
464
+ `).get(modelName);
465
+ const tasks = this.db.query(`
466
+ SELECT task_type, COUNT(*) as count
467
+ FROM performance_history
468
+ WHERE model_name = ?
469
+ GROUP BY task_type
470
+ `).all(modelName);
471
+ const taskBreakdown = {};
472
+ for (const task of tasks) {
473
+ taskBreakdown[task.task_type] = task.count;
474
+ }
475
+ return {
476
+ totalUsage: stats?.total_usage ?? 0,
477
+ avgLatency: stats?.avg_latency ?? 0,
478
+ avgRating: stats?.avg_rating ?? 0,
479
+ successRate: stats?.success_rate ?? 0,
480
+ taskBreakdown,
481
+ };
482
+ }
483
+ // ============================================================================
484
+ // Maintenance
485
+ // ============================================================================
486
+ clearHistory() {
487
+ this.db.exec(`
488
+ DELETE FROM performance_history;
489
+ DELETE FROM user_feedback;
490
+ DELETE FROM task_performance;
491
+ DELETE FROM tier_lists;
492
+ DELETE FROM model_scores;
493
+ `);
494
+ console.log('[ModelScoringDB] History cleared');
495
+ }
496
+ vacuum() {
497
+ this.db.exec('VACUUM;');
498
+ console.log('[ModelScoringDB] Database vacuumed');
499
+ }
500
+ close() {
501
+ this.db.close();
502
+ this.initialized = false;
503
+ }
504
+ // ============================================================================
505
+ // Export/Import
506
+ // ============================================================================
507
+ exportData() {
508
+ const history = this.db.query('SELECT * FROM performance_history').all();
509
+ const scores = this.db.query('SELECT * FROM model_scores').all();
510
+ const feedback = this.db.query('SELECT * FROM user_feedback').all();
511
+ const tasks = this.db.query('SELECT * FROM task_performance').all();
512
+ const tiers = this.db.query('SELECT * FROM tier_lists').all();
513
+ return {
514
+ exportedAt: new Date().toISOString(),
515
+ history,
516
+ scores,
517
+ feedback,
518
+ tasks,
519
+ tiers,
520
+ };
521
+ }
522
+ importData(data) {
523
+ if (data.history) {
524
+ for (const row of data.history) {
525
+ this.db.query(`
526
+ INSERT OR REPLACE INTO performance_history
527
+ (id, model_name, task_type, complexity, latency_ms, input_tokens, output_tokens, timestamp, user_rating, success, session_id)
528
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
529
+ `).run(row.id || `import-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`, row.model_name ?? row.modelName, row.task_type ?? row.taskType ?? 'chat', row.complexity ?? 'medium', row.latency_ms ?? row.latencyMs ?? 0, row.input_tokens ?? row.inputTokens ?? 0, row.output_tokens ?? row.outputTokens ?? 0, row.timestamp ?? Date.now(), row.user_rating ?? row.userRating ?? null, row.success ?? 1, row.session_id ?? row.sessionId ?? null);
530
+ }
531
+ }
532
+ console.log('[ModelScoringDB] Data imported');
533
+ }
534
+ }
535
+ // ============================================================================
536
+ // Singleton Instance
537
+ // ============================================================================
538
+ let dbInstance = null;
539
+ export function getModelScoringDB() {
540
+ if (!dbInstance) {
541
+ dbInstance = new ModelScoringDB();
542
+ }
543
+ return dbInstance;
544
+ }
545
+ export function closeModelScoringDB() {
546
+ if (dbInstance) {
547
+ dbInstance.close();
548
+ dbInstance = null;
549
+ }
550
+ }
551
+ export { ModelScoringDB };
552
+ export default ModelScoringDB;
553
+ //# sourceMappingURL=model-scoring-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-scoring-db.js","sourceRoot":"","sources":["../../../src/llm/model-scoring-db.ts"],"names":[],"mappings":"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"}