0xkobold 0.0.2 â 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -5
- package/dist/package.json +7 -5
- package/dist/src/cli/commands/setup.js +144 -0
- package/dist/src/cli/commands/setup.js.map +1 -0
- package/dist/src/cli/program.js +3 -0
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/extensions/core/auto-compact-on-error-extension.js +244 -0
- package/dist/src/extensions/core/auto-compact-on-error-extension.js.map +1 -0
- package/dist/src/extensions/core/diagnostics-extension.js +215 -0
- package/dist/src/extensions/core/diagnostics-extension.js.map +1 -0
- package/dist/src/extensions/core/extension-scaffold-extension.js +449 -0
- package/dist/src/extensions/core/extension-scaffold-extension.js.map +1 -0
- package/dist/src/extensions/core/git-commit-extension.js +527 -0
- package/dist/src/extensions/core/git-commit-extension.js.map +1 -0
- package/dist/src/extensions/core/heartbeat-extension.js +43 -0
- package/dist/src/extensions/core/heartbeat-extension.js.map +1 -1
- package/dist/src/extensions/core/memory-extension.js +120 -0
- package/dist/src/extensions/core/memory-extension.js.map +1 -0
- package/dist/src/extensions/core/memory-synthesis-extension.js +137 -0
- package/dist/src/extensions/core/memory-synthesis-extension.js.map +1 -0
- package/dist/src/extensions/core/mode-manager-extension.js +19 -0
- package/dist/src/extensions/core/mode-manager-extension.js.map +1 -1
- package/dist/src/extensions/core/ollama-cloud-extension.js +132 -0
- package/dist/src/extensions/core/ollama-cloud-extension.js.map +1 -0
- package/dist/src/extensions/core/ollama-router-extension.js +100 -0
- package/dist/src/extensions/core/ollama-router-extension.js.map +1 -0
- package/dist/src/extensions/core/perennial-memory-extension.js +449 -0
- package/dist/src/extensions/core/perennial-memory-extension.js.map +1 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/llm/ollama.js +80 -9
- package/dist/src/llm/ollama.js.map +1 -1
- package/package.json +7 -5
- package/scripts/postinstall.js +71 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
const routerState = {
|
|
2
|
+
mode: "auto",
|
|
3
|
+
localAvailable: true,
|
|
4
|
+
cloudAvailable: false,
|
|
5
|
+
};
|
|
6
|
+
async function checkLocalOllama() {
|
|
7
|
+
try {
|
|
8
|
+
const controller = new AbortController();
|
|
9
|
+
const timeout = setTimeout(() => controller.abort(), 2000);
|
|
10
|
+
const response = await fetch("http://localhost:11434/api/version", {
|
|
11
|
+
signal: controller.signal,
|
|
12
|
+
});
|
|
13
|
+
clearTimeout(timeout);
|
|
14
|
+
return response.ok;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function getStatusIcon() {
|
|
21
|
+
if (routerState.mode === "cloud")
|
|
22
|
+
return "đŠī¸";
|
|
23
|
+
if (routerState.mode === "local")
|
|
24
|
+
return "đ ";
|
|
25
|
+
return routerState.localAvailable ? "đ " : "đŠī¸";
|
|
26
|
+
}
|
|
27
|
+
function getStatusText() {
|
|
28
|
+
const icon = getStatusIcon();
|
|
29
|
+
if (routerState.mode === "cloud")
|
|
30
|
+
return `${icon} Cloud`;
|
|
31
|
+
if (routerState.mode === "local")
|
|
32
|
+
return `${icon} Local`;
|
|
33
|
+
return `${icon} Auto`;
|
|
34
|
+
}
|
|
35
|
+
export default function ollamaRouterExtension(pi) {
|
|
36
|
+
console.log("[OllamaRouter] Extension loaded");
|
|
37
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
38
|
+
routerState.localAvailable = await checkLocalOllama();
|
|
39
|
+
console.log(`[OllamaRouter] Local: ${routerState.localAvailable ? "up" : "down"}`);
|
|
40
|
+
// Set footer status
|
|
41
|
+
ctx.ui.setStatus("ollama-mode", getStatusText());
|
|
42
|
+
});
|
|
43
|
+
pi.registerCommand("ollama-mode", {
|
|
44
|
+
description: "Switch Ollama mode: local | cloud | auto",
|
|
45
|
+
handler: async (args, ctx) => {
|
|
46
|
+
const mode = args.trim().toLowerCase();
|
|
47
|
+
if (!mode) {
|
|
48
|
+
// Show detailed status
|
|
49
|
+
const lines = [
|
|
50
|
+
`đ Ollama Router Status`,
|
|
51
|
+
`âââââââââââââââââââââ`,
|
|
52
|
+
`Mode: ${routerState.mode}`,
|
|
53
|
+
`Local: ${routerState.localAvailable ? "â
" : "â"}`,
|
|
54
|
+
``,
|
|
55
|
+
`Usage: /ollama-mode [local|cloud|auto]`,
|
|
56
|
+
];
|
|
57
|
+
ctx.ui.notify(lines.join("\n"), "info");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (mode === "local" || mode === "cloud" || mode === "auto") {
|
|
61
|
+
routerState.mode = mode;
|
|
62
|
+
ctx.ui.setStatus("ollama-mode", getStatusText());
|
|
63
|
+
ctx.ui.notify(`â
Switched to ${mode} mode`, "info");
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
ctx.ui.notify("â Invalid mode. Use: local, cloud, or auto", "error");
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
pi.registerCommand("ollama-local", {
|
|
71
|
+
description: "Quick switch to local Ollama mode",
|
|
72
|
+
handler: async (_args, ctx) => {
|
|
73
|
+
routerState.mode = "local";
|
|
74
|
+
ctx.ui.setStatus("ollama-mode", getStatusText());
|
|
75
|
+
ctx.ui.notify(`â
Switched to local mode`, "info");
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
pi.registerCommand("ollama-cloud", {
|
|
79
|
+
description: "Quick switch to cloud Ollama mode",
|
|
80
|
+
handler: async (_args, ctx) => {
|
|
81
|
+
routerState.mode = "cloud";
|
|
82
|
+
ctx.ui.setStatus("ollama-mode", getStatusText());
|
|
83
|
+
ctx.ui.notify(`â
Switched to cloud mode`, "info");
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
globalThis.__ollamaRouterState = routerState;
|
|
87
|
+
console.log("[OllamaRouter] Commands registered: /ollama-mode, /ollama-local, /ollama-cloud");
|
|
88
|
+
}
|
|
89
|
+
export function getOllamaRouterState() {
|
|
90
|
+
return globalThis.__ollamaRouterState || routerState;
|
|
91
|
+
}
|
|
92
|
+
export function shouldUseCloud() {
|
|
93
|
+
const state = getOllamaRouterState();
|
|
94
|
+
if (state.mode === "cloud")
|
|
95
|
+
return true;
|
|
96
|
+
if (state.mode === "local")
|
|
97
|
+
return false;
|
|
98
|
+
return !state.localAvailable;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=ollama-router-extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-router-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/ollama-router-extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
// 0xKobold Perennial Memory System
|
|
2
|
+
// A digital familiar that remembers forever
|
|
3
|
+
import { Database } from "bun:sqlite";
|
|
4
|
+
import { Type } from "@sinclair/typebox";
|
|
5
|
+
import * as fs from "node:fs/promises";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
import { homedir } from "node:os";
|
|
8
|
+
import { randomUUID } from "node:crypto";
|
|
9
|
+
// Constants
|
|
10
|
+
const MEMORY_DIR = path.join(homedir(), ".0xkobold", "memory", "perennial");
|
|
11
|
+
const DB_PATH = path.join(MEMORY_DIR, "knowledge.db");
|
|
12
|
+
const CURRENT_SCHEMA_VERSION = 1;
|
|
13
|
+
const EMBEDDING_DIM = 768;
|
|
14
|
+
// Database initialization with migrations
|
|
15
|
+
async function initDatabase() {
|
|
16
|
+
await fs.mkdir(MEMORY_DIR, { recursive: true });
|
|
17
|
+
const db = new Database(DB_PATH);
|
|
18
|
+
db.exec("PRAGMA journal_mode = WAL;");
|
|
19
|
+
db.exec("PRAGMA synchronous = NORMAL;");
|
|
20
|
+
// Get current version
|
|
21
|
+
const version = db.query("SELECT value FROM _metadata WHERE key = 'schema_version'").get()?.value || "0";
|
|
22
|
+
// Run migrations
|
|
23
|
+
const migrations = {
|
|
24
|
+
0: `
|
|
25
|
+
-- Metadata table
|
|
26
|
+
CREATE TABLE IF NOT EXISTS _metadata (
|
|
27
|
+
key TEXT PRIMARY KEY,
|
|
28
|
+
value TEXT
|
|
29
|
+
);
|
|
30
|
+
INSERT OR REPLACE INTO _metadata VALUES ('schema_version', '1');
|
|
31
|
+
INSERT OR REPLACE INTO _metadata VALUES ('created_at', datetime('now'));
|
|
32
|
+
|
|
33
|
+
-- Core memories table
|
|
34
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
35
|
+
id TEXT PRIMARY KEY,
|
|
36
|
+
content TEXT NOT NULL,
|
|
37
|
+
timestamp TEXT NOT NULL,
|
|
38
|
+
category TEXT NOT NULL,
|
|
39
|
+
tags TEXT NOT NULL, -- JSON array
|
|
40
|
+
project TEXT,
|
|
41
|
+
importance REAL DEFAULT 0.5,
|
|
42
|
+
access_count INTEGER DEFAULT 0,
|
|
43
|
+
last_accessed TEXT,
|
|
44
|
+
session_id TEXT,
|
|
45
|
+
embedding BLOB -- 768 floats, stored as bytes
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
-- Full-text search index
|
|
49
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts
|
|
50
|
+
USING fts5(id, content, content_rowid=rowid);
|
|
51
|
+
|
|
52
|
+
-- Triggers to keep FTS in sync
|
|
53
|
+
CREATE TRIGGER IF NOT EXISTS memories_insert_fts
|
|
54
|
+
AFTER INSERT ON memories BEGIN
|
|
55
|
+
INSERT INTO memories_fts(rowid, content) VALUES (new.rowid, new.content);
|
|
56
|
+
END;
|
|
57
|
+
|
|
58
|
+
CREATE TRIGGER IF NOT EXISTS memories_delete_fts
|
|
59
|
+
AFTER DELETE ON memories BEGIN
|
|
60
|
+
DELETE FROM memories_fts WHERE rowid = old.rowid;
|
|
61
|
+
END;
|
|
62
|
+
|
|
63
|
+
CREATE TRIGGER IF NOT EXISTS memories_update_fts
|
|
64
|
+
AFTER UPDATE ON memories BEGIN
|
|
65
|
+
UPDATE memories_fts SET content = new.content WHERE rowid = new.rowid;
|
|
66
|
+
END;
|
|
67
|
+
|
|
68
|
+
-- Indexes
|
|
69
|
+
CREATE INDEX IF NOT EXISTS idx_memories_timestamp ON memories(timestamp);
|
|
70
|
+
CREATE INDEX IF NOT EXISTS idx_memories_category ON memories(category);
|
|
71
|
+
CREATE INDEX IF NOT EXISTS idx_memories_project ON memories(project);
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_memories_importance ON memories(importance);
|
|
73
|
+
|
|
74
|
+
-- Schema version
|
|
75
|
+
UPDATE _metadata SET value = '1' WHERE key = 'schema_version';
|
|
76
|
+
`,
|
|
77
|
+
};
|
|
78
|
+
const currentVersion = parseInt(version, 10);
|
|
79
|
+
for (let v = currentVersion; v < CURRENT_SCHEMA_VERSION; v++) {
|
|
80
|
+
if (migrations[v]) {
|
|
81
|
+
console.log(`[Memory] Migrating schema: v${v} â v${v + 1}`);
|
|
82
|
+
db.exec(migrations[v]);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return db;
|
|
86
|
+
}
|
|
87
|
+
// Ollama embedding
|
|
88
|
+
async function getEmbedding(text, ollamaUrl) {
|
|
89
|
+
const response = await fetch(`${ollamaUrl}/api/embeddings`, {
|
|
90
|
+
method: "POST",
|
|
91
|
+
headers: { "Content-Type": "application/json" },
|
|
92
|
+
body: JSON.stringify({
|
|
93
|
+
model: "nomic-embed-text",
|
|
94
|
+
prompt: text,
|
|
95
|
+
}),
|
|
96
|
+
});
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
throw new Error(`Ollama error: ${response.status}`);
|
|
99
|
+
}
|
|
100
|
+
const data = await response.json();
|
|
101
|
+
return data.embedding;
|
|
102
|
+
}
|
|
103
|
+
// Serialize embedding to blob
|
|
104
|
+
function embeddingToBlob(embedding) {
|
|
105
|
+
const buffer = Buffer.alloc(EMBEDDING_DIM * 4); // Float32 = 4 bytes
|
|
106
|
+
for (let i = 0; i < EMBEDDING_DIM; i++) {
|
|
107
|
+
buffer.writeFloatLE(embedding[i], i * 4);
|
|
108
|
+
}
|
|
109
|
+
return buffer;
|
|
110
|
+
}
|
|
111
|
+
// Deserialize
|
|
112
|
+
function blobToEmbedding(blob) {
|
|
113
|
+
const embedding = [];
|
|
114
|
+
for (let i = 0; i < EMBEDDING_DIM; i++) {
|
|
115
|
+
embedding.push(blob.readFloatLE(i * 4));
|
|
116
|
+
}
|
|
117
|
+
return embedding;
|
|
118
|
+
}
|
|
119
|
+
// Cosine similarity
|
|
120
|
+
function cosineSimilarity(a, b) {
|
|
121
|
+
let dotProduct = 0;
|
|
122
|
+
let normA = 0;
|
|
123
|
+
let normB = 0;
|
|
124
|
+
for (let i = 0; i < a.length; i++) {
|
|
125
|
+
dotProduct += a[i] * b[i];
|
|
126
|
+
normA += a[i] * a[i];
|
|
127
|
+
normB += b[i] * b[i];
|
|
128
|
+
}
|
|
129
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
130
|
+
}
|
|
131
|
+
export default async function perennialMemoryExtension(pi) {
|
|
132
|
+
console.log("[Perennial Memory] Loading...");
|
|
133
|
+
// Get Ollama URL from config or use default
|
|
134
|
+
const config = pi.config || {};
|
|
135
|
+
const ollamaUrl = config.ollama?.url || "http://localhost:11434";
|
|
136
|
+
const db = await initDatabase();
|
|
137
|
+
// Check Ollama availability
|
|
138
|
+
let ollamaAvailable = false;
|
|
139
|
+
try {
|
|
140
|
+
const res = await fetch(`${ollamaUrl}/api/tags`, { method: "GET" });
|
|
141
|
+
ollamaAvailable = res.ok;
|
|
142
|
+
if (ollamaAvailable) {
|
|
143
|
+
console.log("[Perennial Memory] Ollama connected for embeddings");
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
console.warn("[Perennial Memory] Ollama not available - semantic search disabled");
|
|
148
|
+
}
|
|
149
|
+
// TOOL: Save memory with embedding
|
|
150
|
+
pi.registerTool({
|
|
151
|
+
name: "perennial_save",
|
|
152
|
+
label: "Save Perennial Memory",
|
|
153
|
+
description: "Save a memory with semantic indexing. Will be remembered forever and findable by meaning, not just exact words.",
|
|
154
|
+
parameters: Type.Object({
|
|
155
|
+
content: Type.String({ description: "What to remember" }),
|
|
156
|
+
category: Type.String({ description: "Type: decision, fact, task, context, error, learning, preference" }),
|
|
157
|
+
tags: Type.Optional(Type.Array(Type.String(), { description: "Tags for organization" })),
|
|
158
|
+
importance: Type.Optional(Type.Number({ description: "0.0-1.0, higher = more important" })),
|
|
159
|
+
project: Type.Optional(Type.String({ description: "Optional project name" })),
|
|
160
|
+
}),
|
|
161
|
+
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
162
|
+
const entry = {
|
|
163
|
+
id: randomUUID(),
|
|
164
|
+
content: params.content,
|
|
165
|
+
timestamp: new Date().toISOString(),
|
|
166
|
+
category: (params.category || "context"),
|
|
167
|
+
tags: params.tags || [],
|
|
168
|
+
project: params.project,
|
|
169
|
+
importance: params.importance ?? 0.5,
|
|
170
|
+
accessCount: 0,
|
|
171
|
+
lastAccessed: new Date().toISOString(),
|
|
172
|
+
sessionId: ctx.sessionManager?.getSessionId?.(),
|
|
173
|
+
};
|
|
174
|
+
// Get embedding if Ollama available
|
|
175
|
+
let embedding;
|
|
176
|
+
if (ollamaAvailable) {
|
|
177
|
+
try {
|
|
178
|
+
embedding = await getEmbedding(entry.content, ollamaUrl);
|
|
179
|
+
entry.embedding = embedding;
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
console.warn("[Perennial Memory] Failed to get embedding:", err);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Save to database
|
|
186
|
+
db.query(`
|
|
187
|
+
INSERT INTO memories (id, content, timestamp, category, tags, project, importance,
|
|
188
|
+
access_count, last_accessed, session_id, embedding)
|
|
189
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
190
|
+
`).run(entry.id, entry.content, entry.timestamp, entry.category, JSON.stringify(entry.tags), entry.project || null, entry.importance, entry.accessCount, entry.lastAccessed, entry.sessionId || null, embedding ? embeddingToBlob(embedding) : null);
|
|
191
|
+
return {
|
|
192
|
+
content: [{
|
|
193
|
+
type: "text",
|
|
194
|
+
text: `đī¸ Memory archived: ${entry.id.slice(0, 8)}\n[${entry.category}] "${entry.content.slice(0, 50)}..."`,
|
|
195
|
+
}],
|
|
196
|
+
details: { entry, hasEmbedding: !!embedding },
|
|
197
|
+
};
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
// TOOL: Hybrid search
|
|
201
|
+
pi.registerTool({
|
|
202
|
+
name: "perennial_search",
|
|
203
|
+
label: "Search Perennial Memory",
|
|
204
|
+
description: "Semantic search across all memories. Finds related concepts even with different wording.",
|
|
205
|
+
parameters: Type.Object({
|
|
206
|
+
query: Type.String({ description: "Search query (concepts, not just keywords)" }),
|
|
207
|
+
category: Type.Optional(Type.String({ description: "Filter by category" })),
|
|
208
|
+
project: Type.Optional(Type.String({ description: "Filter by project" })),
|
|
209
|
+
limit: Type.Optional(Type.Number({ description: "Max results (default 10)" })),
|
|
210
|
+
}),
|
|
211
|
+
async execute(_toolCallId, params) {
|
|
212
|
+
const query = params.query;
|
|
213
|
+
const limit = params.limit || 10;
|
|
214
|
+
const category = params.category;
|
|
215
|
+
const project = params.project;
|
|
216
|
+
const results = [];
|
|
217
|
+
// 1. Semantic search (if Ollama available)
|
|
218
|
+
if (ollamaAvailable) {
|
|
219
|
+
try {
|
|
220
|
+
const queryEmbedding = await getEmbedding(query, ollamaUrl);
|
|
221
|
+
// Get all entries with embeddings (limit to recent 1000 for performance)
|
|
222
|
+
const rows = db.query(`
|
|
223
|
+
SELECT id, content, timestamp, category, tags, project, importance,
|
|
224
|
+
access_count, last_accessed, embedding
|
|
225
|
+
FROM memories
|
|
226
|
+
WHERE embedding IS NOT NULL
|
|
227
|
+
ORDER BY timestamp DESC
|
|
228
|
+
LIMIT 1000
|
|
229
|
+
`).all();
|
|
230
|
+
for (const row of rows) {
|
|
231
|
+
const entryEmbedding = blobToEmbedding(row.embedding);
|
|
232
|
+
const similarity = cosineSimilarity(queryEmbedding, entryEmbedding);
|
|
233
|
+
// Apply temporal decay
|
|
234
|
+
const ageDays = (Date.now() - new Date(row.timestamp).getTime()) / (1000 * 60 * 60 * 24);
|
|
235
|
+
const decay = Math.exp(-Math.log(2) * ageDays / 30); // 30-day half-life
|
|
236
|
+
results.push({
|
|
237
|
+
id: row.id,
|
|
238
|
+
content: row.content,
|
|
239
|
+
timestamp: row.timestamp,
|
|
240
|
+
category: row.category,
|
|
241
|
+
tags: JSON.parse(row.tags),
|
|
242
|
+
project: row.project,
|
|
243
|
+
importance: row.importance,
|
|
244
|
+
accessCount: row.access_count,
|
|
245
|
+
lastAccessed: row.last_accessed,
|
|
246
|
+
score: similarity * decay * row.importance,
|
|
247
|
+
matchType: "semantic",
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
console.warn("[Perennial Memory] Semantic search failed:", err);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// 2. Text search (always works)
|
|
256
|
+
const textMatches = db.query(`
|
|
257
|
+
SELECT m.id, m.content, m.timestamp, m.category, m.tags, m.project,
|
|
258
|
+
m.importance, m.access_count, m.last_accessed
|
|
259
|
+
FROM memories m
|
|
260
|
+
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
261
|
+
WHERE memories_fts MATCH ?
|
|
262
|
+
${category ? "AND m.category = ?" : ""}
|
|
263
|
+
${project ? "AND m.project = ?" : ""}
|
|
264
|
+
ORDER BY rank
|
|
265
|
+
LIMIT ?
|
|
266
|
+
`).all(query, ...(category ? [category] : []), ...(project ? [project] : []), limit);
|
|
267
|
+
for (const row of textMatches) {
|
|
268
|
+
// Check if already in results
|
|
269
|
+
const existing = results.find(r => r.id === row.id);
|
|
270
|
+
if (existing) {
|
|
271
|
+
existing.score = Math.max(existing.score, 0.8); // Boost for text matches
|
|
272
|
+
existing.matchType = "hybrid";
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
results.push({
|
|
276
|
+
id: row.id,
|
|
277
|
+
content: row.content,
|
|
278
|
+
timestamp: row.timestamp,
|
|
279
|
+
category: row.category,
|
|
280
|
+
tags: JSON.parse(row.tags),
|
|
281
|
+
project: row.project,
|
|
282
|
+
importance: row.importance,
|
|
283
|
+
accessCount: row.access_count,
|
|
284
|
+
lastAccessed: row.last_accessed,
|
|
285
|
+
score: 0.7, // Base score for text match
|
|
286
|
+
matchType: "text",
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// Sort by score and take top results
|
|
291
|
+
const sorted = results
|
|
292
|
+
.sort((a, b) => b.score - a.score)
|
|
293
|
+
.slice(0, limit);
|
|
294
|
+
// Update access counts
|
|
295
|
+
for (const r of sorted) {
|
|
296
|
+
db.query(`UPDATE memories SET access_count = access_count + 1, last_accessed = ? WHERE id = ?`)
|
|
297
|
+
.run(new Date().toISOString(), r.id);
|
|
298
|
+
}
|
|
299
|
+
// Format output
|
|
300
|
+
const formatted = sorted.length
|
|
301
|
+
? sorted.map((r, i) => `${i + 1}. [${r.matchType}] ${r.content.slice(0, 70)}... (score: ${(r.score * 100).toFixed(1)}%)`).join("\n")
|
|
302
|
+
: "No memories found";
|
|
303
|
+
return {
|
|
304
|
+
content: [{ type: "text", text: `đī¸ ${sorted.length} memories found:\n\n${formatted}` }],
|
|
305
|
+
details: { count: sorted.length, results: sorted },
|
|
306
|
+
};
|
|
307
|
+
},
|
|
308
|
+
});
|
|
309
|
+
// TOOL: Export memories
|
|
310
|
+
pi.registerTool({
|
|
311
|
+
name: "perennial_export",
|
|
312
|
+
label: "Export Memories",
|
|
313
|
+
description: "Export all memories to a portable format (JSONL or SQLite)",
|
|
314
|
+
parameters: Type.Object({
|
|
315
|
+
format: Type.String({ description: "jsonl or sqlite" }),
|
|
316
|
+
output: Type.Optional(Type.String({ description: "Output path (optional)" })),
|
|
317
|
+
}),
|
|
318
|
+
async execute(_toolCallId, params) {
|
|
319
|
+
const format = (params.format || "jsonl");
|
|
320
|
+
const timestamp = new Date().toISOString().split("T")[0];
|
|
321
|
+
const outputPath = params.output || path.join(MEMORY_DIR, "exports", `memories-${timestamp}.${format}`);
|
|
322
|
+
await fs.mkdir(path.dirname(outputPath), { recursive: true });
|
|
323
|
+
const rows = db.query(`SELECT * FROM memories ORDER BY timestamp`).all();
|
|
324
|
+
if (format === "jsonl") {
|
|
325
|
+
const lines = rows.map(row => JSON.stringify({
|
|
326
|
+
id: row.id,
|
|
327
|
+
content: row.content,
|
|
328
|
+
timestamp: row.timestamp,
|
|
329
|
+
category: row.category,
|
|
330
|
+
tags: JSON.parse(row.tags),
|
|
331
|
+
project: row.project,
|
|
332
|
+
importance: row.importance,
|
|
333
|
+
accessCount: row.access_count,
|
|
334
|
+
}));
|
|
335
|
+
await fs.writeFile(outputPath, lines.join("\n"));
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
// Copy SQLite database
|
|
339
|
+
await fs.copyFile(DB_PATH, outputPath);
|
|
340
|
+
}
|
|
341
|
+
return {
|
|
342
|
+
content: [{ type: "text", text: `đĻ Exported ${rows.length} memories to ${outputPath}` }],
|
|
343
|
+
details: { count: rows.length, path: outputPath },
|
|
344
|
+
};
|
|
345
|
+
},
|
|
346
|
+
});
|
|
347
|
+
// COMMANDS
|
|
348
|
+
pi.registerCommand("remember", {
|
|
349
|
+
description: "Save a memory forever: /remember \"Content\" --category fact --importance 0.9",
|
|
350
|
+
handler: async (args, ctx) => {
|
|
351
|
+
const [content, ...opts] = args.split(" --");
|
|
352
|
+
if (!content.trim()) {
|
|
353
|
+
ctx.ui.notify("â Usage: /remember \"content\" --category fact", "error");
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
const options = {};
|
|
357
|
+
for (const opt of opts) {
|
|
358
|
+
const [k, ...v] = opt.split(" ");
|
|
359
|
+
options[k] = v.join(" ");
|
|
360
|
+
}
|
|
361
|
+
let embedding;
|
|
362
|
+
if (ollamaAvailable) {
|
|
363
|
+
try {
|
|
364
|
+
embedding = await getEmbedding(content, ollamaUrl);
|
|
365
|
+
}
|
|
366
|
+
catch { }
|
|
367
|
+
}
|
|
368
|
+
const entry = {
|
|
369
|
+
id: randomUUID(),
|
|
370
|
+
content: content.trim(),
|
|
371
|
+
timestamp: new Date().toISOString(),
|
|
372
|
+
category: (options.category || "context"),
|
|
373
|
+
tags: options.tags?.split(",").map((t) => t.trim()) || [],
|
|
374
|
+
importance: parseFloat(options.importance || "0.5"),
|
|
375
|
+
};
|
|
376
|
+
db.query(`
|
|
377
|
+
INSERT INTO memories (id, content, timestamp, category, tags, importance, access_count, session_id${embedding ? ', embedding' : ''})
|
|
378
|
+
VALUES (?, ?, ?, ?, ?, ?, 0, ?${embedding ? ', ?' : ''})
|
|
379
|
+
`).run(entry.id, entry.content, entry.timestamp, entry.category, JSON.stringify(entry.tags), entry.importance, ctx.sessionManager?.getSessionId?.() || null, ...(embedding ? [embeddingToBlob(embedding)] : []));
|
|
380
|
+
ctx.ui.notify(`đī¸ Remembered forever: ${entry.id.slice(0, 8)}${embedding ? " (semantic)" : ""}`, "info");
|
|
381
|
+
},
|
|
382
|
+
});
|
|
383
|
+
pi.registerCommand("recall", {
|
|
384
|
+
description: "Recall by meaning: /recall \"that auth thing we did\"",
|
|
385
|
+
handler: async (args, ctx) => {
|
|
386
|
+
if (!args.trim()) {
|
|
387
|
+
ctx.ui.notify("â Usage: /recall \"vague description of what you remember\"", "error");
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
// Use the search tool
|
|
391
|
+
const limit = 5;
|
|
392
|
+
let results = [];
|
|
393
|
+
if (ollamaAvailable) {
|
|
394
|
+
try {
|
|
395
|
+
const queryEmbedding = await getEmbedding(args, ollamaUrl);
|
|
396
|
+
const rows = db.query(`SELECT id, content, category, importance, embedding FROM memories WHERE embedding IS NOT NULL LIMIT 1000`).all();
|
|
397
|
+
results = rows
|
|
398
|
+
.map(row => ({
|
|
399
|
+
...row,
|
|
400
|
+
score: cosineSimilarity(queryEmbedding, blobToEmbedding(row.embedding)),
|
|
401
|
+
}))
|
|
402
|
+
.sort((a, b) => b.score - a.score)
|
|
403
|
+
.slice(0, limit);
|
|
404
|
+
}
|
|
405
|
+
catch { }
|
|
406
|
+
}
|
|
407
|
+
// Fallback to text search
|
|
408
|
+
if (results.length === 0) {
|
|
409
|
+
const rows = db.query(`
|
|
410
|
+
SELECT id, content, category, importance, rank
|
|
411
|
+
FROM memories JOIN memories_fts ON memories.rowid = memories_fts.rowid
|
|
412
|
+
WHERE memories_fts MATCH ?
|
|
413
|
+
LIMIT ?
|
|
414
|
+
`).all(args, limit);
|
|
415
|
+
results = rows.map(r => ({ ...r, score: 0.7 }));
|
|
416
|
+
}
|
|
417
|
+
ctx.ui.notify(results.length
|
|
418
|
+
? `đī¸ Found:\n${results.map((r, i) => `${i + 1}. [${r.category}] ${r.content.slice(0, 60)}...`).join("\n")}`
|
|
419
|
+
: "No memories match that description", "info");
|
|
420
|
+
},
|
|
421
|
+
});
|
|
422
|
+
pi.registerCommand("memories", {
|
|
423
|
+
description: "List recent memories",
|
|
424
|
+
handler: async (_args, ctx) => {
|
|
425
|
+
const rows = db.query(`SELECT id, content, category, timestamp FROM memories ORDER BY timestamp DESC LIMIT 10`).all();
|
|
426
|
+
ctx.ui.notify(rows.length
|
|
427
|
+
? rows.map((r, i) => `${i + 1}. ${r.id.slice(0, 8)} [${r.category}] ${r.content.slice(0, 40)}...`).join("\n")
|
|
428
|
+
: "No memories yet", "info");
|
|
429
|
+
},
|
|
430
|
+
});
|
|
431
|
+
pi.registerCommand("memory-export", {
|
|
432
|
+
description: "Export memories to file",
|
|
433
|
+
handler: async (_args, ctx) => {
|
|
434
|
+
const timestamp = new Date().toISOString().split("T")[0];
|
|
435
|
+
const exportDir = path.join(MEMORY_DIR, "exports");
|
|
436
|
+
await fs.mkdir(exportDir, { recursive: true });
|
|
437
|
+
const outputPath = path.join(exportDir, `memories-${timestamp}.jsonl`);
|
|
438
|
+
const rows = db.query(`SELECT * FROM memories`).all();
|
|
439
|
+
const lines = rows.map(r => JSON.stringify(r));
|
|
440
|
+
await fs.writeFile(outputPath, lines.join("\n"));
|
|
441
|
+
ctx.ui.notify(`đĻ Exported ${rows.length} memories to ${outputPath}`, "info");
|
|
442
|
+
},
|
|
443
|
+
});
|
|
444
|
+
console.log("[Perennial Memory] Ready");
|
|
445
|
+
console.log(` Database: ${DB_PATH}`);
|
|
446
|
+
console.log(` Schema: v${CURRENT_SCHEMA_VERSION}`);
|
|
447
|
+
console.log(` Ollama: ${ollamaAvailable ? "â
connected" : "â ī¸ not available"}`);
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=perennial-memory-extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perennial-memory-extension.js","sourceRoot":"","sources":["../../../../src/extensions/core/perennial-memory-extension.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -46,6 +46,8 @@ function verifyExtensions() {
|
|
|
46
46
|
const extensions = [
|
|
47
47
|
// Infrastructure
|
|
48
48
|
'--extension', ext('ollama-provider-extension'),
|
|
49
|
+
'--extension', ext('ollama-cloud-extension'),
|
|
50
|
+
'--extension', ext('ollama-router-extension'),
|
|
49
51
|
'--extension', ext('session-bridge-extension'),
|
|
50
52
|
// Core Features
|
|
51
53
|
'--extension', ext('persona-loader-extension'),
|
|
@@ -63,6 +65,7 @@ function verifyExtensions() {
|
|
|
63
65
|
// Context management (OpenClaw-style)
|
|
64
66
|
'--extension', ext('context-pruning/extension'),
|
|
65
67
|
'--extension', ext('compaction-safeguard'),
|
|
68
|
+
'--extension', ext('auto-compact-on-error-extension'),
|
|
66
69
|
// Multi-Channel
|
|
67
70
|
'--extension', ext('multi-channel-extension'),
|
|
68
71
|
'--extension', ext('discord-extension'),
|
|
@@ -76,6 +79,10 @@ function verifyExtensions() {
|
|
|
76
79
|
'--extension', ext('gateway-extension'),
|
|
77
80
|
'--extension', ext('agent-registry-extension'),
|
|
78
81
|
'--extension', ext('websearch-extension'),
|
|
82
|
+
'--extension', ext('memory-extension'),
|
|
83
|
+
'--extension', ext('perennial-memory-extension'),
|
|
84
|
+
'--extension', ext('diagnostics-extension'),
|
|
85
|
+
'--extension', ext('memory-synthesis-extension'),
|
|
79
86
|
// Note: pi-coding-agent updates disabled - user manages dependencies manually
|
|
80
87
|
// '--extension', ext('update-extension'),
|
|
81
88
|
// Self-update for 0xKobold only (shows in dev mode)
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,IAAI,IAAI,MAAM,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAE7C,6CAA6C;AAC7C,gEAAgE;AAChE,MAAM,iBAAiB,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACrD,+DAA+D;AAC/D,uDAAuD;AACvD,MAAM,YAAY,GAAG,iBAAiB;IACpC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAE,uDAAuD;IACnG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC,CAAE,yBAAyB;AACxE,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAEvD,6EAA6E;AAC7E,wDAAwD;AACxD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAErG,0DAA0D;AAC1D,wDAAwD;AACxD,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,GAAG,CAAC;AAE7E,oCAAoC;AACpC,SAAS,GAAG,CAAC,IAAY;IACvB,6DAA6D;IAC7D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,YAAY,CAAC;IACpD,CAAC;IACD,OAAO,OAAO,CAAC,YAAY,EAAE,IAAI,GAAG,YAAY,CAAC,CAAC;AACpD,CAAC;AAED,0CAA0C;AAC1C,SAAS,gBAAgB;IACvB,MAAM,UAAU,GAAa;QAC3B,iBAAiB;QACjB,aAAa,EAAE,GAAG,CAAC,2BAA2B,CAAC;QAC/C,aAAa,EAAE,GAAG,CAAC,0BAA0B,CAAC;QAE9C,gBAAgB;QAChB,aAAa,EAAE,GAAG,CAAC,0BAA0B,CAAC;QAC9C,aAAa,EAAE,GAAG,CAAC,yBAAyB,CAAC;QAC7C,aAAa,EAAE,GAAG,CAAC,sBAAsB,CAAC;QAC1C,aAAa,EAAE,GAAG,CAAC,wBAAwB,CAAC;QAC5C,aAAa,EAAE,GAAG,CAAC,yBAAyB,CAAC;QAC7C,aAAa,EAAE,GAAG,CAAC,wBAAwB,CAAC;QAC5C,aAAa,EAAE,GAAG,CAAC,mBAAmB,CAAC;QACvC,aAAa,EAAE,GAAG,CAAC,qBAAqB,CAAC;QACzC,aAAa,EAAE,GAAG,CAAC,sBAAsB,CAAC;QAC1C,aAAa,EAAE,GAAG,CAAC,qBAAqB,CAAC;QACzC,aAAa,EAAE,GAAG,CAAC,2BAA2B,CAAC;QAC/C,aAAa,EAAE,GAAG,CAAC,wBAAwB,CAAC;QAC5C,sCAAsC;QACtC,aAAa,EAAE,GAAG,CAAC,2BAA2B,CAAC;QAC/C,aAAa,EAAE,GAAG,CAAC,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|