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,246 @@
|
|
|
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 OpenAI from 'openai';
|
|
11
|
+
import { getAllMemories, deserializeEmbedding } from './memory-db.js';
|
|
12
|
+
/**
|
|
13
|
+
* Tokenize text for TF-IDF
|
|
14
|
+
* Reused from Context Hub implementation
|
|
15
|
+
*/
|
|
16
|
+
function tokenize(text) {
|
|
17
|
+
return text
|
|
18
|
+
.toLowerCase()
|
|
19
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
20
|
+
.split(/\s+/)
|
|
21
|
+
.filter(token => token.length > 2);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Compute TF-IDF scores for text
|
|
25
|
+
*/
|
|
26
|
+
export function computeTFIDF(text, allTexts) {
|
|
27
|
+
const tokens = tokenize(text);
|
|
28
|
+
const tokenCounts = {};
|
|
29
|
+
// Term frequency
|
|
30
|
+
tokens.forEach(token => {
|
|
31
|
+
tokenCounts[token] = (tokenCounts[token] || 0) + 1;
|
|
32
|
+
});
|
|
33
|
+
const totalTokens = tokens.length;
|
|
34
|
+
const tf = {};
|
|
35
|
+
Object.keys(tokenCounts).forEach(token => {
|
|
36
|
+
tf[token] = tokenCounts[token] / totalTokens;
|
|
37
|
+
});
|
|
38
|
+
// Inverse document frequency
|
|
39
|
+
const idf = {};
|
|
40
|
+
const totalDocs = allTexts.length;
|
|
41
|
+
Object.keys(tf).forEach(token => {
|
|
42
|
+
const docsWithToken = allTexts.filter(doc => tokenize(doc).includes(token)).length;
|
|
43
|
+
idf[token] = Math.log(totalDocs / (docsWithToken + 1));
|
|
44
|
+
});
|
|
45
|
+
// TF-IDF
|
|
46
|
+
const tfidf = {};
|
|
47
|
+
Object.keys(tf).forEach(token => {
|
|
48
|
+
tfidf[token] = tf[token] * idf[token];
|
|
49
|
+
});
|
|
50
|
+
return tfidf;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Search memories using TF-IDF
|
|
54
|
+
*/
|
|
55
|
+
async function searchMemoriesTFIDF(query, memories, limit) {
|
|
56
|
+
const queryTokens = tokenize(query);
|
|
57
|
+
const scored = [];
|
|
58
|
+
for (const memory of memories) {
|
|
59
|
+
if (!memory.tf_idf_tokens)
|
|
60
|
+
continue;
|
|
61
|
+
const tfIdfTokens = JSON.parse(memory.tf_idf_tokens);
|
|
62
|
+
let score = 0;
|
|
63
|
+
for (const token of queryTokens) {
|
|
64
|
+
score += tfIdfTokens[token] || 0;
|
|
65
|
+
}
|
|
66
|
+
// Boost recent entries (1.3x if within 7 days)
|
|
67
|
+
const daysSinceCreated = daysBetween(memory.created_at, new Date().toISOString());
|
|
68
|
+
if (daysSinceCreated < 7) {
|
|
69
|
+
score *= 1.3;
|
|
70
|
+
}
|
|
71
|
+
// Boost by type
|
|
72
|
+
if (memory.type === 'decision')
|
|
73
|
+
score *= 1.4;
|
|
74
|
+
if (memory.type === 'feature')
|
|
75
|
+
score *= 1.2;
|
|
76
|
+
if (score > 0) {
|
|
77
|
+
scored.push({
|
|
78
|
+
memory,
|
|
79
|
+
score,
|
|
80
|
+
relevance: score > 0.7 ? 'high' : score > 0.4 ? 'medium' : 'low'
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Sort by score descending
|
|
85
|
+
scored.sort((a, b) => b.score - a.score);
|
|
86
|
+
return scored.slice(0, limit);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Compute embedding for text using OpenAI
|
|
90
|
+
*/
|
|
91
|
+
async function computeEmbedding(text) {
|
|
92
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
93
|
+
if (!apiKey) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const openai = new OpenAI({ apiKey });
|
|
98
|
+
const response = await openai.embeddings.create({
|
|
99
|
+
model: 'text-embedding-3-small',
|
|
100
|
+
input: text,
|
|
101
|
+
encoding_format: 'float'
|
|
102
|
+
});
|
|
103
|
+
return {
|
|
104
|
+
embedding: new Float32Array(response.data[0].embedding),
|
|
105
|
+
model: 'text-embedding-3-small'
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
console.error('Failed to compute embedding:', error);
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Cosine similarity between two vectors
|
|
115
|
+
*/
|
|
116
|
+
function cosineSimilarity(a, b) {
|
|
117
|
+
if (a.length !== b.length) {
|
|
118
|
+
throw new Error('Vectors must have same length');
|
|
119
|
+
}
|
|
120
|
+
let dotProduct = 0;
|
|
121
|
+
let normA = 0;
|
|
122
|
+
let normB = 0;
|
|
123
|
+
for (let i = 0; i < a.length; i++) {
|
|
124
|
+
dotProduct += a[i] * b[i];
|
|
125
|
+
normA += a[i] * a[i];
|
|
126
|
+
normB += b[i] * b[i];
|
|
127
|
+
}
|
|
128
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Search memories using embeddings
|
|
132
|
+
*/
|
|
133
|
+
async function searchMemoriesEmbedding(query, memories, limit) {
|
|
134
|
+
// Compute query embedding
|
|
135
|
+
const queryEmbedding = await computeEmbedding(query);
|
|
136
|
+
if (!queryEmbedding) {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
const scored = [];
|
|
140
|
+
for (const memory of memories) {
|
|
141
|
+
if (!memory.embedding)
|
|
142
|
+
continue;
|
|
143
|
+
const memoryEmbedding = deserializeEmbedding(memory.embedding);
|
|
144
|
+
const similarity = cosineSimilarity(queryEmbedding.embedding, memoryEmbedding);
|
|
145
|
+
if (similarity > 0.5) {
|
|
146
|
+
scored.push({
|
|
147
|
+
memory,
|
|
148
|
+
score: similarity,
|
|
149
|
+
relevance: similarity > 0.8 ? 'high' : similarity > 0.65 ? 'medium' : 'low'
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
scored.sort((a, b) => b.score - a.score);
|
|
154
|
+
return scored.slice(0, limit * 2); // Get more for merging
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Normalize scores to 0-1 range
|
|
158
|
+
*/
|
|
159
|
+
function normalizeScores(results) {
|
|
160
|
+
if (results.length === 0)
|
|
161
|
+
return [];
|
|
162
|
+
const maxScore = Math.max(...results.map(r => r.score));
|
|
163
|
+
const minScore = Math.min(...results.map(r => r.score));
|
|
164
|
+
const range = maxScore - minScore;
|
|
165
|
+
if (range === 0)
|
|
166
|
+
return results;
|
|
167
|
+
return results.map(r => ({
|
|
168
|
+
...r,
|
|
169
|
+
score: (r.score - minScore) / range
|
|
170
|
+
}));
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Hybrid search combining TF-IDF and embeddings
|
|
174
|
+
*/
|
|
175
|
+
async function searchMemoriesHybrid(query, memories, limit) {
|
|
176
|
+
// Run both searches in parallel
|
|
177
|
+
const [tfIdfResults, embeddingResults] = await Promise.all([
|
|
178
|
+
searchMemoriesTFIDF(query, memories, limit * 2),
|
|
179
|
+
searchMemoriesEmbedding(query, memories, limit * 2).catch(() => [])
|
|
180
|
+
]);
|
|
181
|
+
// Normalize scores
|
|
182
|
+
const tfIdfNormalized = normalizeScores(tfIdfResults);
|
|
183
|
+
const embeddingNormalized = normalizeScores(embeddingResults);
|
|
184
|
+
// Merge with weights (TF-IDF: 0.4, Embedding: 0.6)
|
|
185
|
+
const mergedScores = new Map();
|
|
186
|
+
for (const result of tfIdfNormalized) {
|
|
187
|
+
const memId = result.memory.id;
|
|
188
|
+
mergedScores.set(memId, (mergedScores.get(memId) || 0) + result.score * 0.4);
|
|
189
|
+
}
|
|
190
|
+
for (const result of embeddingNormalized) {
|
|
191
|
+
const memId = result.memory.id;
|
|
192
|
+
mergedScores.set(memId, (mergedScores.get(memId) || 0) + result.score * 0.6);
|
|
193
|
+
}
|
|
194
|
+
// Create final results
|
|
195
|
+
const memoryMap = new Map();
|
|
196
|
+
tfIdfResults.forEach(r => memoryMap.set(r.memory.id, r.memory));
|
|
197
|
+
embeddingResults.forEach(r => memoryMap.set(r.memory.id, r.memory));
|
|
198
|
+
const finalResults = Array.from(mergedScores.entries())
|
|
199
|
+
.map(([id, score]) => ({
|
|
200
|
+
memory: memoryMap.get(id),
|
|
201
|
+
score,
|
|
202
|
+
relevance: score > 0.7 ? 'high' : score > 0.4 ? 'medium' : 'low'
|
|
203
|
+
}))
|
|
204
|
+
.sort((a, b) => b.score - a.score)
|
|
205
|
+
.slice(0, limit);
|
|
206
|
+
return finalResults;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Main search function
|
|
210
|
+
*/
|
|
211
|
+
export async function searchMemories(query, options = {}) {
|
|
212
|
+
const { maxItems = 10, type, since, method = 'hybrid' } = options;
|
|
213
|
+
// Get all memories
|
|
214
|
+
let memories = await getAllMemories();
|
|
215
|
+
// Apply filters
|
|
216
|
+
if (type && type !== 'all') {
|
|
217
|
+
memories = memories.filter(m => m.type === type);
|
|
218
|
+
}
|
|
219
|
+
if (since) {
|
|
220
|
+
memories = memories.filter(m => m.created_at >= since);
|
|
221
|
+
}
|
|
222
|
+
// Search based on method
|
|
223
|
+
if (method === 'tfidf') {
|
|
224
|
+
return searchMemoriesTFIDF(query, memories, maxItems);
|
|
225
|
+
}
|
|
226
|
+
else if (method === 'embedding') {
|
|
227
|
+
return searchMemoriesEmbedding(query, memories, maxItems);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
return searchMemoriesHybrid(query, memories, maxItems);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Calculate days between two dates
|
|
235
|
+
*/
|
|
236
|
+
function daysBetween(date1, date2) {
|
|
237
|
+
const d1 = new Date(date1);
|
|
238
|
+
const d2 = new Date(date2);
|
|
239
|
+
const diff = Math.abs(d2.getTime() - d1.getTime());
|
|
240
|
+
return Math.floor(diff / (1000 * 60 * 60 * 24));
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Export compute embedding for use in indexer
|
|
244
|
+
*/
|
|
245
|
+
export { computeEmbedding };
|
|
246
|
+
//# sourceMappingURL=memory-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-search.js","sourceRoot":"","sources":["../../src/lib/memory-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Agent Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages the multi-GTM agent registry at ~/.config/jfl/openclaw-agents.json.
|
|
5
|
+
* Tracks which agents are registered, their GTM workspaces, and active sessions.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Multi-GTM agent registry management for OpenClaw protocol
|
|
8
|
+
* @spec specs/OPENCLAW_SPEC.md#5-multi-gtm-agent-registry
|
|
9
|
+
*/
|
|
10
|
+
export interface GtmRegistration {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
path: string;
|
|
14
|
+
default: boolean;
|
|
15
|
+
registered_at: string;
|
|
16
|
+
}
|
|
17
|
+
export interface AgentSession {
|
|
18
|
+
branch: string;
|
|
19
|
+
started_at: string;
|
|
20
|
+
worktree: string | null;
|
|
21
|
+
}
|
|
22
|
+
export interface AgentEntry {
|
|
23
|
+
id: string;
|
|
24
|
+
runtime: string;
|
|
25
|
+
manifest_path: string | null;
|
|
26
|
+
registered_gtms: GtmRegistration[];
|
|
27
|
+
active_gtm: string | null;
|
|
28
|
+
session: AgentSession | null;
|
|
29
|
+
}
|
|
30
|
+
export interface AgentRegistry {
|
|
31
|
+
version: string;
|
|
32
|
+
agents: Record<string, AgentEntry>;
|
|
33
|
+
}
|
|
34
|
+
export declare function getAgent(agentId: string): AgentEntry | null;
|
|
35
|
+
export declare function listAgents(): AgentEntry[];
|
|
36
|
+
export declare function ensureAgent(agentId: string, runtime?: string): AgentEntry;
|
|
37
|
+
export declare function setManifestPath(agentId: string, manifestPath: string): void;
|
|
38
|
+
export declare function registerGtm(agentId: string, gtmPath: string, gtmName: string, setDefault?: boolean): GtmRegistration;
|
|
39
|
+
export declare function getActiveGtm(agentId: string): GtmRegistration | null;
|
|
40
|
+
export declare function switchGtm(agentId: string, gtmId: string): GtmRegistration;
|
|
41
|
+
export declare function listGtms(agentId: string): GtmRegistration[];
|
|
42
|
+
export declare function removeGtm(agentId: string, gtmId: string): boolean;
|
|
43
|
+
export declare function updateSession(agentId: string, session: AgentSession | null): void;
|
|
44
|
+
export declare function getActiveSession(agentId: string): AgentSession | null;
|
|
45
|
+
export declare function clearSession(agentId: string): void;
|
|
46
|
+
export declare function removeAgent(agentId: string): boolean;
|
|
47
|
+
export declare function getRegistryPath(): string;
|
|
48
|
+
//# sourceMappingURL=openclaw-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-registry.d.ts","sourceRoot":"","sources":["../../src/lib/openclaw-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,eAAe,EAAE,eAAe,EAAE,CAAA;IAClC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,YAAY,GAAG,IAAI,CAAA;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;CACnC;AA8BD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAG3D;AAED,wBAAgB,UAAU,IAAI,UAAU,EAAE,CAGzC;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAiB,GAAG,UAAU,CAgBnF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAM3E;AAMD,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,OAAe,GAC1B,eAAe,CA2CjB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAKpE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAezE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,CAI3D;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAgBjE;AAMD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,GAAG,IAAI,GAC3B,IAAI,CASN;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAGrE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAMD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMpD;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Agent Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages the multi-GTM agent registry at ~/.config/jfl/openclaw-agents.json.
|
|
5
|
+
* Tracks which agents are registered, their GTM workspaces, and active sessions.
|
|
6
|
+
*
|
|
7
|
+
* @purpose Multi-GTM agent registry management for OpenClaw protocol
|
|
8
|
+
* @spec specs/OPENCLAW_SPEC.md#5-multi-gtm-agent-registry
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
11
|
+
import { join, dirname, basename } from "path";
|
|
12
|
+
import { JFL_PATHS } from "../utils/jfl-paths.js";
|
|
13
|
+
const REGISTRY_FILE = join(JFL_PATHS.config, "openclaw-agents.json");
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Registry I/O
|
|
16
|
+
// ============================================================================
|
|
17
|
+
function loadRegistry() {
|
|
18
|
+
if (!existsSync(REGISTRY_FILE)) {
|
|
19
|
+
return { version: "1.0", agents: {} };
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(readFileSync(REGISTRY_FILE, "utf-8"));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return { version: "1.0", agents: {} };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function saveRegistry(registry) {
|
|
29
|
+
const dir = dirname(REGISTRY_FILE);
|
|
30
|
+
if (!existsSync(dir)) {
|
|
31
|
+
mkdirSync(dir, { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
writeFileSync(REGISTRY_FILE, JSON.stringify(registry, null, 2) + "\n");
|
|
34
|
+
}
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// Agent Operations
|
|
37
|
+
// ============================================================================
|
|
38
|
+
export function getAgent(agentId) {
|
|
39
|
+
const registry = loadRegistry();
|
|
40
|
+
return registry.agents[agentId] || null;
|
|
41
|
+
}
|
|
42
|
+
export function listAgents() {
|
|
43
|
+
const registry = loadRegistry();
|
|
44
|
+
return Object.values(registry.agents);
|
|
45
|
+
}
|
|
46
|
+
export function ensureAgent(agentId, runtime = "custom") {
|
|
47
|
+
const registry = loadRegistry();
|
|
48
|
+
if (!registry.agents[agentId]) {
|
|
49
|
+
registry.agents[agentId] = {
|
|
50
|
+
id: agentId,
|
|
51
|
+
runtime,
|
|
52
|
+
manifest_path: null,
|
|
53
|
+
registered_gtms: [],
|
|
54
|
+
active_gtm: null,
|
|
55
|
+
session: null,
|
|
56
|
+
};
|
|
57
|
+
saveRegistry(registry);
|
|
58
|
+
}
|
|
59
|
+
return registry.agents[agentId];
|
|
60
|
+
}
|
|
61
|
+
export function setManifestPath(agentId, manifestPath) {
|
|
62
|
+
const registry = loadRegistry();
|
|
63
|
+
if (registry.agents[agentId]) {
|
|
64
|
+
registry.agents[agentId].manifest_path = manifestPath;
|
|
65
|
+
saveRegistry(registry);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// ============================================================================
|
|
69
|
+
// GTM Operations
|
|
70
|
+
// ============================================================================
|
|
71
|
+
export function registerGtm(agentId, gtmPath, gtmName, setDefault = false) {
|
|
72
|
+
const registry = loadRegistry();
|
|
73
|
+
const agent = registry.agents[agentId];
|
|
74
|
+
if (!agent) {
|
|
75
|
+
throw new Error(`Agent "${agentId}" not found in registry. Call ensureAgent() first.`);
|
|
76
|
+
}
|
|
77
|
+
const gtmId = basename(gtmPath).toLowerCase().replace(/[^a-z0-9-]/g, "-");
|
|
78
|
+
// Check if already registered
|
|
79
|
+
const existing = agent.registered_gtms.find((g) => g.path === gtmPath);
|
|
80
|
+
if (existing) {
|
|
81
|
+
if (setDefault) {
|
|
82
|
+
agent.registered_gtms.forEach((g) => (g.default = false));
|
|
83
|
+
existing.default = true;
|
|
84
|
+
}
|
|
85
|
+
saveRegistry(registry);
|
|
86
|
+
return existing;
|
|
87
|
+
}
|
|
88
|
+
// If first GTM or explicit default, mark as default
|
|
89
|
+
const isDefault = setDefault || agent.registered_gtms.length === 0;
|
|
90
|
+
if (isDefault) {
|
|
91
|
+
agent.registered_gtms.forEach((g) => (g.default = false));
|
|
92
|
+
}
|
|
93
|
+
const registration = {
|
|
94
|
+
id: gtmId,
|
|
95
|
+
name: gtmName,
|
|
96
|
+
path: gtmPath,
|
|
97
|
+
default: isDefault,
|
|
98
|
+
registered_at: new Date().toISOString(),
|
|
99
|
+
};
|
|
100
|
+
agent.registered_gtms.push(registration);
|
|
101
|
+
if (isDefault) {
|
|
102
|
+
agent.active_gtm = gtmId;
|
|
103
|
+
}
|
|
104
|
+
saveRegistry(registry);
|
|
105
|
+
return registration;
|
|
106
|
+
}
|
|
107
|
+
export function getActiveGtm(agentId) {
|
|
108
|
+
const agent = getAgent(agentId);
|
|
109
|
+
if (!agent || !agent.active_gtm)
|
|
110
|
+
return null;
|
|
111
|
+
return agent.registered_gtms.find((g) => g.id === agent.active_gtm) || null;
|
|
112
|
+
}
|
|
113
|
+
export function switchGtm(agentId, gtmId) {
|
|
114
|
+
const registry = loadRegistry();
|
|
115
|
+
const agent = registry.agents[agentId];
|
|
116
|
+
if (!agent) {
|
|
117
|
+
throw new Error(`Agent "${agentId}" not found in registry`);
|
|
118
|
+
}
|
|
119
|
+
const gtm = agent.registered_gtms.find((g) => g.id === gtmId);
|
|
120
|
+
if (!gtm) {
|
|
121
|
+
throw new Error(`GTM "${gtmId}" not registered for agent "${agentId}"`);
|
|
122
|
+
}
|
|
123
|
+
agent.active_gtm = gtmId;
|
|
124
|
+
saveRegistry(registry);
|
|
125
|
+
return gtm;
|
|
126
|
+
}
|
|
127
|
+
export function listGtms(agentId) {
|
|
128
|
+
const agent = getAgent(agentId);
|
|
129
|
+
if (!agent)
|
|
130
|
+
return [];
|
|
131
|
+
return agent.registered_gtms;
|
|
132
|
+
}
|
|
133
|
+
export function removeGtm(agentId, gtmId) {
|
|
134
|
+
const registry = loadRegistry();
|
|
135
|
+
const agent = registry.agents[agentId];
|
|
136
|
+
if (!agent)
|
|
137
|
+
return false;
|
|
138
|
+
const idx = agent.registered_gtms.findIndex((g) => g.id === gtmId);
|
|
139
|
+
if (idx === -1)
|
|
140
|
+
return false;
|
|
141
|
+
agent.registered_gtms.splice(idx, 1);
|
|
142
|
+
if (agent.active_gtm === gtmId) {
|
|
143
|
+
agent.active_gtm = agent.registered_gtms[0]?.id || null;
|
|
144
|
+
}
|
|
145
|
+
saveRegistry(registry);
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
// ============================================================================
|
|
149
|
+
// Session Operations
|
|
150
|
+
// ============================================================================
|
|
151
|
+
export function updateSession(agentId, session) {
|
|
152
|
+
const registry = loadRegistry();
|
|
153
|
+
const agent = registry.agents[agentId];
|
|
154
|
+
if (!agent) {
|
|
155
|
+
throw new Error(`Agent "${agentId}" not found in registry`);
|
|
156
|
+
}
|
|
157
|
+
agent.session = session;
|
|
158
|
+
saveRegistry(registry);
|
|
159
|
+
}
|
|
160
|
+
export function getActiveSession(agentId) {
|
|
161
|
+
const agent = getAgent(agentId);
|
|
162
|
+
return agent?.session || null;
|
|
163
|
+
}
|
|
164
|
+
export function clearSession(agentId) {
|
|
165
|
+
updateSession(agentId, null);
|
|
166
|
+
}
|
|
167
|
+
// ============================================================================
|
|
168
|
+
// Utility
|
|
169
|
+
// ============================================================================
|
|
170
|
+
export function removeAgent(agentId) {
|
|
171
|
+
const registry = loadRegistry();
|
|
172
|
+
if (!registry.agents[agentId])
|
|
173
|
+
return false;
|
|
174
|
+
delete registry.agents[agentId];
|
|
175
|
+
saveRegistry(registry);
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
export function getRegistryPath() {
|
|
179
|
+
return REGISTRY_FILE;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=openclaw-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-registry.js","sourceRoot":"","sources":["../../src/lib/openclaw-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw TypeScript SDK
|
|
3
|
+
*
|
|
4
|
+
* Thin wrapper around Context Hub HTTP API and direct file I/O.
|
|
5
|
+
* For Node.js agent runtimes (Clawdbot, custom) that prefer imports over shell-outs.
|
|
6
|
+
*
|
|
7
|
+
* Primary path: HTTP to Context Hub (fast, no process spawn).
|
|
8
|
+
* Fallback: Shell out to `jfl openclaw` commands.
|
|
9
|
+
*
|
|
10
|
+
* @purpose Runtime-agnostic SDK for OpenClaw agent protocol
|
|
11
|
+
* @spec specs/OPENCLAW_SPEC.md
|
|
12
|
+
*/
|
|
13
|
+
export interface OpenClawConfig {
|
|
14
|
+
agentId: string;
|
|
15
|
+
hubUrl?: string;
|
|
16
|
+
gtmPath?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SessionInfo {
|
|
19
|
+
session_id: string;
|
|
20
|
+
branch: string;
|
|
21
|
+
gtm_path: string;
|
|
22
|
+
gtm_name: string;
|
|
23
|
+
context_hub: {
|
|
24
|
+
url: string;
|
|
25
|
+
healthy: boolean;
|
|
26
|
+
};
|
|
27
|
+
auto_commit: {
|
|
28
|
+
running: boolean;
|
|
29
|
+
interval: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export interface HealthStatus {
|
|
33
|
+
healthy: boolean;
|
|
34
|
+
context_hub: boolean;
|
|
35
|
+
uncommitted_changes: boolean;
|
|
36
|
+
last_commit: string | null;
|
|
37
|
+
session_duration_seconds: number;
|
|
38
|
+
}
|
|
39
|
+
export interface ContextItem {
|
|
40
|
+
source: string;
|
|
41
|
+
type: string;
|
|
42
|
+
title: string;
|
|
43
|
+
content: string;
|
|
44
|
+
path?: string;
|
|
45
|
+
relevance?: number;
|
|
46
|
+
}
|
|
47
|
+
export interface MemoryResult {
|
|
48
|
+
id: string;
|
|
49
|
+
title: string;
|
|
50
|
+
summary: string;
|
|
51
|
+
type: string;
|
|
52
|
+
ts: string;
|
|
53
|
+
relevance: string;
|
|
54
|
+
score: number;
|
|
55
|
+
}
|
|
56
|
+
export interface JournalEntry {
|
|
57
|
+
v: number;
|
|
58
|
+
ts: string;
|
|
59
|
+
session: string;
|
|
60
|
+
type: "feature" | "fix" | "decision" | "milestone" | "spec" | "discovery";
|
|
61
|
+
status?: "complete" | "incomplete" | "blocked";
|
|
62
|
+
title: string;
|
|
63
|
+
summary: string;
|
|
64
|
+
detail?: string;
|
|
65
|
+
files?: string[];
|
|
66
|
+
decision?: string;
|
|
67
|
+
incomplete?: string[];
|
|
68
|
+
next?: string;
|
|
69
|
+
learned?: string[];
|
|
70
|
+
}
|
|
71
|
+
export interface GtmInfo {
|
|
72
|
+
id: string;
|
|
73
|
+
name: string;
|
|
74
|
+
path: string;
|
|
75
|
+
default: boolean;
|
|
76
|
+
registered_at: string;
|
|
77
|
+
}
|
|
78
|
+
export interface ServiceInfo {
|
|
79
|
+
name: string;
|
|
80
|
+
path: string;
|
|
81
|
+
type: string;
|
|
82
|
+
status: string;
|
|
83
|
+
}
|
|
84
|
+
export declare class OpenClawClient {
|
|
85
|
+
private agentId;
|
|
86
|
+
private hubUrl;
|
|
87
|
+
private gtmPath;
|
|
88
|
+
private http;
|
|
89
|
+
private sessionId;
|
|
90
|
+
constructor(config: OpenClawConfig);
|
|
91
|
+
sessionStart(gtmPath?: string): Promise<SessionInfo>;
|
|
92
|
+
sessionEnd(sync?: boolean): Promise<void>;
|
|
93
|
+
heartbeat(): Promise<HealthStatus>;
|
|
94
|
+
getContext(query?: string, taskType?: string): Promise<ContextItem[]>;
|
|
95
|
+
searchMemory(query: string, type?: string): Promise<MemoryResult[]>;
|
|
96
|
+
writeJournal(entry: Partial<JournalEntry>): Promise<void>;
|
|
97
|
+
listGtms(): Promise<GtmInfo[]>;
|
|
98
|
+
switchGtm(gtmId: string): Promise<void>;
|
|
99
|
+
createGtm(name: string, path?: string): Promise<string>;
|
|
100
|
+
tagService(name: string, message: string): Promise<void>;
|
|
101
|
+
listServices(): Promise<ServiceInfo[]>;
|
|
102
|
+
private cli;
|
|
103
|
+
private getAuthHeaders;
|
|
104
|
+
private resolveGtmPath;
|
|
105
|
+
private getCurrentSessionBranch;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=openclaw-sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-sdk.d.ts","sourceRoot":"","sources":["../../src/lib/openclaw-sdk.ts"],"names":[],"mappings":"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"}
|