0xkobold 0.7.1 → 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 +3 -1
- package/dist/src/cli/program.js +6 -0
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/pi-config.js +6 -4
- package/dist/src/pi-config.js.map +1 -1
- package/package.json +3 -1
- package/dist/src/extensions/core/cloudflare-browser-extension.js +0 -389
- package/dist/src/extensions/core/cloudflare-browser-extension.js.map +0 -1
- package/dist/src/extensions/core/obsidian-bridge-extension.js +0 -488
- package/dist/src/extensions/core/obsidian-bridge-extension.js.map +0 -1
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "0xkobold",
|
|
3
|
-
"version": "0.7.
|
|
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",
|
package/dist/src/cli/program.js
CHANGED
|
@@ -40,6 +40,7 @@ export function createCli() {
|
|
|
40
40
|
const program = new Command("0xkobold")
|
|
41
41
|
.version(version || "1.0.0")
|
|
42
42
|
.description("0xKobold - Multi-Agent Automation Platform")
|
|
43
|
+
.option("-l, --local", "Use current directory as workspace (TUI mode)")
|
|
43
44
|
.showHelpAfterError("\nUse --help for more information.");
|
|
44
45
|
// Core service commands
|
|
45
46
|
program.addCommand(createStartCommand());
|
|
@@ -74,6 +75,11 @@ export function createCli() {
|
|
|
74
75
|
.command("tui", { isDefault: true })
|
|
75
76
|
.description("Start interactive TUI (default)")
|
|
76
77
|
.action(async () => {
|
|
78
|
+
// Check if --local flag was passed globally
|
|
79
|
+
const opts = program.opts();
|
|
80
|
+
if (opts.local) {
|
|
81
|
+
process.argv.push("--local");
|
|
82
|
+
}
|
|
77
83
|
const { main } = await import("../index.js");
|
|
78
84
|
await main();
|
|
79
85
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../../src/cli/program.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../../../src/cli/program.ts"],"names":[],"mappings":"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"}
|
package/dist/src/pi-config.js
CHANGED
|
@@ -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',
|
|
46
|
-
'./
|
|
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 (
|
|
58
|
-
'./src/extensions/core/obsidian-bridge-extension.ts',
|
|
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":"AAAA;;;;;GAKG;AAUH,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,6BAA6B;IAC7B,EAAE,EAAE,KAAK;IAET,qDAAqD;IACrD,wEAAwE;IACxE,UAAU,EAAE;QACV,8BAA8B;QAC9B,gCAAgC,EAAqB,6CAA6C;QAClG,2CAA2C,EAAY,4BAA4B;QACnF,sDAAsD,EAAG,kBAAkB;QAC3E,wCAAwC,EAAe,8BAA8B;QAErF,gBAAgB;QAChB,qDAAqD,EAAE,iDAAiD;QACxG,mDAAmD,EAAE,sBAAsB;QAC3E,+CAA+C,EAAM,kBAAkB;QACvE,iDAAiD,EAAI,0BAA0B;QAC/E,8CAA8C,EAAO,oCAAoC;QACzF,kDAAkD,EAAE,2CAA2C;QAE/F,gBAAgB;QAChB,kDAAkD,EAAE,6BAA6B;QACjF,4CAA4C,EAAQ,0BAA0B;QAE9E,kDAAkD;QAClD,uDAAuD,EAAG,sBAAsB;QAChF,4CAA4C,EAAa,oBAAoB;QAC7E,4CAA4C,EAAa,kBAAkB;QAC3E,+CAA+C,EAAQ,oBAAoB;QAC3E,kDAAkD,EAAO,qBAAqB;QAC9E,mDAAmD,EAAM,gBAAgB;QAEzE,wDAAwD;QACxD,oDAAoD,EAAG,uFAAuF;QAC9I,uDAAuD,EAAE,kDAAkD;QAE3G,kBAAkB;QAClB,uDAAuD,EAAE,0BAA0B;QACnF,gDAAgD,EAAS,kCAAkC;QAE3F,oBAAoB;QACpB,wCAAwC,EAAa,iCAAiC;QACtF,iDAAiD,EAAI,gCAAgC;QACrF,uDAAuD,EAAS,oBAAoB;QACpF,
|
|
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.
|
|
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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"}
|