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.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +606 -0
  3. package/dist/commands/apply.d.ts +6 -0
  4. package/dist/commands/apply.d.ts.map +1 -0
  5. package/dist/commands/apply.js +337 -0
  6. package/dist/commands/apply.js.map +1 -0
  7. package/dist/commands/create.d.ts +13 -0
  8. package/dist/commands/create.d.ts.map +1 -0
  9. package/dist/commands/create.js +72 -0
  10. package/dist/commands/create.js.map +1 -0
  11. package/dist/commands/delete.d.ts +9 -0
  12. package/dist/commands/delete.d.ts.map +1 -0
  13. package/dist/commands/delete.js +179 -0
  14. package/dist/commands/delete.js.map +1 -0
  15. package/dist/commands/describe.d.ts +5 -0
  16. package/dist/commands/describe.d.ts.map +1 -0
  17. package/dist/commands/describe.js +121 -0
  18. package/dist/commands/describe.js.map +1 -0
  19. package/dist/commands/export.d.ts +6 -0
  20. package/dist/commands/export.d.ts.map +1 -0
  21. package/dist/commands/export.js +79 -0
  22. package/dist/commands/export.js.map +1 -0
  23. package/dist/commands/get.d.ts +5 -0
  24. package/dist/commands/get.d.ts.map +1 -0
  25. package/dist/commands/get.js +32 -0
  26. package/dist/commands/get.js.map +1 -0
  27. package/dist/commands/import.d.ts +10 -0
  28. package/dist/commands/import.d.ts.map +1 -0
  29. package/dist/commands/import.js +94 -0
  30. package/dist/commands/import.js.map +1 -0
  31. package/dist/commands/messages.d.ts +21 -0
  32. package/dist/commands/messages.d.ts.map +1 -0
  33. package/dist/commands/messages.js +254 -0
  34. package/dist/commands/messages.js.map +1 -0
  35. package/dist/commands/update.d.ts +11 -0
  36. package/dist/commands/update.d.ts.map +1 -0
  37. package/dist/commands/update.js +63 -0
  38. package/dist/commands/update.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +230 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/lib/agent-manager.d.ts +125 -0
  44. package/dist/lib/agent-manager.d.ts.map +1 -0
  45. package/dist/lib/agent-manager.js +254 -0
  46. package/dist/lib/agent-manager.js.map +1 -0
  47. package/dist/lib/agent-resolver.d.ts +12 -0
  48. package/dist/lib/agent-resolver.d.ts.map +1 -0
  49. package/dist/lib/agent-resolver.js +27 -0
  50. package/dist/lib/agent-resolver.js.map +1 -0
  51. package/dist/lib/block-manager.d.ts +63 -0
  52. package/dist/lib/block-manager.d.ts.map +1 -0
  53. package/dist/lib/block-manager.js +288 -0
  54. package/dist/lib/block-manager.js.map +1 -0
  55. package/dist/lib/diff-engine.d.ts +129 -0
  56. package/dist/lib/diff-engine.d.ts.map +1 -0
  57. package/dist/lib/diff-engine.js +391 -0
  58. package/dist/lib/diff-engine.js.map +1 -0
  59. package/dist/lib/error-handler.d.ts +9 -0
  60. package/dist/lib/error-handler.d.ts.map +1 -0
  61. package/dist/lib/error-handler.js +25 -0
  62. package/dist/lib/error-handler.js.map +1 -0
  63. package/dist/lib/file-content-tracker.d.ts +42 -0
  64. package/dist/lib/file-content-tracker.d.ts.map +1 -0
  65. package/dist/lib/file-content-tracker.js +128 -0
  66. package/dist/lib/file-content-tracker.js.map +1 -0
  67. package/dist/lib/fleet-parser.d.ts +14 -0
  68. package/dist/lib/fleet-parser.d.ts.map +1 -0
  69. package/dist/lib/fleet-parser.js +282 -0
  70. package/dist/lib/fleet-parser.js.map +1 -0
  71. package/dist/lib/letta-client.d.ts +61 -0
  72. package/dist/lib/letta-client.d.ts.map +1 -0
  73. package/dist/lib/letta-client.js +208 -0
  74. package/dist/lib/letta-client.js.map +1 -0
  75. package/dist/lib/output-formatter.d.ts +15 -0
  76. package/dist/lib/output-formatter.d.ts.map +1 -0
  77. package/dist/lib/output-formatter.js +51 -0
  78. package/dist/lib/output-formatter.js.map +1 -0
  79. package/dist/lib/resource-classifier.d.ts +27 -0
  80. package/dist/lib/resource-classifier.d.ts.map +1 -0
  81. package/dist/lib/resource-classifier.js +84 -0
  82. package/dist/lib/resource-classifier.js.map +1 -0
  83. package/dist/lib/response-normalizer.d.ts +6 -0
  84. package/dist/lib/response-normalizer.d.ts.map +1 -0
  85. package/dist/lib/response-normalizer.js +27 -0
  86. package/dist/lib/response-normalizer.js.map +1 -0
  87. package/dist/lib/validators.d.ts +9 -0
  88. package/dist/lib/validators.d.ts.map +1 -0
  89. package/dist/lib/validators.js +26 -0
  90. package/dist/lib/validators.js.map +1 -0
  91. package/dist/types/fleet-config.d.ts +44 -0
  92. package/dist/types/fleet-config.d.ts.map +1 -0
  93. package/dist/types/fleet-config.js +3 -0
  94. package/dist/types/fleet-config.js.map +1 -0
  95. package/package.json +61 -0
