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.
Files changed (130) hide show
  1. package/README.md +226 -383
  2. package/dist/package.json +13 -4
  3. package/dist/src/agent/DraconicCapabilityRouter.js +556 -0
  4. package/dist/src/agent/DraconicCapabilityRouter.js.map +1 -0
  5. package/dist/src/agent/DraconicErrorClassifier.js +606 -0
  6. package/dist/src/agent/DraconicErrorClassifier.js.map +1 -0
  7. package/dist/src/agent/DraconicRunRegistry.js +460 -0
  8. package/dist/src/agent/DraconicRunRegistry.js.map +1 -0
  9. package/dist/src/agent/DraconicTokenPredictor.js +500 -0
  10. package/dist/src/agent/DraconicTokenPredictor.js.map +1 -0
  11. package/dist/src/agent/embedded-runner.js +3 -2
  12. package/dist/src/agent/embedded-runner.js.map +1 -1
  13. package/dist/src/cli/commands/doctor.js +199 -0
  14. package/dist/src/cli/commands/doctor.js.map +1 -0
  15. package/dist/src/cli/commands/migrate-from-openclaw.js +39 -0
  16. package/dist/src/cli/commands/migrate-from-openclaw.js.map +1 -0
  17. package/dist/src/cli/commands/migrate.js +6 -4
  18. package/dist/src/cli/commands/migrate.js.map +1 -1
  19. package/dist/src/cli/program.js +3 -1
  20. package/dist/src/cli/program.js.map +1 -1
  21. package/dist/src/config/unified-config.js +195 -0
  22. package/dist/src/config/unified-config.js.map +1 -0
  23. package/dist/src/cron/notifications.js +1 -1
  24. package/dist/src/cron/notifications.js.map +1 -1
  25. package/dist/src/cron/runner.js +9 -3
  26. package/dist/src/cron/runner.js.map +1 -1
  27. package/dist/src/event-bus/index.js +3 -1
  28. package/dist/src/event-bus/index.js.map +1 -1
  29. package/dist/src/extensions/community/draconic-messenger-wrapper.js +35 -0
  30. package/dist/src/extensions/community/draconic-messenger-wrapper.js.map +1 -0
  31. package/dist/src/extensions/community/draconic-subagents-wrapper.js +115 -0
  32. package/dist/src/extensions/community/draconic-subagents-wrapper.js.map +1 -0
  33. package/dist/src/extensions/core/compaction-safeguard-v2.js +95 -0
  34. package/dist/src/extensions/core/compaction-safeguard-v2.js.map +1 -0
  35. package/dist/src/extensions/core/compaction-safeguard.js +206 -137
  36. package/dist/src/extensions/core/compaction-safeguard.js.map +1 -1
  37. package/dist/src/extensions/core/config-extension.js +122 -0
  38. package/dist/src/extensions/core/config-extension.js.map +1 -0
  39. package/dist/src/extensions/core/draconic-hoard-extension.js +194 -0
  40. package/dist/src/extensions/core/draconic-hoard-extension.js.map +1 -0
  41. package/dist/src/extensions/core/draconic-lair-extension.js +146 -0
  42. package/dist/src/extensions/core/draconic-lair-extension.js.map +1 -0
  43. package/dist/src/extensions/core/draconic-safety-extension.js +402 -0
  44. package/dist/src/extensions/core/draconic-safety-extension.js.map +1 -0
  45. package/dist/src/extensions/core/ext-manager.js +40 -0
  46. package/dist/src/extensions/core/ext-manager.js.map +1 -0
  47. package/dist/src/extensions/core/gateway-extension.js +413 -624
  48. package/dist/src/extensions/core/gateway-extension.js.map +1 -1
  49. package/dist/src/extensions/core/generative-agents-extension.js +704 -0
  50. package/dist/src/extensions/core/generative-agents-extension.js.map +1 -0
  51. package/dist/src/extensions/core/memory-bootstrap-extension.js +279 -0
  52. package/dist/src/extensions/core/memory-bootstrap-extension.js.map +1 -0
  53. package/dist/src/extensions/core/ollama-extension.js +442 -0
  54. package/dist/src/extensions/core/ollama-extension.js.map +1 -0
  55. package/dist/src/extensions/core/ollama-router-extension.js +34 -93
  56. package/dist/src/extensions/core/ollama-router-extension.js.map +1 -1
  57. package/dist/src/extensions/core/perennial-memory-extension.js +5 -2
  58. package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -1
  59. package/dist/src/extensions/core/persona-loader-extension.js +41 -15
  60. package/dist/src/extensions/core/persona-loader-extension.js.map +1 -1
  61. package/dist/src/extensions/core/pi-notify-extension.js +6 -0
  62. package/dist/src/extensions/core/pi-notify-extension.js.map +1 -1
  63. package/dist/src/extensions/core/session-bridge-extension.js +8 -72
  64. package/dist/src/extensions/core/session-bridge-extension.js.map +1 -1
  65. package/dist/src/extensions/core/tui-integration-extension-fixed.js +3 -0
  66. package/dist/src/extensions/core/tui-integration-extension-fixed.js.map +1 -0
  67. package/dist/src/extensions/core/tui-integration-extension.js +984 -0
  68. package/dist/src/extensions/core/tui-integration-extension.js.map +1 -0
  69. package/dist/src/gateway/persistence/AgentStore.js +399 -0
  70. package/dist/src/gateway/persistence/AgentStore.js.map +1 -0
  71. package/dist/src/gateway/persistence/index.js +9 -0
  72. package/dist/src/gateway/persistence/index.js.map +1 -0
  73. package/dist/src/hoard/DraconicHoardSystem.js +465 -0
  74. package/dist/src/hoard/DraconicHoardSystem.js.map +1 -0
  75. package/dist/src/index.js +7 -5
  76. package/dist/src/index.js.map +1 -1
  77. package/dist/src/infra/DraconicConnectionPool.js +492 -0
  78. package/dist/src/infra/DraconicConnectionPool.js.map +1 -0
  79. package/dist/src/lair/DraconicLairSystem.js +387 -0
  80. package/dist/src/lair/DraconicLairSystem.js.map +1 -0
  81. package/dist/src/llm/ollama.js +143 -99
  82. package/dist/src/llm/ollama.js.map +1 -1
  83. package/dist/src/migration/openclaw.js +5 -5
  84. package/dist/src/migration/openclaw.js.map +1 -1
  85. package/dist/src/pi-config.js +52 -27
  86. package/dist/src/pi-config.js.map +1 -1
  87. package/dist/src/sessions/SessionManager.js +416 -0
  88. package/dist/src/sessions/SessionManager.js.map +1 -0
  89. package/dist/src/sessions/SessionStore.js +580 -0
  90. package/dist/src/sessions/SessionStore.js.map +1 -0
  91. package/dist/src/sessions/UnifiedSessionBridge.js +394 -0
  92. package/dist/src/sessions/UnifiedSessionBridge.js.map +1 -0
  93. package/dist/src/sessions/index.js +15 -0
  94. package/dist/src/sessions/index.js.map +1 -0
  95. package/dist/src/sessions/migration/index.js +156 -0
  96. package/dist/src/sessions/migration/index.js.map +1 -0
  97. package/dist/src/sessions/types.js +8 -0
  98. package/dist/src/sessions/types.js.map +1 -0
  99. package/dist/src/skills/framework.js +1 -1
  100. package/dist/src/skills/framework.js.map +1 -1
  101. package/dist/src/tui/commands/final-functions.js +39 -0
  102. package/dist/src/tui/commands/final-functions.js.map +1 -0
  103. package/dist/src/tui/commands/natural-language-commands.js +231 -0
  104. package/dist/src/tui/commands/natural-language-commands.js.map +1 -0
  105. package/dist/src/tui/commands/orchestration-commands.js +340 -0
  106. package/dist/src/tui/commands/orchestration-commands.js.map +1 -0
  107. package/dist/src/tui/commands/orchestration-final-section.js +84 -0
  108. package/dist/src/tui/commands/orchestration-final-section.js.map +1 -0
  109. package/dist/src/tui/components/agent-tree-overlay.js +210 -0
  110. package/dist/src/tui/components/agent-tree-overlay.js.map +1 -0
  111. package/dist/src/tui/components/agent-tree-panel.js +229 -0
  112. package/dist/src/tui/components/agent-tree-panel.js.map +1 -0
  113. package/dist/src/tui/components/sidebar.js +82 -0
  114. package/dist/src/tui/components/sidebar.js.map +1 -0
  115. package/dist/src/tui/components/status-bar.js +115 -0
  116. package/dist/src/tui/components/status-bar.js.map +1 -0
  117. package/dist/src/tui/components/tree-header.js +85 -0
  118. package/dist/src/tui/components/tree-header.js.map +1 -0
  119. package/dist/src/tui/draconic-tui.js +291 -0
  120. package/dist/src/tui/draconic-tui.js.map +1 -0
  121. package/dist/src/tui/index.js +93 -0
  122. package/dist/src/tui/index.js.map +1 -0
  123. package/dist/src/tui/pi-tui-integration.js +260 -0
  124. package/dist/src/tui/pi-tui-integration.js.map +1 -0
  125. package/dist/src/utils/nl-patterns.js +145 -0
  126. package/dist/src/utils/nl-patterns.js.map +1 -0
  127. package/package.json +13 -4
  128. package/scripts/migrate-from-openclaw.sh +498 -0
  129. package/HEARTBEAT.md +0 -121
  130. 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
