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.
- package/HEARTBEAT.md +239 -0
- package/IDENTITY.md +12 -0
- package/README.md +138 -4
- package/SOUL.md +21 -0
- package/dist/package.json +10 -5
- package/dist/src/agent/bootstrap-loader.js +295 -66
- package/dist/src/agent/bootstrap-loader.js.map +1 -1
- package/dist/src/agent/context-pruning.js +10 -5
- package/dist/src/agent/context-pruning.js.map +1 -1
- package/dist/src/agent/embedded-runner.js +29 -15
- package/dist/src/agent/embedded-runner.js.map +1 -1
- package/dist/src/agent/index.js +5 -2
- package/dist/src/agent/index.js.map +1 -1
- package/dist/src/agent/system-prompt.js +167 -20
- package/dist/src/agent/system-prompt.js.map +1 -1
- package/dist/src/agent/tools/spawn-agent.js +72 -5
- package/dist/src/agent/tools/spawn-agent.js.map +1 -1
- package/dist/src/channels/slack/webhook.js +2 -2
- package/dist/src/channels/slack/webhook.js.map +1 -1
- package/dist/src/channels/telegram/bot.js +4 -4
- package/dist/src/channels/telegram/bot.js.map +1 -1
- package/dist/src/channels/whatsapp/integration.js +4 -4
- package/dist/src/channels/whatsapp/integration.js.map +1 -1
- package/dist/src/cli/commands/gateway.js +9 -10
- package/dist/src/cli/commands/gateway.js.map +1 -1
- package/dist/src/cli/commands/init.js +90 -0
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/setup.js +53 -0
- package/dist/src/cli/commands/setup.js.map +1 -1
- package/dist/src/cli/index.js +0 -0
- package/dist/src/config/unified-config.js +5 -0
- package/dist/src/config/unified-config.js.map +1 -1
- package/dist/src/cron/index.js +2 -0
- package/dist/src/cron/index.js.map +1 -1
- package/dist/src/cron/nl-parser.js +522 -0
- package/dist/src/cron/nl-parser.js.map +1 -0
- package/dist/src/cron/runner.js +6 -31
- package/dist/src/cron/runner.js.map +1 -1
- package/dist/src/event-bus/index.js.map +1 -1
- package/dist/src/extensions/core/agent-orchestrator-extension.js +200 -148
- package/dist/src/extensions/core/agent-orchestrator-extension.js.map +1 -1
- package/dist/src/extensions/core/diagnostics-extension.js +93 -56
- package/dist/src/extensions/core/diagnostics-extension.js.map +1 -1
- package/dist/src/extensions/core/draconic-safety-extension.js +256 -3
- package/dist/src/extensions/core/draconic-safety-extension.js.map +1 -1
- package/dist/src/extensions/core/heartbeat-extension.js +416 -150
- package/dist/src/extensions/core/heartbeat-extension.js.map +1 -1
- package/dist/src/extensions/core/{generative-agents-extension.js → learning-extension.js} +90 -128
- package/dist/src/extensions/core/learning-extension.js.map +1 -0
- package/dist/src/extensions/core/perennial-memory-extension.js +884 -87
- package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -1
- package/dist/src/extensions/core/routed-ollama-extension.js +345 -0
- package/dist/src/extensions/core/routed-ollama-extension.js.map +1 -0
- package/dist/src/extensions/core/task-manager-extension.js +25 -2
- package/dist/src/extensions/core/task-manager-extension.js.map +1 -1
- package/dist/src/extensions/core/websearch-enhanced-extension.js +81 -23
- package/dist/src/extensions/core/websearch-enhanced-extension.js.map +1 -1
- package/dist/src/extensions/core/workspace-footer-extension.js +40 -63
- package/dist/src/extensions/core/workspace-footer-extension.js.map +1 -1
- package/dist/src/extensions/loader.js +5 -1
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/gateway/gateway-server.js +74 -3
- package/dist/src/gateway/gateway-server.js.map +1 -1
- package/dist/src/gateway/index.js +2 -2
- package/dist/src/gateway/index.js.map +1 -1
- package/dist/src/gateway/methods/agent.js +1 -1
- package/dist/src/gateway/methods/agent.js.map +1 -1
- package/dist/src/gateway/methods/index.js +4 -0
- package/dist/src/gateway/methods/index.js.map +1 -1
- package/dist/src/gateway/methods/node.js +261 -0
- package/dist/src/gateway/methods/node.js.map +1 -0
- package/dist/src/gateway/queue-modes.js +356 -0
- package/dist/src/gateway/queue-modes.js.map +1 -0
- package/dist/src/index.js +47 -6
- package/dist/src/index.js.map +1 -1
- package/dist/src/llm/community-analytics.js +569 -0
- package/dist/src/llm/community-analytics.js.map +1 -0
- package/dist/src/llm/index.js +28 -4
- package/dist/src/llm/index.js.map +1 -1
- package/dist/src/llm/model-discovery.js +335 -0
- package/dist/src/llm/model-discovery.js.map +1 -0
- package/dist/src/llm/model-popularity.js +566 -0
- package/dist/src/llm/model-popularity.js.map +1 -0
- package/dist/src/llm/model-scoring-db.js +553 -0
- package/dist/src/llm/model-scoring-db.js.map +1 -0
- package/dist/src/llm/multi-provider.js +258 -0
- package/dist/src/llm/multi-provider.js.map +1 -0
- package/dist/src/llm/ollama.js +133 -187
- package/dist/src/llm/ollama.js.map +1 -1
- package/dist/src/llm/router-commands.js +773 -0
- package/dist/src/llm/router-commands.js.map +1 -0
- package/dist/src/llm/router-core.js +600 -0
- package/dist/src/llm/router-core.js.map +1 -0
- package/dist/src/memory/checkpoint-manager.js +278 -0
- package/dist/src/memory/checkpoint-manager.js.map +1 -0
- package/dist/src/memory/conflict-detector.js +279 -0
- package/dist/src/memory/conflict-detector.js.map +1 -0
- package/dist/src/memory/context-graph.js +360 -0
- package/dist/src/memory/context-graph.js.map +1 -0
- package/dist/src/memory/dialectic/benchmark-cli.js +200 -0
- package/dist/src/memory/dialectic/benchmark-cli.js.map +1 -0
- package/dist/src/memory/dialectic/debug-reasoning.js +37 -0
- package/dist/src/memory/dialectic/debug-reasoning.js.map +1 -0
- package/dist/src/memory/dialectic/index.js +135 -0
- package/dist/src/memory/dialectic/index.js.map +1 -0
- package/dist/src/memory/dialectic/nudges.js +380 -0
- package/dist/src/memory/dialectic/nudges.js.map +1 -0
- package/dist/src/memory/dialectic/reasoning-engine.js +607 -0
- package/dist/src/memory/dialectic/reasoning-engine.js.map +1 -0
- package/dist/src/memory/dialectic/reasoning.js +390 -0
- package/dist/src/memory/dialectic/reasoning.js.map +1 -0
- package/dist/src/memory/dialectic/skill-creation.js +481 -0
- package/dist/src/memory/dialectic/skill-creation.js.map +1 -0
- package/dist/src/memory/dialectic/store.js +663 -0
- package/dist/src/memory/dialectic/store.js.map +1 -0
- package/dist/src/memory/dialectic/types.js +11 -0
- package/dist/src/memory/dialectic/types.js.map +1 -0
- package/dist/src/memory/index.js +24 -2
- package/dist/src/memory/index.js.map +1 -1
- package/dist/src/memory/memory-decay.js +350 -0
- package/dist/src/memory/memory-decay.js.map +1 -0
- package/dist/src/memory/memory-integration.js +5 -5
- package/dist/src/memory/memory-integration.js.map +1 -1
- package/dist/src/memory/migrate-memory-stream.js +97 -0
- package/dist/src/memory/migrate-memory-stream.js.map +1 -0
- package/dist/src/memory/session-memory-bridge.js +49 -5
- package/dist/src/memory/session-memory-bridge.js.map +1 -1
- package/dist/src/memory/session-store.js +123 -0
- package/dist/src/memory/session-store.js.map +1 -1
- package/dist/src/memory/smart-write-rules.js +164 -0
- package/dist/src/memory/smart-write-rules.js.map +1 -0
- package/dist/src/memory/tiered-memory.js +436 -0
- package/dist/src/memory/tiered-memory.js.map +1 -0
- package/dist/src/memory/types.js +6 -0
- package/dist/src/memory/types.js.map +1 -0
- package/dist/src/memory/verify-migration.js +99 -0
- package/dist/src/memory/verify-migration.js.map +1 -0
- package/dist/src/pi-config.js +11 -9
- package/dist/src/pi-config.js.map +1 -1
- package/dist/src/skills/conditional-skills.js +464 -0
- package/dist/src/skills/conditional-skills.js.map +1 -0
- package/dist/src/skills/index.js +5 -0
- package/dist/src/skills/index.js.map +1 -1
- package/dist/src/skills/loader.js +56 -0
- package/dist/src/skills/loader.js.map +1 -1
- package/dist/src/skills/skill-manage.js +417 -0
- package/dist/src/skills/skill-manage.js.map +1 -0
- package/dist/src/tui/commands/orchestration-commands.js +62 -0
- package/dist/src/tui/commands/orchestration-commands.js.map +1 -1
- package/package.json +10 -5
- package/skills/model-router-test.ts +65 -0
- package/dist/src/extensions/core/auto-security-scan-extension.js +0 -41
- package/dist/src/extensions/core/auto-security-scan-extension.js.map +0 -1
- package/dist/src/extensions/core/cloudflare-browser-extension.js +0 -389
- package/dist/src/extensions/core/cloudflare-browser-extension.js.map +0 -1
- package/dist/src/extensions/core/compaction-safeguard.js +0 -223
- package/dist/src/extensions/core/compaction-safeguard.js.map +0 -1
- package/dist/src/extensions/core/generative-agents-extension.js.map +0 -1
- package/dist/src/extensions/core/obsidian-bridge-extension.js +0 -488
- package/dist/src/extensions/core/obsidian-bridge-extension.js.map +0 -1
- package/dist/src/llm/router.js +0 -145
- package/dist/src/llm/router.js.map +0 -1
- package/skills/kobold-scan-skill/node_modules/.package-lock.json +0 -172
- package/skills/kobold-scan-skill/node_modules/ansi-styles/index.d.ts +0 -345
- package/skills/kobold-scan-skill/node_modules/ansi-styles/index.js +0 -163
- package/skills/kobold-scan-skill/node_modules/ansi-styles/license +0 -9
- package/skills/kobold-scan-skill/node_modules/ansi-styles/package.json +0 -56
- package/skills/kobold-scan-skill/node_modules/ansi-styles/readme.md +0 -152
- package/skills/kobold-scan-skill/node_modules/balanced-match/.github/FUNDING.yml +0 -2
- package/skills/kobold-scan-skill/node_modules/balanced-match/LICENSE.md +0 -21
- package/skills/kobold-scan-skill/node_modules/balanced-match/README.md +0 -97
- package/skills/kobold-scan-skill/node_modules/balanced-match/index.js +0 -62
- package/skills/kobold-scan-skill/node_modules/balanced-match/package.json +0 -48
- package/skills/kobold-scan-skill/node_modules/brace-expansion/.github/FUNDING.yml +0 -2
- package/skills/kobold-scan-skill/node_modules/brace-expansion/LICENSE +0 -21
- package/skills/kobold-scan-skill/node_modules/brace-expansion/README.md +0 -135
- package/skills/kobold-scan-skill/node_modules/brace-expansion/index.js +0 -203
- package/skills/kobold-scan-skill/node_modules/brace-expansion/package.json +0 -49
- package/skills/kobold-scan-skill/node_modules/chalk/index.d.ts +0 -415
- package/skills/kobold-scan-skill/node_modules/chalk/license +0 -9
- package/skills/kobold-scan-skill/node_modules/chalk/package.json +0 -68
- package/skills/kobold-scan-skill/node_modules/chalk/readme.md +0 -341
- package/skills/kobold-scan-skill/node_modules/chalk/source/index.js +0 -229
- package/skills/kobold-scan-skill/node_modules/chalk/source/templates.js +0 -134
- package/skills/kobold-scan-skill/node_modules/chalk/source/util.js +0 -39
- package/skills/kobold-scan-skill/node_modules/color-convert/CHANGELOG.md +0 -54
- package/skills/kobold-scan-skill/node_modules/color-convert/LICENSE +0 -21
- package/skills/kobold-scan-skill/node_modules/color-convert/README.md +0 -68
- package/skills/kobold-scan-skill/node_modules/color-convert/conversions.js +0 -839
- package/skills/kobold-scan-skill/node_modules/color-convert/index.js +0 -81
- package/skills/kobold-scan-skill/node_modules/color-convert/package.json +0 -48
- package/skills/kobold-scan-skill/node_modules/color-convert/route.js +0 -97
- package/skills/kobold-scan-skill/node_modules/color-name/LICENSE +0 -8
- package/skills/kobold-scan-skill/node_modules/color-name/README.md +0 -11
- package/skills/kobold-scan-skill/node_modules/color-name/index.js +0 -152
- package/skills/kobold-scan-skill/node_modules/color-name/package.json +0 -28
- package/skills/kobold-scan-skill/node_modules/commander/LICENSE +0 -22
- package/skills/kobold-scan-skill/node_modules/commander/Readme.md +0 -1129
- package/skills/kobold-scan-skill/node_modules/commander/esm.mjs +0 -16
- package/skills/kobold-scan-skill/node_modules/commander/index.js +0 -27
- package/skills/kobold-scan-skill/node_modules/commander/lib/argument.js +0 -147
- package/skills/kobold-scan-skill/node_modules/commander/lib/command.js +0 -2179
- package/skills/kobold-scan-skill/node_modules/commander/lib/error.js +0 -45
- package/skills/kobold-scan-skill/node_modules/commander/lib/help.js +0 -461
- package/skills/kobold-scan-skill/node_modules/commander/lib/option.js +0 -326
- package/skills/kobold-scan-skill/node_modules/commander/lib/suggestSimilar.js +0 -100
- package/skills/kobold-scan-skill/node_modules/commander/package-support.json +0 -16
- package/skills/kobold-scan-skill/node_modules/commander/package.json +0 -80
- package/skills/kobold-scan-skill/node_modules/commander/typings/index.d.ts +0 -891
- package/skills/kobold-scan-skill/node_modules/fs.realpath/LICENSE +0 -43
- package/skills/kobold-scan-skill/node_modules/fs.realpath/README.md +0 -33
- package/skills/kobold-scan-skill/node_modules/fs.realpath/index.js +0 -66
- package/skills/kobold-scan-skill/node_modules/fs.realpath/old.js +0 -303
- package/skills/kobold-scan-skill/node_modules/fs.realpath/package.json +0 -26
- package/skills/kobold-scan-skill/node_modules/glob/LICENSE +0 -15
- package/skills/kobold-scan-skill/node_modules/glob/README.md +0 -399
- package/skills/kobold-scan-skill/node_modules/glob/common.js +0 -244
- package/skills/kobold-scan-skill/node_modules/glob/glob.js +0 -790
- package/skills/kobold-scan-skill/node_modules/glob/package.json +0 -55
- package/skills/kobold-scan-skill/node_modules/glob/sync.js +0 -486
- package/skills/kobold-scan-skill/node_modules/has-flag/index.d.ts +0 -39
- package/skills/kobold-scan-skill/node_modules/has-flag/index.js +0 -8
- package/skills/kobold-scan-skill/node_modules/has-flag/license +0 -9
- package/skills/kobold-scan-skill/node_modules/has-flag/package.json +0 -46
- package/skills/kobold-scan-skill/node_modules/has-flag/readme.md +0 -89
- package/skills/kobold-scan-skill/node_modules/inflight/LICENSE +0 -15
- package/skills/kobold-scan-skill/node_modules/inflight/README.md +0 -37
- package/skills/kobold-scan-skill/node_modules/inflight/inflight.js +0 -54
- package/skills/kobold-scan-skill/node_modules/inflight/package.json +0 -29
- package/skills/kobold-scan-skill/node_modules/inherits/LICENSE +0 -16
- package/skills/kobold-scan-skill/node_modules/inherits/README.md +0 -42
- package/skills/kobold-scan-skill/node_modules/inherits/inherits.js +0 -9
- package/skills/kobold-scan-skill/node_modules/inherits/inherits_browser.js +0 -27
- package/skills/kobold-scan-skill/node_modules/inherits/package.json +0 -29
- package/skills/kobold-scan-skill/node_modules/minimatch/LICENSE +0 -15
- package/skills/kobold-scan-skill/node_modules/minimatch/README.md +0 -259
- package/skills/kobold-scan-skill/node_modules/minimatch/lib/path.js +0 -4
- package/skills/kobold-scan-skill/node_modules/minimatch/minimatch.js +0 -944
- package/skills/kobold-scan-skill/node_modules/minimatch/package.json +0 -35
- package/skills/kobold-scan-skill/node_modules/once/LICENSE +0 -15
- package/skills/kobold-scan-skill/node_modules/once/README.md +0 -79
- package/skills/kobold-scan-skill/node_modules/once/once.js +0 -42
- package/skills/kobold-scan-skill/node_modules/once/package.json +0 -33
- package/skills/kobold-scan-skill/node_modules/supports-color/browser.js +0 -5
- package/skills/kobold-scan-skill/node_modules/supports-color/index.js +0 -135
- package/skills/kobold-scan-skill/node_modules/supports-color/license +0 -9
- package/skills/kobold-scan-skill/node_modules/supports-color/package.json +0 -53
- package/skills/kobold-scan-skill/node_modules/supports-color/readme.md +0 -76
- package/skills/kobold-scan-skill/node_modules/wrappy/LICENSE +0 -15
- package/skills/kobold-scan-skill/node_modules/wrappy/README.md +0 -36
- package/skills/kobold-scan-skill/node_modules/wrappy/package.json +0 -29
- 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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"}
|