@@ -0,0 +1,288 @@
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.BlockManager = void 0;
37
+ const response_normalizer_1 = require("./response-normalizer");
38
+ const crypto = __importStar(require("crypto"));
39
+ class BlockManager {
40
+ constructor(client) {
41
+ this.blockRegistry = new Map();
42
+ this.client = client;
43
+ }
44
+ /**
45
+ * Generates a content hash for version detection
46
+ */
47
+ generateContentHash(content) {
48
+ return crypto.createHash('sha256').update(content).digest('hex').substring(0, 16);
49
+ }
50
+ /**
51
+ * Loads existing blocks from the server and builds the registry
52
+ */
53
+ async loadExistingBlocks() {
54
+ const blocks = await this.client.listBlocks();
55
+ const blockList = (0, response_normalizer_1.normalizeResponse)(blocks);
56
+ for (const block of blockList) {
57
+ if (block.label && block.value) {
58
+ const contentHash = this.generateContentHash(block.value);
59
+ const version = this.parseVersionFromLabel(block.label);
60
+ const isShared = block.label.startsWith('shared_');
61
+ const blockVersion = {
62
+ id: block.id,
63
+ label: block.label,
64
+ description: block.description || '',
65
+ value: block.value,
66
+ limit: block.limit || 0,
67
+ contentHash,
68
+ version,
69
+ isShared,
70
+ lastUpdated: block.updated_at || new Date().toISOString(),
71
+ userDefined: false // We can't know if existing blocks had user-defined versions
72
+ };
73
+ this.blockRegistry.set(this.getBlockKey(block.label, isShared), blockVersion);
74
+ }
75
+ }
76
+ }
77
+ /**
78
+ * Parses version string from block label (e.g., "block_name__v__20241202-a1b2c3d4" -> "20241202-a1b2c3d4")
79
+ */
80
+ parseVersionFromLabel(label) {
81
+ const versionMatch = label.match(/__v__(.+)$/);
82
+ return versionMatch ? versionMatch[1] : 'initial';
83
+ }
84
+ /**
85
+ * Gets the registry key for a block
86
+ */
87
+ getBlockKey(baseName, isShared) {
88
+ const cleanName = baseName.replace(/__v__.+$/, ''); // Remove version suffix
89
+ return isShared ? `shared:${cleanName}` : cleanName;
90
+ }
91
+ /**
92
+ * Generates a timestamp-based version string
93
+ */
94
+ generateTimestampVersion(contentHash) {
95
+ const now = new Date();
96
+ const timestamp = now.toISOString().slice(0, 10).replace(/-/g, ''); // YYYYMMDD
97
+ const shortHash = contentHash.substring(0, 8);
98
+ return `${timestamp}-${shortHash}`;
99
+ }
100
+ /**
101
+ * Validates and sanitizes user-defined version tags
102
+ */
103
+ validateUserVersion(version) {
104
+ // Remove spaces, convert to lowercase, replace invalid chars with dashes
105
+ return version.trim().toLowerCase().replace(/[^a-z0-9.-]/g, '-');
106
+ }
107
+ /**
108
+ * Creates a versioned block label
109
+ */
110
+ createVersionedLabel(baseName, version, isFirstVersion = false) {
111
+ return isFirstVersion && version === 'initial' ? baseName : `${baseName}__v__${version}`;
112
+ }
113
+ /**
114
+ * Gets or creates a shared block, with enhanced versioning support
115
+ */
116
+ async getOrCreateSharedBlock(blockConfig) {
117
+ const blockKey = this.getBlockKey(blockConfig.name, true);
118
+ const contentHash = this.generateContentHash(blockConfig.value);
119
+ const existing = this.blockRegistry.get(blockKey);
120
+ // Determine version strategy
121
+ let newVersion;
122
+ let userDefined = false;
123
+ if (blockConfig.version) {
124
+ newVersion = this.validateUserVersion(blockConfig.version);
125
+ userDefined = true;
126
+ }
127
+ else {
128
+ newVersion = existing ? this.generateTimestampVersion(contentHash) : 'initial';
129
+ }
130
+ if (existing) {
131
+ // Check if content has changed or user wants a specific version
132
+ if (existing.contentHash === contentHash && !blockConfig.version) {
133
+ console.log(`Using existing shared block: ${existing.label}`);
134
+ return existing.id;
135
+ }
136
+ else {
137
+ // Content changed or user specified version
138
+ const newLabel = this.createVersionedLabel(blockConfig.name, newVersion);
139
+ const reason = blockConfig.version
140
+ ? `user tagged as '${newVersion}'`
141
+ : `content changed (${newVersion})`;
142
+ console.log(`Creating shared block ${newLabel} (${reason}, was ${existing.label})`);
143
+ const newBlock = await this.client.createBlock({
144
+ label: newLabel,
145
+ description: blockConfig.description,
146
+ value: blockConfig.value,
147
+ limit: blockConfig.limit
148
+ });
149
+ const blockVersion = {
150
+ id: newBlock.id,
151
+ label: newLabel,
152
+ description: blockConfig.description,
153
+ value: blockConfig.value,
154
+ limit: blockConfig.limit,
155
+ contentHash,
156
+ version: newVersion,
157
+ isShared: true,
158
+ lastUpdated: new Date().toISOString(),
159
+ userDefined
160
+ };
161
+ this.blockRegistry.set(blockKey, blockVersion);
162
+ return newBlock.id;
163
+ }
164
+ }
165
+ else {
166
+ // Create new shared block
167
+ const isFirstVersion = newVersion === 'initial';
168
+ const newLabel = this.createVersionedLabel(blockConfig.name, newVersion, isFirstVersion);
169
+ console.log(`Creating new shared block: ${newLabel}${userDefined ? ` (tagged: ${newVersion})` : ''}`);
170
+ const newBlock = await this.client.createBlock({
171
+ label: newLabel,
172
+ description: blockConfig.description,
173
+ value: blockConfig.value,
174
+ limit: blockConfig.limit
175
+ });
176
+ const blockVersion = {
177
+ id: newBlock.id,
178
+ label: newLabel,
179
+ description: blockConfig.description,
180
+ value: blockConfig.value,
181
+ limit: blockConfig.limit,
182
+ contentHash,
183
+ version: newVersion,
184
+ isShared: true,
185
+ lastUpdated: new Date().toISOString(),
186
+ userDefined
187
+ };
188
+ this.blockRegistry.set(blockKey, blockVersion);
189
+ return newBlock.id;
190
+ }
191
+ }
192
+ /**
193
+ * Gets or creates an agent-specific block with enhanced versioning
194
+ */
195
+ async getOrCreateAgentBlock(blockConfig, agentName) {
196
+ const fullBlockName = `${blockConfig.name}`;
197
+ const blockKey = this.getBlockKey(fullBlockName, false);
198
+ const contentHash = this.generateContentHash(blockConfig.value);
199
+ const existing = this.blockRegistry.get(blockKey);
200
+ // Determine version strategy
201
+ let newVersion;
202
+ let userDefined = false;
203
+ if (blockConfig.version) {
204
+ newVersion = this.validateUserVersion(blockConfig.version);
205
+ userDefined = true;
206
+ }
207
+ else {
208
+ newVersion = existing ? this.generateTimestampVersion(contentHash) : 'initial';
209
+ }
210
+ if (existing) {
211
+ // Check if content has changed or user wants a specific version
212
+ if (existing.contentHash === contentHash && !blockConfig.version) {
213
+ console.log(`Using existing block: ${existing.label}`);
214
+ return existing.id;
215
+ }
216
+ else {
217
+ // Content changed or user specified version
218
+ const newLabel = this.createVersionedLabel(fullBlockName, newVersion);
219
+ const reason = blockConfig.version
220
+ ? `user tagged as '${newVersion}'`
221
+ : `content changed (${newVersion})`;
222
+ console.log(`Creating block ${newLabel} (${reason}, was ${existing.label})`);
223
+ const newBlock = await this.client.createBlock({
224
+ label: newLabel,
225
+ description: blockConfig.description,
226
+ value: blockConfig.value,
227
+ limit: blockConfig.limit
228
+ });
229
+ const blockVersion = {
230
+ id: newBlock.id,
231
+ label: newLabel,
232
+ description: blockConfig.description,
233
+ value: blockConfig.value,
234
+ limit: blockConfig.limit,
235
+ contentHash,
236
+ version: newVersion,
237
+ isShared: false,
238
+ lastUpdated: new Date().toISOString(),
239
+ userDefined
240
+ };
241
+ this.blockRegistry.set(blockKey, blockVersion);
242
+ return newBlock.id;
243
+ }
244
+ }
245
+ else {
246
+ // Create new agent block
247
+ const isFirstVersion = newVersion === 'initial';
248
+ const newLabel = this.createVersionedLabel(fullBlockName, newVersion, isFirstVersion);
249
+ console.log(`Creating new block: ${newLabel}${userDefined ? ` (tagged: ${newVersion})` : ''}`);
250
+ const newBlock = await this.client.createBlock({
251
+ label: newLabel,
252
+ description: blockConfig.description,
253
+ value: blockConfig.value,
254
+ limit: blockConfig.limit
255
+ });
256
+ const blockVersion = {
257
+ id: newBlock.id,
258
+ label: newLabel,
259
+ description: blockConfig.description,
260
+ value: blockConfig.value,
261
+ limit: blockConfig.limit,
262
+ contentHash,
263
+ version: newVersion,
264
+ isShared: false,
265
+ lastUpdated: new Date().toISOString(),
266
+ userDefined
267
+ };
268
+ this.blockRegistry.set(blockKey, blockVersion);
269
+ return newBlock.id;
270
+ }
271
+ }
272
+ /**
273
+ * Gets the shared block ID by name
274
+ */
275
+ getSharedBlockId(blockName) {
276
+ const blockKey = this.getBlockKey(blockName, true);
277
+ const existing = this.blockRegistry.get(blockKey);
278
+ return existing ? existing.id : null;
279
+ }
280
+ /**
281
+ * Lists all block versions for debugging/reporting
282
+ */
283
+ getBlockRegistry() {
284
+ return new Map(this.blockRegistry);
285
+ }
286
+ }
287
+ exports.BlockManager = BlockManager;
288
+ //# sourceMappingURL=block-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-manager.js","sourceRoot":"","sources":["../../src/lib/block-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ import { LettaClientWrapper } from './letta-client';
2
+ import { AgentVersion } from './agent-manager';
3
+ import { BlockManager } from './block-manager';
4
+ export interface ToolDiff {
5
+ toAdd: Array<{
6
+ name: string;
7
+ id: string;
8
+ }>;
9
+ toRemove: Array<{
10
+ name: string;
11
+ id: string;
12
+ }>;
13
+ toUpdate: Array<{
14
+ name: string;
15
+ currentId: string;
16
+ newId: string;
17
+ reason: string;
18
+ }>;
19
+ unchanged: Array<{
20
+ name: string;
21
+ id: string;
22
+ }>;
23
+ }
24
+ export interface BlockDiff {
25
+ toAdd: Array<{
26
+ name: string;
27
+ id: string;
28
+ }>;
29
+ toRemove: Array<{
30
+ name: string;
31
+ id: string;
32
+ }>;
33
+ toUpdate: Array<{
34
+ name: string;
35
+ currentId: string;
36
+ newId: string;
37
+ }>;
38
+ unchanged: Array<{
39
+ name: string;
40
+ id: string;
41
+ }>;
42
+ }
43
+ export interface FolderDiff {
44
+ toAttach: Array<{
45
+ name: string;
46
+ id: string;
47
+ }>;
48
+ toDetach: Array<{
49
+ name: string;
50
+ id: string;
51
+ }>;
52
+ toUpdate: Array<{
53
+ name: string;
54
+ id: string;
55
+ filesToAdd: string[];
56
+ filesToRemove: string[];
57
+ filesToUpdate: string[];
58
+ }>;
59
+ unchanged: Array<{
60
+ name: string;
61
+ id: string;
62
+ }>;
63
+ }
64
+ export interface AgentUpdateOperations {
65
+ updateFields?: {
66
+ systemPrompt?: string;
67
+ model?: string;
68
+ embedding?: string;
69
+ contextWindow?: number;
70
+ };
71
+ tools?: ToolDiff;
72
+ blocks?: BlockDiff;
73
+ folders?: FolderDiff;
74
+ preservesConversation: boolean;
75
+ operationCount: number;
76
+ }
77
+ /**
78
+ * DiffEngine determines what specific operations are needed to update an agent
79
+ * while preserving conversation history whenever possible
80
+ */
81
+ export declare class DiffEngine {
82
+ private client;
83
+ private blockManager;
84
+ private basePath;
85
+ constructor(client: LettaClientWrapper, blockManager: BlockManager, basePath?: string);
86
+ /**
87
+ * Analyzes differences between existing and desired agent configuration
88
+ * and generates specific update operations that preserve conversation history
89
+ */
90
+ generateUpdateOperations(existingAgent: AgentVersion, desiredConfig: {
91
+ systemPrompt: string;
92
+ tools: string[];
93
+ toolSourceHashes?: Record<string, string>;
94
+ model?: string;
95
+ embedding?: string;
96
+ contextWindow?: number;
97
+ memoryBlocks?: Array<{
98
+ name: string;
99
+ description: string;
100
+ limit: number;
101
+ value: string;
102
+ }>;
103
+ folders?: Array<{
104
+ name: string;
105
+ files: string[];
106
+ }>;
107
+ sharedBlocks?: string[];
108
+ }, toolRegistry: Map<string, string>, folderRegistry: Map<string, string>, verbose?: boolean): Promise<AgentUpdateOperations>;
109
+ private analyzeToolChanges;
110
+ private analyzeBlockChanges;
111
+ private analyzeFolderChanges;
112
+ /**
113
+ * Applies the update operations to the agent
114
+ */
115
+ applyUpdateOperations(agentId: string, operations: AgentUpdateOperations, verbose?: boolean): Promise<void>;
116
+ /**
117
+ * Helper method to add a file to an existing folder
118
+ */
119
+ private addFileToFolder;
120
+ /**
121
+ * Helper method to remove a file from a folder
122
+ */
123
+ private removeFileFromFolder;
124
+ /**
125
+ * Helper method to update an existing file in a folder
126
+ */
127
+ private updateFileInFolder;
128
+ }
129
+ //# sourceMappingURL=diff-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-engine.d.ts","sourceRoot":"","sources":["../../src/lib/diff-engine.ts"],"names":[],"mappings":"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"}