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,569 @@
1
+ /**
2
+ * Community Analytics Service
3
+ *
4
+ * Shares anonymized model performance data with the 0xKobold community.
5
+ *
6
+ * Privacy guarantees:
7
+ * - NO prompts or responses shared
8
+ * - NO user identity or IP stored
9
+ * - ONLY aggregated model stats (name, rating, latency, success rate)
10
+ * - Opt-in only (disabled by default)
11
+ *
12
+ * Data shared:
13
+ * - Model name
14
+ * - Average rating (1-5)
15
+ * - Average latency (ms)
16
+ * - Success rate (0-1)
17
+ * - Usage count
18
+ * - Task types used for
19
+ */
20
+ import { homedir } from 'os';
21
+ import { join } from 'path';
22
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
23
+ import { getModelScoringDB } from './model-scoring-db';
24
+ import { getModelPopularityService } from './model-popularity';
25
+ // Nostr integration using nostr-tools
26
+ import { finalizeEvent, verifyEvent, SimplePool, generateSecretKey, getPublicKey } from 'nostr-tools';
27
+ // ============================================================================
28
+ // Constants
29
+ // ============================================================================
30
+ const CONFIG_PATH = join(homedir(), '.0xkobold', 'community-config.json');
31
+ const DATA_PATH = join(homedir(), '.0xkobold', 'community-data.json');
32
+ const DEFAULT_CONFIG = {
33
+ enabled: false, // Opt-in only
34
+ endpoint: 'https://raw.githubusercontent.com/kobolds/0xKobolds/main/community/model-stats.json',
35
+ submitInterval: 24, // Submit once per day
36
+ };
37
+ // Default community endpoint (can be customized)
38
+ const COMMUNITY_ENDPOINT = 'https://raw.githubusercontent.com/kobolds/0xKobolds/main/community/model-stats.json';
39
+ // ============================================================================
40
+ // Community Analytics Service
41
+ // ============================================================================
42
+ class CommunityAnalyticsService {
43
+ config;
44
+ userId;
45
+ constructor() {
46
+ this.config = this.loadConfig();
47
+ this.userId = this.generateOrGetUserId();
48
+ }
49
+ // ============================================================================
50
+ // Configuration
51
+ // ============================================================================
52
+ loadConfig() {
53
+ if (existsSync(CONFIG_PATH)) {
54
+ try {
55
+ const data = readFileSync(CONFIG_PATH, 'utf-8');
56
+ return { ...DEFAULT_CONFIG, ...JSON.parse(data) };
57
+ }
58
+ catch {
59
+ return DEFAULT_CONFIG;
60
+ }
61
+ }
62
+ return DEFAULT_CONFIG;
63
+ }
64
+ saveConfig() {
65
+ writeFileSync(CONFIG_PATH, JSON.stringify(this.config, null, 2));
66
+ }
67
+ generateOrGetUserId() {
68
+ const idPath = join(homedir(), '.0xkobold', 'community-id.txt');
69
+ if (existsSync(idPath)) {
70
+ return readFileSync(idPath, 'utf-8').trim();
71
+ }
72
+ // Generate anonymous ID (random UUID)
73
+ const id = `user_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
74
+ writeFileSync(idPath, id);
75
+ return id;
76
+ }
77
+ enable() {
78
+ this.config.enabled = true;
79
+ this.saveConfig();
80
+ console.log('[Community] Enabled anonymous stats sharing');
81
+ }
82
+ disable() {
83
+ this.config.enabled = false;
84
+ this.saveConfig();
85
+ console.log('[Community] Disabled anonymous stats sharing');
86
+ }
87
+ isEnabled() {
88
+ return this.config.enabled;
89
+ }
90
+ setEndpoint(endpoint) {
91
+ this.config.endpoint = endpoint;
92
+ this.saveConfig();
93
+ console.log(`[Community] Set endpoint to: ${endpoint}`);
94
+ }
95
+ // ============================================================================
96
+ // Data Collection
97
+ // ============================================================================
98
+ /**
99
+ * Collect anonymized stats from local database
100
+ */
101
+ collectLocalStats() {
102
+ const scoringDB = getModelScoringDB();
103
+ const popularity = getModelPopularityService();
104
+ const scores = scoringDB.getAllScores();
105
+ const stats = [];
106
+ for (const score of scores) {
107
+ if (score.usageCount < 1)
108
+ continue; // Skip unused models
109
+ // Get task-specific performance
110
+ const taskTypes = ['chat', 'code', 'vision', 'reasoning'];
111
+ const taskStats = [];
112
+ const bestFor = [];
113
+ for (const taskType of taskTypes) {
114
+ const taskPerf = scoringDB.getTaskPerformance(score.modelName, taskType);
115
+ if (taskPerf && taskPerf.usageCount >= 1) {
116
+ taskStats.push({
117
+ taskType,
118
+ avgRating: taskPerf.avgQuality,
119
+ avgLatency: taskPerf.avgLatency,
120
+ successRate: taskPerf.successRate,
121
+ usageCount: taskPerf.usageCount,
122
+ });
123
+ // Mark as "best for" if rated highly (4+ rating, 80%+ success)
124
+ if (taskPerf.avgQuality >= 4 && taskPerf.successRate >= 0.8) {
125
+ const taskName = taskType.charAt(0).toUpperCase() + taskType.slice(1);
126
+ if (!bestFor.includes(taskName)) {
127
+ bestFor.push(taskName);
128
+ }
129
+ }
130
+ }
131
+ }
132
+ stats.push({
133
+ modelName: score.modelName,
134
+ avgRating: score.avgQuality,
135
+ avgLatency: score.avgLatency,
136
+ successRate: score.successRate,
137
+ usageCount: score.usageCount,
138
+ taskStats,
139
+ bestFor,
140
+ lastUpdated: Date.now(),
141
+ contributorCount: 1, // Just this user
142
+ });
143
+ }
144
+ return stats;
145
+ }
146
+ /**
147
+ * Export stats for community submission
148
+ */
149
+ exportForCommunity() {
150
+ const stats = this.collectLocalStats();
151
+ return {
152
+ userId: this.userId, // Anonymous ID
153
+ stats,
154
+ timestamp: Date.now(),
155
+ };
156
+ }
157
+ // ============================================================================
158
+ // Submission (to user's own storage)
159
+ // ============================================================================
160
+ /**
161
+ * Save community submission locally for manual upload
162
+ */
163
+ saveSubmissionLocally() {
164
+ const data = this.exportForCommunity();
165
+ const outputPath = join(homedir(), '.0xkobold', 'community-submission.json');
166
+ writeFileSync(outputPath, JSON.stringify(data, null, 2));
167
+ console.log(`[Community] Saved submission to: ${outputPath}`);
168
+ console.log(`[Community] Stats prepared for ${data.stats.length} models`);
169
+ return outputPath;
170
+ }
171
+ /**
172
+ * Create a shareable text summary for manual submission
173
+ */
174
+ createShareableText() {
175
+ const data = this.exportForCommunity();
176
+ const lines = [
177
+ '# 0xKobold Community Stats Submission',
178
+ `# Generated: ${new Date().toISOString()}`,
179
+ `# User ID: ${this.userId}`,
180
+ `# Models: ${data.stats.length}`,
181
+ '',
182
+ '## Model Performance Stats',
183
+ '',
184
+ '| Model | Overall | Code | Chat | Reasoning | Vision | Best For |',
185
+ '|-------|---------|------|------|------------|--------|----------|',
186
+ ];
187
+ data.stats
188
+ .sort((a, b) => b.avgRating - a.avgRating)
189
+ .forEach(s => {
190
+ const overall = `${s.avgRating.toFixed(1)}★`;
191
+ // Get task ratings
192
+ const code = s.taskStats.find(t => t.taskType === 'code');
193
+ const chat = s.taskStats.find(t => t.taskType === 'chat');
194
+ const reasoning = s.taskStats.find(t => t.taskType === 'reasoning');
195
+ const vision = s.taskStats.find(t => t.taskType === 'vision');
196
+ const codeRating = code ? `${code.avgRating.toFixed(1)}` : '-';
197
+ const chatRating = chat ? `${chat.avgRating.toFixed(1)}` : '-';
198
+ const reasoningRating = reasoning ? `${reasoning.avgRating.toFixed(1)}` : '-';
199
+ const visionRating = vision ? `${vision.avgRating.toFixed(1)}` : '-';
200
+ const bestFor = s.bestFor.length > 0 ? s.bestFor.slice(0, 3).join(', ') : '-';
201
+ lines.push(`| ${s.modelName} | ${overall} | ${codeRating} | ${chatRating} | ${reasoningRating} | ${visionRating} | ${bestFor} |`);
202
+ });
203
+ lines.push('');
204
+ lines.push('## Raw JSON');
205
+ lines.push('```json');
206
+ lines.push(JSON.stringify(data, null, 2));
207
+ lines.push('```');
208
+ return lines.join('\n');
209
+ }
210
+ // ============================================================================
211
+ // Fetching Community Data
212
+ // ============================================================================
213
+ /**
214
+ * Fetch community stats from remote endpoint
215
+ */
216
+ async fetchCommunityStats() {
217
+ try {
218
+ const response = await fetch(this.config.endpoint, {
219
+ headers: {
220
+ 'User-Agent': '0xKobold/1.0',
221
+ },
222
+ signal: AbortSignal.timeout(10000), // 10 second timeout
223
+ });
224
+ if (!response.ok) {
225
+ console.warn(`[Community] Failed to fetch: ${response.status}`);
226
+ return null;
227
+ }
228
+ const data = await response.json();
229
+ // Validate structure
230
+ if (!data.version || !Array.isArray(data.models)) {
231
+ console.warn('[Community] Invalid data structure');
232
+ return null;
233
+ }
234
+ console.log(`[Community] Fetched ${data.models.length} model stats from ${data.totalContributors || 'unknown'} contributors`);
235
+ // Save locally
236
+ writeFileSync(DATA_PATH, JSON.stringify(data, null, 2));
237
+ this.config.lastFetched = Date.now();
238
+ this.saveConfig();
239
+ return data;
240
+ }
241
+ catch (err) {
242
+ console.error('[Community] Error fetching:', err);
243
+ return null;
244
+ }
245
+ }
246
+ /**
247
+ * Get cached community data
248
+ */
249
+ getCachedData() {
250
+ if (!existsSync(DATA_PATH))
251
+ return null;
252
+ try {
253
+ const data = readFileSync(DATA_PATH, 'utf-8');
254
+ return JSON.parse(data);
255
+ }
256
+ catch {
257
+ return null;
258
+ }
259
+ }
260
+ /**
261
+ * Merge community stats with local scores for combined ranking
262
+ */
263
+ mergeWithLocal() {
264
+ const merged = new Map();
265
+ // Start with community data
266
+ const communityData = this.getCachedData();
267
+ if (communityData) {
268
+ for (const stat of communityData.models) {
269
+ merged.set(stat.modelName, { ...stat, taskStats: [...stat.taskStats] });
270
+ }
271
+ }
272
+ // Merge with local data
273
+ const localStats = this.collectLocalStats();
274
+ for (const local of localStats) {
275
+ const existing = merged.get(local.modelName);
276
+ if (existing) {
277
+ // Weighted average: community + local
278
+ const totalUsage = existing.usageCount + local.usageCount;
279
+ const communityWeight = existing.usageCount / totalUsage;
280
+ const localWeight = local.usageCount / totalUsage;
281
+ // Merge task stats
282
+ const mergedTasks = new Map();
283
+ // Add community tasks
284
+ for (const task of existing.taskStats) {
285
+ mergedTasks.set(task.taskType, { ...task });
286
+ }
287
+ // Merge with local tasks
288
+ for (const task of local.taskStats) {
289
+ const existingTask = mergedTasks.get(task.taskType);
290
+ if (existingTask) {
291
+ const taskTotal = existingTask.usageCount + task.usageCount;
292
+ const tw = existingTask.usageCount / taskTotal;
293
+ const lw = task.usageCount / taskTotal;
294
+ mergedTasks.set(task.taskType, {
295
+ taskType: task.taskType,
296
+ avgRating: existingTask.avgRating * tw + task.avgRating * lw,
297
+ avgLatency: existingTask.avgLatency * tw + task.avgLatency * lw,
298
+ successRate: existingTask.successRate * tw + task.successRate * lw,
299
+ usageCount: taskTotal,
300
+ });
301
+ }
302
+ else {
303
+ mergedTasks.set(task.taskType, { ...task });
304
+ }
305
+ }
306
+ merged.set(local.modelName, {
307
+ modelName: local.modelName,
308
+ avgRating: existing.avgRating * communityWeight + local.avgRating * localWeight,
309
+ avgLatency: existing.avgLatency * communityWeight + local.avgLatency * localWeight,
310
+ successRate: existing.successRate * communityWeight + local.successRate * localWeight,
311
+ usageCount: totalUsage,
312
+ taskStats: Array.from(mergedTasks.values()),
313
+ bestFor: [...new Set([...existing.bestFor, ...local.bestFor])],
314
+ lastUpdated: Math.max(existing.lastUpdated, local.lastUpdated),
315
+ contributorCount: existing.contributorCount + 1,
316
+ });
317
+ }
318
+ else {
319
+ merged.set(local.modelName, local);
320
+ }
321
+ }
322
+ return merged;
323
+ }
324
+ /**
325
+ * Get community-enhanced tier list
326
+ */
327
+ getCommunityTierList() {
328
+ const merged = this.mergeWithLocal();
329
+ const models = Array.from(merged.values())
330
+ .filter(m => m.usageCount >= 2) // Need at least 2 uses
331
+ .sort((a, b) => {
332
+ // Score: 40% rating + 30% success + 20% speed + 10% popularity
333
+ const scoreA = (a.avgRating / 5) * 0.4 + a.successRate * 0.3 +
334
+ (1 - a.avgLatency / 10000) * 0.2 +
335
+ Math.min(a.usageCount / 100, 1) * 0.1;
336
+ const scoreB = (b.avgRating / 5) * 0.4 + b.successRate * 0.3 +
337
+ (1 - b.avgLatency / 10000) * 0.2 +
338
+ Math.min(b.usageCount / 100, 1) * 0.1;
339
+ return scoreB - scoreA;
340
+ });
341
+ const tiers = [
342
+ { tier: 'S', models: models.filter(m => (m.avgRating / 5) * 0.4 + m.successRate * 0.3 + (1 - m.avgLatency / 10000) * 0.2 >= 0.85) },
343
+ { tier: 'A', models: models.filter(m => { const s = (m.avgRating / 5) * 0.4 + m.successRate * 0.3 + (1 - m.avgLatency / 10000) * 0.2; return s >= 0.70 && s < 0.85; }) },
344
+ { tier: 'B', models: models.filter(m => { const s = (m.avgRating / 5) * 0.4 + m.successRate * 0.3 + (1 - m.avgLatency / 10000) * 0.2; return s >= 0.55 && s < 0.70; }) },
345
+ { tier: 'C', models: models.filter(m => { const s = (m.avgRating / 5) * 0.4 + m.successRate * 0.3 + (1 - m.avgLatency / 10000) * 0.2; return s >= 0.40 && s < 0.55; }) },
346
+ { tier: 'D', models: models.filter(m => { const s = (m.avgRating / 5) * 0.4 + m.successRate * 0.3 + (1 - m.avgLatency / 10000) * 0.2; return s < 0.40; }) },
347
+ ];
348
+ return tiers;
349
+ }
350
+ // ============================================================================
351
+ // Nostr Integration
352
+ // ============================================================================
353
+ /**
354
+ * Get or generate user's Nostr keypair
355
+ */
356
+ getNostrKeypair() {
357
+ const KEY_PATH = join(homedir(), '.0xkobold', 'community-nostr-key.json');
358
+ if (existsSync(KEY_PATH)) {
359
+ return JSON.parse(readFileSync(KEY_PATH, 'utf-8'));
360
+ }
361
+ // Generate new keypair using nostr-tools
362
+ const sk = generateSecretKey();
363
+ const privkey = Buffer.from(sk).toString('hex');
364
+ const pubkey = getPublicKey(sk);
365
+ const keypair = { pubkey, privkey };
366
+ writeFileSync(KEY_PATH, JSON.stringify(keypair, null, 2));
367
+ console.log('[Community] Generated new Nostr keypair:', pubkey);
368
+ return keypair;
369
+ }
370
+ /**
371
+ * Publish stats to Nostr relays
372
+ */
373
+ async publishToNostr() {
374
+ if (!this.config.enabled) {
375
+ return { success: false, error: 'Community sharing not enabled' };
376
+ }
377
+ const stats = this.collectLocalStats();
378
+ if (stats.length === 0) {
379
+ return { success: false, error: 'No stats to publish' };
380
+ }
381
+ const keypair = this.getNostrKeypair();
382
+ const relayUrls = [
383
+ 'wss://relay.nostr.band',
384
+ 'wss://nos.lol',
385
+ 'wss://relay.damus.io',
386
+ ];
387
+ const eventTemplate = {
388
+ kind: 31234, // Custom kind for model performance reports
389
+ created_at: Math.floor(Date.now() / 1000),
390
+ tags: [
391
+ ['client', '0xkobold'],
392
+ ['version', '1.0'],
393
+ ],
394
+ content: JSON.stringify({
395
+ version: 1,
396
+ userId: this.userId,
397
+ models: stats.map(s => ({
398
+ n: s.modelName,
399
+ r: Math.round(s.avgRating * 10) / 10, // Compact format
400
+ l: Math.round(s.avgLatency),
401
+ s: Math.round(s.successRate * 100),
402
+ u: s.usageCount,
403
+ t: s.taskStats.map(t => [t.taskType, t.avgRating, t.successRate]),
404
+ b: s.bestFor,
405
+ })),
406
+ }),
407
+ };
408
+ try {
409
+ // Sign and finalize the event
410
+ const privkeyBytes = Uint8Array.from(Buffer.from(keypair.privkey, 'hex'));
411
+ const signedEvent = finalizeEvent(eventTemplate, privkeyBytes);
412
+ // Verify signature
413
+ if (!verifyEvent(signedEvent)) {
414
+ return { success: false, error: 'Invalid event signature' };
415
+ }
416
+ // Publish using SimplePool
417
+ const pool = new SimplePool();
418
+ let publishedCount = 0;
419
+ try {
420
+ const promises = pool.publish(relayUrls, signedEvent);
421
+ const results = await Promise.allSettled(promises);
422
+ for (const result of results) {
423
+ if (result.status === 'fulfilled' && result.value) {
424
+ publishedCount++;
425
+ }
426
+ }
427
+ }
428
+ finally {
429
+ pool.close(relayUrls);
430
+ }
431
+ if (publishedCount > 0) {
432
+ this.config.lastSubmitted = Date.now();
433
+ this.saveConfig();
434
+ console.log(`[Community] Published to ${publishedCount} Nostr relays`);
435
+ return { success: true, eventId: signedEvent.id };
436
+ }
437
+ else {
438
+ return { success: false, error: 'Failed to publish to any relay' };
439
+ }
440
+ }
441
+ catch (err) {
442
+ console.error('[Community] Nostr publish error:', err);
443
+ return { success: false, error: err?.message || 'Unknown error' };
444
+ }
445
+ }
446
+ /**
447
+ * Fetch community stats from Nostr
448
+ */
449
+ async fetchFromNostr() {
450
+ const relayUrls = [
451
+ 'wss://relay.nostr.band',
452
+ 'wss://nos.lol',
453
+ 'wss://relay.damus.io',
454
+ ];
455
+ const allStats = new Map();
456
+ let totalContributors = 0;
457
+ const seenPubkeys = new Set();
458
+ try {
459
+ const pool = new SimplePool();
460
+ // Query for model performance events
461
+ const events = await pool.querySync(relayUrls, {
462
+ kinds: [31234],
463
+ limit: 100,
464
+ });
465
+ pool.close(relayUrls);
466
+ for (const event of events) {
467
+ if (!verifyEvent(event))
468
+ continue;
469
+ if (seenPubkeys.has(event.pubkey))
470
+ continue;
471
+ seenPubkeys.add(event.pubkey);
472
+ totalContributors++;
473
+ try {
474
+ const content = JSON.parse(event.content);
475
+ if (!content.models)
476
+ continue;
477
+ for (const m of content.models) {
478
+ const existing = allStats.get(m.n);
479
+ const newStats = {
480
+ modelName: m.n,
481
+ avgRating: existing
482
+ ? (existing.avgRating * existing.usageCount + m.r) / (existing.usageCount + 1)
483
+ : m.r,
484
+ avgLatency: existing
485
+ ? (existing.avgLatency * existing.usageCount + m.l) / (existing.usageCount + 1)
486
+ : m.l,
487
+ successRate: existing
488
+ ? (existing.successRate * existing.usageCount + m.s / 100) / (existing.usageCount + 1)
489
+ : m.s / 100,
490
+ usageCount: existing ? existing.usageCount + 1 : 1,
491
+ taskStats: m.t?.map((t) => ({
492
+ taskType: t[0],
493
+ avgRating: t[1],
494
+ successRate: t[2],
495
+ avgLatency: 0,
496
+ usageCount: 1,
497
+ })) || [],
498
+ bestFor: m.b || [],
499
+ lastUpdated: event.created_at * 1000,
500
+ contributorCount: totalContributors,
501
+ };
502
+ allStats.set(m.n, newStats);
503
+ }
504
+ }
505
+ catch (e) {
506
+ // Skip malformed events
507
+ }
508
+ }
509
+ if (allStats.size === 0)
510
+ return null;
511
+ const data = {
512
+ version: '1.0',
513
+ updatedAt: Date.now(),
514
+ generatedAt: new Date().toISOString(),
515
+ totalContributors,
516
+ models: Array.from(allStats.values()),
517
+ };
518
+ // Cache the result
519
+ writeFileSync(DATA_PATH, JSON.stringify(data, null, 2));
520
+ this.config.lastFetched = Date.now();
521
+ this.saveConfig();
522
+ console.log(`[Community] Fetched ${allStats.size} models from ${totalContributors} Nostr contributors`);
523
+ return data;
524
+ }
525
+ catch (err) {
526
+ console.error('[Community] Nostr fetch error:', err);
527
+ return null;
528
+ }
529
+ }
530
+ // ============================================================================
531
+ // Auto-Submit (if enabled and interval passed)
532
+ // ============================================================================
533
+ /**
534
+ * Check if should auto-submit
535
+ */
536
+ shouldSubmit() {
537
+ if (!this.config.enabled)
538
+ return false;
539
+ const hoursSinceLastSubmit = this.config.lastSubmitted
540
+ ? (Date.now() - this.config.lastSubmitted) / (1000 * 60 * 60)
541
+ : Infinity;
542
+ return hoursSinceLastSubmit >= this.config.submitInterval;
543
+ }
544
+ /**
545
+ * Auto-submit if interval passed (called periodically)
546
+ */
547
+ async autoSubmit() {
548
+ if (!this.shouldSubmit())
549
+ return false;
550
+ // For now, just save locally - user can manually submit
551
+ // In future, could send to actual endpoint
552
+ const outputPath = this.saveSubmissionLocally();
553
+ this.config.lastSubmitted = Date.now();
554
+ this.saveConfig();
555
+ return true;
556
+ }
557
+ }
558
+ // ============================================================================
559
+ // Singleton
560
+ // ============================================================================
561
+ let service = null;
562
+ export function getCommunityAnalytics() {
563
+ if (!service) {
564
+ service = new CommunityAnalyticsService();
565
+ }
566
+ return service;
567
+ }
568
+ export { CommunityAnalyticsService };
569
+ //# sourceMappingURL=community-analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"community-analytics.js","sourceRoot":"","sources":["../../../src/llm/community-analytics.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,33 @@
1
1
  /**
2
- * LLM Module
2
+ * LLM Module - Unified Model Router
3
3
  *
4
- * Multi-provider LLM support with Ollama as default.
4
+ * Two-layer architecture:
5
+ * - router-core.ts: The brains (scoring, learning, selection)
6
+ * - router-commands.ts: The plumbing (singleton, commands, status)
7
+ * - model-discovery.ts: Data source (API fetching, caching)
8
+ * - model-scoring-db.ts: Persistent performance tracking
9
+ * - model-popularity.ts: Community popularity (Ollama + Nostr)
10
+ * - multi-provider.ts: Multi-provider routing (Ollama, Anthropic)
5
11
  */
