0xkobold 0.0.1

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 (258) hide show
  1. package/.agents/skills/nextjs-best-practices/SKILL.md +208 -0
  2. package/.agents/skills/sql-optimization-patterns/SKILL.md +509 -0
  3. package/HEARTBEAT.md +45 -0
  4. package/README.md +197 -0
  5. package/USAGE.md +191 -0
  6. package/dist/package.json +77 -0
  7. package/dist/src/agent/pi-adapter.js +307 -0
  8. package/dist/src/agent/pi-adapter.js.map +1 -0
  9. package/dist/src/agent/tool-adapter.js +86 -0
  10. package/dist/src/agent/tool-adapter.js.map +1 -0
  11. package/dist/src/approval/queue.js +114 -0
  12. package/dist/src/approval/queue.js.map +1 -0
  13. package/dist/src/ascii-kobold.js +76 -0
  14. package/dist/src/ascii-kobold.js.map +1 -0
  15. package/dist/src/cli/client.js +217 -0
  16. package/dist/src/cli/client.js.map +1 -0
  17. package/dist/src/cli/commands/agent.js +272 -0
  18. package/dist/src/cli/commands/agent.js.map +1 -0
  19. package/dist/src/cli/commands/chat.js +234 -0
  20. package/dist/src/cli/commands/chat.js.map +1 -0
  21. package/dist/src/cli/commands/config.js +202 -0
  22. package/dist/src/cli/commands/config.js.map +1 -0
  23. package/dist/src/cli/commands/daemon.js +203 -0
  24. package/dist/src/cli/commands/daemon.js.map +1 -0
  25. package/dist/src/cli/commands/gateway.js +184 -0
  26. package/dist/src/cli/commands/gateway.js.map +1 -0
  27. package/dist/src/cli/commands/init.js +175 -0
  28. package/dist/src/cli/commands/init.js.map +1 -0
  29. package/dist/src/cli/commands/kobold.js +21 -0
  30. package/dist/src/cli/commands/kobold.js.map +1 -0
  31. package/dist/src/cli/commands/logs.js +27 -0
  32. package/dist/src/cli/commands/logs.js.map +1 -0
  33. package/dist/src/cli/commands/mode.js +121 -0
  34. package/dist/src/cli/commands/mode.js.map +1 -0
  35. package/dist/src/cli/commands/persona.js +261 -0
  36. package/dist/src/cli/commands/persona.js.map +1 -0
  37. package/dist/src/cli/commands/start.js +66 -0
  38. package/dist/src/cli/commands/start.js.map +1 -0
  39. package/dist/src/cli/commands/status.js +117 -0
  40. package/dist/src/cli/commands/status.js.map +1 -0
  41. package/dist/src/cli/commands/stop.js +27 -0
  42. package/dist/src/cli/commands/stop.js.map +1 -0
  43. package/dist/src/cli/commands/system.js +128 -0
  44. package/dist/src/cli/commands/system.js.map +1 -0
  45. package/dist/src/cli/commands/tui.js +103 -0
  46. package/dist/src/cli/commands/tui.js.map +1 -0
  47. package/dist/src/cli/commands/update.js +133 -0
  48. package/dist/src/cli/commands/update.js.map +1 -0
  49. package/dist/src/cli/extensions/discord.js +113 -0
  50. package/dist/src/cli/extensions/discord.js.map +1 -0
  51. package/dist/src/cli/extensions/env.js +91 -0
  52. package/dist/src/cli/extensions/env.js.map +1 -0
  53. package/dist/src/cli/extensions/heartbeat.js +78 -0
  54. package/dist/src/cli/extensions/heartbeat.js.map +1 -0
  55. package/dist/src/cli/index.js +24 -0
  56. package/dist/src/cli/index.js.map +1 -0
  57. package/dist/src/cli/program.js +70 -0
  58. package/dist/src/cli/program.js.map +1 -0
  59. package/dist/src/cli/repl.js +184 -0
  60. package/dist/src/cli/repl.js.map +1 -0
  61. package/dist/src/cli/shared/discord-service.js +102 -0
  62. package/dist/src/cli/shared/discord-service.js.map +1 -0
  63. package/dist/src/config/index.js +10 -0
  64. package/dist/src/config/index.js.map +1 -0
  65. package/dist/src/config/loader.js +401 -0
  66. package/dist/src/config/loader.js.map +1 -0
  67. package/dist/src/config/paths.js +84 -0
  68. package/dist/src/config/paths.js.map +1 -0
  69. package/dist/src/config/types.js +8 -0
  70. package/dist/src/config/types.js.map +1 -0
  71. package/dist/src/context-detector.js +60 -0
  72. package/dist/src/context-detector.js.map +1 -0
  73. package/dist/src/discord/index.js +376 -0
  74. package/dist/src/discord/index.js.map +1 -0
  75. package/dist/src/event-bus/index.js +97 -0
  76. package/dist/src/event-bus/index.js.map +1 -0
  77. package/dist/src/extensions/command-args.js +68 -0
  78. package/dist/src/extensions/command-args.js.map +1 -0
  79. package/dist/src/extensions/core/agent-registry-extension.js +541 -0
  80. package/dist/src/extensions/core/agent-registry-extension.js.map +1 -0
  81. package/dist/src/extensions/core/agent-worker.js +148 -0
  82. package/dist/src/extensions/core/agent-worker.js.map +1 -0
  83. package/dist/src/extensions/core/compaction-safeguard.js +154 -0
  84. package/dist/src/extensions/core/compaction-safeguard.js.map +1 -0
  85. package/dist/src/extensions/core/confirm-destructive.js +43 -0
  86. package/dist/src/extensions/core/confirm-destructive.js.map +1 -0
  87. package/dist/src/extensions/core/context-aware-extension.js +124 -0
  88. package/dist/src/extensions/core/context-aware-extension.js.map +1 -0
  89. package/dist/src/extensions/core/context-pruning/extension.js +124 -0
  90. package/dist/src/extensions/core/context-pruning/extension.js.map +1 -0
  91. package/dist/src/extensions/core/context-pruning/pruner.js +312 -0
  92. package/dist/src/extensions/core/context-pruning/pruner.js.map +1 -0
  93. package/dist/src/extensions/core/context-pruning/runtime.js +48 -0
  94. package/dist/src/extensions/core/context-pruning/runtime.js.map +1 -0
  95. package/dist/src/extensions/core/context-pruning/settings.js +105 -0
  96. package/dist/src/extensions/core/context-pruning/settings.js.map +1 -0
  97. package/dist/src/extensions/core/dirty-repo-guard.js +42 -0
  98. package/dist/src/extensions/core/dirty-repo-guard.js.map +1 -0
  99. package/dist/src/extensions/core/discord-channel-extension.js +205 -0
  100. package/dist/src/extensions/core/discord-channel-extension.js.map +1 -0
  101. package/dist/src/extensions/core/discord-extension.js +142 -0
  102. package/dist/src/extensions/core/discord-extension.js.map +1 -0
  103. package/dist/src/extensions/core/env-loader-extension.js +157 -0
  104. package/dist/src/extensions/core/env-loader-extension.js.map +1 -0
  105. package/dist/src/extensions/core/fileops-extension.js +699 -0
  106. package/dist/src/extensions/core/fileops-extension.js.map +1 -0
  107. package/dist/src/extensions/core/gateway-extension.js +730 -0
  108. package/dist/src/extensions/core/gateway-extension.js.map +1 -0
  109. package/dist/src/extensions/core/git-checkpoint.js +46 -0
  110. package/dist/src/extensions/core/git-checkpoint.js.map +1 -0
  111. package/dist/src/extensions/core/handoff-extension.js +206 -0
  112. package/dist/src/extensions/core/handoff-extension.js.map +1 -0
  113. package/dist/src/extensions/core/heartbeat-extension.js +373 -0
  114. package/dist/src/extensions/core/heartbeat-extension.js.map +1 -0
  115. package/dist/src/extensions/core/mcp-extension.js +413 -0
  116. package/dist/src/extensions/core/mcp-extension.js.map +1 -0
  117. package/dist/src/extensions/core/mode-manager-extension.js +562 -0
  118. package/dist/src/extensions/core/mode-manager-extension.js.map +1 -0
  119. package/dist/src/extensions/core/multi-channel-extension.js +435 -0
  120. package/dist/src/extensions/core/multi-channel-extension.js.map +1 -0
  121. package/dist/src/extensions/core/ollama-provider-extension.js +66 -0
  122. package/dist/src/extensions/core/ollama-provider-extension.js.map +1 -0
  123. package/dist/src/extensions/core/onboarding-extension.js +122 -0
  124. package/dist/src/extensions/core/onboarding-extension.js.map +1 -0
  125. package/dist/src/extensions/core/persona-loader-extension.js +139 -0
  126. package/dist/src/extensions/core/persona-loader-extension.js.map +1 -0
  127. package/dist/src/extensions/core/pi-notify-extension.js +70 -0
  128. package/dist/src/extensions/core/pi-notify-extension.js.map +1 -0
  129. package/dist/src/extensions/core/protected-paths.js +24 -0
  130. package/dist/src/extensions/core/protected-paths.js.map +1 -0
  131. package/dist/src/extensions/core/questionnaire-extension.js +242 -0
  132. package/dist/src/extensions/core/questionnaire-extension.js.map +1 -0
  133. package/dist/src/extensions/core/self-update-extension.js +181 -0
  134. package/dist/src/extensions/core/self-update-extension.js.map +1 -0
  135. package/dist/src/extensions/core/session-bridge-extension.js +78 -0
  136. package/dist/src/extensions/core/session-bridge-extension.js.map +1 -0
  137. package/dist/src/extensions/core/session-manager-extension.js +319 -0
  138. package/dist/src/extensions/core/session-manager-extension.js.map +1 -0
  139. package/dist/src/extensions/core/session-name-extension.js +88 -0
  140. package/dist/src/extensions/core/session-name-extension.js.map +1 -0
  141. package/dist/src/extensions/core/session-pruning-extension.js +480 -0
  142. package/dist/src/extensions/core/session-pruning-extension.js.map +1 -0
  143. package/dist/src/extensions/core/task-manager-extension.js +661 -0
  144. package/dist/src/extensions/core/task-manager-extension.js.map +1 -0
  145. package/dist/src/extensions/core/update-extension.js +438 -0
  146. package/dist/src/extensions/core/update-extension.js.map +1 -0
  147. package/dist/src/extensions/core/websearch-extension.js +463 -0
  148. package/dist/src/extensions/core/websearch-extension.js.map +1 -0
  149. package/dist/src/extensions/index.js +5 -0
  150. package/dist/src/extensions/index.js.map +1 -0
  151. package/dist/src/extensions/loader.js +80 -0
  152. package/dist/src/extensions/loader.js.map +1 -0
  153. package/dist/src/gateway/index.js +353 -0
  154. package/dist/src/gateway/index.js.map +1 -0
  155. package/dist/src/index.js +150 -0
  156. package/dist/src/index.js.map +1 -0
  157. package/dist/src/llm/anthropic.js +86 -0
  158. package/dist/src/llm/anthropic.js.map +1 -0
  159. package/dist/src/llm/index.js +9 -0
  160. package/dist/src/llm/index.js.map +1 -0
  161. package/dist/src/llm/ollama.js +113 -0
  162. package/dist/src/llm/ollama.js.map +1 -0
  163. package/dist/src/llm/router.js +145 -0
  164. package/dist/src/llm/router.js.map +1 -0
  165. package/dist/src/llm/types.js +7 -0
  166. package/dist/src/llm/types.js.map +1 -0
  167. package/dist/src/memory/index.js +5 -0
  168. package/dist/src/memory/index.js.map +1 -0
  169. package/dist/src/memory/store.js +91 -0
  170. package/dist/src/memory/store.js.map +1 -0
  171. package/dist/src/pi-config.js +80 -0
  172. package/dist/src/pi-config.js.map +1 -0
  173. package/dist/src/skills/builtin/file.js +184 -0
  174. package/dist/src/skills/builtin/file.js.map +1 -0
  175. package/dist/src/skills/builtin/shell.js +100 -0
  176. package/dist/src/skills/builtin/shell.js.map +1 -0
  177. package/dist/src/skills/builtin/subagent.js +62 -0
  178. package/dist/src/skills/builtin/subagent.js.map +1 -0
  179. package/dist/src/skills/hello.js +42 -0
  180. package/dist/src/skills/hello.js.map +1 -0
  181. package/dist/src/skills/index.js +11 -0
  182. package/dist/src/skills/index.js.map +1 -0
  183. package/dist/src/skills/loader.js +382 -0
  184. package/dist/src/skills/loader.js.map +1 -0
  185. package/dist/src/skills/types.js +8 -0
  186. package/dist/src/skills/types.js.map +1 -0
  187. package/dist/src/utils/working-dir.js +71 -0
  188. package/dist/src/utils/working-dir.js.map +1 -0
  189. package/package.json +77 -0
  190. package/skills/1password/SKILL.md +70 -0
  191. package/skills/1password/references/cli-examples.md +29 -0
  192. package/skills/1password/references/get-started.md +17 -0
  193. package/skills/apple-notes/SKILL.md +77 -0
  194. package/skills/apple-reminders/SKILL.md +118 -0
  195. package/skills/bear-notes/SKILL.md +107 -0
  196. package/skills/blogwatcher/SKILL.md +69 -0
  197. package/skills/blucli/SKILL.md +47 -0
  198. package/skills/bluebubbles/SKILL.md +131 -0
  199. package/skills/camsnap/SKILL.md +45 -0
  200. package/skills/canvas/SKILL.md +198 -0
  201. package/skills/clawhub/SKILL.md +77 -0
  202. package/skills/coding-agent/SKILL.md +284 -0
  203. package/skills/discord/SKILL.md +197 -0
  204. package/skills/eightctl/SKILL.md +50 -0
  205. package/skills/food-order/SKILL.md +48 -0
  206. package/skills/gemini/SKILL.md +43 -0
  207. package/skills/gh-issues/SKILL.md +865 -0
  208. package/skills/gifgrep/SKILL.md +79 -0
  209. package/skills/github/SKILL.md +163 -0
  210. package/skills/gog/SKILL.md +116 -0
  211. package/skills/goplaces/SKILL.md +52 -0
  212. package/skills/healthcheck/SKILL.md +245 -0
  213. package/skills/himalaya/SKILL.md +257 -0
  214. package/skills/himalaya/references/configuration.md +184 -0
  215. package/skills/himalaya/references/message-composition.md +199 -0
  216. package/skills/imsg/SKILL.md +122 -0
  217. package/skills/mcporter/SKILL.md +61 -0
  218. package/skills/model-usage/SKILL.md +69 -0
  219. package/skills/model-usage/references/codexbar-cli.md +33 -0
  220. package/skills/model-usage/scripts/model_usage.py +310 -0
  221. package/skills/nano-banana-pro/SKILL.md +58 -0
  222. package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
  223. package/skills/nano-pdf/SKILL.md +38 -0
  224. package/skills/notion/SKILL.md +172 -0
  225. package/skills/obsidian/SKILL.md +81 -0
  226. package/skills/openai-image-gen/SKILL.md +89 -0
  227. package/skills/openai-image-gen/scripts/gen.py +240 -0
  228. package/skills/openai-whisper/SKILL.md +38 -0
  229. package/skills/openai-whisper-api/SKILL.md +52 -0
  230. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  231. package/skills/openhue/SKILL.md +112 -0
  232. package/skills/oracle/SKILL.md +125 -0
  233. package/skills/ordercli/SKILL.md +78 -0
  234. package/skills/peekaboo/SKILL.md +190 -0
  235. package/skills/sag/SKILL.md +87 -0
  236. package/skills/session-logs/SKILL.md +115 -0
  237. package/skills/sherpa-onnx-tts/SKILL.md +103 -0
  238. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  239. package/skills/skill-creator/SKILL.md +370 -0
  240. package/skills/skill-creator/license.txt +202 -0
  241. package/skills/skill-creator/scripts/init_skill.py +378 -0
  242. package/skills/skill-creator/scripts/package_skill.py +111 -0
  243. package/skills/skill-creator/scripts/quick_validate.py +101 -0
  244. package/skills/slack/SKILL.md +144 -0
  245. package/skills/songsee/SKILL.md +49 -0
  246. package/skills/sonoscli/SKILL.md +46 -0
  247. package/skills/spotify-player/SKILL.md +64 -0
  248. package/skills/summarize/SKILL.md +87 -0
  249. package/skills/things-mac/SKILL.md +86 -0
  250. package/skills/tmux/SKILL.md +153 -0
  251. package/skills/tmux/scripts/find-sessions.sh +112 -0
  252. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  253. package/skills/trello/SKILL.md +95 -0
  254. package/skills/video-frames/SKILL.md +46 -0
  255. package/skills/video-frames/scripts/frame.sh +81 -0
  256. package/skills/voice-call/SKILL.md +45 -0
  257. package/skills/wacli/SKILL.md +72 -0
  258. package/skills/weather/SKILL.md +112 -0
