jfl 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +443 -145
- package/clawdbot-plugin/clawdbot.plugin.json +20 -0
- package/clawdbot-plugin/index.js +555 -0
- package/clawdbot-plugin/index.ts +582 -0
- package/clawdbot-skill/SKILL.md +33 -336
- package/clawdbot-skill/index.ts +491 -321
- package/clawdbot-skill/skill.json +4 -13
- package/dist/commands/clawdbot.d.ts +11 -0
- package/dist/commands/clawdbot.d.ts.map +1 -0
- package/dist/commands/clawdbot.js +215 -0
- package/dist/commands/clawdbot.js.map +1 -0
- package/dist/commands/context-hub.d.ts +5 -0
- package/dist/commands/context-hub.d.ts.map +1 -1
- package/dist/commands/context-hub.js +394 -28
- package/dist/commands/context-hub.js.map +1 -1
- package/dist/commands/gtm-process-update.d.ts +10 -0
- package/dist/commands/gtm-process-update.d.ts.map +1 -0
- package/dist/commands/gtm-process-update.js +101 -0
- package/dist/commands/gtm-process-update.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +278 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +32 -33
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/memory.d.ts +38 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +229 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/migrate-services.d.ts +8 -0
- package/dist/commands/migrate-services.d.ts.map +1 -0
- package/dist/commands/migrate-services.js +182 -0
- package/dist/commands/migrate-services.js.map +1 -0
- package/dist/commands/onboard.d.ts +24 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +663 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/openclaw.d.ts +56 -0
- package/dist/commands/openclaw.d.ts.map +1 -0
- package/dist/commands/openclaw.js +700 -0
- package/dist/commands/openclaw.js.map +1 -0
- package/dist/commands/orchestrate.d.ts +14 -0
- package/dist/commands/orchestrate.d.ts.map +1 -0
- package/dist/commands/orchestrate.js +270 -0
- package/dist/commands/orchestrate.js.map +1 -0
- package/dist/commands/profile.d.ts +46 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +498 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/repair.d.ts.map +1 -1
- package/dist/commands/repair.js +37 -0
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/service-agent.d.ts +16 -0
- package/dist/commands/service-agent.d.ts.map +1 -0
- package/dist/commands/service-agent.js +375 -0
- package/dist/commands/service-agent.js.map +1 -0
- package/dist/commands/service-manager.d.ts +12 -0
- package/dist/commands/service-manager.d.ts.map +1 -0
- package/dist/commands/service-manager.js +967 -0
- package/dist/commands/service-manager.js.map +1 -0
- package/dist/commands/service-validate.d.ts +12 -0
- package/dist/commands/service-validate.d.ts.map +1 -0
- package/dist/commands/service-validate.js +611 -0
- package/dist/commands/service-validate.js.map +1 -0
- package/dist/commands/services-create.d.ts +15 -0
- package/dist/commands/services-create.d.ts.map +1 -0
- package/dist/commands/services-create.js +1452 -0
- package/dist/commands/services-create.js.map +1 -0
- package/dist/commands/services-scan.d.ts +13 -0
- package/dist/commands/services-scan.d.ts.map +1 -0
- package/dist/commands/services-scan.js +251 -0
- package/dist/commands/services-scan.js.map +1 -0
- package/dist/commands/services-sync-agents.d.ts +23 -0
- package/dist/commands/services-sync-agents.d.ts.map +1 -0
- package/dist/commands/services-sync-agents.js +207 -0
- package/dist/commands/services-sync-agents.js.map +1 -0
- package/dist/commands/services.d.ts +19 -0
- package/dist/commands/services.d.ts.map +1 -0
- package/dist/commands/services.js +742 -0
- package/dist/commands/services.js.map +1 -0
- package/dist/commands/session.d.ts +5 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +68 -586
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +17 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +75 -21
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate-settings.d.ts +37 -0
- package/dist/commands/validate-settings.d.ts.map +1 -0
- package/dist/commands/validate-settings.js +197 -0
- package/dist/commands/validate-settings.js.map +1 -0
- package/dist/commands/voice.d.ts +0 -1
- package/dist/commands/voice.d.ts.map +1 -1
- package/dist/commands/voice.js +16 -15
- package/dist/commands/voice.js.map +1 -1
- package/dist/index.js +395 -141
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-generator.d.ts +26 -0
- package/dist/lib/agent-generator.d.ts.map +1 -0
- package/dist/lib/agent-generator.js +331 -0
- package/dist/lib/agent-generator.js.map +1 -0
- package/dist/lib/memory-db.d.ts +102 -0
- package/dist/lib/memory-db.d.ts.map +1 -0
- package/dist/lib/memory-db.js +313 -0
- package/dist/lib/memory-db.js.map +1 -0
- package/dist/lib/memory-indexer.d.ts +47 -0
- package/dist/lib/memory-indexer.d.ts.map +1 -0
- package/dist/lib/memory-indexer.js +215 -0
- package/dist/lib/memory-indexer.js.map +1 -0
- package/dist/lib/memory-search.d.ts +41 -0
- package/dist/lib/memory-search.d.ts.map +1 -0
- package/dist/lib/memory-search.js +246 -0
- package/dist/lib/memory-search.js.map +1 -0
- package/dist/lib/openclaw-registry.d.ts +48 -0
- package/dist/lib/openclaw-registry.d.ts.map +1 -0
- package/dist/lib/openclaw-registry.js +181 -0
- package/dist/lib/openclaw-registry.js.map +1 -0
- package/dist/lib/openclaw-sdk.d.ts +107 -0
- package/dist/lib/openclaw-sdk.d.ts.map +1 -0
- package/dist/lib/openclaw-sdk.js +208 -0
- package/dist/lib/openclaw-sdk.js.map +1 -0
- package/dist/lib/peer-agent-generator.d.ts +44 -0
- package/dist/lib/peer-agent-generator.d.ts.map +1 -0
- package/dist/lib/peer-agent-generator.js +286 -0
- package/dist/lib/peer-agent-generator.js.map +1 -0
- package/dist/lib/service-dependencies.d.ts +44 -0
- package/dist/lib/service-dependencies.d.ts.map +1 -0
- package/dist/lib/service-dependencies.js +314 -0
- package/dist/lib/service-dependencies.js.map +1 -0
- package/dist/lib/service-detector.d.ts +61 -0
- package/dist/lib/service-detector.d.ts.map +1 -0
- package/dist/lib/service-detector.js +521 -0
- package/dist/lib/service-detector.js.map +1 -0
- package/dist/lib/service-gtm.d.ts +157 -0
- package/dist/lib/service-gtm.d.ts.map +1 -0
- package/dist/lib/service-gtm.js +786 -0
- package/dist/lib/service-gtm.js.map +1 -0
- package/dist/lib/service-mcp-base.d.ts +103 -0
- package/dist/lib/service-mcp-base.d.ts.map +1 -0
- package/dist/lib/service-mcp-base.js +263 -0
- package/dist/lib/service-mcp-base.js.map +1 -0
- package/dist/lib/service-utils.d.ts +103 -0
- package/dist/lib/service-utils.d.ts.map +1 -0
- package/dist/lib/service-utils.js +368 -0
- package/dist/lib/service-utils.js.map +1 -0
- package/dist/lib/skill-generator.d.ts +21 -0
- package/dist/lib/skill-generator.d.ts.map +1 -0
- package/dist/lib/skill-generator.js +253 -0
- package/dist/lib/skill-generator.js.map +1 -0
- package/dist/lib/stratus-client.d.ts +100 -0
- package/dist/lib/stratus-client.d.ts.map +1 -0
- package/dist/lib/stratus-client.js +255 -0
- package/dist/lib/stratus-client.js.map +1 -0
- package/dist/mcp/context-hub-mcp.js +135 -53
- package/dist/mcp/context-hub-mcp.js.map +1 -1
- package/dist/mcp/service-mcp-server.d.ts +12 -0
- package/dist/mcp/service-mcp-server.d.ts.map +1 -0
- package/dist/mcp/service-mcp-server.js +434 -0
- package/dist/mcp/service-mcp-server.js.map +1 -0
- package/dist/mcp/service-peer-mcp.d.ts +36 -0
- package/dist/mcp/service-peer-mcp.d.ts.map +1 -0
- package/dist/mcp/service-peer-mcp.js +220 -0
- package/dist/mcp/service-peer-mcp.js.map +1 -0
- package/dist/mcp/service-registry-mcp.d.ts +13 -0
- package/dist/mcp/service-registry-mcp.d.ts.map +1 -0
- package/dist/mcp/service-registry-mcp.js +330 -0
- package/dist/mcp/service-registry-mcp.js.map +1 -0
- package/dist/ui/banner.js +1 -1
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/context-hub-logs.d.ts +10 -0
- package/dist/ui/context-hub-logs.d.ts.map +1 -0
- package/dist/ui/context-hub-logs.js +175 -0
- package/dist/ui/context-hub-logs.js.map +1 -0
- package/dist/ui/service-dashboard.d.ts +11 -0
- package/dist/ui/service-dashboard.d.ts.map +1 -0
- package/dist/ui/service-dashboard.js +357 -0
- package/dist/ui/service-dashboard.js.map +1 -0
- package/dist/ui/services-manager.d.ts +11 -0
- package/dist/ui/services-manager.d.ts.map +1 -0
- package/dist/ui/services-manager.js +507 -0
- package/dist/ui/services-manager.js.map +1 -0
- package/dist/utils/auth-guard.d.ts.map +1 -1
- package/dist/utils/auth-guard.js +8 -9
- package/dist/utils/auth-guard.js.map +1 -1
- package/dist/utils/claude-md-generator.d.ts +10 -0
- package/dist/utils/claude-md-generator.d.ts.map +1 -0
- package/dist/utils/claude-md-generator.js +215 -0
- package/dist/utils/claude-md-generator.js.map +1 -0
- package/dist/utils/ensure-context-hub.d.ts +20 -0
- package/dist/utils/ensure-context-hub.d.ts.map +1 -0
- package/dist/utils/ensure-context-hub.js +65 -0
- package/dist/utils/ensure-context-hub.js.map +1 -0
- package/dist/utils/ensure-project.d.ts.map +1 -1
- package/dist/utils/ensure-project.js +3 -4
- package/dist/utils/ensure-project.js.map +1 -1
- package/dist/utils/jfl-config.d.ts +19 -0
- package/dist/utils/jfl-config.d.ts.map +1 -0
- package/dist/utils/jfl-config.js +112 -0
- package/dist/utils/jfl-config.js.map +1 -0
- package/dist/utils/jfl-migration.d.ts +29 -0
- package/dist/utils/jfl-migration.d.ts.map +1 -0
- package/dist/utils/jfl-migration.js +142 -0
- package/dist/utils/jfl-migration.js.map +1 -0
- package/dist/utils/jfl-paths.d.ts +55 -0
- package/dist/utils/jfl-paths.d.ts.map +1 -0
- package/dist/utils/jfl-paths.js +120 -0
- package/dist/utils/jfl-paths.js.map +1 -0
- package/dist/utils/settings-validator.d.ts +73 -0
- package/dist/utils/settings-validator.d.ts.map +1 -0
- package/dist/utils/settings-validator.js +222 -0
- package/dist/utils/settings-validator.js.map +1 -0
- package/package.json +19 -3
- package/scripts/commit-gtm.sh +56 -0
- package/scripts/commit-product.sh +68 -0
- package/scripts/context-query.sh +45 -0
- package/scripts/session/auto-commit.sh +297 -0
- package/scripts/session/jfl-doctor.sh +707 -0
- package/scripts/session/session-cleanup.sh +268 -0
- package/scripts/session/session-end.sh +198 -0
- package/scripts/session/session-init.sh +350 -0
- package/scripts/session/session-init.sh.backup +292 -0
- package/scripts/session/session-sync.sh +167 -0
- package/scripts/session/test-context-preservation.sh +160 -0
- package/scripts/session/test-critical-infrastructure.sh +293 -0
- package/scripts/session/test-experience-level.sh +336 -0
- package/scripts/session/test-session-cleanup.sh +268 -0
- package/scripts/session/test-session-sync.sh +320 -0
- package/scripts/voice-start.sh +36 -8
- package/scripts/where-am-i.sh +78 -0
- package/template/.claude/service-settings.json +32 -0
- package/template/.claude/settings.json +14 -1
- package/template/.claude/skills/end/SKILL.md +1780 -0
- package/template/.jfl/config.json +2 -1
- package/template/CLAUDE.md +1039 -134
- package/template/CLAUDE.md.bak +1187 -0
- package/template/scripts/commit-gtm.sh +56 -0
- package/template/scripts/commit-product.sh +68 -0
- package/template/scripts/migrate-to-branch-sessions.sh +201 -0
- package/template/scripts/session/auto-commit.sh +58 -6
- package/template/scripts/session/jfl-doctor.sh +137 -17
- package/template/scripts/session/session-cleanup.sh +268 -0
- package/template/scripts/session/session-end.sh +4 -0
- package/template/scripts/session/session-init.sh +253 -66
- package/template/scripts/session/test-critical-infrastructure.sh +293 -0
- package/template/scripts/session/test-experience-level.sh +336 -0
- package/template/scripts/session/test-session-cleanup.sh +268 -0
- package/template/scripts/session/test-session-sync.sh +320 -0
- package/template/scripts/where-am-i.sh +78 -0
- package/template/templates/service-agent/.claude/settings.json +32 -0
- package/template/templates/service-agent/CLAUDE.md +334 -0
- package/template/templates/service-agent/knowledge/ARCHITECTURE.md +115 -0
- package/template/templates/service-agent/knowledge/DEPLOYMENT.md +199 -0
- package/template/templates/service-agent/knowledge/RUNBOOK.md +412 -0
- package/template/templates/service-agent/knowledge/SERVICE_SPEC.md +77 -0
- package/dist/commands/session-mgmt.d.ts +0 -33
- package/dist/commands/session-mgmt.d.ts.map +0 -1
- package/dist/commands/session-mgmt.js +0 -404
- package/dist/commands/session-mgmt.js.map +0 -1
- package/template/scripts/session/auto-merge.sh +0 -325
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Database Module
|
|
3
|
+
*
|
|
4
|
+
* SQLite database for indexed journal entries and memories.
|
|
5
|
+
* Provides schema initialization, CRUD operations, and query builders.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Memory persistence and querying via SQLite
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import initSqlJs from 'sql.js';
|
|
12
|
+
let SQL = null;
|
|
13
|
+
let dbInstance = null;
|
|
14
|
+
let dbPath = null;
|
|
15
|
+
/**
|
|
16
|
+
* Initialize sql.js library
|
|
17
|
+
*/
|
|
18
|
+
async function initSQL() {
|
|
19
|
+
if (SQL)
|
|
20
|
+
return;
|
|
21
|
+
SQL = await initSqlJs();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get database path for current project
|
|
25
|
+
*/
|
|
26
|
+
function getDbPath() {
|
|
27
|
+
return path.join(process.cwd(), '.jfl', 'memory.db');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Load or create database
|
|
31
|
+
*/
|
|
32
|
+
async function loadDb() {
|
|
33
|
+
await initSQL();
|
|
34
|
+
const currentPath = getDbPath();
|
|
35
|
+
// If db instance exists and path matches, reuse it
|
|
36
|
+
if (dbInstance && dbPath === currentPath) {
|
|
37
|
+
return dbInstance;
|
|
38
|
+
}
|
|
39
|
+
// Check if database file exists
|
|
40
|
+
if (fs.existsSync(currentPath)) {
|
|
41
|
+
const buffer = fs.readFileSync(currentPath);
|
|
42
|
+
dbInstance = new SQL.Database(buffer);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// Create new database
|
|
46
|
+
dbInstance = new SQL.Database();
|
|
47
|
+
}
|
|
48
|
+
dbPath = currentPath;
|
|
49
|
+
if (!dbInstance) {
|
|
50
|
+
throw new Error('Failed to create database instance');
|
|
51
|
+
}
|
|
52
|
+
return dbInstance;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Save database to disk
|
|
56
|
+
*/
|
|
57
|
+
async function saveDb(db) {
|
|
58
|
+
const currentPath = getDbPath();
|
|
59
|
+
const data = db.export();
|
|
60
|
+
const buffer = Buffer.from(data);
|
|
61
|
+
// Ensure .jfl directory exists
|
|
62
|
+
const dir = path.dirname(currentPath);
|
|
63
|
+
if (!fs.existsSync(dir)) {
|
|
64
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
65
|
+
}
|
|
66
|
+
fs.writeFileSync(currentPath, buffer);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Initialize database schema
|
|
70
|
+
*/
|
|
71
|
+
export async function initializeDatabase() {
|
|
72
|
+
const db = await loadDb();
|
|
73
|
+
// Create memories table
|
|
74
|
+
db.run(`
|
|
75
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
76
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
77
|
+
source TEXT NOT NULL,
|
|
78
|
+
source_id TEXT,
|
|
79
|
+
type TEXT,
|
|
80
|
+
title TEXT NOT NULL,
|
|
81
|
+
content TEXT NOT NULL,
|
|
82
|
+
summary TEXT,
|
|
83
|
+
metadata TEXT,
|
|
84
|
+
created_at TEXT NOT NULL,
|
|
85
|
+
indexed_at TEXT NOT NULL,
|
|
86
|
+
embedding BLOB,
|
|
87
|
+
embedding_model TEXT,
|
|
88
|
+
tf_idf_tokens TEXT
|
|
89
|
+
)
|
|
90
|
+
`);
|
|
91
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_memories_source ON memories(source)`);
|
|
92
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type)`);
|
|
93
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_memories_created_at ON memories(created_at)`);
|
|
94
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_memories_source_id ON memories(source_id)`);
|
|
95
|
+
// Create tags table
|
|
96
|
+
db.run(`
|
|
97
|
+
CREATE TABLE IF NOT EXISTS tags (
|
|
98
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
99
|
+
memory_id INTEGER NOT NULL,
|
|
100
|
+
tag TEXT NOT NULL,
|
|
101
|
+
FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
|
|
102
|
+
)
|
|
103
|
+
`);
|
|
104
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_tags_memory ON tags(memory_id)`);
|
|
105
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_tags_tag ON tags(tag)`);
|
|
106
|
+
// Create links table
|
|
107
|
+
db.run(`
|
|
108
|
+
CREATE TABLE IF NOT EXISTS links (
|
|
109
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
110
|
+
from_memory_id INTEGER NOT NULL,
|
|
111
|
+
to_memory_id INTEGER NOT NULL,
|
|
112
|
+
link_type TEXT,
|
|
113
|
+
FOREIGN KEY (from_memory_id) REFERENCES memories(id) ON DELETE CASCADE,
|
|
114
|
+
FOREIGN KEY (to_memory_id) REFERENCES memories(id) ON DELETE CASCADE
|
|
115
|
+
)
|
|
116
|
+
`);
|
|
117
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_links_from ON links(from_memory_id)`);
|
|
118
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_links_to ON links(to_memory_id)`);
|
|
119
|
+
// Create meta table
|
|
120
|
+
db.run(`
|
|
121
|
+
CREATE TABLE IF NOT EXISTS meta (
|
|
122
|
+
key TEXT PRIMARY KEY,
|
|
123
|
+
value TEXT NOT NULL
|
|
124
|
+
)
|
|
125
|
+
`);
|
|
126
|
+
// Insert default meta values if not exists
|
|
127
|
+
const versionExists = db.exec(`SELECT value FROM meta WHERE key = 'version'`);
|
|
128
|
+
if (versionExists.length === 0) {
|
|
129
|
+
db.run(`INSERT INTO meta (key, value) VALUES ('version', '1')`);
|
|
130
|
+
db.run(`INSERT INTO meta (key, value) VALUES ('last_index', '${new Date().toISOString()}')`);
|
|
131
|
+
db.run(`INSERT INTO meta (key, value) VALUES ('embedding_model', 'text-embedding-3-small')`);
|
|
132
|
+
}
|
|
133
|
+
await saveDb(db);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Check if memory is already indexed
|
|
137
|
+
*/
|
|
138
|
+
export async function isMemoryIndexed(sourceId, timestamp) {
|
|
139
|
+
const db = await loadDb();
|
|
140
|
+
const result = db.exec(`
|
|
141
|
+
SELECT id FROM memories
|
|
142
|
+
WHERE source_id = ? AND created_at = ?
|
|
143
|
+
`, [sourceId, timestamp]);
|
|
144
|
+
return result.length > 0 && result[0].values.length > 0;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Insert a memory
|
|
148
|
+
*/
|
|
149
|
+
export async function insertMemory(memory) {
|
|
150
|
+
const db = await loadDb();
|
|
151
|
+
const now = new Date().toISOString();
|
|
152
|
+
// Serialize embedding if present
|
|
153
|
+
let embeddingBlob = null;
|
|
154
|
+
if (memory.embedding) {
|
|
155
|
+
embeddingBlob = Buffer.from(memory.embedding.buffer);
|
|
156
|
+
}
|
|
157
|
+
db.run(`
|
|
158
|
+
INSERT INTO memories (
|
|
159
|
+
source, source_id, type, title, content, summary,
|
|
160
|
+
metadata, created_at, indexed_at, embedding,
|
|
161
|
+
embedding_model, tf_idf_tokens
|
|
162
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
163
|
+
`, [
|
|
164
|
+
memory.source,
|
|
165
|
+
memory.source_id || null,
|
|
166
|
+
memory.type || null,
|
|
167
|
+
memory.title,
|
|
168
|
+
memory.content,
|
|
169
|
+
memory.summary || null,
|
|
170
|
+
memory.metadata ? JSON.stringify(memory.metadata) : null,
|
|
171
|
+
memory.created_at,
|
|
172
|
+
now,
|
|
173
|
+
embeddingBlob,
|
|
174
|
+
memory.embedding_model || null,
|
|
175
|
+
memory.tf_idf_tokens ? JSON.stringify(memory.tf_idf_tokens) : null
|
|
176
|
+
]);
|
|
177
|
+
// Get last insert ID
|
|
178
|
+
const result = db.exec(`SELECT last_insert_rowid() as id`);
|
|
179
|
+
const id = result[0].values[0][0];
|
|
180
|
+
await saveDb(db);
|
|
181
|
+
return id;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get all memories
|
|
185
|
+
*/
|
|
186
|
+
export async function getAllMemories() {
|
|
187
|
+
const db = await loadDb();
|
|
188
|
+
const result = db.exec(`SELECT * FROM memories ORDER BY created_at DESC`);
|
|
189
|
+
if (result.length === 0 || result[0].values.length === 0) {
|
|
190
|
+
return [];
|
|
191
|
+
}
|
|
192
|
+
const columns = result[0].columns;
|
|
193
|
+
const rows = result[0].values;
|
|
194
|
+
return rows.map((row) => {
|
|
195
|
+
const memory = {};
|
|
196
|
+
columns.forEach((col, i) => {
|
|
197
|
+
memory[col] = row[i];
|
|
198
|
+
});
|
|
199
|
+
return memory;
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get memories by IDs
|
|
204
|
+
*/
|
|
205
|
+
export async function getMemoriesByIds(ids) {
|
|
206
|
+
if (ids.length === 0)
|
|
207
|
+
return [];
|
|
208
|
+
const db = await loadDb();
|
|
209
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
210
|
+
const result = db.exec(`SELECT * FROM memories WHERE id IN (${placeholders})`, ids);
|
|
211
|
+
if (result.length === 0 || result[0].values.length === 0) {
|
|
212
|
+
return [];
|
|
213
|
+
}
|
|
214
|
+
const columns = result[0].columns;
|
|
215
|
+
const rows = result[0].values;
|
|
216
|
+
return rows.map((row) => {
|
|
217
|
+
const memory = {};
|
|
218
|
+
columns.forEach((col, i) => {
|
|
219
|
+
memory[col] = row[i];
|
|
220
|
+
});
|
|
221
|
+
return memory;
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get memory statistics
|
|
226
|
+
*/
|
|
227
|
+
export async function getMemoryStats() {
|
|
228
|
+
const db = await loadDb();
|
|
229
|
+
// Total count
|
|
230
|
+
const totalResult = db.exec(`SELECT COUNT(*) as total FROM memories`);
|
|
231
|
+
const total = totalResult[0].values[0][0];
|
|
232
|
+
// By type
|
|
233
|
+
const typeResult = db.exec(`SELECT type, COUNT(*) as count FROM memories GROUP BY type`);
|
|
234
|
+
const byType = {};
|
|
235
|
+
if (typeResult.length > 0) {
|
|
236
|
+
typeResult[0].values.forEach((row) => {
|
|
237
|
+
const type = row[0] || 'unknown';
|
|
238
|
+
const count = row[1];
|
|
239
|
+
byType[type] = count;
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
// Date range
|
|
243
|
+
const dateResult = db.exec(`
|
|
244
|
+
SELECT MIN(created_at) as earliest, MAX(created_at) as latest
|
|
245
|
+
FROM memories
|
|
246
|
+
`);
|
|
247
|
+
const earliest = dateResult[0].values[0][0] || null;
|
|
248
|
+
const latest = dateResult[0].values[0][1] || null;
|
|
249
|
+
// Embeddings
|
|
250
|
+
const embeddingResult = db.exec(`
|
|
251
|
+
SELECT COUNT(*) as count, embedding_model
|
|
252
|
+
FROM memories
|
|
253
|
+
WHERE embedding IS NOT NULL
|
|
254
|
+
`);
|
|
255
|
+
const embeddingCount = embeddingResult.length > 0 ? embeddingResult[0].values[0][0] : 0;
|
|
256
|
+
const embeddingModel = embeddingResult.length > 0 ? embeddingResult[0].values[0][1] : null;
|
|
257
|
+
// Last index
|
|
258
|
+
const metaResult = db.exec(`SELECT value FROM meta WHERE key = 'last_index'`);
|
|
259
|
+
const lastIndex = metaResult.length > 0 ? metaResult[0].values[0][0] : null;
|
|
260
|
+
return {
|
|
261
|
+
total_memories: total,
|
|
262
|
+
by_type: byType,
|
|
263
|
+
date_range: {
|
|
264
|
+
earliest,
|
|
265
|
+
latest
|
|
266
|
+
},
|
|
267
|
+
embeddings: {
|
|
268
|
+
available: embeddingCount > 0,
|
|
269
|
+
count: embeddingCount,
|
|
270
|
+
model: embeddingModel
|
|
271
|
+
},
|
|
272
|
+
last_index: lastIndex
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Update last index timestamp
|
|
277
|
+
*/
|
|
278
|
+
export async function setLastIndexTimestamp(timestamp) {
|
|
279
|
+
const db = await loadDb();
|
|
280
|
+
db.run(`
|
|
281
|
+
INSERT OR REPLACE INTO meta (key, value)
|
|
282
|
+
VALUES ('last_index', ?)
|
|
283
|
+
`, [timestamp]);
|
|
284
|
+
await saveDb(db);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get last index timestamp
|
|
288
|
+
*/
|
|
289
|
+
export async function getLastIndexTimestamp() {
|
|
290
|
+
const db = await loadDb();
|
|
291
|
+
const result = db.exec(`SELECT value FROM meta WHERE key = 'last_index'`);
|
|
292
|
+
if (result.length === 0 || result[0].values.length === 0) {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
return result[0].values[0][0];
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Deserialize embedding from buffer
|
|
299
|
+
*/
|
|
300
|
+
export function deserializeEmbedding(buffer) {
|
|
301
|
+
return new Float32Array(buffer.buffer, buffer.byteOffset, buffer.byteLength / 4);
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Close database connection
|
|
305
|
+
*/
|
|
306
|
+
export async function closeDatabase() {
|
|
307
|
+
if (dbInstance) {
|
|
308
|
+
dbInstance.close();
|
|
309
|
+
dbInstance = null;
|
|
310
|
+
dbPath = null;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=memory-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-db.js","sourceRoot":"","sources":["../../src/lib/memory-db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Indexer Module
|
|
3
|
+
*
|
|
4
|
+
* Indexes journal entries into the memory database.
|
|
5
|
+
* Runs periodically and on-demand to keep memory system up-to-date.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Automatic indexing of journal entries
|
|
8
|
+
*/
|
|
9
|
+
export interface JournalEntry {
|
|
10
|
+
v: number;
|
|
11
|
+
ts: string;
|
|
12
|
+
session: string;
|
|
13
|
+
type?: string;
|
|
14
|
+
status?: string;
|
|
15
|
+
title: string;
|
|
16
|
+
summary?: string;
|
|
17
|
+
detail?: string;
|
|
18
|
+
files?: string[];
|
|
19
|
+
decision?: string;
|
|
20
|
+
incomplete?: string[];
|
|
21
|
+
next?: string;
|
|
22
|
+
learned?: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface IndexStats {
|
|
25
|
+
added: number;
|
|
26
|
+
updated: number;
|
|
27
|
+
skipped: number;
|
|
28
|
+
errors: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Index all journal entries
|
|
32
|
+
*/
|
|
33
|
+
export declare function indexJournalEntries(force?: boolean): Promise<IndexStats>;
|
|
34
|
+
/**
|
|
35
|
+
* Recompute TF-IDF for all memories
|
|
36
|
+
* Used when corpus changes significantly
|
|
37
|
+
*/
|
|
38
|
+
export declare function recomputeTFIDF(): Promise<number>;
|
|
39
|
+
/**
|
|
40
|
+
* Start periodic indexing
|
|
41
|
+
*/
|
|
42
|
+
export declare function startPeriodicIndexing(intervalMs?: number): void;
|
|
43
|
+
/**
|
|
44
|
+
* Stop periodic indexing
|
|
45
|
+
*/
|
|
46
|
+
export declare function stopPeriodicIndexing(): void;
|
|
47
|
+
//# sourceMappingURL=memory-indexer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-indexer.d.ts","sourceRoot":"","sources":["../../src/lib/memory-indexer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAA;IACT,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAiHD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAuDrF;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAwBtD;AAKD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,GAAE,MAAc,GAAG,IAAI,CAYtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Indexer Module
|
|
3
|
+
*
|
|
4
|
+
* Indexes journal entries into the memory database.
|
|
5
|
+
* Runs periodically and on-demand to keep memory system up-to-date.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Automatic indexing of journal entries
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { insertMemory, isMemoryIndexed, setLastIndexTimestamp, getAllMemories } from './memory-db.js';
|
|
12
|
+
import { computeTFIDF, computeEmbedding } from './memory-search.js';
|
|
13
|
+
/**
|
|
14
|
+
* Parse a single journal file (JSONL format)
|
|
15
|
+
*/
|
|
16
|
+
async function parseJournalFile(filePath) {
|
|
17
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
18
|
+
const lines = content.split('\n').filter(line => line.trim());
|
|
19
|
+
const entries = [];
|
|
20
|
+
for (const line of lines) {
|
|
21
|
+
try {
|
|
22
|
+
const entry = JSON.parse(line);
|
|
23
|
+
entries.push(entry);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.error(`Failed to parse line in ${filePath}:`, error);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return entries;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get all journal files
|
|
33
|
+
*/
|
|
34
|
+
async function getJournalFiles() {
|
|
35
|
+
const journalDir = path.join(process.cwd(), '.jfl', 'journal');
|
|
36
|
+
if (!fs.existsSync(journalDir)) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
const files = fs.readdirSync(journalDir)
|
|
40
|
+
.filter(file => file.endsWith('.jsonl'))
|
|
41
|
+
.map(file => path.join(journalDir, file));
|
|
42
|
+
return files;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Extract full text content from journal entry
|
|
46
|
+
*/
|
|
47
|
+
function extractContent(entry) {
|
|
48
|
+
const parts = [
|
|
49
|
+
entry.title,
|
|
50
|
+
entry.summary || '',
|
|
51
|
+
entry.detail || '',
|
|
52
|
+
(entry.files || []).join(' '),
|
|
53
|
+
(entry.learned || []).join(' '),
|
|
54
|
+
entry.next || ''
|
|
55
|
+
];
|
|
56
|
+
return parts.filter(p => p).join('\n\n');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Index a single journal entry
|
|
60
|
+
*/
|
|
61
|
+
async function indexEntry(entry, allTexts) {
|
|
62
|
+
// Check if already indexed
|
|
63
|
+
if (await isMemoryIndexed(entry.session, entry.ts)) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
// Extract content
|
|
67
|
+
const content = extractContent(entry);
|
|
68
|
+
// Compute TF-IDF tokens
|
|
69
|
+
const tfIdfTokens = computeTFIDF(content, allTexts);
|
|
70
|
+
// Try to compute embedding (optional)
|
|
71
|
+
let embedding;
|
|
72
|
+
let embeddingModel;
|
|
73
|
+
try {
|
|
74
|
+
const result = await computeEmbedding(content);
|
|
75
|
+
if (result) {
|
|
76
|
+
embedding = result.embedding;
|
|
77
|
+
embeddingModel = result.model;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
// Embeddings are optional - continue without them
|
|
82
|
+
}
|
|
83
|
+
// Prepare metadata
|
|
84
|
+
const metadata = {
|
|
85
|
+
files: entry.files || [],
|
|
86
|
+
learned: entry.learned || [],
|
|
87
|
+
decision: entry.decision || null,
|
|
88
|
+
incomplete: entry.incomplete || [],
|
|
89
|
+
next: entry.next || null,
|
|
90
|
+
status: entry.status || null
|
|
91
|
+
};
|
|
92
|
+
// Insert into database
|
|
93
|
+
await insertMemory({
|
|
94
|
+
source: 'journal',
|
|
95
|
+
source_id: entry.session,
|
|
96
|
+
type: entry.type,
|
|
97
|
+
title: entry.title,
|
|
98
|
+
content,
|
|
99
|
+
summary: entry.summary,
|
|
100
|
+
metadata,
|
|
101
|
+
created_at: entry.ts,
|
|
102
|
+
embedding,
|
|
103
|
+
embedding_model: embeddingModel,
|
|
104
|
+
tf_idf_tokens: tfIdfTokens
|
|
105
|
+
});
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Index all journal entries
|
|
110
|
+
*/
|
|
111
|
+
export async function indexJournalEntries(force = false) {
|
|
112
|
+
const stats = {
|
|
113
|
+
added: 0,
|
|
114
|
+
updated: 0,
|
|
115
|
+
skipped: 0,
|
|
116
|
+
errors: 0
|
|
117
|
+
};
|
|
118
|
+
try {
|
|
119
|
+
// Get all journal files
|
|
120
|
+
const journalFiles = await getJournalFiles();
|
|
121
|
+
if (journalFiles.length === 0) {
|
|
122
|
+
return stats;
|
|
123
|
+
}
|
|
124
|
+
// Parse all entries
|
|
125
|
+
const allEntries = [];
|
|
126
|
+
for (const file of journalFiles) {
|
|
127
|
+
try {
|
|
128
|
+
const entries = await parseJournalFile(file);
|
|
129
|
+
allEntries.push(...entries);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
console.error(`Failed to parse ${file}:`, error);
|
|
133
|
+
stats.errors++;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Get all content for TF-IDF computation
|
|
137
|
+
const allTexts = allEntries.map(entry => extractContent(entry));
|
|
138
|
+
// Index each entry
|
|
139
|
+
for (const entry of allEntries) {
|
|
140
|
+
try {
|
|
141
|
+
const added = await indexEntry(entry, allTexts);
|
|
142
|
+
if (added) {
|
|
143
|
+
stats.added++;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
stats.skipped++;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
console.error(`Failed to index entry ${entry.title}:`, error);
|
|
151
|
+
stats.errors++;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Update last index timestamp
|
|
155
|
+
await setLastIndexTimestamp(new Date().toISOString());
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
console.error('Failed to index journal entries:', error);
|
|
159
|
+
stats.errors++;
|
|
160
|
+
}
|
|
161
|
+
return stats;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Recompute TF-IDF for all memories
|
|
165
|
+
* Used when corpus changes significantly
|
|
166
|
+
*/
|
|
167
|
+
export async function recomputeTFIDF() {
|
|
168
|
+
const memories = await getAllMemories();
|
|
169
|
+
if (memories.length === 0) {
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
const allTexts = memories.map((m) => m.content);
|
|
173
|
+
let updated = 0;
|
|
174
|
+
for (const memory of memories) {
|
|
175
|
+
try {
|
|
176
|
+
const tfIdfTokens = computeTFIDF(memory.content, allTexts);
|
|
177
|
+
// Update memory with new TF-IDF tokens
|
|
178
|
+
// Note: This would require an update function in memory-db
|
|
179
|
+
// For now, this is a placeholder
|
|
180
|
+
updated++;
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
console.error(`Failed to recompute TF-IDF for memory ${memory.id}:`, error);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return updated;
|
|
187
|
+
}
|
|
188
|
+
// Periodic indexing state
|
|
189
|
+
let indexingInterval = null;
|
|
190
|
+
/**
|
|
191
|
+
* Start periodic indexing
|
|
192
|
+
*/
|
|
193
|
+
export function startPeriodicIndexing(intervalMs = 60000) {
|
|
194
|
+
if (indexingInterval) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
indexingInterval = setInterval(async () => {
|
|
198
|
+
try {
|
|
199
|
+
await indexJournalEntries();
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
console.error('Periodic indexing failed:', error);
|
|
203
|
+
}
|
|
204
|
+
}, intervalMs);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Stop periodic indexing
|
|
208
|
+
*/
|
|
209
|
+
export function stopPeriodicIndexing() {
|
|
210
|
+
if (indexingInterval) {
|
|
211
|
+
clearInterval(indexingInterval);
|
|
212
|
+
indexingInterval = null;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=memory-indexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-indexer.js","sourceRoot":"","sources":["../../src/lib/memory-indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Search Module
|
|
3
|
+
*
|
|
4
|
+
* Hybrid search combining TF-IDF (fast, always available) and
|
|
5
|
+
* embeddings (semantic, optional). Provides relevance scoring
|
|
6
|
+
* and result ranking.
|
|
7
|
+
*
|
|
8
|
+
* @purpose Fast and semantic search across indexed memories
|
|
9
|
+
*/
|
|
10
|
+
import { Memory } from './memory-db.js';
|
|
11
|
+
export interface SearchResult {
|
|
12
|
+
memory: Memory;
|
|
13
|
+
score: number;
|
|
14
|
+
relevance: 'high' | 'medium' | 'low';
|
|
15
|
+
}
|
|
16
|
+
export interface SearchOptions {
|
|
17
|
+
maxItems?: number;
|
|
18
|
+
type?: string;
|
|
19
|
+
since?: string;
|
|
20
|
+
method?: 'tfidf' | 'embedding' | 'hybrid';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Compute TF-IDF scores for text
|
|
24
|
+
*/
|
|
25
|
+
export declare function computeTFIDF(text: string, allTexts: string[]): Record<string, number>;
|
|
26
|
+
/**
|
|
27
|
+
* Compute embedding for text using OpenAI
|
|
28
|
+
*/
|
|
29
|
+
declare function computeEmbedding(text: string): Promise<{
|
|
30
|
+
embedding: Float32Array;
|
|
31
|
+
model: string;
|
|
32
|
+
} | null>;
|
|
33
|
+
/**
|
|
34
|
+
* Main search function
|
|
35
|
+
*/
|
|
36
|
+
export declare function searchMemories(query: string, options?: SearchOptions): Promise<SearchResult[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Export compute embedding for use in indexer
|
|
39
|
+
*/
|
|
40
|
+
export { computeEmbedding };
|
|
41
|
+
//# sourceMappingURL=memory-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-search.d.ts","sourceRoot":"","sources":["../../src/lib/memory-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,MAAM,EAAwC,MAAM,gBAAgB,CAAA;AAE7E,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAA;CAC1C;AAcD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmCrF;AAgDD;;GAEG;AACH,iBAAe,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACrD,SAAS,EAAE,YAAY,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,IAAI,CAAC,CAwBR;AA8HD;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,EAAE,CAAC,CA4BzB;AAYD;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,CAAA"}
|