0xkobold 0.7.2 → 0.7.3

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/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "0xkobold",
3
- "version": "0.7.2",
3
+ "version": "0.7.3",
4
4
  "description": "Your digital familiar - Koclaw-style gateway, session management, and multi-agent orchestration",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -43,6 +43,8 @@
43
43
  "author": "0xKobold Team",
44
44
  "license": "MIT",
45
45
  "dependencies": {
46
+ "@0xkobold/pi-cloudflare-browser": "0.1.0",
47
+ "@0xkobold/pi-obsidian-bridge": "0.1.0",
46
48
  "@0xkobold/pi-ollama": "0.1.7",
47
49
  "@aliou/pi-processes": "^0.6.2",
48
50
  "@mariozechner/pi-agent-core": "0.57.1",
@@ -42,8 +42,9 @@ export const config = {
42
42
  './src/extensions/core/mcp-extension.ts', // Model Context Protocol support
43
43
  './node_modules/@aliou/pi-processes/src/index.ts', // Background process management
44
44
  './src/extensions/core/websearch-enhanced-extension.ts', // Ollama web search
45
- './src/extensions/core/cloudflare-browser-extension.ts', // ☁️ Browser Rendering (opt-in)
46
- './src/extensions/core/wallet-extension.ts', // 🪙 CDP Agentic + Ethers.js + ERC-8004
45
+ // './src/extensions/core/cloudflare-browser-extension.ts', // MOVED: Now at npm:@0xkobold/pi-cloudflare-browser
46
+ './node_modules/@0xkobold/pi-cloudflare-browser/dist/index.js', // ☁️ Browser Rendering (published)
47
+ './src/extensions/core/wallet-extension.ts', // 🪙 CDP Agentic + Ethers.js (legacy - published as @0xkobold/pi-wallet)
47
48
  './src/extensions/core/update-extension.ts', // Framework update functionality
48
49
  './src/extensions/core/self-update-extension.ts', // 0xKobold self-update
49
50
  './src/extensions/core/perennial-memory-extension.ts', // Long-term memory
@@ -54,8 +55,9 @@ export const config = {
54
55
  '../../node_modules/pi-web-access/index.ts', // 🕸️ Web search, fetch, research
55
56
  // 🧠 Context Engine Extension (Koclaw-style context management)
56
57
  './src/extensions/core/intelligent-context-extension.ts', // Intelligent context via framework events
57
- // 🔗 Obsidian Bridge (NEW - Heartbeat-integrated task sync)
58
- './src/extensions/core/obsidian-bridge-extension.ts', // Obsidian vault integration
58
+ // 🔗 Obsidian Bridge (published)
59
+ // './src/extensions/core/obsidian-bridge-extension.ts', // MOVED: Now at npm:@0xkobold/pi-obsidian-bridge
60
+ './node_modules/@0xkobold/pi-obsidian-bridge/dist/index.js', // 📓 Obsidian vault sync
59
61
  // 🪙 Wallet + ERC-8004 (Agent economy - PUBLISHED)
60
62
  'npm:@0xkobold/pi-wallet', // CDP Agentic + Ethers.js + x402
61
63
  'npm:@0xkobold/pi-erc8004', // ERC-8004 identity & reputation
@@ -1 +1 @@
1
- {"version":3,"file":"pi-config.js","sourceRoot":"","sources":["../../src/pi-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pi-config.js","sourceRoot":"","sources":["../../src/pi-config.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "0xkobold",
3
- "version": "0.7.2",
3
+ "version": "0.7.3",
4
4
  "description": "Your digital familiar - Koclaw-style gateway, session management, and multi-agent orchestration",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -43,6 +43,8 @@
43
43
  "author": "0xKobold Team",
44
44
  "license": "MIT",
45
45
  "dependencies": {
46
+ "@0xkobold/pi-cloudflare-browser": "0.1.0",
47
+ "@0xkobold/pi-obsidian-bridge": "0.1.0",
46
48
  "@0xkobold/pi-ollama": "0.1.7",
47
49
  "@aliou/pi-processes": "^0.6.2",
48
50
  "@mariozechner/pi-agent-core": "0.57.1",
@@ -1,389 +0,0 @@
1
- /**
2
- * Cloudflare Browser Rendering Extension for 0xKobold
3
- *
4
- * Provides browser rendering capabilities via Cloudflare Browser Rendering API
5
- * Opt-in: Only loads if CLOUDFLARE_API_TOKEN exists in ~/.0xkobold/.env
6
- *
7
- * Endpoints:
8
- * - /crawl - Crawl web content (multi-page)
9
- * - /content - Fetch HTML from single URL
10
- * - /screenshot - Capture screenshot
11
- * - /pdf - Generate PDF
12
- * - /markdown - Extract markdown
13
- * - /json - Extract structured data with AI
14
- *
15
- * Requirements:
16
- * - CLOUDFLARE_API_TOKEN with "Browser Rendering - Edit" permission
17
- * - CLOUDFLARE_ACCOUNT_ID from Cloudflare dashboard
18
- */
19
- import { Type } from "@sinclair/typebox";
20
- import { homedir } from "os";
21
- import { join } from "path";
22
- async function loadConfig() {
23
- // Try environment first, then fallback to ~/.0xkobold/.env
24
- let apiToken = process.env.CLOUDFLARE_API_TOKEN || null;
25
- let accountId = process.env.CLOUDFLARE_ACCOUNT_ID || null;
26
- // If not in env, try to load from ~/.0xkobold/.env
27
- if (!apiToken || !accountId) {
28
- try {
29
- const envPath = join(homedir(), ".0xkobold", ".env");
30
- const envFile = Bun.file(envPath);
31
- if (await envFile.exists()) {
32
- const content = await envFile.text();
33
- const lines = content.split('\n');
34
- for (const line of lines) {
35
- const trimmed = line.trim();
36
- if (trimmed.startsWith('CLOUDFLARE_API_TOKEN=')) {
37
- apiToken = trimmed.slice('CLOUDFLARE_API_TOKEN='.length).replace(/^["']|["']$/g, '');
38
- }
39
- if (trimmed.startsWith('CLOUDFLARE_ACCOUNT_ID=')) {
40
- accountId = trimmed.slice('CLOUDFLARE_ACCOUNT_ID='.length).replace(/^["']|["']$/g, '');
41
- }
42
- }
43
- }
44
- }
45
- catch {
46
- // .env may not exist, that's ok
47
- }
48
- }
49
- return {
50
- apiToken,
51
- accountId,
52
- enabled: !!(apiToken && accountId)
53
- };
54
- }
55
- // ============================================================================
56
- // API CLIENT
57
- // ============================================================================
58
- class CloudflareClient {
59
- config;
60
- baseUrl;
61
- constructor(config) {
62
- this.config = config;
63
- this.baseUrl = `https://api.cloudflare.com/client/v4/accounts/${config.accountId}/browser-rendering`;
64
- }
65
- async request(endpoint, options) {
66
- const url = `${this.baseUrl}${endpoint}`;
67
- const response = await fetch(url, {
68
- ...options,
69
- headers: {
70
- 'Authorization': `Bearer ${this.config.apiToken}`,
71
- 'Content-Type': 'application/json',
72
- ...options.headers
73
- }
74
- });
75
- if (!response.ok) {
76
- const errorText = await response.text();
77
- throw new Error(`Cloudflare API error ${response.status}: ${errorText.slice(0, 200)}`);
78
- }
79
- const data = await response.json();
80
- if (!data.success) {
81
- throw new Error(`Cloudflare API failed: ${JSON.stringify(data.errors)}`);
82
- }
83
- return data.result;
84
- }
85
- /**
86
- * Crawl web content (async job)
87
- * Returns job ID immediately, use getCrawlResult to poll
88
- */
89
- async crawl(params) {
90
- const result = await this.request('/crawl', {
91
- method: 'POST',
92
- body: JSON.stringify(params)
93
- });
94
- return result.id;
95
- }
96
- /**
97
- * Get crawl job results
98
- */
99
- async getCrawlResult(jobId, limit) {
100
- const query = limit ? `?limit=${limit}` : '';
101
- return this.request(`/crawl/${jobId}${query}`, { method: 'GET' });
102
- }
103
- /**
104
- * Cancel running crawl job
105
- */
106
- async cancelCrawl(jobId) {
107
- await this.request(`/crawl/${jobId}`, { method: 'DELETE' });
108
- }
109
- /**
110
- * Fetch single page content
111
- */
112
- async fetchContent(url, options) {
113
- return this.request('/content', {
114
- method: 'POST',
115
- body: JSON.stringify({ url, ...options })
116
- });
117
- }
118
- /**
119
- * Take screenshot
120
- */
121
- async screenshot(url, options) {
122
- return this.request('/screenshot', {
123
- method: 'POST',
124
- body: JSON.stringify({ url, ...options })
125
- });
126
- }
127
- /**
128
- * Generate PDF
129
- */
130
- async pdf(url, options) {
131
- return this.request('/pdf', {
132
- method: 'POST',
133
- body: JSON.stringify({ url, ...options })
134
- });
135
- }
136
- }
137
- // ============================================================================
138
- // POLLING HELPER
139
- // ============================================================================
140
- async function pollCrawlJob(client, jobId, onUpdate) {
141
- const maxAttempts = 180;
142
- const delayMs = 5000;
143
- for (let i = 0; i < maxAttempts; i++) {
144
- const result = await client.getCrawlResult(jobId, 1);
145
- onUpdate?.(result.status, result.finished / result.total * 100 || 0);
146
- if (result.status !== 'running') {
147
- return client.getCrawlResult(jobId);
148
- }
149
- await new Promise(resolve => setTimeout(resolve, delayMs));
150
- }
151
- throw new Error('Crawl job did not complete within 15 minute timeout');
152
- }
153
- // ============================================================================
154
- // SAVES TO OBSIDIAN
155
- // ============================================================================
156
- async function saveToObsidian(type, data, sourceUrl, title) {
157
- const vaultPath = join(homedir(), '.0xkobold', 'obsidian_vault', 'Research');
158
- const dateStr = new Date().toISOString().split('T')[0];
159
- const safeTitle = (title || 'Untitled').replace(/[^a-zA-Z0-9]/g, '_').slice(0, 50);
160
- if (type === 'screenshot' || type === 'pdf') {
161
- const ext = type === 'screenshot' ? 'png' : 'pdf';
162
- const base64 = data[type === 'screenshot' ? 'screenshot' : 'pdf'];
163
- const filename = `${dateStr}_${safeTitle}.${ext}`;
164
- const filepath = join(vaultPath, filename);
165
- await Bun.write(filepath, Buffer.from(base64, 'base64'));
166
- return filepath;
167
- }
168
- else if (type === 'crawl') {
169
- const result = data;
170
- const filename = `${dateStr}_${safeTitle}_crawl.md`;
171
- const filepath = join(vaultPath, filename);
172
- let content = `# Crawled: ${title || sourceUrl}\n\n`;
173
- content += `**Source:** ${sourceUrl}\n`;
174
- content += `**Date:** ${dateStr}\n`;
175
- content += `**Pages:** ${result.finished}/${result.total}\n`;
176
- content += `**Status:** ${result.status}\n\n`;
177
- content += `---\n\n`;
178
- for (const record of result.records.slice(0, 50)) {
179
- if (record.markdown || record.html) {
180
- content += `## ${record.metadata.title}\n`;
181
- content += `**URL:** ${record.url}\n`;
182
- content += `**Status:** ${record.status} (${record.metadata.status})\n\n`;
183
- content += record.markdown || record.html?.slice(0, 5000) || '(no content)';
184
- content += `\n\n---\n\n`;
185
- }
186
- }
187
- await Bun.write(filepath, content);
188
- return filepath;
189
- }
190
- else {
191
- const result = data;
192
- const filename = `${dateStr}_${safeTitle}.md`;
193
- const filepath = join(vaultPath, filename);
194
- const content = `# ${result.metadata.title}\n\n**Source:** ${result.metadata.url}\n\n---\n\n${result.html}`;
195
- await Bun.write(filepath, content);
196
- return filepath;
197
- }
198
- }
199
- // ============================================================================
200
- // MAIN EXTENSION
201
- // ============================================================================
202
- export default async function cloudflareBrowserExtension(pi) {
203
- const config = await loadConfig();
204
- if (!config.enabled) {
205
- console.log('[CloudflareBrowser] Skipped - no CLOUDFLARE_API_TOKEN/CLOUDFLARE_ACCOUNT_ID');
206
- return;
207
- }
208
- const client = new CloudflareClient(config);
209
- console.log('[CloudflareBrowser] Extension loaded');
210
- console.log('[CloudflareBrowser] Account:', config.accountId?.slice(0, 8) + '...');
211
- // ========================================================================
212
- // TOOL: cloudflare_crawl - Crawl multiple pages
213
- // ========================================================================
214
- pi.registerTool({
215
- name: "cloudflare_crawl",
216
- label: "/cf_crawl",
217
- description: "Crawl website with Cloudflare Browser Rendering (multi-page)",
218
- parameters: Type.Object({
219
- url: Type.String({ description: "Starting URL to crawl" }),
220
- limit: Type.Number({ default: 10, description: "Max pages to crawl" }),
221
- depth: Type.Optional(Type.Number({ description: "Max link depth" })),
222
- formats: Type.Optional(Type.Array(Type.String({
223
- enum: ["html", "markdown", "json"]
224
- }))),
225
- render: Type.Boolean({ default: true, description: "Execute JavaScript" }),
226
- saveToObsidian: Type.Boolean({ default: true, description: "Save results" })
227
- }),
228
- async execute(_toolCallId, params, _signal, onUpdate, _ctx) {
229
- try {
230
- onUpdate?.({ content: [{ type: "text", text: `🕸️ Starting crawl of ${params.url}...` }] });
231
- const jobId = await client.crawl({
232
- url: params.url,
233
- limit: params.limit || 10,
234
- depth: params.depth,
235
- formats: params.formats || ['markdown'],
236
- render: params.render ?? true
237
- });
238
- onUpdate?.({ content: [{ type: "text", text: `📋 Crawl job: ${jobId}` }] });
239
- const result = await pollCrawlJob(client, jobId, (status, progress) => {
240
- onUpdate?.({ content: [{ type: "text", text: `${status} (${progress.toFixed(0)}%)` }] });
241
- });
242
- let savedPath;
243
- if (params.saveToObsidian !== false) {
244
- const firstRecord = result.records[0];
245
- savedPath = await saveToObsidian('crawl', result, params.url, firstRecord?.metadata?.title);
246
- }
247
- const completedPages = result.records.filter(r => r.status === 'completed').length;
248
- const summary = `✅ Crawl ${result.status}\n📊 Pages: ${completedPages}/${result.total}\n⏱️ Browser: ${result.browserSecondsUsed.toFixed(1)}s` +
249
- (savedPath ? `\n💾 Saved: ${savedPath.split('/').pop()}` : '');
250
- return {
251
- content: [{ type: "text", text: summary }],
252
- details: { jobId, status: result.status, total: result.total, savedPath }
253
- };
254
- }
255
- catch (error) {
256
- return {
257
- content: [{ type: "text", text: `❌ ${error instanceof Error ? error.message : String(error)}` }],
258
- details: { error: String(error) }
259
- };
260
- }
261
- }
262
- });
263
- // ========================================================================
264
- // TOOL: cloudflare_screenshot
265
- // ========================================================================
266
- pi.registerTool({
267
- name: "cloudflare_screenshot",
268
- label: "/cf_screenshot",
269
- description: "Take screenshot with Cloudflare Browser Rendering (inline + saved)",
270
- parameters: Type.Object({
271
- url: Type.String({ description: "URL to screenshot" }),
272
- fullPage: Type.Boolean({ default: false, description: "Full page vs viewport" }),
273
- saveToObsidian: Type.Boolean({ default: true, description: "Save PNG to vault" })
274
- }),
275
- async execute(_toolCallId, params) {
276
- try {
277
- const result = await client.screenshot(params.url, { fullPage: params.fullPage });
278
- let savedPath;
279
- if (params.saveToObsidian !== false) {
280
- savedPath = await saveToObsidian('screenshot', result, params.url, result.metadata.title);
281
- }
282
- return {
283
- content: [
284
- { type: "text", text: `📸 Screenshot: ${result.metadata.title}\n🌐 ${result.metadata.url}` },
285
- // Inline image for immediate viewing
286
- { type: "image", data: result.screenshot, mimeType: "image/png" },
287
- ...(savedPath ? [{ type: "text", text: `💾 Saved to: ${savedPath}` }] : [])
288
- ],
289
- details: {
290
- title: result.metadata.title,
291
- url: result.metadata.url,
292
- savedPath,
293
- imageSize: result.screenshot.length
294
- }
295
- };
296
- }
297
- catch (error) {
298
- return {
299
- content: [{ type: "text", text: `❌ ${error instanceof Error ? error.message : String(error)}` }],
300
- details: { error: String(error) }
301
- };
302
- }
303
- }
304
- });
305
- // ========================================================================
306
- // TOOL: cloudflare_pdf
307
- // ========================================================================
308
- pi.registerTool({
309
- name: "cloudflare_pdf",
310
- label: "/cf_pdf",
311
- description: "Generate PDF from URL and save to Obsidian vault",
312
- parameters: Type.Object({
313
- url: Type.String({ description: "URL to convert to PDF" }),
314
- fullPage: Type.Boolean({ default: true, description: "Include full page" }),
315
- saveToObsidian: Type.Boolean({ default: true, description: "Save PDF to vault" })
316
- }),
317
- async execute(_toolCallId, params) {
318
- try {
319
- const result = await client.pdf(params.url, { fullPage: params.fullPage });
320
- let savedPath;
321
- if (params.saveToObsidian !== false) {
322
- savedPath = await saveToObsidian('pdf', result, params.url, result.metadata.title);
323
- }
324
- return {
325
- content: [
326
- { type: "text", text: `📄 PDF Generated: ${result.metadata.title}` },
327
- { type: "text", text: `🌐 Source: ${result.metadata.url}` },
328
- ...(savedPath ? [
329
- { type: "text", text: `💾 Saved to: ${savedPath}` },
330
- { type: "text", text: `📝 Tip: Use file viewer to open the PDF` }
331
- ] : [])
332
- ],
333
- details: {
334
- title: result.metadata.title,
335
- url: result.metadata.url,
336
- savedPath,
337
- pdfSize: result.pdf.length
338
- }
339
- };
340
- }
341
- catch (error) {
342
- return {
343
- content: [{ type: "text", text: `❌ ${error instanceof Error ? error.message : String(error)}` }],
344
- details: { error: String(error) }
345
- };
346
- }
347
- }
348
- });
349
- // ========================================================================
350
- // TOOL: cloudflare_content (single page)
351
- // ========================================================================
352
- pi.registerTool({
353
- name: "cloudflare_content",
354
- label: "/cf_fetch",
355
- description: "Fetch rendered HTML with Cloudflare Browser Rendering",
356
- parameters: Type.Object({
357
- url: Type.String({ description: "URL to fetch" }),
358
- waitFor: Type.Optional(Type.Union([Type.String(), Type.Number()], { description: "Wait for selector or ms" })),
359
- saveToObsidian: Type.Boolean({ default: true, description: "Save to Obsidian" })
360
- }),
361
- async execute(_toolCallId, params) {
362
- try {
363
- const result = await client.fetchContent(params.url, { waitFor: params.waitFor });
364
- let savedPath;
365
- if (params.saveToObsidian !== false) {
366
- savedPath = await saveToObsidian('content', result, params.url, result.metadata.title);
367
- }
368
- return {
369
- content: [
370
- {
371
- type: "text",
372
- text: `📄 ${result.metadata.title}\nStatus: ${result.metadata.status}\n\n${result.html.slice(0, 3000)}${result.html.length > 3000 ? '...' : ''}`
373
- }
374
- ],
375
- details: { metadata: result.metadata, savedPath }
376
- };
377
- }
378
- catch (error) {
379
- return {
380
- content: [{ type: "text", text: `❌ ${error instanceof Error ? error.message : String(error)}` }],
381
- details: { error: String(error) }
382
- };
383
- }
384
- }
385
- });
386
- console.log('[CloudflareBrowser] Tools registered: cloudflare_crawl, cloudflare_screenshot, cloudflare_pdf, cloudflare_content');
387
- }
388
- export { CloudflareClient, loadConfig };
389
- //# sourceMappingURL=cloudflare-browser-extension.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cloudflare-browser-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/cloudflare-browser-extension.ts"],"names":[],"mappings":"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"}
@@ -1,488 +0,0 @@
1
- /**
2
- * Obsidian Bridge Extension - Heartbeat Integration
3
- *
4
- * Uses the Heartbeat scheduler to poll Obsidian for tasks.
5
- *
6
- * How it works:
7
- * 1. On heartbeat 'checkin' events, poll Obsidian vault for #kobold tasks
8
- * 2. Tasks found are written to ~/.0xkobold/obsidian-tasks.json
9
- * 3. On next startup (or via gateway), Kobold processes these tasks
10
- * 4. When tasks complete, Kobold marks them done in Obsidian
11
- *
12
- * This integrates with the existing Heartbeat system (no separate polling)
13
- * and stores tasks in ~/.0xkobold (managed by Kobold, not in project dir)
14
- */
15
- import { homedir } from "os";
16
- import { join } from "path";
17
- import { existsSync, mkdirSync } from "fs";
18
- // Config storage in ~/.0xkobold
19
- const KOBOLD_DIR = join(homedir(), ".0xkobold");
20
- const DEFAULT_VAULT_PATH = join(KOBOLD_DIR, "obsidian_vault");
21
- const TASKS_FILE = join(KOBOLD_DIR, "obsidian-tasks.json");
22
- const STATE_FILE = join(KOBOLD_DIR, "obsidian-bridge-state.json");
23
- const DEFAULT_CONFIG = {
24
- enabled: false,
25
- tasksFilePath: "10-Action/Tasks.md",
26
- pollOn: ["morning", "periodic"], // Poll on morning check-in and every 30 min
27
- };
28
- class ObsidianBridgeExtension {
29
- api;
30
- config;
31
- scheduler = null;
32
- vaultDetected = false;
33
- vaultPath = null;
34
- cliAvailable = false;
35
- constructor(api, config = {}) {
36
- this.api = api;
37
- this.config = { ...DEFAULT_CONFIG, ...config };
38
- // Ensure ~/.0xkobold exists
39
- if (!existsSync(KOBOLD_DIR)) {
40
- mkdirSync(KOBOLD_DIR, { recursive: true });
41
- }
42
- this.init();
43
- }
44
- async init() {
45
- if (!this.config.enabled) {
46
- console.log("[ObsidianBridge] Extension disabled");
47
- return;
48
- }
49
- console.log("[ObsidianBridge] Initializing...");
50
- // Check CLI (optional)
51
- this.checkCli();
52
- // Detect vault - prioritizes ~/.0xkobold/obsidian_vault
53
- await this.detectVault();
54
- // If no vault found, create default Kobold vault
55
- if (!this.vaultPath) {
56
- console.log(`[ObsidianBridge] Creating default vault at ${DEFAULT_VAULT_PATH}`);
57
- this.createDefaultVault();
58
- this.vaultPath = DEFAULT_VAULT_PATH;
59
- }
60
- this.vaultDetected = true;
61
- console.log(`[ObsidianBridge] Connected to vault: ${this.vaultPath}`);
62
- console.log(`[ObsidianBridge] CLI available: ${this.cliAvailable} (advanced features ${this.cliAvailable ? 'enabled' : 'disabled'})`);
63
- // Load any existing tasks
64
- await this.loadState();
65
- // Register with Heartbeat scheduler
66
- this.registerWithHeartbeat();
67
- }
68
- createDefaultVault() {
69
- const vault = DEFAULT_VAULT_PATH;
70
- // Create vault structure
71
- const paths = [
72
- vault,
73
- join(vault, ".obsidian"),
74
- join(vault, "00-Inbox"),
75
- join(vault, "01-Projects"),
76
- join(vault, "10-Action"),
77
- join(vault, "90-Archive"),
78
- join(vault, "Daily"),
79
- ];
80
- for (const path of paths) {
81
- if (!existsSync(path)) {
82
- mkdirSync(path, { recursive: true });
83
- }
84
- }
85
- // Create welcome note
86
- const welcomePath = join(vault, "00-Inbox", "Welcome.md");
87
- if (!existsSync(welcomePath)) {
88
- const welcomeContent = `# Kobold Obsidian Bridge
89
-
90
- Welcome to your Kobold-managed Obsidian vault!
91
-
92
- ## How to use
93
-
94
- 1. **Add tasks**: Create notes in \`00-Inbox/\` or add tasks to \`10-Action/Tasks.md\`
95
- 2. **Tag with #kobold**: Any task tagged #kobold will be picked up by Kobold
96
- 3. **Heartbeat polling**: Kobold checks this vault on heartbeat events
97
- 4. **Processing**: Tasks appear in Kobold kanban for processing
98
- 5. **Completion**: When done, Kobold marks tasks complete here
99
-
100
- ## Folder Structure
101
-
102
- - \`00-Inbox/\` - New tasks and notes
103
- - \`01-Projects/\` - Project-specific notes
104
- - \`10-Action/\` - Tasks and actions (Tasks.md synced with Kobold)
105
- - \`90-Archive/\` - Completed/archived items
106
- - \`Daily/\` - Daily notes exported from Kobold sessions
107
-
108
- ## Quick Start
109
-
110
- \`\`\`markdown
111
- - [ ] Review authentication system #kobold #security
112
- - [ ] Deploy v0.6.11 #kobold #deploy
113
- \`\`\`
114
-
115
- Open this vault in Obsidian: \`${vault}\`
116
- `;
117
- Bun.write(welcomePath, welcomeContent);
118
- }
119
- // Create initial Tasks.md
120
- const tasksPath = join(vault, "10-Action", "Tasks.md");
121
- if (!existsSync(tasksPath)) {
122
- const tasksContent = `# Tasks
123
-
124
- Synced with 0xKobold kanban board.
125
-
126
- ## Active
127
-
128
- - [ ] Example task from Obsidian #kobold
129
-
130
- ## Archive
131
-
132
- <!-- Completed tasks end up here -->
133
- `;
134
- Bun.write(tasksPath, tasksContent);
135
- }
136
- console.log(`[ObsidianBridge] Created default vault with structure`);
137
- }
138
- async detectVault() {
139
- // Priority 1: Check Kobold's managed vault location
140
- if (existsSync(DEFAULT_VAULT_PATH)) {
141
- // Ensure .obsidian folder exists (create if needed)
142
- const obsidianConfigPath = join(DEFAULT_VAULT_PATH, ".obsidian");
143
- if (!existsSync(obsidianConfigPath)) {
144
- mkdirSync(obsidianConfigPath, { recursive: true });
145
- console.log("[ObsidianBridge] Created .obsidian config folder in default vault");
146
- }
147
- this.vaultPath = DEFAULT_VAULT_PATH;
148
- console.log(`[ObsidianBridge] Using Kobold-managed vault: ${DEFAULT_VAULT_PATH}`);
149
- return;
150
- }
151
- // Priority 2: User-configured vault name
152
- if (this.config.vaultName) {
153
- const candidates = [
154
- join(homedir(), "Documents", "Obsidian", this.config.vaultName),
155
- join(homedir(), "Library", "Mobile Documents", "iCloud~md~obsidian", "Documents", this.config.vaultName),
156
- join(homedir(), "iCloudDrive", "Obsidian", this.config.vaultName),
157
- join(homedir(), "Obsidian", this.config.vaultName),
158
- ];
159
- for (const path of candidates) {
160
- if (existsSync(join(path, ".obsidian"))) {
161
- this.vaultPath = path;
162
- console.log(`[ObsidianBridge] Found user vault: ${path}`);
163
- return;
164
- }
165
- }
166
- }
167
- // Priority 3: Try obsidian-cli default
168
- if (this.cliAvailable) {
169
- try {
170
- const { execSync } = await import("child_process");
171
- const result = execSync("obsidian-cli print-default --path-only", {
172
- encoding: "utf-8",
173
- stdio: ["pipe", "pipe", "ignore"]
174
- }).trim();
175
- if (result && existsSync(result)) {
176
- this.vaultPath = result;
177
- console.log(`[ObsidianBridge] Found CLI default vault: ${result}`);
178
- }
179
- }
180
- catch {
181
- // CLI couldn't get default
182
- }
183
- }
184
- }
185
- checkCli() {
186
- try {
187
- const { execSync } = require("child_process");
188
- execSync("which obsidian-cli", { stdio: "ignore" });
189
- this.cliAvailable = true;
190
- }
191
- catch {
192
- this.cliAvailable = false;
193
- }
194
- }
195
- registerWithHeartbeat() {
196
- // Get the Heartbeat scheduler singleton
197
- const { getScheduler } = require("../../heartbeat/scheduler.js");
198
- this.scheduler = getScheduler();
199
- // Listen for check-in events
200
- this.scheduler.on("checkin", (event) => {
201
- if (this.shouldPollOn(event.type)) {
202
- this.pollForTasks();
203
- }
204
- });
205
- console.log(`[ObsidianBridge] Registered with Heartbeat. Polling on: ${this.config.pollOn.join(", ")}`);
206
- }
207
- shouldPollOn(checkInType) {
208
- return this.config.pollOn.includes(checkInType);
209
- }
210
- /**
211
- * Poll Obsidian vault for #kobold tasks
212
- * Called by Heartbeat on scheduled events
213
- * Works without CLI - uses direct file access
214
- */
215
- async pollForTasks() {
216
- if (!this.vaultDetected)
217
- return;
218
- console.log("[ObsidianBridge] Polling for tasks...");
219
- try {
220
- // Use direct file access (no CLI needed)
221
- const tasksPath = join(this.vaultPath, this.config.tasksFilePath);
222
- if (!existsSync(tasksPath)) {
223
- // Create tasks file if it doesn't exist
224
- const tasksDir = join(this.vaultPath, "10-Action");
225
- if (!existsSync(tasksDir)) {
226
- mkdirSync(tasksDir, { recursive: true });
227
- }
228
- const initialContent = `# Tasks\n\nSynced with 0xKobold kanban board.\n\nTasks tagged with #kobold will be picked up by Kobold.\n\n## Active\n\n\n## Archive\n\n<!-- Completed tasks end up here -->\n`;
229
- await Bun.write(tasksPath, initialContent);
230
- console.log(`[ObsidianBridge] Created tasks file: ${tasksPath}`);
231
- return;
232
- }
233
- // Read the tasks file
234
- const content = await Bun.file(tasksPath).text();
235
- const newTasks = this.parseTasks(content);
236
- if (newTasks.length > 0) {
237
- console.log(`[ObsidianBridge] Found ${newTasks.length} new #kobold tasks`);
238
- await this.addTasks(newTasks);
239
- }
240
- else {
241
- console.log("[ObsidianBridge] No new #kobold tasks found");
242
- }
243
- // Update state
244
- await this.saveState({
245
- lastPoll: new Date().toISOString(),
246
- lastProcessedTaskId: newTasks.length > 0 ? newTasks[newTasks.length - 1].id : null,
247
- });
248
- }
249
- catch (error) {
250
- console.error("[ObsidianBridge] Failed to poll for tasks:", error);
251
- }
252
- }
253
- /**
254
- * Parse markdown tasks looking for #kobold tag
255
- */
256
- parseTasks(content) {
257
- const tasks = [];
258
- const lines = content.split("\n");
259
- for (const line of lines) {
260
- // Match: - [ ] Task title #tag1 #tag2
261
- const match = line.match(/^- \[ ] (.+)$/);
262
- if (match) {
263
- const text = match[1];
264
- const tagMatches = text.match(/#\w+/g) || [];
265
- const tags = tagMatches.map(t => t.slice(1));
266
- if (tags.includes("kobold")) {
267
- const title = text.replace(/#\w+/g, "").trim();
268
- const taskId = this.hashTask(title);
269
- tasks.push({
270
- id: taskId,
271
- title,
272
- tags,
273
- source: "obsidian",
274
- discoveredAt: new Date().toISOString(),
275
- status: "pending",
276
- });
277
- }
278
- }
279
- }
280
- return tasks;
281
- }
282
- hashTask(title) {
283
- // Simple hash for task ID
284
- let hash = 0;
285
- for (let i = 0; i < title.length; i++) {
286
- const char = title.charCodeAt(i);
287
- hash = ((hash << 5) - hash) + char;
288
- hash = hash & hash;
289
- }
290
- return `obs-${Math.abs(hash).toString(36)}`;
291
- }
292
- /**
293
- * Add new tasks to the pending list
294
- */
295
- async addTasks(newTasks) {
296
- const state = await this.loadState();
297
- const existingIds = new Set(state.pendingTasks.map(t => t.id));
298
- const trulyNew = newTasks.filter(t => !existingIds.has(t.id));
299
- if (trulyNew.length === 0)
300
- return;
301
- state.pendingTasks.push(...trulyNew);
302
- await this.saveState(state);
303
- }
304
- /**
305
- * Mark a task as complete in Obsidian
306
- * Works without CLI - uses direct file access
307
- */
308
- async completeTask(taskId) {
309
- if (!this.vaultDetected)
310
- return false;
311
- const state = await this.loadState();
312
- const task = state.pendingTasks.find(t => t.id === taskId);
313
- if (!task)
314
- return false;
315
- try {
316
- const tasksPath = join(this.vaultPath, this.config.tasksFilePath);
317
- // Read current content
318
- let content = await Bun.file(tasksPath).text();
319
- // Find and replace [ ] with [x] for this task
320
- const escapedTitle = task.title.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
321
- const regex = new RegExp(`^- (\\[ ]|\\[x]) ${escapedTitle}.*$`, "m");
322
- content = content.replace(regex, match => match.replace("[ ]", "[x]"));
323
- // Add Archive section if needed
324
- if (!content.includes("## Archive")) {
325
- content += "\n\n## Archive\n";
326
- }
327
- // Write back
328
- await Bun.write(tasksPath, content);
329
- // Update state
330
- task.status = "completed";
331
- await this.saveState(state);
332
- console.log(`[ObsidianBridge] Completed task: ${task.title}`);
333
- return true;
334
- }
335
- catch (error) {
336
- console.error("[ObsidianBridge] Failed to complete task:", error);
337
- return false;
338
- }
339
- }
340
- escapeRegex(str) {
341
- return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
342
- }
343
- /**
344
- * Get pending tasks (called by Kobold to process work)
345
- */
346
- async getPendingTasks() {
347
- const state = await this.loadState();
348
- return state.pendingTasks.filter(t => t.status === "pending");
349
- }
350
- /**
351
- * Mark task as in-progress (prevents duplicate processing)
352
- */
353
- async markInProgress(taskId) {
354
- const state = await this.loadState();
355
- const task = state.pendingTasks.find(t => t.id === taskId);
356
- if (task) {
357
- task.status = "in_progress";
358
- await this.saveState(state);
359
- }
360
- }
361
- /**
362
- * Load state from ~/.0xkobold/obsidian-bridge-state.json
363
- */
364
- async loadState() {
365
- if (!existsSync(STATE_FILE)) {
366
- return {
367
- lastPoll: null,
368
- lastProcessedTaskId: null,
369
- pendingTasks: [],
370
- };
371
- }
372
- try {
373
- const content = await Bun.file(STATE_FILE).text();
374
- return JSON.parse(content);
375
- }
376
- catch {
377
- return {
378
- lastPoll: null,
379
- lastProcessedTaskId: null,
380
- pendingTasks: [],
381
- };
382
- }
383
- }
384
- /**
385
- * Save state to ~/.0xkobold/obsidian-bridge-state.json
386
- */
387
- async saveState(partial) {
388
- const current = await this.loadState();
389
- const updated = { ...current, ...partial };
390
- await Bun.write(STATE_FILE, JSON.stringify(updated, null, 2));
391
- }
392
- /**
393
- * Get status for TUI/CLI display
394
- */
395
- async getStatus() {
396
- const state = await this.loadState();
397
- return {
398
- enabled: this.config.enabled,
399
- connected: this.vaultDetected && this.cliAvailable,
400
- vault: this.vaultPath,
401
- pendingCount: state.pendingTasks.filter(t => t.status === "pending").length,
402
- lastPoll: state.lastPoll,
403
- };
404
- }
405
- }
406
- // Extension factory function
407
- export async function registerObsidianBridgeExtension(api, context) {
408
- // Load config from kobold.json
409
- const { loadConfig } = await import("../../config/loader.js");
410
- const configSnapshot = await loadConfig();
411
- // Safely access obsidian config
412
- const obsConfig = configSnapshot.config?.obsidian;
413
- const bridgeConfig = {
414
- enabled: obsConfig?.enabled ?? false,
415
- vaultName: obsConfig?.vault,
416
- tasksFilePath: obsConfig?.tasksFile ?? "10-Action/Tasks.md",
417
- pollOn: obsConfig?.pollOn ?? ["morning", "periodic"],
418
- };
419
- const extension = new ObsidianBridgeExtension(api, bridgeConfig);
420
- // Register tools
421
- api.registerTool({
422
- name: "obsidian_poll_tasks",
423
- label: "/obsidian_poll",
424
- description: "Manually poll Obsidian for #kobold tasks",
425
- // @ts-ignore TSchema mismatch
426
- parameters: {},
427
- async execute(_toolCallId, _params, _signal, _onUpdate, _ctx) {
428
- await extension.pollForTasks();
429
- const status = await extension.getStatus();
430
- return {
431
- content: [{ type: "text", text: `Polled Obsidian. Found ${status.pendingCount} pending tasks.` }],
432
- details: { status },
433
- };
434
- },
435
- });
436
- api.registerTool({
437
- name: "obsidian_get_tasks",
438
- label: "/obsidian_tasks",
439
- description: "Get pending tasks from Obsidian bridge",
440
- // @ts-ignore TSchema mismatch
441
- parameters: {},
442
- async execute(_toolCallId, _params, _signal, _onUpdate, _ctx) {
443
- const tasks = await extension.getPendingTasks();
444
- return {
445
- content: [{ type: "text", text: `Found ${tasks.length} pending tasks from Obsidian.` }],
446
- details: { tasks, count: tasks.length },
447
- };
448
- },
449
- });
450
- api.registerTool({
451
- name: "obsidian_complete_task",
452
- label: "/obsidian_done",
453
- description: "Mark an Obsidian-sourced task as complete",
454
- // @ts-ignore TSchema mismatch
455
- parameters: {
456
- type: "object",
457
- properties: {
458
- taskId: { type: "string", description: "Task ID from obsidian_get_tasks" },
459
- },
460
- required: ["taskId"],
461
- },
462
- async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
463
- const args = params;
464
- const success = await extension.completeTask(args.taskId);
465
- return {
466
- content: [{ type: "text", text: success ? "Task marked complete in Obsidian" : "Failed to complete task" }],
467
- details: { success },
468
- };
469
- },
470
- });
471
- api.registerTool({
472
- name: "obsidian_status",
473
- label: "/obsidian_status",
474
- description: "Get Obsidian bridge status",
475
- // @ts-ignore TSchema mismatch
476
- parameters: {},
477
- async execute(_toolCallId, _params, _signal, _onUpdate, _ctx) {
478
- const status = await extension.getStatus();
479
- return {
480
- content: [{ type: "text", text: `Obsidian Bridge: ${status.enabled ? (status.connected ? "✅ Connected" : "⚠️ Disconnected") : "🔴 Disabled"}` }],
481
- details: { status },
482
- };
483
- },
484
- });
485
- console.log("[ObsidianBridge] Extension registered");
486
- }
487
- export default registerObsidianBridgeExtension;
488
- //# sourceMappingURL=obsidian-bridge-extension.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"obsidian-bridge-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/obsidian-bridge-extension.ts"],"names":[],"mappings":"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"}