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,566 @@
1
+ /**
2
+ * Model Popularity Service
3
+ *
4
+ * Gathers model popularity data from multiple sources:
5
+ * 1. Ollama library (pull counts) - scraped from ollama.com/library
6
+ * 2. Nostr network - decentralized community stats sharing
7
+ * 3. Local usage history - your own usage patterns
8
+ *
9
+ * This data is used by the adaptive router to boost popular/community-tested models.
10
+ */
11
+ import { Database } from 'bun:sqlite';
12
+ import { homedir } from 'os';
13
+ import { join } from 'path';
14
+ import { mkdirSync, existsSync } from 'fs';
15
+ // ============================================================================
16
+ // Database Schema
17
+ // ============================================================================
18
+ const DB_PATH = join(homedir(), '.0xkobold', 'model-popularity.db');
19
+ const SCHEMA = `
20
+ -- Cached Ollama library data
21
+ CREATE TABLE IF NOT EXISTS ollama_models (
22
+ name TEXT PRIMARY KEY,
23
+ pull_count INTEGER DEFAULT 0,
24
+ tags TEXT,
25
+ description TEXT,
26
+ updated_at INTEGER
27
+ );
28
+
29
+ CREATE INDEX IF NOT EXISTS idx_ollama_pulls ON ollama_models(pull_count DESC);
30
+
31
+ -- Community reports from Nostr
32
+ CREATE TABLE IF NOT EXISTS nostr_reports (
33
+ id TEXT PRIMARY KEY,
34
+ pubkey TEXT NOT NULL,
35
+ model_name TEXT NOT NULL,
36
+ rating INTEGER,
37
+ task_type TEXT,
38
+ latency INTEGER,
39
+ success INTEGER,
40
+ timestamp INTEGER NOT NULL,
41
+ signature TEXT,
42
+ UNIQUE(pubkey, model_name, timestamp)
43
+ );
44
+
45
+ CREATE INDEX IF NOT EXISTS idx_nostr_model ON nostr_reports(model_name);
46
+ CREATE INDEX IF NOT EXISTS idx_nostr_time ON nostr_reports(timestamp DESC);
47
+
48
+ -- Aggregated popularity scores
49
+ CREATE TABLE IF NOT EXISTS model_popularity (
50
+ model_name TEXT PRIMARY KEY,
51
+ pull_count INTEGER DEFAULT 0,
52
+ pull_count_rank INTEGER DEFAULT 999,
53
+ community_score REAL DEFAULT 0,
54
+ community_sample_size INTEGER DEFAULT 0,
55
+ local_usage_count INTEGER DEFAULT 0,
56
+ trending INTEGER DEFAULT 0,
57
+ last_updated INTEGER
58
+ );
59
+
60
+ -- Cache metadata
61
+ CREATE TABLE IF NOT EXISTS cache_metadata (
62
+ key TEXT PRIMARY KEY,
63
+ value TEXT,
64
+ updated_at INTEGER
65
+ );
66
+ `;
67
+ async function fetchOllamaLibrary() {
68
+ const models = [];
69
+ try {
70
+ const response = await fetch('https://ollama.com/library', {
71
+ headers: {
72
+ 'User-Agent': 'Mozilla/5.0 (compatible; 0xKobold/1.0)',
73
+ },
74
+ });
75
+ const html = await response.text();
76
+ // Split into model sections using the x-test-model attribute
77
+ const modelSectionRegex = /x-test-model[^>]*>([\s\S]*?)<\/li>/gi;
78
+ let modelMatch;
79
+ while ((modelMatch = modelSectionRegex.exec(html)) !== null) {
80
+ const section = modelMatch[1];
81
+ // Extract model name from href="/library/xxx"
82
+ const nameMatch = section.match(/href="\/library\/([^"]+)"/);
83
+ if (!nameMatch)
84
+ continue;
85
+ const name = nameMatch[1];
86
+ // Extract pull count from x-test-pull-count
87
+ const pullMatch = section.match(/x-test-pull-count[^>]*>([^<]+)</);
88
+ let pullCount = 0;
89
+ if (pullMatch) {
90
+ const countStr = pullMatch[1].trim();
91
+ pullCount = parsePullCount(countStr);
92
+ }
93
+ // Extract tags (look for tags in the section)
94
+ const tags = [];
95
+ if (section.includes('tools'))
96
+ tags.push('tools');
97
+ if (section.includes('vision'))
98
+ tags.push('vision');
99
+ if (section.includes('embedding'))
100
+ tags.push('embedding');
101
+ if (section.includes('thinking'))
102
+ tags.push('thinking');
103
+ if (section.includes('cloud'))
104
+ tags.push('cloud');
105
+ models.push({
106
+ name,
107
+ pullCount,
108
+ tags,
109
+ description: '',
110
+ });
111
+ }
112
+ // Sort by pull count descending
113
+ models.sort((a, b) => b.pullCount - a.pullCount);
114
+ }
115
+ catch (err) {
116
+ console.error('[ModelPopularity] Failed to fetch Ollama library:', err);
117
+ }
118
+ return models;
119
+ }
120
+ function parsePullCount(countStr) {
121
+ const clean = countStr.trim();
122
+ if (clean.includes('M')) {
123
+ return parseFloat(clean) * 1_000_000;
124
+ }
125
+ else if (clean.includes('K')) {
126
+ return parseFloat(clean) * 1_000;
127
+ }
128
+ const num = parseFloat(clean.replace(/,/g, ''));
129
+ return isNaN(num) ? 0 : num;
130
+ }
131
+ // ============================================================================
132
+ // Nostr Integration
133
+ // ============================================================================
134
+ /**
135
+ * Nostr event kind for model performance reports
136
+ * Using kind 31234 for application-specific data
137
+ */
138
+ const NOSTR_KIND_MODEL_REPORT = 31234;
139
+ /**
140
+ * Parse a Nostr model report from event content
141
+ */
142
+ function parseNostrReport(event) {
143
+ try {
144
+ const content = JSON.parse(event.content);
145
+ return {
146
+ pubkey: event.pubkey,
147
+ modelName: content.modelName,
148
+ rating: content.rating,
149
+ taskType: content.taskType,
150
+ latency: content.latency,
151
+ success: content.success,
152
+ timestamp: event.created_at * 1000,
153
+ signature: event.sig,
154
+ };
155
+ }
156
+ catch {
157
+ return null;
158
+ }
159
+ }
160
+ /**
161
+ * Create a Nostr model report event (for publishing)
162
+ */
163
+ export function createModelReportEvent(modelName, rating, taskType, latency, success) {
164
+ return {
165
+ kind: NOSTR_KIND_MODEL_REPORT,
166
+ content: JSON.stringify({
167
+ modelName,
168
+ rating,
169
+ taskType,
170
+ latency,
171
+ success,
172
+ timestamp: Date.now(),
173
+ }),
174
+ tags: [
175
+ ['model', modelName],
176
+ ['rating', String(rating)],
177
+ ['task', taskType],
178
+ ],
179
+ created_at: Math.floor(Date.now() / 1000),
180
+ };
181
+ }
182
+ // ============================================================================
183
+ // Model Popularity Service
184
+ // ============================================================================
185
+ class ModelPopularityService {
186
+ db;
187
+ cache = new Map();
188
+ lastFetch = 0;
189
+ CACHE_TTL = 60 * 60 * 1000; // 1 hour
190
+ constructor(dbPath = DB_PATH) {
191
+ const dir = join(homedir(), '.0xkobold');
192
+ if (!existsSync(dir)) {
193
+ mkdirSync(dir, { recursive: true });
194
+ }
195
+ this.db = new Database(dbPath);
196
+ this.db.exec("PRAGMA journal_mode = WAL;");
197
+ this.db.exec(SCHEMA);
198
+ // Load lastFetch from database
199
+ this.loadLastFetch();
200
+ }
201
+ loadLastFetch() {
202
+ try {
203
+ const row = this.db.prepare('SELECT value FROM cache_metadata WHERE key = ?').get('lastFetch');
204
+ if (row) {
205
+ this.lastFetch = parseInt(row.value, 10);
206
+ }
207
+ }
208
+ catch {
209
+ // Table might not exist yet, that's fine
210
+ }
211
+ }
212
+ saveLastFetch() {
213
+ try {
214
+ this.db.prepare('INSERT OR REPLACE INTO cache_metadata (key, value) VALUES (?, ?)').run('lastFetch', String(this.lastFetch));
215
+ }
216
+ catch {
217
+ // Ignore errors
218
+ }
219
+ }
220
+ /**
221
+ * Refresh popularity data from Ollama library
222
+ */
223
+ async refreshFromOllama() {
224
+ console.log('[ModelPopularity] Fetching Ollama library...');
225
+ const models = await fetchOllamaLibrary();
226
+ if (models.length === 0) {
227
+ return 0;
228
+ }
229
+ // Sort by pull count for ranking
230
+ models.sort((a, b) => b.pullCount - a.pullCount);
231
+ // Update database
232
+ const stmt = this.db.query(`
233
+ INSERT OR REPLACE INTO ollama_models (name, pull_count, tags, description, updated_at)
234
+ VALUES (?, ?, ?, ?, ?)
235
+ `);
236
+ let updated = 0;
237
+ for (let i = 0; i < models.length; i++) {
238
+ const model = models[i];
239
+ stmt.run(model.name, model.pullCount, JSON.stringify(model.tags), model.description, Date.now());
240
+ updated++;
241
+ }
242
+ // Update rankings
243
+ this.updatePopularityRankings();
244
+ // Update cache metadata
245
+ this.db.query(`
246
+ INSERT OR REPLACE INTO cache_metadata (key, value, updated_at)
247
+ VALUES ('ollama_fetch', 'completed', ?)
248
+ `).run(Date.now());
249
+ this.lastFetch = Date.now();
250
+ this.saveLastFetch();
251
+ console.log(`[ModelPopularity] Updated ${updated} models from Ollama`);
252
+ return updated;
253
+ }
254
+ /**
255
+ * Update popularity rankings based on pull counts
256
+ */
257
+ updatePopularityRankings() {
258
+ const models = this.db.query(`
259
+ SELECT name, pull_count,
260
+ ROW_NUMBER() OVER (ORDER BY pull_count DESC) as rank
261
+ FROM ollama_models
262
+ `).all();
263
+ const stmt = this.db.query(`
264
+ INSERT OR REPLACE INTO model_popularity
265
+ (model_name, pull_count, pull_count_rank, last_updated)
266
+ VALUES (?, ?, ?, ?)
267
+ `);
268
+ for (const model of models) {
269
+ stmt.run(model.name, model.pull_count, model.rank, Date.now());
270
+ }
271
+ }
272
+ /**
273
+ * Store a Nostr report
274
+ */
275
+ storeNostrReport(report) {
276
+ const id = `${report.pubkey}-${report.modelName}-${report.timestamp}`;
277
+ this.db.query(`
278
+ INSERT OR REPLACE INTO nostr_reports
279
+ (id, pubkey, model_name, rating, task_type, latency, success, timestamp, signature)
280
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
281
+ `).run(id, report.pubkey, report.modelName, report.rating, report.taskType, report.latency, report.success ? 1 : 0, report.timestamp, report.signature);
282
+ // Update aggregated popularity
283
+ this.updateCommunityScore(report.modelName);
284
+ }
285
+ /**
286
+ * Update community score for a model
287
+ */
288
+ updateCommunityScore(modelName) {
289
+ const stats = this.db.query(`
290
+ SELECT
291
+ AVG(rating) as avg_rating,
292
+ COUNT(*) as sample_size,
293
+ SUM(CASE WHEN success = 1 THEN 1 ELSE 0 END) * 1.0 / COUNT(*) as success_rate
294
+ FROM nostr_reports
295
+ WHERE model_name = ?
296
+ `).get(modelName);
297
+ if (stats && stats.sample_size > 0) {
298
+ const communityScore = (stats.avg_rating / 5) * 0.6 + (stats.success_rate ?? 0.5) * 0.4;
299
+ this.db.query(`
300
+ UPDATE model_popularity
301
+ SET community_score = ?, community_sample_size = ?, last_updated = ?
302
+ WHERE model_name = ?
303
+ `).run(communityScore, stats.sample_size, Date.now(), modelName);
304
+ }
305
+ }
306
+ /**
307
+ * Increment local usage count
308
+ */
309
+ incrementLocalUsage(modelName) {
310
+ this.db.query(`
311
+ INSERT INTO model_popularity (model_name, local_usage_count, last_updated)
312
+ VALUES (?, 1, ?)
313
+ ON CONFLICT(model_name) DO UPDATE SET
314
+ local_usage_count = local_usage_count + 1,
315
+ last_updated = excluded.last_updated
316
+ `).run(modelName, Date.now());
317
+ }
318
+ /**
319
+ * Get popularity for a specific model
320
+ */
321
+ getPopularity(modelName) {
322
+ const row = this.db.query(`
323
+ SELECT
324
+ model_name,
325
+ COALESCE(pull_count, 0) as pull_count,
326
+ COALESCE(pull_count_rank, 999) as pull_count_rank,
327
+ COALESCE(community_score, 0) as community_score,
328
+ COALESCE(community_sample_size, 0) as community_sample_size,
329
+ COALESCE(local_usage_count, 0) as local_usage_count,
330
+ COALESCE(trending, 0) as trending,
331
+ last_updated
332
+ FROM model_popularity
333
+ WHERE model_name = ?
334
+ `).get(modelName);
335
+ if (!row) {
336
+ // Check if model exists in Ollama cache
337
+ const ollamaModel = this.db.query(`
338
+ SELECT name, pull_count FROM ollama_models WHERE name = ?
339
+ `).get(modelName);
340
+ if (ollamaModel) {
341
+ return {
342
+ modelName: modelName,
343
+ pullCount: ollamaModel.pull_count || 0,
344
+ pullCountRank: 999,
345
+ communityScore: 0,
346
+ communitySampleSize: 0,
347
+ localUsageCount: 0,
348
+ trending: false,
349
+ lastUpdated: Date.now(),
350
+ };
351
+ }
352
+ return null;
353
+ }
354
+ return {
355
+ modelName: row.model_name,
356
+ pullCount: row.pull_count,
357
+ pullCountRank: row.pull_count_rank,
358
+ communityScore: row.community_score,
359
+ communitySampleSize: row.community_sample_size,
360
+ localUsageCount: row.local_usage_count,
361
+ trending: row.trending === 1,
362
+ lastUpdated: row.last_updated,
363
+ };
364
+ }
365
+ /**
366
+ * Get all popularity data
367
+ */
368
+ getAllPopularity() {
369
+ const rows = this.db.query(`
370
+ SELECT
371
+ model_name,
372
+ COALESCE(pull_count, 0) as pull_count,
373
+ COALESCE(pull_count_rank, 999) as pull_count_rank,
374
+ COALESCE(community_score, 0) as community_score,
375
+ COALESCE(community_sample_size, 0) as community_sample_size,
376
+ COALESCE(local_usage_count, 0) as local_usage_count,
377
+ COALESCE(trending, 0) as trending,
378
+ last_updated
379
+ FROM model_popularity
380
+ ORDER BY pull_count DESC
381
+ `).all();
382
+ return rows.map(row => ({
383
+ modelName: row.model_name,
384
+ pullCount: row.pull_count,
385
+ pullCountRank: row.pull_count_rank,
386
+ communityScore: row.community_score,
387
+ communitySampleSize: row.community_sample_size,
388
+ localUsageCount: row.local_usage_count,
389
+ trending: row.trending === 1,
390
+ lastUpdated: row.last_updated,
391
+ }));
392
+ }
393
+ /**
394
+ * Calculate popularity score for use in routing
395
+ * Returns a normalized score (0-1) factoring in multiple signals
396
+ */
397
+ calculatePopularityScore(modelName, weights) {
398
+ const pop = this.getPopularity(modelName);
399
+ if (!pop)
400
+ return 0.5; // Default for unknown models
401
+ const w = {
402
+ pullCount: 0.4,
403
+ communityScore: 0.4,
404
+ localUsage: 0.2,
405
+ ...weights,
406
+ };
407
+ // Normalize pull count (log scale)
408
+ const pullScore = Math.log10(pop.pullCount + 1) / 8; // 100M pulls = ~1
409
+ // Community score is already normalized (0-1)
410
+ const communityNorm = pop.communitySampleSize > 0
411
+ ? pop.communityScore
412
+ : 0.5; // Default for no community data
413
+ // Normalize local usage (log scale)
414
+ const localScore = Math.log10(pop.localUsageCount + 1) / 4; // 10K uses = ~1
415
+ return pullScore * w.pullCount +
416
+ communityNorm * w.communityScore +
417
+ Math.min(localScore, 1) * w.localUsage;
418
+ }
419
+ /**
420
+ * Get trending models (fastest growing)
421
+ */
422
+ getTrending(limit = 10) {
423
+ const rows = this.db.query(`
424
+ SELECT
425
+ model_name,
426
+ pull_count,
427
+ pull_count_rank,
428
+ community_score,
429
+ community_sample_size,
430
+ local_usage_count,
431
+ trending,
432
+ last_updated
433
+ FROM model_popularity
434
+ WHERE pull_count > 0
435
+ ORDER BY pull_count DESC
436
+ LIMIT ?
437
+ `).all(limit);
438
+ return rows.map(row => ({
439
+ modelName: row.model_name,
440
+ pullCount: row.pull_count,
441
+ pullCountRank: row.pull_count_rank,
442
+ communityScore: row.community_score,
443
+ communitySampleSize: row.community_sample_size,
444
+ localUsageCount: row.local_usage_count,
445
+ trending: row.trending === 1,
446
+ lastUpdated: row.last_updated,
447
+ }));
448
+ }
449
+ /**
450
+ * Get most used models locally
451
+ */
452
+ getMostUsedLocally(limit = 10) {
453
+ const rows = this.db.query(`
454
+ SELECT
455
+ model_name,
456
+ pull_count,
457
+ pull_count_rank,
458
+ community_score,
459
+ community_sample_size,
460
+ local_usage_count,
461
+ trending,
462
+ last_updated
463
+ FROM model_popularity
464
+ WHERE local_usage_count > 0
465
+ ORDER BY local_usage_count DESC
466
+ LIMIT ?
467
+ `).all(limit);
468
+ return rows.map(row => ({
469
+ modelName: row.model_name,
470
+ pullCount: row.pull_count,
471
+ pullCountRank: row.pull_count_rank,
472
+ communityScore: row.community_score,
473
+ communitySampleSize: row.community_sample_size,
474
+ localUsageCount: row.local_usage_count,
475
+ trending: false,
476
+ lastUpdated: row.last_updated,
477
+ }));
478
+ }
479
+ /**
480
+ * Check if cache needs refresh
481
+ */
482
+ needsRefresh() {
483
+ return Date.now() - this.lastFetch > this.CACHE_TTL;
484
+ }
485
+ /**
486
+ * Auto-refresh if needed
487
+ */
488
+ async ensureFresh() {
489
+ if (this.needsRefresh()) {
490
+ await this.refreshFromOllama();
491
+ }
492
+ }
493
+ /**
494
+ * Export popularity data for sharing
495
+ */
496
+ exportForNostr() {
497
+ const myReports = this.db.query(`
498
+ SELECT model_name,
499
+ AVG(rating) as avg_rating,
500
+ COUNT(*) as count,
501
+ AVG(latency) as avg_latency
502
+ FROM nostr_reports
503
+ GROUP BY model_name
504
+ `).all();
505
+ return {
506
+ kind: NOSTR_KIND_MODEL_REPORT,
507
+ models: myReports.map(r => ({
508
+ model: r.model_name,
509
+ rating: r.avg_rating,
510
+ samples: r.count,
511
+ latency: r.avg_latency,
512
+ })),
513
+ timestamp: Date.now(),
514
+ };
515
+ }
516
+ /**
517
+ * Close database
518
+ */
519
+ close() {
520
+ this.db.close();
521
+ }
522
+ }
523
+ const DEFAULT_RELAYS = [
524
+ 'wss://relay.damus.io',
525
+ 'wss://nos.lol',
526
+ 'wss://relay.nostr.band',
527
+ ];
528
+ /**
529
+ * Fetch model reports from Nostr relays
530
+ * This is a simplified implementation - for full Nostr support,
531
+ * use a proper Nostr library like nostr-tools
532
+ */
533
+ async function fetchNostrModelReports(modelNames, config = {}) {
534
+ const { relays = DEFAULT_RELAYS, timeout = 5000 } = config;
535
+ const reports = [];
536
+ // Note: This is a simplified WebSocket implementation
537
+ // In production, use a proper Nostr library with proper signing
538
+ console.log('[Nostr] Fetching model reports from relays...');
539
+ // For now, return local data
540
+ // Full Nostr integration would require:
541
+ // 1. WebSocket connections to relays
542
+ // 2. REQ messages with filters for kind 31234
543
+ // 3. Event signature verification
544
+ // 4. Rate limiting and pagination
545
+ console.log('[Nostr] Note: Full Nostr integration requires nostr-tools library');
546
+ return reports;
547
+ }
548
+ // ============================================================================
549
+ // Singleton Instance
550
+ // ============================================================================
551
+ let popularityInstance = null;
552
+ export function getModelPopularityService() {
553
+ if (!popularityInstance) {
554
+ popularityInstance = new ModelPopularityService();
555
+ }
556
+ return popularityInstance;
557
+ }
558
+ export function closeModelPopularityService() {
559
+ if (popularityInstance) {
560
+ popularityInstance.close();
561
+ popularityInstance = null;
562
+ }
563
+ }
564
+ export { ModelPopularityService, fetchNostrModelReports, NOSTR_KIND_MODEL_REPORT };
565
+ export default ModelPopularityService;
566
+ //# sourceMappingURL=model-popularity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-popularity.js","sourceRoot":"","sources":["../../../src/llm/model-popularity.ts"],"names":[],"mappings":"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"}