lettactl 0.1.1
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/LICENSE +21 -0
- package/README.md +606 -0
- package/dist/commands/apply.d.ts +6 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +337 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/create.d.ts +13 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +72 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +9 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +179 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/describe.d.ts +5 -0
- package/dist/commands/describe.d.ts.map +1 -0
- package/dist/commands/describe.js +121 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/export.d.ts +6 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +79 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/get.d.ts +5 -0
- package/dist/commands/get.d.ts.map +1 -0
- package/dist/commands/get.js +32 -0
- package/dist/commands/get.js.map +1 -0
- package/dist/commands/import.d.ts +10 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +94 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/messages.d.ts +21 -0
- package/dist/commands/messages.d.ts.map +1 -0
- package/dist/commands/messages.js +254 -0
- package/dist/commands/messages.js.map +1 -0
- package/dist/commands/update.d.ts +11 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +63 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +230 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agent-manager.d.ts +125 -0
- package/dist/lib/agent-manager.d.ts.map +1 -0
- package/dist/lib/agent-manager.js +254 -0
- package/dist/lib/agent-manager.js.map +1 -0
- package/dist/lib/agent-resolver.d.ts +12 -0
- package/dist/lib/agent-resolver.d.ts.map +1 -0
- package/dist/lib/agent-resolver.js +27 -0
- package/dist/lib/agent-resolver.js.map +1 -0
- package/dist/lib/block-manager.d.ts +63 -0
- package/dist/lib/block-manager.d.ts.map +1 -0
- package/dist/lib/block-manager.js +288 -0
- package/dist/lib/block-manager.js.map +1 -0
- package/dist/lib/diff-engine.d.ts +129 -0
- package/dist/lib/diff-engine.d.ts.map +1 -0
- package/dist/lib/diff-engine.js +391 -0
- package/dist/lib/diff-engine.js.map +1 -0
- package/dist/lib/error-handler.d.ts +9 -0
- package/dist/lib/error-handler.d.ts.map +1 -0
- package/dist/lib/error-handler.js +25 -0
- package/dist/lib/error-handler.js.map +1 -0
- package/dist/lib/file-content-tracker.d.ts +42 -0
- package/dist/lib/file-content-tracker.d.ts.map +1 -0
- package/dist/lib/file-content-tracker.js +128 -0
- package/dist/lib/file-content-tracker.js.map +1 -0
- package/dist/lib/fleet-parser.d.ts +14 -0
- package/dist/lib/fleet-parser.d.ts.map +1 -0
- package/dist/lib/fleet-parser.js +282 -0
- package/dist/lib/fleet-parser.js.map +1 -0
- package/dist/lib/letta-client.d.ts +61 -0
- package/dist/lib/letta-client.d.ts.map +1 -0
- package/dist/lib/letta-client.js +208 -0
- package/dist/lib/letta-client.js.map +1 -0
- package/dist/lib/output-formatter.d.ts +15 -0
- package/dist/lib/output-formatter.d.ts.map +1 -0
- package/dist/lib/output-formatter.js +51 -0
- package/dist/lib/output-formatter.js.map +1 -0
- package/dist/lib/resource-classifier.d.ts +27 -0
- package/dist/lib/resource-classifier.d.ts.map +1 -0
- package/dist/lib/resource-classifier.js +84 -0
- package/dist/lib/resource-classifier.js.map +1 -0
- package/dist/lib/response-normalizer.d.ts +6 -0
- package/dist/lib/response-normalizer.d.ts.map +1 -0
- package/dist/lib/response-normalizer.js +27 -0
- package/dist/lib/response-normalizer.js.map +1 -0
- package/dist/lib/validators.d.ts +9 -0
- package/dist/lib/validators.d.ts.map +1 -0
- package/dist/lib/validators.js +26 -0
- package/dist/lib/validators.js.map +1 -0
- package/dist/types/fleet-config.d.ts +44 -0
- package/dist/types/fleet-config.d.ts.map +1 -0
- package/dist/types/fleet-config.js +3 -0
- package/dist/types/fleet-config.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { LettaClientWrapper } from './letta-client';
|
|
2
|
+
export interface AgentConfigHashes {
|
|
3
|
+
overall: string;
|
|
4
|
+
systemPrompt: string;
|
|
5
|
+
tools: string;
|
|
6
|
+
model: string;
|
|
7
|
+
memoryBlocks: string;
|
|
8
|
+
folders: string;
|
|
9
|
+
sharedBlocks: string;
|
|
10
|
+
}
|
|
11
|
+
export interface AgentVersion {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
baseName: string;
|
|
15
|
+
configHashes: AgentConfigHashes;
|
|
16
|
+
version: string;
|
|
17
|
+
lastUpdated: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class AgentManager {
|
|
20
|
+
private client;
|
|
21
|
+
private agentRegistry;
|
|
22
|
+
constructor(client: LettaClientWrapper);
|
|
23
|
+
/**
|
|
24
|
+
* Generates a content hash for system prompt versioning
|
|
25
|
+
*/
|
|
26
|
+
private generateContentHash;
|
|
27
|
+
/**
|
|
28
|
+
* Generates a timestamp-based version for system prompt changes
|
|
29
|
+
*/
|
|
30
|
+
private generateTimestampVersion;
|
|
31
|
+
/**
|
|
32
|
+
* Parses version from agent name (e.g., "recipe-assistant__v__20241202-abc123ef")
|
|
33
|
+
*/
|
|
34
|
+
private parseVersionFromName;
|
|
35
|
+
/**
|
|
36
|
+
* Loads existing agents from the server and builds the registry
|
|
37
|
+
* Note: We only store basic info here. Full configuration comparison
|
|
38
|
+
* happens in getOrCreateAgentName when we have the desired config.
|
|
39
|
+
*/
|
|
40
|
+
loadExistingAgents(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Generates granular configuration hashes for each component
|
|
43
|
+
*/
|
|
44
|
+
private generateAgentConfigHashes;
|
|
45
|
+
/**
|
|
46
|
+
* Determines if an agent needs to be created/updated based on complete configuration
|
|
47
|
+
*/
|
|
48
|
+
getOrCreateAgentName(baseName: string, agentConfig: {
|
|
49
|
+
systemPrompt: string;
|
|
50
|
+
tools: string[];
|
|
51
|
+
toolSourceHashes?: Record<string, string>;
|
|
52
|
+
model?: string;
|
|
53
|
+
embedding?: string;
|
|
54
|
+
contextWindow?: number;
|
|
55
|
+
memoryBlocks?: Array<{
|
|
56
|
+
name: string;
|
|
57
|
+
description: string;
|
|
58
|
+
limit: number;
|
|
59
|
+
value: string;
|
|
60
|
+
}>;
|
|
61
|
+
memoryBlockFileHashes?: Record<string, string>;
|
|
62
|
+
folders?: Array<{
|
|
63
|
+
name: string;
|
|
64
|
+
files: string[];
|
|
65
|
+
}>;
|
|
66
|
+
sharedBlocks?: string[];
|
|
67
|
+
}, verbose?: boolean): Promise<{
|
|
68
|
+
agentName: string;
|
|
69
|
+
shouldCreate: boolean;
|
|
70
|
+
existingAgent?: AgentVersion;
|
|
71
|
+
}>;
|
|
72
|
+
/**
|
|
73
|
+
* Identifies what has changed between existing and desired agent configuration
|
|
74
|
+
*/
|
|
75
|
+
getConfigChanges(existing: AgentVersion, newConfig: {
|
|
76
|
+
systemPrompt: string;
|
|
77
|
+
tools: string[];
|
|
78
|
+
toolSourceHashes?: Record<string, string>;
|
|
79
|
+
model?: string;
|
|
80
|
+
embedding?: string;
|
|
81
|
+
contextWindow?: number;
|
|
82
|
+
memoryBlocks?: Array<{
|
|
83
|
+
name: string;
|
|
84
|
+
description: string;
|
|
85
|
+
limit: number;
|
|
86
|
+
value: string;
|
|
87
|
+
}>;
|
|
88
|
+
memoryBlockFileHashes?: Record<string, string>;
|
|
89
|
+
folders?: Array<{
|
|
90
|
+
name: string;
|
|
91
|
+
files: string[];
|
|
92
|
+
}>;
|
|
93
|
+
sharedBlocks?: string[];
|
|
94
|
+
}): {
|
|
95
|
+
hasChanges: boolean;
|
|
96
|
+
changedComponents: string[];
|
|
97
|
+
newHashes: AgentConfigHashes;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Updates the registry after creating a new agent
|
|
101
|
+
*/
|
|
102
|
+
updateRegistry(agentName: string, agentConfig: {
|
|
103
|
+
systemPrompt: string;
|
|
104
|
+
tools: string[];
|
|
105
|
+
model?: string;
|
|
106
|
+
embedding?: string;
|
|
107
|
+
contextWindow?: number;
|
|
108
|
+
memoryBlocks?: Array<{
|
|
109
|
+
name: string;
|
|
110
|
+
description: string;
|
|
111
|
+
limit: number;
|
|
112
|
+
value: string;
|
|
113
|
+
}>;
|
|
114
|
+
folders?: Array<{
|
|
115
|
+
name: string;
|
|
116
|
+
files: string[];
|
|
117
|
+
}>;
|
|
118
|
+
sharedBlocks?: string[];
|
|
119
|
+
}, agentId: string): void;
|
|
120
|
+
/**
|
|
121
|
+
* Gets all agents with the same base name (for cleanup/management)
|
|
122
|
+
*/
|
|
123
|
+
getAgentVersions(baseName: string): AgentVersion[];
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=agent-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-manager.d.ts","sourceRoot":"","sources":["../../src/lib/agent-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.AgentManager = void 0;
|
|
37
|
+
const response_normalizer_1 = require("./response-normalizer");
|
|
38
|
+
const crypto = __importStar(require("crypto"));
|
|
39
|
+
class AgentManager {
|
|
40
|
+
constructor(client) {
|
|
41
|
+
this.agentRegistry = new Map();
|
|
42
|
+
this.client = client;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Generates a content hash for system prompt versioning
|
|
46
|
+
*/
|
|
47
|
+
generateContentHash(content) {
|
|
48
|
+
return crypto.createHash('sha256').update(content).digest('hex').substring(0, 16);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generates a timestamp-based version for system prompt changes
|
|
52
|
+
*/
|
|
53
|
+
generateTimestampVersion(contentHash) {
|
|
54
|
+
const now = new Date();
|
|
55
|
+
const timestamp = now.toISOString().slice(0, 10).replace(/-/g, ''); // YYYYMMDD
|
|
56
|
+
const shortHash = contentHash.substring(0, 8);
|
|
57
|
+
return `${timestamp}-${shortHash}`;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Parses version from agent name (e.g., "recipe-assistant__v__20241202-abc123ef")
|
|
61
|
+
*/
|
|
62
|
+
parseVersionFromName(agentName) {
|
|
63
|
+
const versionMatch = agentName.match(/^(.+)__v__(.+)$/);
|
|
64
|
+
if (versionMatch) {
|
|
65
|
+
return { baseName: versionMatch[1], version: versionMatch[2] };
|
|
66
|
+
}
|
|
67
|
+
return { baseName: agentName, version: null };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Loads existing agents from the server and builds the registry
|
|
71
|
+
* Note: We only store basic info here. Full configuration comparison
|
|
72
|
+
* happens in getOrCreateAgentName when we have the desired config.
|
|
73
|
+
*/
|
|
74
|
+
async loadExistingAgents() {
|
|
75
|
+
const agents = await this.client.listAgents();
|
|
76
|
+
const agentList = (0, response_normalizer_1.normalizeResponse)(agents);
|
|
77
|
+
for (const agent of agentList) {
|
|
78
|
+
if (agent.name && agent.system) {
|
|
79
|
+
// For existing agents, store basic info for lookup
|
|
80
|
+
// Full configuration hashing will be done during comparison
|
|
81
|
+
const configHashes = {
|
|
82
|
+
overall: '', // Will be populated during comparison
|
|
83
|
+
systemPrompt: this.generateContentHash(agent.system),
|
|
84
|
+
tools: '',
|
|
85
|
+
model: '',
|
|
86
|
+
memoryBlocks: '',
|
|
87
|
+
folders: '',
|
|
88
|
+
sharedBlocks: ''
|
|
89
|
+
};
|
|
90
|
+
const { baseName, version } = this.parseVersionFromName(agent.name);
|
|
91
|
+
const agentVersion = {
|
|
92
|
+
id: agent.id,
|
|
93
|
+
name: agent.name,
|
|
94
|
+
baseName: baseName,
|
|
95
|
+
configHashes: configHashes,
|
|
96
|
+
version: version || 'latest',
|
|
97
|
+
lastUpdated: agent.last_updated || new Date().toISOString()
|
|
98
|
+
};
|
|
99
|
+
// Store by base name for lookup
|
|
100
|
+
const existingAgent = this.agentRegistry.get(baseName);
|
|
101
|
+
if (!existingAgent || agentVersion.lastUpdated > existingAgent.lastUpdated) {
|
|
102
|
+
this.agentRegistry.set(baseName, agentVersion);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Generates granular configuration hashes for each component
|
|
109
|
+
*/
|
|
110
|
+
generateAgentConfigHashes(config) {
|
|
111
|
+
// System prompt hash
|
|
112
|
+
const systemPromptHash = this.generateContentHash(config.systemPrompt);
|
|
113
|
+
// Tools hash - includes tool names and source code content when available
|
|
114
|
+
const toolsWithContent = (config.tools || []).map(toolName => ({
|
|
115
|
+
name: toolName,
|
|
116
|
+
sourceHash: config.toolSourceHashes?.[toolName] || ''
|
|
117
|
+
})).sort((a, b) => a.name.localeCompare(b.name));
|
|
118
|
+
const toolsHash = this.generateContentHash(JSON.stringify(toolsWithContent));
|
|
119
|
+
// Model configuration hash (model + embedding + context window)
|
|
120
|
+
const modelConfig = {
|
|
121
|
+
model: config.model || "google_ai/gemini-2.5-pro",
|
|
122
|
+
embedding: config.embedding || "letta/letta-free",
|
|
123
|
+
contextWindow: config.contextWindow || 64000
|
|
124
|
+
};
|
|
125
|
+
const modelHash = this.generateContentHash(JSON.stringify(modelConfig));
|
|
126
|
+
// Memory blocks hash - includes file content when available
|
|
127
|
+
const normalizedMemoryBlocks = (config.memoryBlocks || [])
|
|
128
|
+
.map(block => ({
|
|
129
|
+
name: block.name,
|
|
130
|
+
description: block.description,
|
|
131
|
+
limit: block.limit,
|
|
132
|
+
contentHash: config.memoryBlockFileHashes?.[block.name] || this.generateContentHash(block.value)
|
|
133
|
+
}))
|
|
134
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
135
|
+
const memoryBlocksHash = this.generateContentHash(JSON.stringify(normalizedMemoryBlocks));
|
|
136
|
+
// Folders hash - includes file contents when available
|
|
137
|
+
const normalizedFolders = (config.folders || [])
|
|
138
|
+
.map(folder => ({
|
|
139
|
+
name: folder.name,
|
|
140
|
+
files: [...folder.files].sort(),
|
|
141
|
+
fileContentHashes: folder.fileContentHashes || {}
|
|
142
|
+
}))
|
|
143
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
144
|
+
const foldersHash = this.generateContentHash(JSON.stringify(normalizedFolders));
|
|
145
|
+
// Shared blocks hash
|
|
146
|
+
const sharedBlocksHash = this.generateContentHash(JSON.stringify([...(config.sharedBlocks || [])].sort()));
|
|
147
|
+
// Overall hash combining all components
|
|
148
|
+
const overallHash = this.generateContentHash(JSON.stringify({
|
|
149
|
+
systemPrompt: systemPromptHash,
|
|
150
|
+
tools: toolsHash,
|
|
151
|
+
model: modelHash,
|
|
152
|
+
memoryBlocks: memoryBlocksHash,
|
|
153
|
+
folders: foldersHash,
|
|
154
|
+
sharedBlocks: sharedBlocksHash
|
|
155
|
+
}));
|
|
156
|
+
return {
|
|
157
|
+
overall: overallHash,
|
|
158
|
+
systemPrompt: systemPromptHash,
|
|
159
|
+
tools: toolsHash,
|
|
160
|
+
model: modelHash,
|
|
161
|
+
memoryBlocks: memoryBlocksHash,
|
|
162
|
+
folders: foldersHash,
|
|
163
|
+
sharedBlocks: sharedBlocksHash
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Determines if an agent needs to be created/updated based on complete configuration
|
|
168
|
+
*/
|
|
169
|
+
async getOrCreateAgentName(baseName, agentConfig, verbose = false) {
|
|
170
|
+
const desiredConfigHashes = this.generateAgentConfigHashes(agentConfig);
|
|
171
|
+
const existingAgent = this.agentRegistry.get(baseName);
|
|
172
|
+
if (!existingAgent) {
|
|
173
|
+
// No agent with this base name exists
|
|
174
|
+
if (verbose)
|
|
175
|
+
console.log(` No existing agent found for: ${baseName}`);
|
|
176
|
+
return {
|
|
177
|
+
agentName: baseName,
|
|
178
|
+
shouldCreate: true
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// For existing agents, we need to compare properly by generating current config hash
|
|
182
|
+
// from the server state. For now, we'll always prefer partial updates over recreation.
|
|
183
|
+
if (verbose)
|
|
184
|
+
console.log(` Found existing agent: ${existingAgent.name}, checking for changes...`);
|
|
185
|
+
// Always return existing agent to trigger partial update logic in apply command
|
|
186
|
+
// The actual comparison will happen in the DiffEngine
|
|
187
|
+
return {
|
|
188
|
+
agentName: existingAgent.name,
|
|
189
|
+
shouldCreate: false,
|
|
190
|
+
existingAgent
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Identifies what has changed between existing and desired agent configuration
|
|
195
|
+
*/
|
|
196
|
+
getConfigChanges(existing, newConfig) {
|
|
197
|
+
const newHashes = this.generateAgentConfigHashes(newConfig);
|
|
198
|
+
const changedComponents = [];
|
|
199
|
+
// Compare each component hash
|
|
200
|
+
if (existing.configHashes.systemPrompt !== newHashes.systemPrompt) {
|
|
201
|
+
changedComponents.push('systemPrompt');
|
|
202
|
+
}
|
|
203
|
+
if (existing.configHashes.tools !== newHashes.tools) {
|
|
204
|
+
changedComponents.push('tools');
|
|
205
|
+
}
|
|
206
|
+
if (existing.configHashes.model !== newHashes.model) {
|
|
207
|
+
changedComponents.push('model');
|
|
208
|
+
}
|
|
209
|
+
if (existing.configHashes.memoryBlocks !== newHashes.memoryBlocks) {
|
|
210
|
+
changedComponents.push('memoryBlocks');
|
|
211
|
+
}
|
|
212
|
+
if (existing.configHashes.folders !== newHashes.folders) {
|
|
213
|
+
changedComponents.push('folders');
|
|
214
|
+
}
|
|
215
|
+
if (existing.configHashes.sharedBlocks !== newHashes.sharedBlocks) {
|
|
216
|
+
changedComponents.push('sharedBlocks');
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
hasChanges: changedComponents.length > 0,
|
|
220
|
+
changedComponents,
|
|
221
|
+
newHashes
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Updates the registry after creating a new agent
|
|
226
|
+
*/
|
|
227
|
+
updateRegistry(agentName, agentConfig, agentId) {
|
|
228
|
+
const configHashes = this.generateAgentConfigHashes(agentConfig);
|
|
229
|
+
const { baseName, version } = this.parseVersionFromName(agentName);
|
|
230
|
+
const agentVersion = {
|
|
231
|
+
id: agentId,
|
|
232
|
+
name: agentName,
|
|
233
|
+
baseName: baseName,
|
|
234
|
+
configHashes: configHashes,
|
|
235
|
+
version: version || 'latest',
|
|
236
|
+
lastUpdated: new Date().toISOString()
|
|
237
|
+
};
|
|
238
|
+
this.agentRegistry.set(baseName, agentVersion);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Gets all agents with the same base name (for cleanup/management)
|
|
242
|
+
*/
|
|
243
|
+
getAgentVersions(baseName) {
|
|
244
|
+
const versions = [];
|
|
245
|
+
for (const agent of this.agentRegistry.values()) {
|
|
246
|
+
if (agent.baseName === baseName) {
|
|
247
|
+
versions.push(agent);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return versions.sort((a, b) => b.lastUpdated.localeCompare(a.lastUpdated));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
exports.AgentManager = AgentManager;
|
|
254
|
+
//# sourceMappingURL=agent-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-manager.js","sourceRoot":"","sources":["../../src/lib/agent-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { LettaClientWrapper } from './letta-client';
|
|
2
|
+
export declare class AgentResolver {
|
|
3
|
+
private client;
|
|
4
|
+
constructor(client: LettaClientWrapper);
|
|
5
|
+
findAgentByName(name: string): Promise<{
|
|
6
|
+
agent: any;
|
|
7
|
+
allAgents: any[];
|
|
8
|
+
}>;
|
|
9
|
+
getAllAgents(): Promise<any[]>;
|
|
10
|
+
getAgentWithDetails(agentId: string): Promise<any>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=agent-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-resolver.d.ts","sourceRoot":"","sources":["../../src/lib/agent-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,EAAE,kBAAkB;IAIhC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,GAAG,CAAC;QAAC,SAAS,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC;IAYxE,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAK9B,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAGzD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentResolver = void 0;
|
|
4
|
+
const response_normalizer_1 = require("./response-normalizer");
|
|
5
|
+
class AgentResolver {
|
|
6
|
+
constructor(client) {
|
|
7
|
+
this.client = client;
|
|
8
|
+
}
|
|
9
|
+
async findAgentByName(name) {
|
|
10
|
+
const agents = await this.client.listAgents();
|
|
11
|
+
const agentList = (0, response_normalizer_1.normalizeResponse)(agents);
|
|
12
|
+
const agent = agentList.find((a) => a.name === name);
|
|
13
|
+
if (!agent) {
|
|
14
|
+
throw new Error(`Agent "${name}" not found`);
|
|
15
|
+
}
|
|
16
|
+
return { agent, allAgents: agentList };
|
|
17
|
+
}
|
|
18
|
+
async getAllAgents() {
|
|
19
|
+
const agents = await this.client.listAgents();
|
|
20
|
+
return (0, response_normalizer_1.normalizeResponse)(agents);
|
|
21
|
+
}
|
|
22
|
+
async getAgentWithDetails(agentId) {
|
|
23
|
+
return await this.client.getAgent(agentId);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.AgentResolver = AgentResolver;
|
|
27
|
+
//# sourceMappingURL=agent-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-resolver.js","sourceRoot":"","sources":["../../src/lib/agent-resolver.ts"],"names":[],"mappings":";;;AACA,+DAA0D;AAE1D,MAAa,aAAa;IAGxB,YAAY,MAA0B;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAA,uCAAiB,EAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAE1D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC9C,OAAO,IAAA,uCAAiB,EAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,OAAe;QACvC,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;CACF;AA3BD,sCA2BC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { LettaClientWrapper } from './letta-client';
|
|
2
|
+
export interface BlockVersion {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
description: string;
|
|
6
|
+
value: string;
|
|
7
|
+
limit: number;
|
|
8
|
+
contentHash: string;
|
|
9
|
+
version: string;
|
|
10
|
+
isShared: boolean;
|
|
11
|
+
lastUpdated: string;
|
|
12
|
+
userDefined: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare class BlockManager {
|
|
15
|
+
private client;
|
|
16
|
+
private blockRegistry;
|
|
17
|
+
constructor(client: LettaClientWrapper);
|
|
18
|
+
/**
|
|
19
|
+
* Generates a content hash for version detection
|
|
20
|
+
*/
|
|
21
|
+
private generateContentHash;
|
|
22
|
+
/**
|
|
23
|
+
* Loads existing blocks from the server and builds the registry
|
|
24
|
+
*/
|
|
25
|
+
loadExistingBlocks(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Parses version string from block label (e.g., "block_name__v__20241202-a1b2c3d4" -> "20241202-a1b2c3d4")
|
|
28
|
+
*/
|
|
29
|
+
private parseVersionFromLabel;
|
|
30
|
+
/**
|
|
31
|
+
* Gets the registry key for a block
|
|
32
|
+
*/
|
|
33
|
+
private getBlockKey;
|
|
34
|
+
/**
|
|
35
|
+
* Generates a timestamp-based version string
|
|
36
|
+
*/
|
|
37
|
+
private generateTimestampVersion;
|
|
38
|
+
/**
|
|
39
|
+
* Validates and sanitizes user-defined version tags
|
|
40
|
+
*/
|
|
41
|
+
private validateUserVersion;
|
|
42
|
+
/**
|
|
43
|
+
* Creates a versioned block label
|
|
44
|
+
*/
|
|
45
|
+
private createVersionedLabel;
|
|
46
|
+
/**
|
|
47
|
+
* Gets or creates a shared block, with enhanced versioning support
|
|
48
|
+
*/
|
|
49
|
+
getOrCreateSharedBlock(blockConfig: any): Promise<string>;
|
|
50
|
+
/**
|
|
51
|
+
* Gets or creates an agent-specific block with enhanced versioning
|
|
52
|
+
*/
|
|
53
|
+
getOrCreateAgentBlock(blockConfig: any, agentName: string): Promise<string>;
|
|
54
|
+
/**
|
|
55
|
+
* Gets the shared block ID by name
|
|
56
|
+
*/
|
|
57
|
+
getSharedBlockId(blockName: string): string | null;
|
|
58
|
+
/**
|
|
59
|
+
* Lists all block versions for debugging/reporting
|
|
60
|
+
*/
|
|
61
|
+
getBlockRegistry(): Map<string, BlockVersion>;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=block-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-manager.d.ts","sourceRoot":"","sources":["../../src/lib/block-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIpD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAAmC;gBAE5C,MAAM,EAAE,kBAAkB;IAItC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BzC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAK7B;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAOhC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACG,sBAAsB,CAAC,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAqF/D;;OAEG;IACG,qBAAqB,CAAC,WAAW,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsFjF;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMlD;;OAEG;IACH,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;CAG9C"}
|