@@ -0,0 +1,463 @@
1
+ import { $ } from "bun";
2
+ import { parseArgs } from "../command-args.js";
3
+ /**
4
+ * Perform web search using available methods
5
+ */
6
+ async function performWebSearch(query, limit = 5) {
7
+ const results = [];
8
+ try {
9
+ // Try Ollama first if available
10
+ const ollamaResults = await searchOllama(query, limit);
11
+ if (ollamaResults.length > 0) {
12
+ return {
13
+ results: ollamaResults,
14
+ query,
15
+ totalResults: ollamaResults.length
16
+ };
17
+ }
18
+ }
19
+ catch {
20
+ // Ollama not available or not configured, try alternatives
21
+ }
22
+ // Fallback: Try searx or other search APIs
23
+ try {
24
+ const fallbackResults = await searchFallback(query, limit);
25
+ if (fallbackResults.length > 0) {
26
+ return {
27
+ results: fallbackResults,
28
+ query,
29
+ totalResults: fallbackResults.length
30
+ };
31
+ }
32
+ }
33
+ catch {
34
+ // Fallback also failed
35
+ }
36
+ return {
37
+ results,
38
+ query,
39
+ totalResults: 0
40
+ };
41
+ }
42
+ /**
43
+ * Search using Ollama's web search capability
44
+ */
45
+ async function searchOllama(query, limit) {
46
+ const results = [];
47
+ // Check if Ollama is running and has web search enabled
48
+ try {
49
+ const response = await fetch("http://localhost:11434/api/version");
50
+ if (!response.ok) {
51
+ throw new Error("Ollama not available");
52
+ }
53
+ // Generate search query using Ollama
54
+ // This uses Ollama's capability to generate search terms
55
+ const searchPrompt = `Search the web for: ${query}
56
+
57
+ Provide search results in this format:
58
+ Title | URL | Brief description
59
+
60
+ Important: Only include real, factual results.`;
61
+ const ollamaResponse = await fetch("http://localhost:11434/api/generate", {
62
+ method: "POST",
63
+ headers: { "Content-Type": "application/json" },
64
+ body: JSON.stringify({
65
+ model: process.env.OLLAMA_WEB_SEARCH_MODEL || "llama3.2",
66
+ prompt: searchPrompt,
67
+ stream: false,
68
+ options: {
69
+ // Enable web search if supported by the model
70
+ capabilities: ["web_search"]
71
+ }
72
+ })
73
+ });
74
+ if (!ollamaResponse.ok) {
75
+ throw new Error("Ollama request failed");
76
+ }
77
+ const data = await ollamaResponse.json();
78
+ const content = data.response || "";
79
+ // Parse results from Ollama response
80
+ // Expected format: Title | URL | Description
81
+ const lines = content.split('\n').filter((line) => line.trim());
82
+ for (const line of lines.slice(0, limit)) {
83
+ const parts = line.split('|').map((p) => p.trim());
84
+ if (parts.length >= 2) {
85
+ results.push({
86
+ title: parts[0] || "Untitled",
87
+ url: parts[1] || "",
88
+ snippet: parts[2] || ""
89
+ });
90
+ }
91
+ }
92
+ }
93
+ catch (error) {
94
+ console.log("[WebSearch] Ollama search not available:", error);
95
+ }
96
+ return results;
97
+ }
98
+ /**
99
+ * Fallback search using system tools
100
+ */
101
+ async function searchFallback(query, limit) {
102
+ const results = [];
103
+ // Try using curl with a search engine that supports no-JS queries
104
+ // Using DuckDuckGo HTML version which works without JavaScript
105
+ try {
106
+ const searchUrl = `https://duckduckgo.com/html/?q=${encodeURIComponent(query)}`;
107
+ const html = await $ `curl -s -A "Mozilla/5.0 (compatible; 0xKobold)" ${searchUrl}`.text();
108
+ // Basic parsing - look for result links
109
+ // DuckDuckGo HTML format: <a class="result__a" href="URL">Title</a>
110
+ const resultRegex = /<a[^>]*class="result__a"[^>]*href="([^"]*)"[^>]*>(.*?)<\/a>/gi;
111
+ let match;
112
+ let count = 0;
113
+ while ((match = resultRegex.exec(html)) && count < limit) {
114
+ const url = match[1];
115
+ const title = match[2].replace(/<[^>]*>/g, ''); // Strip HTML
116
+ if (url && title && !url.includes('duckduckgo.com')) {
117
+ results.push({
118
+ title: decodeHtmlEntities(title),
119
+ url: decodeURIComponent(url),
120
+ snippet: ""
121
+ });
122
+ count++;
123
+ }
124
+ }
125
+ }
126
+ catch (error) {
127
+ console.log("[WebSearch] Fallback search failed:", error);
128
+ }
129
+ return results;
130
+ }
131
+ /**
132
+ * Decode HTML entities
133
+ */
134
+ function decodeHtmlEntities(text) {
135
+ const entities = {
136
+ '&amp;': '&',
137
+ '&lt;': '<',
138
+ '&gt;': '>',
139
+ '&quot;': '"',
140
+ '&#39;': "'",
141
+ '&nbsp;': ' '
142
+ };
143
+ return text.replace(/&[^;]+;/g, (entity) => entities[entity] || entity);
144
+ }
145
+ /**
146
+ * Fetch and extract content from a URL
147
+ */
148
+ async function fetchUrlContent(url, maxLength = 5000) {
149
+ try {
150
+ const response = await fetch(url, {
151
+ headers: {
152
+ 'User-Agent': 'Mozilla/5.0 (compatible; 0xKobold/0.1)'
153
+ }
154
+ });
155
+ if (!response.ok) {
156
+ throw new Error(`HTTP ${response.status}`);
157
+ }
158
+ const html = await response.text();
159
+ // Extract title
160
+ const titleMatch = html.match(/<title[^>]*>(.*?)<\/title>/i);
161
+ const title = titleMatch ? decodeHtmlEntities(titleMatch[1].trim()) : "Untitled";
162
+ // Extract main content (basic approach)
163
+ const content = html
164
+ .replace(/<script[^>]*>.*?<\/script>/gi, '') // Remove scripts
165
+ .replace(/<style[^>]*>.*?<\/style>/gi, '') // Remove styles
166
+ .replace(/<[^>]*>/g, ' ') // Remove HTML tags
167
+ .replace(/\s+/g, ' ') // Normalize whitespace
168
+ .trim()
169
+ .slice(0, maxLength);
170
+ return { title, content };
171
+ }
172
+ catch (error) {
173
+ console.log("[WebSearch] Failed to fetch URL:", error);
174
+ return null;
175
+ }
176
+ }
177
+ /**
178
+ * Web Search Extension
179
+ */
180
+ export default function webSearchExtension(pi) {
181
+ // ═══════════════════════════════════════════════════════════════
182
+ // COMMANDS
183
+ // ═══════════════════════════════════════════════════════════════
184
+ pi.registerCommand("web-search", {
185
+ description: "Search the web for information",
186
+ // @ts-ignore Command args property
187
+ args: [
188
+ { name: "query", description: "Search query", required: true },
189
+ { name: "limit", description: "Number of results (default: 5)", required: false }
190
+ ],
191
+ handler: async (args, ctx) => {
192
+ const parsed = parseArgs(args, [
193
+ { name: "query", description: "Search query", required: true },
194
+ { name: "limit", description: "Number of results", required: false }
195
+ ]);
196
+ const query = parsed.query;
197
+ const limit = parsed.limit;
198
+ const resultLimit = parseInt(String(limit)) || 5;
199
+ ctx.ui?.notify?.(`🔍 Searching for: ${query}`, "info");
200
+ const results = await performWebSearch(query, resultLimit);
201
+ if (results.results.length === 0) {
202
+ ctx.ui?.notify?.("No results found", "warning");
203
+ return;
204
+ }
205
+ const lines = [`🔍 Results for "${query}":\n`];
206
+ for (let i = 0; i < results.results.length; i++) {
207
+ const result = results.results[i];
208
+ lines.push(`${i + 1}. ${result.title}`);
209
+ lines.push(` ${result.url}`);
210
+ if (result.snippet) {
211
+ lines.push(` ${result.snippet}`);
212
+ }
213
+ lines.push("");
214
+ }
215
+ ctx.ui?.notify?.(lines.join("\n"), "info");
216
+ }
217
+ });
218
+ pi.registerCommand("fetch", {
219
+ description: "Fetch and display text content from a URL",
220
+ // @ts-ignore Command args property
221
+ args: [
222
+ { name: "url", description: "URL to fetch (must start with http:// or https://)", required: true },
223
+ { name: "max", description: "Maximum characters (default: 5000)", required: false }
224
+ ],
225
+ handler: async (args, ctx) => {
226
+ const parsed = parseArgs(args, [
227
+ { name: "url", description: "URL to fetch", required: true },
228
+ { name: "max", description: "Maximum characters", required: false }
229
+ ]);
230
+ const url = parsed.url;
231
+ const max = parsed.max;
232
+ const maxLength = parseInt(String(max)) || 5000;
233
+ if (!url?.startsWith("http")) {
234
+ ctx.ui?.notify?.("URL must start with http:// or https://", "error");
235
+ return;
236
+ }
237
+ ctx.ui?.notify?.(`📥 Fetching ${url}...`, "info");
238
+ const result = await fetchUrlContent(url, maxLength);
239
+ if (!result) {
240
+ ctx.ui?.notify?.(`Failed to fetch ${url}`, "error");
241
+ return;
242
+ }
243
+ // Format output
244
+ const lines = [
245
+ `📄 ${result.title}`,
246
+ `Source: ${url}`,
247
+ "─────────────────────────────────────────",
248
+ "",
249
+ result.content.slice(0, maxLength),
250
+ "",
251
+ "─────────────────────────────────────────",
252
+ result.content.length > maxLength
253
+ ? `... (${result.content.length - maxLength} more characters)`
254
+ : ""
255
+ ];
256
+ ctx.ui?.notify?.(lines.join("\n"), "info");
257
+ }
258
+ });
259
+ // ═══════════════════════════════════════════════════════════════
260
+ // TOOLS
261
+ // ═══════════════════════════════════════════════════════════════
262
+ pi.registerTool({
263
+ name: "web_search",
264
+ description: "Search the web for current information. Use this when you need up-to-date information not in your training data.",
265
+ // @ts-ignore TSchema mismatch
266
+ parameters: {
267
+ type: "object",
268
+ properties: {
269
+ query: {
270
+ type: "string",
271
+ description: "Search query - be specific for better results"
272
+ },
273
+ limit: {
274
+ type: "number",
275
+ default: 5,
276
+ description: "Number of results to return (1-10)"
277
+ }
278
+ },
279
+ required: ["query"],
280
+ },
281
+ async execute(args) {
282
+ // @ts-ignore Command args property
283
+ console.log("[WebSearch] Received args:", JSON.stringify(args, null, 2));
284
+ // Handle different argument structures
285
+ const query = args?.query || args?.parameters?.query || args?.[0]?.query;
286
+ const limit = args?.limit || args?.parameters?.limit || args?.[0]?.limit || 5;
287
+ console.log("[WebSearch] Extracted query:", query, "limit:", limit);
288
+ if (!query || typeof query !== 'string' || !query.trim()) {
289
+ return {
290
+ content: [{
291
+ type: "text",
292
+ text: `Invalid search query: received "${query}" (type: ${typeof query})`
293
+ }],
294
+ details: { error: "invalid_query", received: args },
295
+ };
296
+ }
297
+ const results = await performWebSearch(query, Math.min(limit, 10));
298
+ if (results.results.length === 0) {
299
+ return {
300
+ content: [{
301
+ type: "text",
302
+ text: "No search results found. The web search service may be unavailable."
303
+ }],
304
+ details: {
305
+ query,
306
+ error: "no_results",
307
+ note: "Ollama web search not configured or fallback failed"
308
+ },
309
+ };
310
+ }
311
+ const formatted = results.results
312
+ .map((r, i) => `${i + 1}. ${r.title}\n URL: ${r.url}${r.snippet ? "\n " + r.snippet : ""}`)
313
+ .join("\n\n");
314
+ return {
315
+ content: [
316
+ { type: "text", text: `Search results for "${query}":\n\n${formatted}` },
317
+ ],
318
+ details: {
319
+ query,
320
+ results: results.results,
321
+ total: results.totalResults,
322
+ },
323
+ };
324
+ },
325
+ });
326
+ pi.registerTool({
327
+ name: "web_fetch",
328
+ description: "Fetch and read the content of a web page. Use this to get detailed information from a specific URL.",
329
+ // @ts-ignore TSchema mismatch
330
+ parameters: {
331
+ type: "object",
332
+ properties: {
333
+ url: {
334
+ type: "string",
335
+ description: "Full URL to fetch (must include http:// or https://)"
336
+ },
337
+ max_length: {
338
+ type: "number",
339
+ default: 5000,
340
+ description: "Maximum characters to retrieve"
341
+ }
342
+ },
343
+ required: ["url"],
344
+ },
345
+ async execute(args) {
346
+ // @ts-ignore Command args property
347
+ console.log("[WebFetch] Received args:", JSON.stringify(args, null, 2));
348
+ // Handle different argument structures that pi-coding-agent might send
349
+ const url = args?.url || args?.parameters?.url || args?.[0]?.url;
350
+ const max_length = args?.max_length || args?.parameters?.max_length || args?.[0]?.max_length || 5000;
351
+ console.log("[WebFetch] Extracted url:", url, "max_length:", max_length);
352
+ if (!url || typeof url !== 'string') {
353
+ return {
354
+ content: [{
355
+ type: "text",
356
+ text: `Invalid URL: received "${url}" (type: ${typeof url}). Must be a string starting with http:// or https://`
357
+ }],
358
+ details: { error: "invalid_url", received: args },
359
+ };
360
+ }
361
+ if (!url.startsWith("http")) {
362
+ return {
363
+ content: [{ type: "text", text: `Invalid URL "${url}". Must start with http:// or https://` }],
364
+ details: { error: "invalid_url_scheme", url },
365
+ };
366
+ }
367
+ const content = await fetchUrlContent(url, max_length);
368
+ if (!content) {
369
+ return {
370
+ content: [{ type: "text", text: `Failed to fetch content from ${url}` }],
371
+ details: { error: "fetch_failed", url },
372
+ };
373
+ }
374
+ return {
375
+ content: [
376
+ {
377
+ type: "text",
378
+ text: `# ${content.title}\n\n${content.content}\n\n[Source: ${url}]`
379
+ },
380
+ ],
381
+ details: {
382
+ url,
383
+ title: content.title,
384
+ length: content.content.length,
385
+ },
386
+ };
387
+ },
388
+ });
389
+ pi.registerTool({
390
+ name: "web_qa",
391
+ description: "Search the web and synthesize an answer. Combines search + fetch for comprehensive results.",
392
+ // @ts-ignore TSchema mismatch
393
+ parameters: {
394
+ type: "object",
395
+ properties: {
396
+ question: {
397
+ type: "string",
398
+ description: "The question to answer using web search"
399
+ },
400
+ sources: {
401
+ type: "number",
402
+ default: 3,
403
+ description: "Number of sources to check (1-5)"
404
+ }
405
+ },
406
+ required: ["question"],
407
+ },
408
+ async execute(args) {
409
+ // @ts-ignore Command args property
410
+ console.log("[WebQA] Received args:", JSON.stringify(args, null, 2));
411
+ // Handle different argument structures
412
+ const question = args?.question || args?.parameters?.question || args?.[0]?.question;
413
+ const sources = args?.sources || args?.parameters?.sources || args?.[0]?.sources || 3;
414
+ console.log("[WebQA] Extracted question:", question, "sources:", sources);
415
+ if (!question || typeof question !== 'string' || !question.trim()) {
416
+ return {
417
+ content: [{
418
+ type: "text",
419
+ text: `Invalid question: received "${question}" (type: ${typeof question})`
420
+ }],
421
+ details: { error: "invalid_question", received: args },
422
+ };
423
+ }
424
+ // Search first
425
+ const searchResults = await performWebSearch(question, Math.min(sources, 5));
426
+ if (searchResults.results.length === 0) {
427
+ return {
428
+ content: [{ type: "text", text: "Could not find any information about that question online." }],
429
+ details: { question, error: "no_search_results" },
430
+ };
431
+ }
432
+ // Fetch content from top results
433
+ const fetchedContents = [];
434
+ for (const result of searchResults.results.slice(0, sources)) {
435
+ const content = await fetchUrlContent(result.url, 3000);
436
+ if (content) {
437
+ fetchedContents.push({
438
+ title: content.title,
439
+ url: result.url,
440
+ content: content.content
441
+ });
442
+ }
443
+ }
444
+ const summary = fetchedContents.length > 0
445
+ ? `Found ${fetchedContents.length} relevant sources:\n\n` +
446
+ fetchedContents.map(c => `## ${c.title}\n${c.content.slice(0, 1500)}...\n(Source: ${c.url})`).join("\n\n")
447
+ : `Found ${searchResults.results.length} search results but could not fetch detailed content.\n\n` +
448
+ searchResults.results.map(r => `- ${r.title}: ${r.url}`).join("\n");
449
+ return {
450
+ content: [{ type: "text", text: summary }],
451
+ details: {
452
+ question,
453
+ sources_found: searchResults.results.length,
454
+ sources_fetched: fetchedContents.length,
455
+ results: searchResults.results,
456
+ },
457
+ };
458
+ },
459
+ });
460
+ console.log("[WebSearch] Extension loaded with Ollama integration");
461
+ console.log("[WebSearch] Tools: web_search, web_fetch, web_qa");
462
+ }
463
+ //# sourceMappingURL=websearch-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websearch-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/websearch-extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Extensions Barrel Export
3
+ */
4
+ export { loadExtensions, loadBuiltInExtensions, createKoboldExtensionAPI } from './loader';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Extension Loader for 0xKobold
3
+ *
4
+ * Dynamically loads pi-coding-agent extensions from the core/ directory
5
+ * and external paths.
6
+ */
7
+ import { readdir } from 'fs/promises';
8
+ import { pathToFileURL } from 'url';
9
+ import { resolve } from 'path';
10
+ /**
11
+ * Load extensions from specified paths
12
+ */
13
+ export async function loadExtensions(pi, extensionPaths) {
14
+ for (const path of extensionPaths) {
15
+ try {
16
+ const resolvedPath = resolve(path);
17
+ const module = await import(pathToFileURL(resolvedPath).href);
18
+ const extension = module.default || module;
19
+ if (typeof extension === 'function') {
20
+ await extension(pi);
21
+ console.log(`[Extensions] Loaded: ${path}`);
22
+ }
23
+ else {
24
+ console.error(`[Extensions] ${path} must export a function`);
25
+ }
26
+ }
27
+ catch (err) {
28
+ console.error(`[Extensions] Failed to load ${path}:`, err);
29
+ }
30
+ }
31
+ }
32
+ /**
33
+ * Load built-in extensions from the core/ directory
34
+ */
35
+ export async function loadBuiltInExtensions(pi) {
36
+ const coreDir = resolve(__dirname, 'core');
37
+ try {
38
+ const files = await readdir(coreDir);
39
+ for (const file of files) {
40
+ if (file.endsWith('.ts') || file.endsWith('.js')) {
41
+ const path = `${coreDir}/${file}`;
42
+ await loadExtensions(pi, [path]);
43
+ }
44
+ }
45
+ }
46
+ catch (err) {
47
+ console.error('[Extensions] Failed to load built-in extensions:', err);
48
+ }
49
+ }
50
+ /**
51
+ * Create extension API wrapper with 0xKobold-specific helpers
52
+ */
53
+ export function createKoboldExtensionAPI(baseApi) {
54
+ return {
55
+ ...baseApi,
56
+ // Add 0xKobold-specific utilities
57
+ registerKoboldTool: (tool) => {
58
+ baseApi.registerTool({
59
+ name: tool.name,
60
+ description: tool.description,
61
+ // @ts-ignore TSchema mismatch
62
+ parameters: tool.parameters,
63
+ // @ts-ignore Tool execute signature
64
+ execute: tool.execute,
65
+ });
66
+ },
67
+ registerKoboldCommand: (name, command) => {
68
+ const cmdHandler = command.handler || command.execute;
69
+ baseApi.registerCommand(name, {
70
+ description: command.description,
71
+ // @ts-ignore Handler signature
72
+ handler: async (args, ctx) => {
73
+ // @ts-ignore Handler signature
74
+ await cmdHandler?.(args, ctx);
75
+ },
76
+ });
77
+ },
78
+ };
79
+ }
80
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAgB,EAChB,cAAwB;IAExB,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;YAE3C,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;gBACpC,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,gBAAgB,IAAI,yBAAyB,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAAgB;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,MAAM,IAAI,GAAG,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC;gBAClC,MAAM,cAAc,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,GAAG,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAqB;IAC5D,OAAO;QACL,GAAG,OAAO;QAEV,kCAAkC;QAClC,kBAAkB,EAAE,CAAC,IAAgB,EAAE,EAAE;YACvC,OAAO,CAAC,YAAY,CAAC;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,8BAA8B;gBAC9B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,oCAAoC;gBACpC,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;QACL,CAAC;QAED,qBAAqB,EAAE,CAAC,IAAY,EAAE,OAAsB,EAAE,EAAE;YAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;YACtD,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE;gBAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,+BAA+B;gBAC/B,OAAO,EAAE,KAAK,EAAE,IAAY,EAAE,GAAG,EAAE,EAAE;oBACnC,+BAA+B;oBAC/B,MAAM,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAChC,CAAC;aACF,CAAC,CAAC;QACL,CAAC;KACc,CAAC;AACpB,CAAC"}