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
|
@@ -1,488 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Obsidian Bridge Extension - Heartbeat Integration
|
|
3
|
-
*
|
|
4
|
-
* Uses the Heartbeat scheduler to poll Obsidian for tasks.
|
|
5
|
-
*
|
|
6
|
-
* How it works:
|
|
7
|
-
* 1. On heartbeat 'checkin' events, poll Obsidian vault for #kobold tasks
|
|
8
|
-
* 2. Tasks found are written to ~/.0xkobold/obsidian-tasks.json
|
|
9
|
-
* 3. On next startup (or via gateway), Kobold processes these tasks
|
|
10
|
-
* 4. When tasks complete, Kobold marks them done in Obsidian
|
|
11
|
-
*
|
|
12
|
-
* This integrates with the existing Heartbeat system (no separate polling)
|
|
13
|
-
* and stores tasks in ~/.0xkobold (managed by Kobold, not in project dir)
|
|
14
|
-
*/
|
|
15
|
-
import { homedir } from "os";
|
|
16
|
-
import { join } from "path";
|
|
17
|
-
import { existsSync, mkdirSync } from "fs";
|
|
18
|
-
// Config storage in ~/.0xkobold
|
|
19
|
-
const KOBOLD_DIR = join(homedir(), ".0xkobold");
|
|
20
|
-
const DEFAULT_VAULT_PATH = join(KOBOLD_DIR, "obsidian_vault");
|
|
21
|
-
const TASKS_FILE = join(KOBOLD_DIR, "obsidian-tasks.json");
|
|
22
|
-
const STATE_FILE = join(KOBOLD_DIR, "obsidian-bridge-state.json");
|
|
23
|
-
const DEFAULT_CONFIG = {
|
|
24
|
-
enabled: false,
|
|
25
|
-
tasksFilePath: "10-Action/Tasks.md",
|
|
26
|
-
pollOn: ["morning", "periodic"], // Poll on morning check-in and every 30 min
|
|
27
|
-
};
|
|
28
|
-
class ObsidianBridgeExtension {
|
|
29
|
-
api;
|
|
30
|
-
config;
|
|
31
|
-
scheduler = null;
|
|
32
|
-
vaultDetected = false;
|
|
33
|
-
vaultPath = null;
|
|
34
|
-
cliAvailable = false;
|
|
35
|
-
constructor(api, config = {}) {
|
|
36
|
-
this.api = api;
|
|
37
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
38
|
-
// Ensure ~/.0xkobold exists
|
|
39
|
-
if (!existsSync(KOBOLD_DIR)) {
|
|
40
|
-
mkdirSync(KOBOLD_DIR, { recursive: true });
|
|
41
|
-
}
|
|
42
|
-
this.init();
|
|
43
|
-
}
|
|
44
|
-
async init() {
|
|
45
|
-
if (!this.config.enabled) {
|
|
46
|
-
console.log("[ObsidianBridge] Extension disabled");
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
console.log("[ObsidianBridge] Initializing...");
|
|
50
|
-
// Check CLI (optional)
|
|
51
|
-
this.checkCli();
|
|
52
|
-
// Detect vault - prioritizes ~/.0xkobold/obsidian_vault
|
|
53
|
-
await this.detectVault();
|
|
54
|
-
// If no vault found, create default Kobold vault
|
|
55
|
-
if (!this.vaultPath) {
|
|
56
|
-
console.log(`[ObsidianBridge] Creating default vault at ${DEFAULT_VAULT_PATH}`);
|
|
57
|
-
this.createDefaultVault();
|
|
58
|
-
this.vaultPath = DEFAULT_VAULT_PATH;
|
|
59
|
-
}
|
|
60
|
-
this.vaultDetected = true;
|
|
61
|
-
console.log(`[ObsidianBridge] Connected to vault: ${this.vaultPath}`);
|
|
62
|
-
console.log(`[ObsidianBridge] CLI available: ${this.cliAvailable} (advanced features ${this.cliAvailable ? 'enabled' : 'disabled'})`);
|
|
63
|
-
// Load any existing tasks
|
|
64
|
-
await this.loadState();
|
|
65
|
-
// Register with Heartbeat scheduler
|
|
66
|
-
this.registerWithHeartbeat();
|
|
67
|
-
}
|
|
68
|
-
createDefaultVault() {
|
|
69
|
-
const vault = DEFAULT_VAULT_PATH;
|
|
70
|
-
// Create vault structure
|
|
71
|
-
const paths = [
|
|
72
|
-
vault,
|
|
73
|
-
join(vault, ".obsidian"),
|
|
74
|
-
join(vault, "00-Inbox"),
|
|
75
|
-
join(vault, "01-Projects"),
|
|
76
|
-
join(vault, "10-Action"),
|
|
77
|
-
join(vault, "90-Archive"),
|
|
78
|
-
join(vault, "Daily"),
|
|
79
|
-
];
|
|
80
|
-
for (const path of paths) {
|
|
81
|
-
if (!existsSync(path)) {
|
|
82
|
-
mkdirSync(path, { recursive: true });
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// Create welcome note
|
|
86
|
-
const welcomePath = join(vault, "00-Inbox", "Welcome.md");
|
|
87
|
-
if (!existsSync(welcomePath)) {
|
|
88
|
-
const welcomeContent = `# Kobold Obsidian Bridge
|
|
89
|
-
|
|
90
|
-
Welcome to your Kobold-managed Obsidian vault!
|
|
91
|
-
|
|
92
|
-
## How to use
|
|
93
|
-
|
|
94
|
-
1. **Add tasks**: Create notes in \`00-Inbox/\` or add tasks to \`10-Action/Tasks.md\`
|
|
95
|
-
2. **Tag with #kobold**: Any task tagged #kobold will be picked up by Kobold
|
|
96
|
-
3. **Heartbeat polling**: Kobold checks this vault on heartbeat events
|
|
97
|
-
4. **Processing**: Tasks appear in Kobold kanban for processing
|
|
98
|
-
5. **Completion**: When done, Kobold marks tasks complete here
|
|
99
|
-
|
|
100
|
-
## Folder Structure
|
|
101
|
-
|
|
102
|
-
- \`00-Inbox/\` - New tasks and notes
|
|
103
|
-
- \`01-Projects/\` - Project-specific notes
|
|
104
|
-
- \`10-Action/\` - Tasks and actions (Tasks.md synced with Kobold)
|
|
105
|
-
- \`90-Archive/\` - Completed/archived items
|
|
106
|
-
- \`Daily/\` - Daily notes exported from Kobold sessions
|
|
107
|
-
|
|
108
|
-
## Quick Start
|
|
109
|
-
|
|
110
|
-
\`\`\`markdown
|
|
111
|
-
- [ ] Review authentication system #kobold #security
|
|
112
|
-
- [ ] Deploy v0.6.11 #kobold #deploy
|
|
113
|
-
\`\`\`
|
|
114
|
-
|
|
115
|
-
Open this vault in Obsidian: \`${vault}\`
|
|
116
|
-
`;
|
|
117
|
-
Bun.write(welcomePath, welcomeContent);
|
|
118
|
-
}
|
|
119
|
-
// Create initial Tasks.md
|
|
120
|
-
const tasksPath = join(vault, "10-Action", "Tasks.md");
|
|
121
|
-
if (!existsSync(tasksPath)) {
|
|
122
|
-
const tasksContent = `# Tasks
|
|
123
|
-
|
|
124
|
-
Synced with 0xKobold kanban board.
|
|
125
|
-
|
|
126
|
-
## Active
|
|
127
|
-
|
|
128
|
-
- [ ] Example task from Obsidian #kobold
|
|
129
|
-
|
|
130
|
-
## Archive
|
|
131
|
-
|
|
132
|
-
<!-- Completed tasks end up here -->
|
|
133
|
-
`;
|
|
134
|
-
Bun.write(tasksPath, tasksContent);
|
|
135
|
-
}
|
|
136
|
-
console.log(`[ObsidianBridge] Created default vault with structure`);
|
|
137
|
-
}
|
|
138
|
-
async detectVault() {
|
|
139
|
-
// Priority 1: Check Kobold's managed vault location
|
|
140
|
-
if (existsSync(DEFAULT_VAULT_PATH)) {
|
|
141
|
-
// Ensure .obsidian folder exists (create if needed)
|
|
142
|
-
const obsidianConfigPath = join(DEFAULT_VAULT_PATH, ".obsidian");
|
|
143
|
-
if (!existsSync(obsidianConfigPath)) {
|
|
144
|
-
mkdirSync(obsidianConfigPath, { recursive: true });
|
|
145
|
-
console.log("[ObsidianBridge] Created .obsidian config folder in default vault");
|
|
146
|
-
}
|
|
147
|
-
this.vaultPath = DEFAULT_VAULT_PATH;
|
|
148
|
-
console.log(`[ObsidianBridge] Using Kobold-managed vault: ${DEFAULT_VAULT_PATH}`);
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
// Priority 2: User-configured vault name
|
|
152
|
-
if (this.config.vaultName) {
|
|
153
|
-
const candidates = [
|
|
154
|
-
join(homedir(), "Documents", "Obsidian", this.config.vaultName),
|
|
155
|
-
join(homedir(), "Library", "Mobile Documents", "iCloud~md~obsidian", "Documents", this.config.vaultName),
|
|
156
|
-
join(homedir(), "iCloudDrive", "Obsidian", this.config.vaultName),
|
|
157
|
-
join(homedir(), "Obsidian", this.config.vaultName),
|
|
158
|
-
];
|
|
159
|
-
for (const path of candidates) {
|
|
160
|
-
if (existsSync(join(path, ".obsidian"))) {
|
|
161
|
-
this.vaultPath = path;
|
|
162
|
-
console.log(`[ObsidianBridge] Found user vault: ${path}`);
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
// Priority 3: Try obsidian-cli default
|
|
168
|
-
if (this.cliAvailable) {
|
|
169
|
-
try {
|
|
170
|
-
const { execSync } = await import("child_process");
|
|
171
|
-
const result = execSync("obsidian-cli print-default --path-only", {
|
|
172
|
-
encoding: "utf-8",
|
|
173
|
-
stdio: ["pipe", "pipe", "ignore"]
|
|
174
|
-
}).trim();
|
|
175
|
-
if (result && existsSync(result)) {
|
|
176
|
-
this.vaultPath = result;
|
|
177
|
-
console.log(`[ObsidianBridge] Found CLI default vault: ${result}`);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
catch {
|
|
181
|
-
// CLI couldn't get default
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
checkCli() {
|
|
186
|
-
try {
|
|
187
|
-
const { execSync } = require("child_process");
|
|
188
|
-
execSync("which obsidian-cli", { stdio: "ignore" });
|
|
189
|
-
this.cliAvailable = true;
|
|
190
|
-
}
|
|
191
|
-
catch {
|
|
192
|
-
this.cliAvailable = false;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
registerWithHeartbeat() {
|
|
196
|
-
// Get the Heartbeat scheduler singleton
|
|
197
|
-
const { getScheduler } = require("../../heartbeat/scheduler.js");
|
|
198
|
-
this.scheduler = getScheduler();
|
|
199
|
-
// Listen for check-in events
|
|
200
|
-
this.scheduler.on("checkin", (event) => {
|
|
201
|
-
if (this.shouldPollOn(event.type)) {
|
|
202
|
-
this.pollForTasks();
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
console.log(`[ObsidianBridge] Registered with Heartbeat. Polling on: ${this.config.pollOn.join(", ")}`);
|
|
206
|
-
}
|
|
207
|
-
shouldPollOn(checkInType) {
|
|
208
|
-
return this.config.pollOn.includes(checkInType);
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Poll Obsidian vault for #kobold tasks
|
|
212
|
-
* Called by Heartbeat on scheduled events
|
|
213
|
-
* Works without CLI - uses direct file access
|
|
214
|
-
*/
|
|
215
|
-
async pollForTasks() {
|
|
216
|
-
if (!this.vaultDetected)
|
|
217
|
-
return;
|
|
218
|
-
console.log("[ObsidianBridge] Polling for tasks...");
|
|
219
|
-
try {
|
|
220
|
-
// Use direct file access (no CLI needed)
|
|
221
|
-
const tasksPath = join(this.vaultPath, this.config.tasksFilePath);
|
|
222
|
-
if (!existsSync(tasksPath)) {
|
|
223
|
-
// Create tasks file if it doesn't exist
|
|
224
|
-
const tasksDir = join(this.vaultPath, "10-Action");
|
|
225
|
-
if (!existsSync(tasksDir)) {
|
|
226
|
-
mkdirSync(tasksDir, { recursive: true });
|
|
227
|
-
}
|
|
228
|
-
const initialContent = `# Tasks\n\nSynced with 0xKobold kanban board.\n\nTasks tagged with #kobold will be picked up by Kobold.\n\n## Active\n\n\n## Archive\n\n<!-- Completed tasks end up here -->\n`;
|
|
229
|
-
await Bun.write(tasksPath, initialContent);
|
|
230
|
-
console.log(`[ObsidianBridge] Created tasks file: ${tasksPath}`);
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
// Read the tasks file
|
|
234
|
-
const content = await Bun.file(tasksPath).text();
|
|
235
|
-
const newTasks = this.parseTasks(content);
|
|
236
|
-
if (newTasks.length > 0) {
|
|
237
|
-
console.log(`[ObsidianBridge] Found ${newTasks.length} new #kobold tasks`);
|
|
238
|
-
await this.addTasks(newTasks);
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
console.log("[ObsidianBridge] No new #kobold tasks found");
|
|
242
|
-
}
|
|
243
|
-
// Update state
|
|
244
|
-
await this.saveState({
|
|
245
|
-
lastPoll: new Date().toISOString(),
|
|
246
|
-
lastProcessedTaskId: newTasks.length > 0 ? newTasks[newTasks.length - 1].id : null,
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
catch (error) {
|
|
250
|
-
console.error("[ObsidianBridge] Failed to poll for tasks:", error);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Parse markdown tasks looking for #kobold tag
|
|
255
|
-
*/
|
|
256
|
-
parseTasks(content) {
|
|
257
|
-
const tasks = [];
|
|
258
|
-
const lines = content.split("\n");
|
|
259
|
-
for (const line of lines) {
|
|
260
|
-
// Match: - [ ] Task title #tag1 #tag2
|
|
261
|
-
const match = line.match(/^- \[ ] (.+)$/);
|
|
262
|
-
if (match) {
|
|
263
|
-
const text = match[1];
|
|
264
|
-
const tagMatches = text.match(/#\w+/g) || [];
|
|
265
|
-
const tags = tagMatches.map(t => t.slice(1));
|
|
266
|
-
if (tags.includes("kobold")) {
|
|
267
|
-
const title = text.replace(/#\w+/g, "").trim();
|
|
268
|
-
const taskId = this.hashTask(title);
|
|
269
|
-
tasks.push({
|
|
270
|
-
id: taskId,
|
|
271
|
-
title,
|
|
272
|
-
tags,
|
|
273
|
-
source: "obsidian",
|
|
274
|
-
discoveredAt: new Date().toISOString(),
|
|
275
|
-
status: "pending",
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
return tasks;
|
|
281
|
-
}
|
|
282
|
-
hashTask(title) {
|
|
283
|
-
// Simple hash for task ID
|
|
284
|
-
let hash = 0;
|
|
285
|
-
for (let i = 0; i < title.length; i++) {
|
|
286
|
-
const char = title.charCodeAt(i);
|
|
287
|
-
hash = ((hash << 5) - hash) + char;
|
|
288
|
-
hash = hash & hash;
|
|
289
|
-
}
|
|
290
|
-
return `obs-${Math.abs(hash).toString(36)}`;
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Add new tasks to the pending list
|
|
294
|
-
*/
|
|
295
|
-
async addTasks(newTasks) {
|
|
296
|
-
const state = await this.loadState();
|
|
297
|
-
const existingIds = new Set(state.pendingTasks.map(t => t.id));
|
|
298
|
-
const trulyNew = newTasks.filter(t => !existingIds.has(t.id));
|
|
299
|
-
if (trulyNew.length === 0)
|
|
300
|
-
return;
|
|
301
|
-
state.pendingTasks.push(...trulyNew);
|
|
302
|
-
await this.saveState(state);
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Mark a task as complete in Obsidian
|
|
306
|
-
* Works without CLI - uses direct file access
|
|
307
|
-
*/
|
|
308
|
-
async completeTask(taskId) {
|
|
309
|
-
if (!this.vaultDetected)
|
|
310
|
-
return false;
|
|
311
|
-
const state = await this.loadState();
|
|
312
|
-
const task = state.pendingTasks.find(t => t.id === taskId);
|
|
313
|
-
if (!task)
|
|
314
|
-
return false;
|
|
315
|
-
try {
|
|
316
|
-
const tasksPath = join(this.vaultPath, this.config.tasksFilePath);
|
|
317
|
-
// Read current content
|
|
318
|
-
let content = await Bun.file(tasksPath).text();
|
|
319
|
-
// Find and replace [ ] with [x] for this task
|
|
320
|
-
const escapedTitle = task.title.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
321
|
-
const regex = new RegExp(`^- (\\[ ]|\\[x]) ${escapedTitle}.*$`, "m");
|
|
322
|
-
content = content.replace(regex, match => match.replace("[ ]", "[x]"));
|
|
323
|
-
// Add Archive section if needed
|
|
324
|
-
if (!content.includes("## Archive")) {
|
|
325
|
-
content += "\n\n## Archive\n";
|
|
326
|
-
}
|
|
327
|
-
// Write back
|
|
328
|
-
await Bun.write(tasksPath, content);
|
|
329
|
-
// Update state
|
|
330
|
-
task.status = "completed";
|
|
331
|
-
await this.saveState(state);
|
|
332
|
-
console.log(`[ObsidianBridge] Completed task: ${task.title}`);
|
|
333
|
-
return true;
|
|
334
|
-
}
|
|
335
|
-
catch (error) {
|
|
336
|
-
console.error("[ObsidianBridge] Failed to complete task:", error);
|
|
337
|
-
return false;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
escapeRegex(str) {
|
|
341
|
-
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* Get pending tasks (called by Kobold to process work)
|
|
345
|
-
*/
|
|
346
|
-
async getPendingTasks() {
|
|
347
|
-
const state = await this.loadState();
|
|
348
|
-
return state.pendingTasks.filter(t => t.status === "pending");
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* Mark task as in-progress (prevents duplicate processing)
|
|
352
|
-
*/
|
|
353
|
-
async markInProgress(taskId) {
|
|
354
|
-
const state = await this.loadState();
|
|
355
|
-
const task = state.pendingTasks.find(t => t.id === taskId);
|
|
356
|
-
if (task) {
|
|
357
|
-
task.status = "in_progress";
|
|
358
|
-
await this.saveState(state);
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Load state from ~/.0xkobold/obsidian-bridge-state.json
|
|
363
|
-
*/
|
|
364
|
-
async loadState() {
|
|
365
|
-
if (!existsSync(STATE_FILE)) {
|
|
366
|
-
return {
|
|
367
|
-
lastPoll: null,
|
|
368
|
-
lastProcessedTaskId: null,
|
|
369
|
-
pendingTasks: [],
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
try {
|
|
373
|
-
const content = await Bun.file(STATE_FILE).text();
|
|
374
|
-
return JSON.parse(content);
|
|
375
|
-
}
|
|
376
|
-
catch {
|
|
377
|
-
return {
|
|
378
|
-
lastPoll: null,
|
|
379
|
-
lastProcessedTaskId: null,
|
|
380
|
-
pendingTasks: [],
|
|
381
|
-
};
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* Save state to ~/.0xkobold/obsidian-bridge-state.json
|
|
386
|
-
*/
|
|
387
|
-
async saveState(partial) {
|
|
388
|
-
const current = await this.loadState();
|
|
389
|
-
const updated = { ...current, ...partial };
|
|
390
|
-
await Bun.write(STATE_FILE, JSON.stringify(updated, null, 2));
|
|
391
|
-
}
|
|
392
|
-
/**
|
|
393
|
-
* Get status for TUI/CLI display
|
|
394
|
-
*/
|
|
395
|
-
async getStatus() {
|
|
396
|
-
const state = await this.loadState();
|
|
397
|
-
return {
|
|
398
|
-
enabled: this.config.enabled,
|
|
399
|
-
connected: this.vaultDetected && this.cliAvailable,
|
|
400
|
-
vault: this.vaultPath,
|
|
401
|
-
pendingCount: state.pendingTasks.filter(t => t.status === "pending").length,
|
|
402
|
-
lastPoll: state.lastPoll,
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
// Extension factory function
|
|
407
|
-
export async function registerObsidianBridgeExtension(api, context) {
|
|
408
|
-
// Load config from kobold.json
|
|
409
|
-
const { loadConfig } = await import("../../config/loader.js");
|
|
410
|
-
const configSnapshot = await loadConfig();
|
|
411
|
-
// Safely access obsidian config
|
|
412
|
-
const obsConfig = configSnapshot.config?.obsidian;
|
|
413
|
-
const bridgeConfig = {
|
|
414
|
-
enabled: obsConfig?.enabled ?? false,
|
|
415
|
-
vaultName: obsConfig?.vault,
|
|
416
|
-
tasksFilePath: obsConfig?.tasksFile ?? "10-Action/Tasks.md",
|
|
417
|
-
pollOn: obsConfig?.pollOn ?? ["morning", "periodic"],
|
|
418
|
-
};
|
|
419
|
-
const extension = new ObsidianBridgeExtension(api, bridgeConfig);
|
|
420
|
-
// Register tools
|
|
421
|
-
api.registerTool({
|
|
422
|
-
name: "obsidian_poll_tasks",
|
|
423
|
-
label: "/obsidian_poll",
|
|
424
|
-
description: "Manually poll Obsidian for #kobold tasks",
|
|
425
|
-
// @ts-ignore TSchema mismatch
|
|
426
|
-
parameters: {},
|
|
427
|
-
async execute(_toolCallId, _params, _signal, _onUpdate, _ctx) {
|
|
428
|
-
await extension.pollForTasks();
|
|
429
|
-
const status = await extension.getStatus();
|
|
430
|
-
return {
|
|
431
|
-
content: [{ type: "text", text: `Polled Obsidian. Found ${status.pendingCount} pending tasks.` }],
|
|
432
|
-
details: { status },
|
|
433
|
-
};
|
|
434
|
-
},
|
|
435
|
-
});
|
|
436
|
-
api.registerTool({
|
|
437
|
-
name: "obsidian_get_tasks",
|
|
438
|
-
label: "/obsidian_tasks",
|
|
439
|
-
description: "Get pending tasks from Obsidian bridge",
|
|
440
|
-
// @ts-ignore TSchema mismatch
|
|
441
|
-
parameters: {},
|
|
442
|
-
async execute(_toolCallId, _params, _signal, _onUpdate, _ctx) {
|
|
443
|
-
const tasks = await extension.getPendingTasks();
|
|
444
|
-
return {
|
|
445
|
-
content: [{ type: "text", text: `Found ${tasks.length} pending tasks from Obsidian.` }],
|
|
446
|
-
details: { tasks, count: tasks.length },
|
|
447
|
-
};
|
|
448
|
-
},
|
|
449
|
-
});
|
|
450
|
-
api.registerTool({
|
|
451
|
-
name: "obsidian_complete_task",
|
|
452
|
-
label: "/obsidian_done",
|
|
453
|
-
description: "Mark an Obsidian-sourced task as complete",
|
|
454
|
-
// @ts-ignore TSchema mismatch
|
|
455
|
-
parameters: {
|
|
456
|
-
type: "object",
|
|
457
|
-
properties: {
|
|
458
|
-
taskId: { type: "string", description: "Task ID from obsidian_get_tasks" },
|
|
459
|
-
},
|
|
460
|
-
required: ["taskId"],
|
|
461
|
-
},
|
|
462
|
-
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
463
|
-
const args = params;
|
|
464
|
-
const success = await extension.completeTask(args.taskId);
|
|
465
|
-
return {
|
|
466
|
-
content: [{ type: "text", text: success ? "Task marked complete in Obsidian" : "Failed to complete task" }],
|
|
467
|
-
details: { success },
|
|
468
|
-
};
|
|
469
|
-
},
|
|
470
|
-
});
|
|
471
|
-
api.registerTool({
|
|
472
|
-
name: "obsidian_status",
|
|
473
|
-
label: "/obsidian_status",
|
|
474
|
-
description: "Get Obsidian bridge status",
|
|
475
|
-
// @ts-ignore TSchema mismatch
|
|
476
|
-
parameters: {},
|
|
477
|
-
async execute(_toolCallId, _params, _signal, _onUpdate, _ctx) {
|
|
478
|
-
const status = await extension.getStatus();
|
|
479
|
-
return {
|
|
480
|
-
content: [{ type: "text", text: `Obsidian Bridge: ${status.enabled ? (status.connected ? "✅ Connected" : "⚠️ Disconnected") : "🔴 Disabled"}` }],
|
|
481
|
-
details: { status },
|
|
482
|
-
};
|
|
483
|
-
},
|
|
484
|
-
});
|
|
485
|
-
console.log("[ObsidianBridge] Extension registered");
|
|
486
|
-
}
|
|
487
|
-
export default registerObsidianBridgeExtension;
|
|
488
|
-
//# sourceMappingURL=obsidian-bridge-extension.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"obsidian-bridge-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/obsidian-bridge-extension.ts"],"names":[],"mappings":"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"}
|
package/dist/src/llm/router.js
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Model Router
|
|
3
|
-
*
|
|
4
|
-
* Smart model selection based on task complexity.
|
|
5
|
-
* Uses fast models for simple tasks, switches to smart models for complex reasoning.
|
|
6
|
-
*/
|
|
7
|
-
export class ModelRouter {
|
|
8
|
-
models = new Map();
|
|
9
|
-
defaultModel;
|
|
10
|
-
constructor(defaultModel) {
|
|
11
|
-
this.defaultModel = defaultModel ?? 'ollama/llama3.2';
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Register a model
|
|
15
|
-
*/
|
|
16
|
-
register(config) {
|
|
17
|
-
this.models.set(config.name, config);
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Select model based on message and context
|
|
21
|
-
*/
|
|
22
|
-
selectModel(message, history) {
|
|
23
|
-
const complexity = this.assessComplexity(message, history);
|
|
24
|
-
// Simple queries → fast model
|
|
25
|
-
if (complexity < 3) {
|
|
26
|
-
const fast = this.findModel({ speed: 'fast' });
|
|
27
|
-
if (fast)
|
|
28
|
-
return fast.name;
|
|
29
|
-
}
|
|
30
|
-
// Medium complexity → balanced
|
|
31
|
-
if (complexity < 6) {
|
|
32
|
-
const medium = this.findModel({ speed: 'medium' });
|
|
33
|
-
if (medium)
|
|
34
|
-
return medium.name;
|
|
35
|
-
}
|
|
36
|
-
// Complex reasoning → smart model
|
|
37
|
-
const smart = this.findModel({ speed: 'slow' });
|
|
38
|
-
if (smart)
|
|
39
|
-
return smart.name;
|
|
40
|
-
return this.defaultModel;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Assess complexity of a task (0-10 scale)
|
|
44
|
-
*/
|
|
45
|
-
assessComplexity(message, history) {
|
|
46
|
-
let score = 0;
|
|
47
|
-
// Length factor
|
|
48
|
-
if (message.length > 500)
|
|
49
|
-
score += 2;
|
|
50
|
-
if (message.length > 1000)
|
|
51
|
-
score += 2;
|
|
52
|
-
// Keywords indicating complexity
|
|
53
|
-
const complexKeywords = [
|
|
54
|
-
'analyze', 'compare', 'evaluate', 'synthesize',
|
|
55
|
-
'explain in detail', 'step by step', 'reasoning',
|
|
56
|
-
'architecture', 'design', 'implement',
|
|
57
|
-
'debug', 'optimize', 'refactor',
|
|
58
|
-
];
|
|
59
|
-
for (const keyword of complexKeywords) {
|
|
60
|
-
if (message.toLowerCase().includes(keyword)) {
|
|
61
|
-
score += 1;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
// Code indicators
|
|
65
|
-
if (message.includes('```'))
|
|
66
|
-
score += 1;
|
|
67
|
-
if (/\b(function|class|interface|async|await)\b/.test(message))
|
|
68
|
-
score += 1;
|
|
69
|
-
// Conversation depth
|
|
70
|
-
if (history && history.length > 10)
|
|
71
|
-
score += 1;
|
|
72
|
-
return Math.min(score, 10);
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Find model matching criteria
|
|
76
|
-
*/
|
|
77
|
-
findModel(criteria) {
|
|
78
|
-
for (const model of this.models.values()) {
|
|
79
|
-
let matches = true;
|
|
80
|
-
if (criteria.speed && model.speed !== criteria.speed)
|
|
81
|
-
matches = false;
|
|
82
|
-
if (criteria.cost && model.cost !== criteria.cost)
|
|
83
|
-
matches = false;
|
|
84
|
-
if (matches)
|
|
85
|
-
return model;
|
|
86
|
-
}
|
|
87
|
-
// Return first available as fallback
|
|
88
|
-
return this.models.values().next().value;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Get provider for a model
|
|
92
|
-
*/
|
|
93
|
-
getProvider(modelName) {
|
|
94
|
-
const model = this.models.get(modelName);
|
|
95
|
-
return model?.provider;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Get default model
|
|
99
|
-
*/
|
|
100
|
-
getDefaultModel() {
|
|
101
|
-
return this.defaultModel;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* List available models
|
|
105
|
-
*/
|
|
106
|
-
listModels() {
|
|
107
|
-
return Array.from(this.models.keys());
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Create default router with Ollama models
|
|
112
|
-
*/
|
|
113
|
-
export function createOllamaRouter(provider) {
|
|
114
|
-
const router = new ModelRouter('ollama/llama3.2');
|
|
115
|
-
// Fast model for simple queries
|
|
116
|
-
router.register({
|
|
117
|
-
name: 'ollama/llama3.2:3b',
|
|
118
|
-
provider,
|
|
119
|
-
speed: 'fast',
|
|
120
|
-
cost: 'free',
|
|
121
|
-
capabilities: ['chat', 'simple'],
|
|
122
|
-
contextWindow: 8192,
|
|
123
|
-
});
|
|
124
|
-
// Medium model for most tasks
|
|
125
|
-
router.register({
|
|
126
|
-
name: 'ollama/llama3.2',
|
|
127
|
-
provider,
|
|
128
|
-
speed: 'medium',
|
|
129
|
-
cost: 'free',
|
|
130
|
-
capabilities: ['chat', 'code', 'reasoning'],
|
|
131
|
-
contextWindow: 128000,
|
|
132
|
-
});
|
|
133
|
-
// Smart model for complex reasoning
|
|
134
|
-
router.register({
|
|
135
|
-
name: 'ollama/llama3.2:70b',
|
|
136
|
-
provider,
|
|
137
|
-
speed: 'slow',
|
|
138
|
-
cost: 'free',
|
|
139
|
-
capabilities: ['chat', 'code', 'reasoning', 'analysis'],
|
|
140
|
-
contextWindow: 128000,
|
|
141
|
-
});
|
|
142
|
-
return router;
|
|
143
|
-
}
|
|
144
|
-
export default ModelRouter;
|
|
145
|
-
//# sourceMappingURL=router.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/llm/router.ts"],"names":[],"mappings":"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"}
|