- const routerState = {
2
- mode: "auto",
3
- localAvailable: true,
4
- cloudAvailable: false,
5
- };
6
- async function checkLocalOllama() {
7
- try {
8
- const controller = new AbortController();
9
- const timeout = setTimeout(() => controller.abort(), 2000);
10
- const response = await fetch("http://localhost:11434/api/version", {
11
- signal: controller.signal,
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
- function getStatusIcon() {
21
- if (routerState.mode === "cloud")
22
- return "đŸŒŠī¸";
23
- if (routerState.mode === "local")
24
- return "🏠";
25
- return routerState.localAvailable ? "🏠" : "đŸŒŠī¸";
14
+ /**
15
+ * Set cloud mode
16
+ */
17
+ export function setCloudMode(enabled) {
18
+ useCloudMode = enabled;
26
19
  }
27
- function getStatusText() {
28
- const icon = getStatusIcon();
29
- if (routerState.mode === "cloud")
30
- return `${icon} Cloud`;
31
- if (routerState.mode === "local")
32
- return `${icon} Local`;
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
- console.log("[OllamaRouter] Extension loaded");
37
- pi.on("session_start", async (_event, ctx) => {
38
- routerState.localAvailable = await checkLocalOllama();
39
- console.log(`[OllamaRouter] Local: ${routerState.localAvailable ? "up" : "down"}`);
40
- // Set footer status
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
- pi.registerCommand("ollama-cloud", {
79
- description: "Quick switch to cloud Ollama mode",
80
- handler: async (_args, ctx) => {
81
- routerState.mode = "cloud";
82
- ctx.ui.setStatus("ollama-mode", getStatusText());
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":"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"}
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(blob.readFloatLE(i * 4));
126
+ embedding.push(dataView.getFloat32(i * 4, true)); // little-endian
124
127
  }
125
128
  return embedding;
126
129
  }