0xkobold 0.4.3 â 0.5.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/README.md +226 -383
- package/dist/package.json +13 -4
- package/dist/src/agent/DraconicCapabilityRouter.js +556 -0
- package/dist/src/agent/DraconicCapabilityRouter.js.map +1 -0
- package/dist/src/agent/DraconicErrorClassifier.js +606 -0
- package/dist/src/agent/DraconicErrorClassifier.js.map +1 -0
- package/dist/src/agent/DraconicRunRegistry.js +460 -0
- package/dist/src/agent/DraconicRunRegistry.js.map +1 -0
- package/dist/src/agent/DraconicTokenPredictor.js +500 -0
- package/dist/src/agent/DraconicTokenPredictor.js.map +1 -0
- package/dist/src/agent/embedded-runner.js +3 -2
- package/dist/src/agent/embedded-runner.js.map +1 -1
- package/dist/src/cli/commands/doctor.js +199 -0
- package/dist/src/cli/commands/doctor.js.map +1 -0
- package/dist/src/cli/commands/migrate-from-openclaw.js +39 -0
- package/dist/src/cli/commands/migrate-from-openclaw.js.map +1 -0
- package/dist/src/cli/commands/migrate.js +6 -4
- package/dist/src/cli/commands/migrate.js.map +1 -1
- package/dist/src/cli/program.js +3 -1
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/unified-config.js +195 -0
- package/dist/src/config/unified-config.js.map +1 -0
- package/dist/src/cron/notifications.js +1 -1
- package/dist/src/cron/notifications.js.map +1 -1
- package/dist/src/cron/runner.js +9 -3
- package/dist/src/cron/runner.js.map +1 -1
- package/dist/src/event-bus/index.js +3 -1
- package/dist/src/event-bus/index.js.map +1 -1
- package/dist/src/extensions/community/draconic-messenger-wrapper.js +35 -0
- package/dist/src/extensions/community/draconic-messenger-wrapper.js.map +1 -0
- package/dist/src/extensions/community/draconic-subagents-wrapper.js +115 -0
- package/dist/src/extensions/community/draconic-subagents-wrapper.js.map +1 -0
- package/dist/src/extensions/core/compaction-safeguard-v2.js +95 -0
- package/dist/src/extensions/core/compaction-safeguard-v2.js.map +1 -0
- package/dist/src/extensions/core/compaction-safeguard.js +206 -137
- package/dist/src/extensions/core/compaction-safeguard.js.map +1 -1
- package/dist/src/extensions/core/config-extension.js +122 -0
- package/dist/src/extensions/core/config-extension.js.map +1 -0
- package/dist/src/extensions/core/draconic-hoard-extension.js +194 -0
- package/dist/src/extensions/core/draconic-hoard-extension.js.map +1 -0
- package/dist/src/extensions/core/draconic-lair-extension.js +146 -0
- package/dist/src/extensions/core/draconic-lair-extension.js.map +1 -0
- package/dist/src/extensions/core/draconic-safety-extension.js +402 -0
- package/dist/src/extensions/core/draconic-safety-extension.js.map +1 -0
- package/dist/src/extensions/core/ext-manager.js +40 -0
- package/dist/src/extensions/core/ext-manager.js.map +1 -0
- package/dist/src/extensions/core/gateway-extension.js +413 -624
- package/dist/src/extensions/core/gateway-extension.js.map +1 -1
- package/dist/src/extensions/core/generative-agents-extension.js +704 -0
- package/dist/src/extensions/core/generative-agents-extension.js.map +1 -0
- package/dist/src/extensions/core/memory-bootstrap-extension.js +279 -0
- package/dist/src/extensions/core/memory-bootstrap-extension.js.map +1 -0
- package/dist/src/extensions/core/ollama-extension.js +442 -0
- package/dist/src/extensions/core/ollama-extension.js.map +1 -0
- package/dist/src/extensions/core/ollama-router-extension.js +34 -93
- package/dist/src/extensions/core/ollama-router-extension.js.map +1 -1
- package/dist/src/extensions/core/perennial-memory-extension.js +5 -2
- package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -1
- package/dist/src/extensions/core/persona-loader-extension.js +41 -15
- package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
- package/dist/src/extensions/core/pi-notify-extension.js +6 -0
- package/dist/src/extensions/core/pi-notify-extension.js.map +1 -1
- package/dist/src/extensions/core/session-bridge-extension.js +8 -72
- package/dist/src/extensions/core/session-bridge-extension.js.map +1 -1
- package/dist/src/extensions/core/tui-integration-extension-fixed.js +3 -0
- package/dist/src/extensions/core/tui-integration-extension-fixed.js.map +1 -0
- package/dist/src/extensions/core/tui-integration-extension.js +984 -0
- package/dist/src/extensions/core/tui-integration-extension.js.map +1 -0
- package/dist/src/gateway/persistence/AgentStore.js +399 -0
- package/dist/src/gateway/persistence/AgentStore.js.map +1 -0
- package/dist/src/gateway/persistence/index.js +9 -0
- package/dist/src/gateway/persistence/index.js.map +1 -0
- package/dist/src/hoard/DraconicHoardSystem.js +465 -0
- package/dist/src/hoard/DraconicHoardSystem.js.map +1 -0
- package/dist/src/index.js +7 -5
- package/dist/src/index.js.map +1 -1
- package/dist/src/infra/DraconicConnectionPool.js +492 -0
- package/dist/src/infra/DraconicConnectionPool.js.map +1 -0
- package/dist/src/lair/DraconicLairSystem.js +387 -0
- package/dist/src/lair/DraconicLairSystem.js.map +1 -0
- package/dist/src/llm/ollama.js +143 -99
- package/dist/src/llm/ollama.js.map +1 -1
- package/dist/src/migration/openclaw.js +5 -5
- package/dist/src/migration/openclaw.js.map +1 -1
- package/dist/src/pi-config.js +52 -27
- package/dist/src/pi-config.js.map +1 -1
- package/dist/src/sessions/SessionManager.js +416 -0
- package/dist/src/sessions/SessionManager.js.map +1 -0
- package/dist/src/sessions/SessionStore.js +580 -0
- package/dist/src/sessions/SessionStore.js.map +1 -0
- package/dist/src/sessions/UnifiedSessionBridge.js +394 -0
- package/dist/src/sessions/UnifiedSessionBridge.js.map +1 -0
- package/dist/src/sessions/index.js +15 -0
- package/dist/src/sessions/index.js.map +1 -0
- package/dist/src/sessions/migration/index.js +156 -0
- package/dist/src/sessions/migration/index.js.map +1 -0
- package/dist/src/sessions/types.js +8 -0
- package/dist/src/sessions/types.js.map +1 -0
- package/dist/src/skills/framework.js +1 -1
- package/dist/src/skills/framework.js.map +1 -1
- package/dist/src/tui/commands/final-functions.js +39 -0
- package/dist/src/tui/commands/final-functions.js.map +1 -0
- package/dist/src/tui/commands/natural-language-commands.js +231 -0
- package/dist/src/tui/commands/natural-language-commands.js.map +1 -0
- package/dist/src/tui/commands/orchestration-commands.js +340 -0
- package/dist/src/tui/commands/orchestration-commands.js.map +1 -0
- package/dist/src/tui/commands/orchestration-final-section.js +84 -0
- package/dist/src/tui/commands/orchestration-final-section.js.map +1 -0
- package/dist/src/tui/components/agent-tree-overlay.js +210 -0
- package/dist/src/tui/components/agent-tree-overlay.js.map +1 -0
- package/dist/src/tui/components/agent-tree-panel.js +229 -0
- package/dist/src/tui/components/agent-tree-panel.js.map +1 -0
- package/dist/src/tui/components/sidebar.js +82 -0
- package/dist/src/tui/components/sidebar.js.map +1 -0
- package/dist/src/tui/components/status-bar.js +115 -0
- package/dist/src/tui/components/status-bar.js.map +1 -0
- package/dist/src/tui/components/tree-header.js +85 -0
- package/dist/src/tui/components/tree-header.js.map +1 -0
- package/dist/src/tui/draconic-tui.js +291 -0
- package/dist/src/tui/draconic-tui.js.map +1 -0
- package/dist/src/tui/index.js +93 -0
- package/dist/src/tui/index.js.map +1 -0
- package/dist/src/tui/pi-tui-integration.js +260 -0
- package/dist/src/tui/pi-tui-integration.js.map +1 -0
- package/dist/src/utils/nl-patterns.js +145 -0
- package/dist/src/utils/nl-patterns.js.map +1 -0
- package/package.json +13 -4
- package/scripts/migrate-from-openclaw.sh +498 -0
- package/HEARTBEAT.md +0 -121
- package/USAGE.md +0 -191
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama Extension for 0xKobold
|
|
3
|
+
*
|
|
4
|
+
* Unified local + cloud Ollama support
|
|
5
|
+
* Refactored: DRY, Functional, OOP, KISS, SOC2 Compliant
|
|
6
|
+
*/
|
|
7
|
+
import { config } from "../../config/unified-config.js";
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// CONFIGURATION
|
|
10
|
+
// ============================================================================
|
|
11
|
+
const CONFIG = {
|
|
12
|
+
LOCAL_URL: config.getPath("ollama.baseUrl") || "http://localhost:11434",
|
|
13
|
+
CLOUD_URL: "https://ollama.com",
|
|
14
|
+
API_KEY: config.getPath("ollama.apiKey") || "",
|
|
15
|
+
DEFAULT_MODEL: config.getPath("ollama.defaultModel") || "",
|
|
16
|
+
CUSTOM_MODELS: config.getPath("ollama.customModels") || [],
|
|
17
|
+
};
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// SECURITY LOGGER (SOC2 Compliance)
|
|
20
|
+
// ============================================================================
|
|
21
|
+
class SecurityLogger {
|
|
22
|
+
static log(action, success) {
|
|
23
|
+
if (action.includes("key") || action.includes("auth")) {
|
|
24
|
+
console.log(`[Security] ${action}: ${success ? "success" : "failed"}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// ============================================================================
|
|
29
|
+
// MODEL FACTORY (DRY: Single model creation)
|
|
30
|
+
// ============================================================================
|
|
31
|
+
function createModel(name, prefix, options = {}) {
|
|
32
|
+
const { label = "", isCloud = false } = options;
|
|
33
|
+
const displayName = label ? `${name} (${label})` : name;
|
|
34
|
+
const lowerName = name.toLowerCase();
|
|
35
|
+
// Detect reasoning capability
|
|
36
|
+
const isReasoning = ["coder", "r1", "deepseek", "kimi", "think", "reason"].some(kw => lowerName.includes(kw));
|
|
37
|
+
// Detect vision capability (models that can process images)
|
|
38
|
+
const isVision = ["vision", "vl", "multimodal", "gpt-4", "claude-3", "llava", "bakllava", "moondream", "llava-phi3"].some(kw => lowerName.includes(kw));
|
|
39
|
+
// Cloud models use :cloud suffix (Ollama convention)
|
|
40
|
+
const modelId = isCloud ? `${name}:cloud` : name;
|
|
41
|
+
// Vision models support both text and image input
|
|
42
|
+
const inputTypes = isVision ? ["text", "image"] : ["text"];
|
|
43
|
+
const visionLabel = isVision ? "đī¸ " : "";
|
|
44
|
+
const cloudLabel = isCloud ? "âī¸ " : "";
|
|
45
|
+
return {
|
|
46
|
+
id: modelId,
|
|
47
|
+
name: `${cloudLabel}${visionLabel}${displayName}`,
|
|
48
|
+
api: "openai-completions", // Force OpenAI API for each model
|
|
49
|
+
reasoning: isReasoning,
|
|
50
|
+
input: inputTypes,
|
|
51
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
52
|
+
contextWindow: 128000,
|
|
53
|
+
maxTokens: 8192,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// HTTP CLIENT
|
|
58
|
+
// ============================================================================
|
|
59
|
+
async function fetchWithTimeout(url, options, timeoutMs) {
|
|
60
|
+
const controller = new AbortController();
|
|
61
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
62
|
+
try {
|
|
63
|
+
return await fetch(url, { ...options, signal: controller.signal });
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
clearTimeout(timeout);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function testLocalConnection() {
|
|
70
|
+
try {
|
|
71
|
+
const response = await fetchWithTimeout(`${CONFIG.LOCAL_URL}/api/tags`, {}, 2000);
|
|
72
|
+
return response.ok;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function testCloudConnection() {
|
|
79
|
+
if (!CONFIG.API_KEY)
|
|
80
|
+
return false;
|
|
81
|
+
try {
|
|
82
|
+
const response = await fetchWithTimeout(`${CONFIG.CLOUD_URL}/api/tags`, { headers: { Authorization: `Bearer ${CONFIG.API_KEY}` } }, 5000);
|
|
83
|
+
return response.ok;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function getLocalModels() {
|
|
90
|
+
try {
|
|
91
|
+
console.log(`[Ollama] Fetching local models`);
|
|
92
|
+
const response = await fetchWithTimeout(`${CONFIG.LOCAL_URL}/api/tags`, {}, 5000);
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
console.warn(`[Ollama] HTTP ${response.status}`);
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
const data = await response.json();
|
|
98
|
+
if (!data.models?.length) {
|
|
99
|
+
console.log("[Ollama] No local models installed");
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
console.log(`[Ollama] Found ${data.models.length} local models`);
|
|
103
|
+
return data.models.map(m => {
|
|
104
|
+
const paramSize = m.details?.parameter_size || "";
|
|
105
|
+
const label = paramSize ? `(${paramSize})` : "";
|
|
106
|
+
return createModel(m.name, "ollama", { label });
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
console.warn("[Ollama] Local fetch failed:", err.message);
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function getCloudModels() {
|
|
115
|
+
if (!CONFIG.API_KEY) {
|
|
116
|
+
console.log("[Ollama] No API key configured");
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
SecurityLogger.log("cloud_auth_attempt", true);
|
|
121
|
+
const response = await fetchWithTimeout(`${CONFIG.CLOUD_URL}/api/tags`, { headers: { Authorization: `Bearer ${CONFIG.API_KEY}` } }, 10000);
|
|
122
|
+
if (!response.ok) {
|
|
123
|
+
SecurityLogger.log("cloud_auth_failed", false);
|
|
124
|
+
console.warn(`[Ollama] Cloud auth failed: HTTP ${response.status}`);
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
const data = await response.json();
|
|
128
|
+
if (!data.models?.length) {
|
|
129
|
+
console.log("[Ollama] No cloud models available");
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
SecurityLogger.log("cloud_models_fetched", true);
|
|
133
|
+
console.log(`[Ollama] ${data.models.length} cloud models accessible`);
|
|
134
|
+
return data.models.map(m => {
|
|
135
|
+
const paramSize = m.details?.parameter_size || "";
|
|
136
|
+
const label = paramSize ? `(${paramSize})` : "";
|
|
137
|
+
return createModel(m.name, "cloud", { label, isCloud: true });
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
SecurityLogger.log("cloud_fetch_error", false);
|
|
142
|
+
console.warn("[Ollama] Cloud fetch failed:", err.message);
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async function pullModel(modelName) {
|
|
147
|
+
const response = await fetchWithTimeout(`${CONFIG.LOCAL_URL}/api/pull`, {
|
|
148
|
+
method: "POST",
|
|
149
|
+
headers: { "Content-Type": "application/json" },
|
|
150
|
+
body: JSON.stringify({ model: modelName, stream: false }),
|
|
151
|
+
}, 30000);
|
|
152
|
+
if (!response.ok) {
|
|
153
|
+
throw new Error(`HTTP ${response.status}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async function getRunningModels() {
|
|
157
|
+
const response = await fetchWithTimeout(`${CONFIG.LOCAL_URL}/api/ps`, {}, 5000);
|
|
158
|
+
const data = await response.json();
|
|
159
|
+
return data.models || [];
|
|
160
|
+
}
|
|
161
|
+
// ============================================================================
|
|
162
|
+
// MODEL SERVICE
|
|
163
|
+
// ============================================================================
|
|
164
|
+
class ModelService {
|
|
165
|
+
localModels = [];
|
|
166
|
+
cloudModels = [];
|
|
167
|
+
customModels = [];
|
|
168
|
+
hasLocal = false;
|
|
169
|
+
hasCloud = false;
|
|
170
|
+
async initialize() {
|
|
171
|
+
console.log("[Ollama] Initializing...");
|
|
172
|
+
[this.hasLocal, this.hasCloud] = await Promise.all([
|
|
173
|
+
testLocalConnection(),
|
|
174
|
+
testCloudConnection(),
|
|
175
|
+
]);
|
|
176
|
+
console.log(`[Ollama] Local: ${this.hasLocal ? "â
" : "â"}, Cloud: ${this.hasCloud ? "â
" : "â"}`);
|
|
177
|
+
if (this.hasLocal) {
|
|
178
|
+
this.localModels = await getLocalModels();
|
|
179
|
+
}
|
|
180
|
+
if (this.hasCloud) {
|
|
181
|
+
this.cloudModels = await getCloudModels();
|
|
182
|
+
}
|
|
183
|
+
this.customModels = this.buildCustomModels();
|
|
184
|
+
}
|
|
185
|
+
buildCustomModels() {
|
|
186
|
+
const models = [];
|
|
187
|
+
const existingIds = new Set([
|
|
188
|
+
...this.localModels.map(m => m.id),
|
|
189
|
+
...this.cloudModels.map(m => m.id),
|
|
190
|
+
]);
|
|
191
|
+
// Strip 'ollama/' prefix from DEFAULT_MODEL if present
|
|
192
|
+
const defaultModelName = CONFIG.DEFAULT_MODEL?.replace(/^ollama\//, "");
|
|
193
|
+
if (defaultModelName && !existingIds.has(defaultModelName)) {
|
|
194
|
+
const isCloudModel = defaultModelName.includes(":cloud");
|
|
195
|
+
models.push(createModel(defaultModelName, "ollama", { label: "Configured Default", isCloud: isCloudModel }));
|
|
196
|
+
}
|
|
197
|
+
for (const custom of CONFIG.CUSTOM_MODELS) {
|
|
198
|
+
let name = typeof custom === "string" ? custom : custom.name;
|
|
199
|
+
// Strip 'ollama/' prefix if present
|
|
200
|
+
name = name.replace(/^ollama\//, "");
|
|
201
|
+
if (!existingIds.has(name)) {
|
|
202
|
+
const isCloudModel = name.includes(":cloud");
|
|
203
|
+
models.push(createModel(name, "ollama", { label: "Custom", isCloud: isCloudModel }));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return models;
|
|
207
|
+
}
|
|
208
|
+
getAllModels() {
|
|
209
|
+
return [...this.customModels, ...this.localModels, ...this.cloudModels];
|
|
210
|
+
}
|
|
211
|
+
getLocalModels() {
|
|
212
|
+
return [...this.localModels];
|
|
213
|
+
}
|
|
214
|
+
getCloudModels() {
|
|
215
|
+
return [...this.cloudModels];
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// ============================================================================
|
|
219
|
+
// COMMANDS
|
|
220
|
+
// ============================================================================
|
|
221
|
+
function registerCommands(pi, service) {
|
|
222
|
+
// Status command
|
|
223
|
+
pi.registerCommand("ollama-status", {
|
|
224
|
+
description: "Show Ollama status and models",
|
|
225
|
+
handler: async () => {
|
|
226
|
+
const allModels = service.getAllModels();
|
|
227
|
+
const visionModels = allModels.filter(m => m.input.includes("image"));
|
|
228
|
+
const lines = [
|
|
229
|
+
"đ¤ Ollama Status",
|
|
230
|
+
`Local: ${service.hasLocal ? "â
Connected" : "â Not detected"}`,
|
|
231
|
+
`Cloud: ${service.hasCloud ? "â
Authenticated" : CONFIG.API_KEY ? "â ī¸ Invalid Key" : "Not Configured"}`,
|
|
232
|
+
"",
|
|
233
|
+
`Models: ${allModels.length} available`,
|
|
234
|
+
...(visionModels.length > 0 ? [`đī¸ Vision models: ${visionModels.length}`] : []),
|
|
235
|
+
...(service.getLocalModels().length > 0 ? ["", "Local:"] : []),
|
|
236
|
+
...service.getLocalModels().slice(0, 10).map(m => ` âĸ ${m.name}`),
|
|
237
|
+
...(service.getCloudModels().length > 0 ? ["", "Cloud:"] : []),
|
|
238
|
+
...service.getCloudModels().map(m => ` âĸ ${m.name}`),
|
|
239
|
+
];
|
|
240
|
+
// @ts-ignore
|
|
241
|
+
pi.sendMessage?.({
|
|
242
|
+
customType: "ollama.info",
|
|
243
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
244
|
+
display: false,
|
|
245
|
+
});
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
// Pull command
|
|
249
|
+
pi.registerCommand("ollama-pull", {
|
|
250
|
+
description: "Pull model from ollama.com",
|
|
251
|
+
handler: async (args) => {
|
|
252
|
+
const modelName = args.trim();
|
|
253
|
+
if (!modelName || !/^[a-zA-Z0-9._:-]+$/.test(modelName)) {
|
|
254
|
+
// @ts-ignore
|
|
255
|
+
pi.sendMessage?.({
|
|
256
|
+
customType: "ollama.warning",
|
|
257
|
+
content: [{ type: "text", text: "Usage: /ollama-pull <model>" }],
|
|
258
|
+
display: false,
|
|
259
|
+
});
|
|
260
|
+
SecurityLogger.log("invalid_pull_input", false);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (!service.hasLocal) {
|
|
264
|
+
// @ts-ignore
|
|
265
|
+
pi.sendMessage?.({
|
|
266
|
+
customType: "ollama.error",
|
|
267
|
+
content: [{ type: "text", text: "Start Ollama first: ollama serve" }],
|
|
268
|
+
display: false,
|
|
269
|
+
});
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
// @ts-ignore
|
|
273
|
+
pi.sendMessage?.({
|
|
274
|
+
customType: "ollama.info",
|
|
275
|
+
content: [{ type: "text", text: `âŦī¸ Pulling ${modelName}...` }],
|
|
276
|
+
display: false,
|
|
277
|
+
});
|
|
278
|
+
try {
|
|
279
|
+
await pullModel(modelName);
|
|
280
|
+
SecurityLogger.log("model_pulled", true);
|
|
281
|
+
// @ts-ignore
|
|
282
|
+
pi.sendMessage?.({
|
|
283
|
+
customType: "ollama.info",
|
|
284
|
+
content: [{ type: "text", text: `â
Downloaded ${modelName}` }],
|
|
285
|
+
display: false,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
SecurityLogger.log("model_pull_failed", false);
|
|
290
|
+
// @ts-ignore
|
|
291
|
+
pi.sendMessage?.({
|
|
292
|
+
customType: "ollama.error",
|
|
293
|
+
content: [{ type: "text", text: `â ${err.message}` }],
|
|
294
|
+
display: false,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
});
|
|
299
|
+
// Running models
|
|
300
|
+
pi.registerCommand("ollama-running", {
|
|
301
|
+
description: "Show models in memory",
|
|
302
|
+
handler: async () => {
|
|
303
|
+
if (!service.hasLocal) {
|
|
304
|
+
// @ts-ignore
|
|
305
|
+
pi.sendMessage?.({
|
|
306
|
+
customType: "ollama.error",
|
|
307
|
+
content: [{ type: "text", text: "Ollama not running" }],
|
|
308
|
+
display: false,
|
|
309
|
+
});
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const models = await getRunningModels();
|
|
313
|
+
if (!models.length) {
|
|
314
|
+
// @ts-ignore
|
|
315
|
+
pi.sendMessage?.({
|
|
316
|
+
customType: "ollama.info",
|
|
317
|
+
content: [{ type: "text", text: "No models loaded" }],
|
|
318
|
+
display: false,
|
|
319
|
+
});
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
const lines = [
|
|
323
|
+
`đ¤ Running Models (${models.length}):`,
|
|
324
|
+
...models.map(m => ` âĸ ${m.name}`),
|
|
325
|
+
];
|
|
326
|
+
// @ts-ignore
|
|
327
|
+
pi.sendMessage?.({
|
|
328
|
+
customType: "ollama.info",
|
|
329
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
330
|
+
display: false,
|
|
331
|
+
});
|
|
332
|
+
},
|
|
333
|
+
});
|
|
334
|
+
// Cloud mode toggle
|
|
335
|
+
pi.registerCommand("ollama-cloud-mode", {
|
|
336
|
+
description: "Show cloud connection status",
|
|
337
|
+
handler: async () => {
|
|
338
|
+
const isCloudOnly = !service.hasLocal && service.hasCloud;
|
|
339
|
+
// @ts-ignore
|
|
340
|
+
pi.sendMessage?.({
|
|
341
|
+
customType: "ollama.info",
|
|
342
|
+
content: [{ type: "text", text: isCloudOnly ? "âī¸ Cloud-only mode" : "đ Local mode preferred" }],
|
|
343
|
+
display: false,
|
|
344
|
+
});
|
|
345
|
+
},
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
// ============================================================================
|
|
349
|
+
// MAIN EXPORT
|
|
350
|
+
// ============================================================================
|
|
351
|
+
export default async function ollamaExtension(pi) {
|
|
352
|
+
console.log("[Ollama] Extension loading...");
|
|
353
|
+
try {
|
|
354
|
+
const service = new ModelService();
|
|
355
|
+
await service.initialize();
|
|
356
|
+
let models = service.getAllModels();
|
|
357
|
+
if (models.length === 0) {
|
|
358
|
+
console.log("[Ollama] No models - using fallback");
|
|
359
|
+
models = [createModel("llama3.2", "ollama", { label: "Install: ollama pull llama3.2" })];
|
|
360
|
+
}
|
|
361
|
+
// Determine endpoint: cloud if API key exists, else local
|
|
362
|
+
const hasApiKey = !!CONFIG.API_KEY;
|
|
363
|
+
const baseUrl = hasApiKey ? CONFIG.CLOUD_URL : CONFIG.LOCAL_URL;
|
|
364
|
+
const effectiveApiKey = hasApiKey ? CONFIG.API_KEY : "ollama-local";
|
|
365
|
+
// Use /v1 endpoint for OpenAI compatibility
|
|
366
|
+
const effectiveBaseUrl = `${baseUrl}/v1`;
|
|
367
|
+
console.log(`[Ollama] Using ${hasApiKey ? 'cloud' : 'local'} endpoint: ${effectiveBaseUrl}`);
|
|
368
|
+
pi.registerProvider("ollama", {
|
|
369
|
+
baseUrl: effectiveBaseUrl,
|
|
370
|
+
apiKey: effectiveApiKey,
|
|
371
|
+
api: "openai-completions",
|
|
372
|
+
models,
|
|
373
|
+
});
|
|
374
|
+
registerCommands(pi, service);
|
|
375
|
+
SecurityLogger.log("extension_loaded", true);
|
|
376
|
+
console.log(`[Ollama] Ready with ${models.length} models`);
|
|
377
|
+
}
|
|
378
|
+
catch (err) {
|
|
379
|
+
SecurityLogger.log("extension_load_failed", false);
|
|
380
|
+
console.error("[Ollama] Extension failed:", err);
|
|
381
|
+
throw err;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
// ============================================================================
|
|
385
|
+
// LEGACY EXPORTS (for LLM provider and other consumers)
|
|
386
|
+
// ============================================================================
|
|
387
|
+
/** Get API key if configured */
|
|
388
|
+
export function getOllamaApiKey() {
|
|
389
|
+
return CONFIG.API_KEY || undefined;
|
|
390
|
+
}
|
|
391
|
+
/** Test if local Ollama is running */
|
|
392
|
+
export function checkLocalOllama() {
|
|
393
|
+
return testLocalConnection();
|
|
394
|
+
}
|
|
395
|
+
/** Check if model requires API key */
|
|
396
|
+
export function modelRequiresApiKey(modelId) {
|
|
397
|
+
// Only cloud models (with :cloud suffix) need API key for direct access
|
|
398
|
+
const isCloudModel = modelId.endsWith(":cloud") || modelId.includes("/cloud/");
|
|
399
|
+
return isCloudModel && !!CONFIG.API_KEY;
|
|
400
|
+
}
|
|
401
|
+
/** Get base URL for a specific model (handles cloud vs local routing)
|
|
402
|
+
* @param modelId - the model ID
|
|
403
|
+
* @param useOpenAiEndpoint - if true, returns /v1 endpoint for OpenAI compatibility
|
|
404
|
+
*/
|
|
405
|
+
export function getOllamaBaseUrl(modelId, useOpenAiEndpoint = false) {
|
|
406
|
+
// Check if it's a cloud model (has :cloud suffix)
|
|
407
|
+
const isCloudModel = modelId.endsWith(":cloud") || modelId.includes("/cloud/");
|
|
408
|
+
let baseUrl;
|
|
409
|
+
if (isCloudModel) {
|
|
410
|
+
// Cloud models: use API key/direct URL ONLY if configured
|
|
411
|
+
if (CONFIG.API_KEY) {
|
|
412
|
+
baseUrl = CONFIG.CLOUD_URL;
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
// Fall back to local proxy (may work if user logged in via CLI)
|
|
416
|
+
baseUrl = CONFIG.LOCAL_URL;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
// Regular local model
|
|
421
|
+
baseUrl = CONFIG.LOCAL_URL;
|
|
422
|
+
}
|
|
423
|
+
// Return /v1 endpoint for OpenAI compatibility if requested
|
|
424
|
+
return useOpenAiEndpoint ? `${baseUrl}/v1` : baseUrl;
|
|
425
|
+
}
|
|
426
|
+
/** Get appropriate headers for a model request */
|
|
427
|
+
export function getOllamaHeaders(modelId) {
|
|
428
|
+
return getOllamaHeadersInternal(modelId);
|
|
429
|
+
}
|
|
430
|
+
// Internal version for use within this module
|
|
431
|
+
function getOllamaHeadersInternal(modelId) {
|
|
432
|
+
const headers = {
|
|
433
|
+
"Content-Type": "application/json",
|
|
434
|
+
};
|
|
435
|
+
// Only add auth for cloud models when API key is explicitly set
|
|
436
|
+
const isCloudModel = modelId.endsWith(":cloud") || modelId.includes("/cloud/");
|
|
437
|
+
if (isCloudModel && CONFIG.API_KEY) {
|
|
438
|
+
headers["Authorization"] = `Bearer ${CONFIG.API_KEY}`;
|
|
439
|
+
}
|
|
440
|
+
return headers;
|
|
441
|
+
}
|
|
442
|
+
//# sourceMappingURL=ollama-extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/ollama-extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,100 +1,41 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
clearTimeout(timeout);
|
|
14
|
-
return response.ok;
|
|
15
|
-
}
|
|
16
|
-
catch {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Ollama Router Extension
|
|
3
|
+
*
|
|
4
|
+
* Provides routing logic to determine whether to use local or cloud Ollama.
|
|
5
|
+
*/
|
|
6
|
+
// Simple router state
|
|
7
|
+
let useCloudMode = false;
|
|
8
|
+
/**
|
|
9
|
+
* Check if cloud Ollama should be used
|
|
10
|
+
*/
|
|
11
|
+
export function shouldUseCloud() {
|
|
12
|
+
return useCloudMode;
|
|
19
13
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return routerState.localAvailable ? "đ " : "đŠī¸";
|
|
14
|
+
/**
|
|
15
|
+
* Set cloud mode
|
|
16
|
+
*/
|
|
17
|
+
export function setCloudMode(enabled) {
|
|
18
|
+
useCloudMode = enabled;
|
|
26
19
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return `${icon} Auto`;
|
|
20
|
+
/**
|
|
21
|
+
* Toggle between local and cloud
|
|
22
|
+
*/
|
|
23
|
+
export function toggleCloudMode() {
|
|
24
|
+
useCloudMode = !useCloudMode;
|
|
25
|
+
return useCloudMode;
|
|
34
26
|
}
|
|
27
|
+
// Default export for extension API
|
|
35
28
|
export default function ollamaRouterExtension(pi) {
|
|
36
|
-
|
|
37
|
-
pi.
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
ctx.ui.setStatus("ollama-mode", getStatusText());
|
|
42
|
-
});
|
|
43
|
-
pi.registerCommand("ollama-mode", {
|
|
44
|
-
description: "Switch Ollama mode: local | cloud | auto",
|
|
45
|
-
handler: async (args, ctx) => {
|
|
46
|
-
const mode = args.trim().toLowerCase();
|
|
47
|
-
if (!mode) {
|
|
48
|
-
// Show detailed status
|
|
49
|
-
const lines = [
|
|
50
|
-
`đ Ollama Router Status`,
|
|
51
|
-
`âââââââââââââââââââââ`,
|
|
52
|
-
`Mode: ${routerState.mode}`,
|
|
53
|
-
`Local: ${routerState.localAvailable ? "â
" : "â"}`,
|
|
54
|
-
``,
|
|
55
|
-
`Usage: /ollama-mode [local|cloud|auto]`,
|
|
56
|
-
];
|
|
57
|
-
ctx.ui.notify(lines.join("\n"), "info");
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
if (mode === "local" || mode === "cloud" || mode === "auto") {
|
|
61
|
-
routerState.mode = mode;
|
|
62
|
-
ctx.ui.setStatus("ollama-mode", getStatusText());
|
|
63
|
-
ctx.ui.notify(`â
Switched to ${mode} mode`, "info");
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
ctx.ui.notify("â Invalid mode. Use: local, cloud, or auto", "error");
|
|
67
|
-
}
|
|
68
|
-
},
|
|
69
|
-
});
|
|
70
|
-
pi.registerCommand("ollama-local", {
|
|
71
|
-
description: "Quick switch to local Ollama mode",
|
|
72
|
-
handler: async (_args, ctx) => {
|
|
73
|
-
routerState.mode = "local";
|
|
74
|
-
ctx.ui.setStatus("ollama-mode", getStatusText());
|
|
75
|
-
ctx.ui.notify(`â
Switched to local mode`, "info");
|
|
76
|
-
},
|
|
29
|
+
// Register cloud mode flag
|
|
30
|
+
pi.registerFlag('ollama-cloud', {
|
|
31
|
+
description: 'Use Ollama cloud instead of local instance',
|
|
32
|
+
type: 'boolean',
|
|
33
|
+
default: 'false',
|
|
77
34
|
});
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
ctx.ui.notify(`â
Switched to cloud mode`, "info");
|
|
84
|
-
},
|
|
85
|
-
});
|
|
86
|
-
globalThis.__ollamaRouterState = routerState;
|
|
87
|
-
console.log("[OllamaRouter] Commands registered: /ollama-mode, /ollama-local, /ollama-cloud");
|
|
88
|
-
}
|
|
89
|
-
export function getOllamaRouterState() {
|
|
90
|
-
return globalThis.__ollamaRouterState || routerState;
|
|
91
|
-
}
|
|
92
|
-
export function shouldUseCloud() {
|
|
93
|
-
const state = getOllamaRouterState();
|
|
94
|
-
if (state.mode === "cloud")
|
|
95
|
-
return true;
|
|
96
|
-
if (state.mode === "local")
|
|
97
|
-
return false;
|
|
98
|
-
return !state.localAvailable;
|
|
35
|
+
// Check if cloud mode is enabled via flag
|
|
36
|
+
if (pi.getFlag('ollama-cloud') === 'true') {
|
|
37
|
+
setCloudMode(true);
|
|
38
|
+
}
|
|
39
|
+
console.log('[OllamaRouter] Extension loaded. Cloud mode:', useCloudMode);
|
|
99
40
|
}
|
|
100
41
|
//# sourceMappingURL=ollama-router-extension.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-router-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/ollama-router-extension.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ollama-router-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/ollama-router-extension.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sBAAsB;AACtB,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,YAAY,GAAG,OAAO,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,YAAY,GAAG,CAAC,YAAY,CAAC;IAC7B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,mCAAmC;AACnC,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,EAAO;IACnD,2BAA2B;IAC3B,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE;QAC9B,WAAW,EAAE,4CAA4C;QACzD,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,0CAA0C;IAC1C,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,MAAM,EAAE,CAAC;QAC1C,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8CAA8C,EAAE,YAAY,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -116,11 +116,14 @@ function embeddingToBlob(embedding) {
|
|
|
116
116
|
}
|
|
117
117
|
return buffer;
|
|
118
118
|
}
|
|
119
|
-
// Deserialize
|
|
119
|
+
// Deserialize - handles both Bun Blob/ArrayBuffer and Node Buffer
|
|
120
120
|
function blobToEmbedding(blob) {
|
|
121
121
|
const embedding = [];
|
|
122
|
+
const dataView = blob instanceof ArrayBuffer
|
|
123
|
+
? new DataView(blob)
|
|
124
|
+
: new DataView(blob.buffer, blob.byteOffset, blob.byteLength);
|
|
122
125
|
for (let i = 0; i < EMBEDDING_DIM; i++) {
|
|
123
|
-
embedding.push(
|
|
126
|
+
embedding.push(dataView.getFloat32(i * 4, true)); // little-endian
|
|
124
127
|
}
|
|
125
128
|
return embedding;
|
|
126
129
|
}
|