12
+ // Router core (brains)
13
+ export { AdaptiveModelRouter, createRouter } from './router-core';
14
+ // Router commands (plumbing)
15
+ export { getRouter, isRouterReady, getRouterStatus, createRoutedOllamaProvider, handleRouterCommand, handleModelsCommand, handleRateCommand, handleProvidersCommand, handleModelRankingsCommand, handleTierListCommand, handlePopularityCommand, handleRefreshPopularity, handleModelStatsCommand, handleCommunityCommand, handleBestForCommand, getFooterStatus,
16
+ // Status state
17
+ setCurrentModel, getCurrentModel, clearCurrentModel, } from './router-commands';
18
+ // Model discovery
19
+ export { getModelDiscoveryService, ModelDiscoveryService, } from './model-discovery';
20
+ // Model scoring database
21
+ export { getModelScoringDB, closeModelScoringDB, ModelScoringDB, } from './model-scoring-db';
22
+ // Model popularity
23
+ export { getModelPopularityService, closeModelPopularityService, createModelReportEvent, } from './model-popularity';
24
+ // Community analytics
25
+ export { getCommunityAnalytics, CommunityAnalyticsService, } from './community-analytics';
26
+ // Multi-provider routing
27
+ export { MultiProviderRouter, getMultiProviderRouter, getProviderRegistry, chat, listAllModels, getProviderStatuses, } from './multi-provider';
28
+ // Types
6
29
  export * from './types';
7
- export { OllamaProvider, createOllamaProvider, isOllamaRunning, listOllamaModels } from './ollama';
8
- export { AnthropicProvider, createAnthropicProvider } from './anthropic';
30
+ // Providers (legacy exports)
31
+ export { OllamaProvider, createOllamaProvider, getOllamaProvider } from './ollama';
32
+ export { AnthropicProvider } from './anthropic';
9
33
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,uBAAuB;AACvB,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlE,6BAA6B;AAC7B,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,EACf,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe;AACf,eAAe;AACf,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAG3B,kBAAkB;AAClB,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,yBAAyB;AACzB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAO5B,mBAAmB;AACnB,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAO5B,sBAAsB;AACtB,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAQ/B,yBAAyB;AACzB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,IAAI,EACJ,aAAa,EACb,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAG1B,QAAQ;AACR,cAAc,SAAS,CAAC;AAExB,6BAA6B;AAC7B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}