@defai.digital/cli 13.1.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/LICENSE +214 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +11 -0
- package/dist/bin.js.map +1 -0
- package/dist/bootstrap.d.ts +144 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +315 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +84 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ability.d.ts +17 -0
- package/dist/commands/ability.d.ts.map +1 -0
- package/dist/commands/ability.js +286 -0
- package/dist/commands/ability.js.map +1 -0
- package/dist/commands/agent.d.ts +18 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +361 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/call.d.ts +15 -0
- package/dist/commands/call.d.ts.map +1 -0
- package/dist/commands/call.js +503 -0
- package/dist/commands/call.js.map +1 -0
- package/dist/commands/cleanup.d.ts +18 -0
- package/dist/commands/cleanup.d.ts.map +1 -0
- package/dist/commands/cleanup.js +300 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/config.d.ts +16 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +513 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/discuss.d.ts +16 -0
- package/dist/commands/discuss.d.ts.map +1 -0
- package/dist/commands/discuss.js +700 -0
- package/dist/commands/discuss.js.map +1 -0
- package/dist/commands/doctor.d.ts +48 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +356 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/guard.d.ts +12 -0
- package/dist/commands/guard.d.ts.map +1 -0
- package/dist/commands/guard.js +225 -0
- package/dist/commands/guard.js.map +1 -0
- package/dist/commands/help.d.ts +11 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +180 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/history.d.ts +19 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +200 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/index.d.ts +23 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +26 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/iterate.d.ts +16 -0
- package/dist/commands/iterate.d.ts.map +1 -0
- package/dist/commands/iterate.js +72 -0
- package/dist/commands/iterate.js.map +1 -0
- package/dist/commands/list.d.ts +6 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +62 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/mcp.d.ts +16 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +57 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/resume.d.ts +18 -0
- package/dist/commands/resume.d.ts.map +1 -0
- package/dist/commands/resume.js +208 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/review.d.ts +13 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +450 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +6 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +158 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/scaffold.d.ts +20 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +924 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/session.d.ts +20 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +504 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +14 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +762 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +17 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +227 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/trace.d.ts +6 -0
- package/dist/commands/trace.d.ts.map +1 -0
- package/dist/commands/trace.js +204 -0
- package/dist/commands/trace.js.map +1 -0
- package/dist/commands/update.d.ts +24 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +296 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/parser.d.ts +14 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +288 -0
- package/dist/parser.js.map +1 -0
- package/dist/types.d.ts +91 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +29 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/dangerous-op-guard.d.ts +33 -0
- package/dist/utils/dangerous-op-guard.d.ts.map +1 -0
- package/dist/utils/dangerous-op-guard.js +112 -0
- package/dist/utils/dangerous-op-guard.js.map +1 -0
- package/dist/utils/database.d.ts +85 -0
- package/dist/utils/database.d.ts.map +1 -0
- package/dist/utils/database.js +184 -0
- package/dist/utils/database.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/provider-factory.d.ts +31 -0
- package/dist/utils/provider-factory.d.ts.map +1 -0
- package/dist/utils/provider-factory.js +109 -0
- package/dist/utils/provider-factory.js.map +1 -0
- package/dist/utils/storage-instances.d.ts +19 -0
- package/dist/utils/storage-instances.d.ts.map +1 -0
- package/dist/utils/storage-instances.js +20 -0
- package/dist/utils/storage-instances.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ability Command
|
|
3
|
+
*
|
|
4
|
+
* CLI command for managing abilities - reusable knowledge modules for agents.
|
|
5
|
+
*/
|
|
6
|
+
import { createAbilityRegistry, createAbilityLoader, createAbilityManager, DEFAULT_ABILITY_DOMAIN_CONFIG, } from '@defai.digital/ability-domain';
|
|
7
|
+
import { LIMIT_ABILITY_TOKENS_AGENT } from '@defai.digital/contracts';
|
|
8
|
+
// Singleton registry for demo purposes
|
|
9
|
+
const registry = createAbilityRegistry();
|
|
10
|
+
const manager = createAbilityManager(registry);
|
|
11
|
+
let loaded = false;
|
|
12
|
+
/**
|
|
13
|
+
* Ensure abilities are loaded from the default directory
|
|
14
|
+
*/
|
|
15
|
+
async function ensureLoaded() {
|
|
16
|
+
if (loaded)
|
|
17
|
+
return;
|
|
18
|
+
try {
|
|
19
|
+
const loader = createAbilityLoader({
|
|
20
|
+
abilitiesDir: DEFAULT_ABILITY_DOMAIN_CONFIG.abilitiesDir,
|
|
21
|
+
});
|
|
22
|
+
const abilities = await loader.loadAll();
|
|
23
|
+
for (const ability of abilities) {
|
|
24
|
+
await registry.register(ability);
|
|
25
|
+
}
|
|
26
|
+
loaded = true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Directory may not exist
|
|
30
|
+
loaded = true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Handles the 'ability' command - manage abilities
|
|
35
|
+
*
|
|
36
|
+
* Subcommands:
|
|
37
|
+
* ability list - List all abilities
|
|
38
|
+
* ability get <id> - Get ability details
|
|
39
|
+
* ability inject - Preview ability injection for an agent/task
|
|
40
|
+
* ability load <dir> - Load abilities from a directory
|
|
41
|
+
*/
|
|
42
|
+
export async function abilityCommand(args, options) {
|
|
43
|
+
const subcommand = args[0] ?? 'list';
|
|
44
|
+
const subArgs = args.slice(1);
|
|
45
|
+
// Ensure abilities are loaded for most commands
|
|
46
|
+
if (subcommand !== 'load') {
|
|
47
|
+
await ensureLoaded();
|
|
48
|
+
}
|
|
49
|
+
switch (subcommand) {
|
|
50
|
+
case 'list':
|
|
51
|
+
return listAbilities(options);
|
|
52
|
+
case 'get':
|
|
53
|
+
return getAbility(subArgs, options);
|
|
54
|
+
case 'inject':
|
|
55
|
+
return injectAbilities(options);
|
|
56
|
+
case 'load':
|
|
57
|
+
return loadAbilities(subArgs, options);
|
|
58
|
+
default:
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
message: `Unknown ability subcommand: ${subcommand}\nAvailable: list, get, inject, load`,
|
|
62
|
+
data: undefined,
|
|
63
|
+
exitCode: 1,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* List all abilities
|
|
69
|
+
*/
|
|
70
|
+
async function listAbilities(options) {
|
|
71
|
+
try {
|
|
72
|
+
// Build filter from options
|
|
73
|
+
const filter = {};
|
|
74
|
+
if (options.category !== undefined) {
|
|
75
|
+
filter.category = options.category;
|
|
76
|
+
}
|
|
77
|
+
if (options.tags !== undefined && options.tags.length > 0) {
|
|
78
|
+
filter.tags = options.tags;
|
|
79
|
+
}
|
|
80
|
+
const abilities = await registry.list(Object.keys(filter).length > 0 ? filter : undefined);
|
|
81
|
+
if (abilities.length === 0) {
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
message: 'No abilities found.',
|
|
85
|
+
data: [],
|
|
86
|
+
exitCode: 0,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Apply limit if specified
|
|
90
|
+
const limited = options.limit !== undefined
|
|
91
|
+
? abilities.slice(0, options.limit)
|
|
92
|
+
: abilities;
|
|
93
|
+
if (options.format === 'json') {
|
|
94
|
+
return {
|
|
95
|
+
success: true,
|
|
96
|
+
message: undefined,
|
|
97
|
+
data: limited,
|
|
98
|
+
exitCode: 0,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// Format as text table
|
|
102
|
+
const header = 'Ability ID | Category | Priority | Enabled | Tags';
|
|
103
|
+
const separator = '-'.repeat(header.length);
|
|
104
|
+
const rows = limited.map((a) => `${(a.abilityId ?? '').padEnd(20)} | ${(a.category ?? '-').padEnd(14)} | ${String(a.priority ?? 50).padEnd(8)} | ${a.enabled ? 'Yes' : 'No '.padEnd(7)} | ${(a.tags?.slice(0, 3).join(', ') ?? '-')}`);
|
|
105
|
+
return {
|
|
106
|
+
success: true,
|
|
107
|
+
message: [header, separator, ...rows, '', `Total: ${abilities.length} abilities`].join('\n'),
|
|
108
|
+
data: limited,
|
|
109
|
+
exitCode: 0,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
return {
|
|
114
|
+
success: false,
|
|
115
|
+
message: `Failed to list abilities: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
116
|
+
data: undefined,
|
|
117
|
+
exitCode: 1,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get ability details by ID
|
|
123
|
+
*/
|
|
124
|
+
async function getAbility(args, options) {
|
|
125
|
+
const abilityId = args[0];
|
|
126
|
+
if (abilityId === undefined) {
|
|
127
|
+
return {
|
|
128
|
+
success: false,
|
|
129
|
+
message: 'Usage: ax ability get <ability-id>',
|
|
130
|
+
data: undefined,
|
|
131
|
+
exitCode: 1,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
const ability = await registry.get(abilityId);
|
|
136
|
+
if (ability === undefined) {
|
|
137
|
+
return {
|
|
138
|
+
success: false,
|
|
139
|
+
message: `Ability not found: ${abilityId}`,
|
|
140
|
+
data: undefined,
|
|
141
|
+
exitCode: 1,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
if (options.format === 'json') {
|
|
145
|
+
return {
|
|
146
|
+
success: true,
|
|
147
|
+
message: undefined,
|
|
148
|
+
data: ability,
|
|
149
|
+
exitCode: 0,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
// Format as text
|
|
153
|
+
const lines = [
|
|
154
|
+
`Ability: ${ability.abilityId}`,
|
|
155
|
+
`Display Name: ${ability.displayName ?? ability.abilityId}`,
|
|
156
|
+
`Category: ${ability.category ?? 'N/A'}`,
|
|
157
|
+
`Priority: ${ability.priority ?? 50}`,
|
|
158
|
+
`Enabled: ${ability.enabled ? 'Yes' : 'No'}`,
|
|
159
|
+
`Tags: ${ability.tags?.join(', ') ?? 'N/A'}`,
|
|
160
|
+
`Version: ${ability.version ?? 'N/A'}`,
|
|
161
|
+
`Author: ${ability.author ?? 'N/A'}`,
|
|
162
|
+
'',
|
|
163
|
+
`Content (${ability.content.length} chars):`,
|
|
164
|
+
'---',
|
|
165
|
+
ability.content.length > 500
|
|
166
|
+
? ability.content.slice(0, 500) + '\n... (truncated)'
|
|
167
|
+
: ability.content,
|
|
168
|
+
];
|
|
169
|
+
return {
|
|
170
|
+
success: true,
|
|
171
|
+
message: lines.join('\n'),
|
|
172
|
+
data: ability,
|
|
173
|
+
exitCode: 0,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
return {
|
|
178
|
+
success: false,
|
|
179
|
+
message: `Failed to get ability: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
180
|
+
data: undefined,
|
|
181
|
+
exitCode: 1,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Preview ability injection for an agent/task
|
|
187
|
+
*/
|
|
188
|
+
async function injectAbilities(options) {
|
|
189
|
+
try {
|
|
190
|
+
const agentId = options.agent ?? 'default-agent';
|
|
191
|
+
const task = options.task ?? options.input ?? 'general task';
|
|
192
|
+
const coreAbilities = options.core !== undefined
|
|
193
|
+
? options.core.split(',').map((s) => s.trim())
|
|
194
|
+
: undefined;
|
|
195
|
+
const maxAbilities = options.limit ?? 10;
|
|
196
|
+
const maxTokens = options.maxTokens ?? LIMIT_ABILITY_TOKENS_AGENT;
|
|
197
|
+
const result = await manager.injectAbilities(agentId, task, coreAbilities, {
|
|
198
|
+
maxAbilities,
|
|
199
|
+
maxTokens,
|
|
200
|
+
includeMetadata: true,
|
|
201
|
+
});
|
|
202
|
+
if (options.format === 'json') {
|
|
203
|
+
return {
|
|
204
|
+
success: true,
|
|
205
|
+
message: undefined,
|
|
206
|
+
data: result,
|
|
207
|
+
exitCode: 0,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
// Format as text
|
|
211
|
+
const lines = [
|
|
212
|
+
`Ability Injection Preview`,
|
|
213
|
+
`-------------------------`,
|
|
214
|
+
`Agent: ${result.agentId}`,
|
|
215
|
+
`Task: ${task.slice(0, 100)}${task.length > 100 ? '...' : ''}`,
|
|
216
|
+
``,
|
|
217
|
+
`Injected Abilities (${result.injectedAbilities.length}):`,
|
|
218
|
+
...result.injectedAbilities.map((id, i) => ` ${i + 1}. ${id}`),
|
|
219
|
+
``,
|
|
220
|
+
`Token Count: ${result.tokenCount ?? 'N/A'}`,
|
|
221
|
+
`Truncated: ${result.truncated ? 'Yes' : 'No'}`,
|
|
222
|
+
``,
|
|
223
|
+
`Combined Content Preview (${result.combinedContent.length} chars):`,
|
|
224
|
+
'---',
|
|
225
|
+
result.combinedContent.length > 1000
|
|
226
|
+
? result.combinedContent.slice(0, 1000) + '\n... (truncated)'
|
|
227
|
+
: result.combinedContent,
|
|
228
|
+
];
|
|
229
|
+
return {
|
|
230
|
+
success: true,
|
|
231
|
+
message: lines.join('\n'),
|
|
232
|
+
data: result,
|
|
233
|
+
exitCode: 0,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
return {
|
|
238
|
+
success: false,
|
|
239
|
+
message: `Failed to inject abilities: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
240
|
+
data: undefined,
|
|
241
|
+
exitCode: 1,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Load abilities from a directory
|
|
247
|
+
*/
|
|
248
|
+
async function loadAbilities(args, options) {
|
|
249
|
+
const directory = args[0] ?? DEFAULT_ABILITY_DOMAIN_CONFIG.abilitiesDir;
|
|
250
|
+
try {
|
|
251
|
+
const loader = createAbilityLoader({ abilitiesDir: directory });
|
|
252
|
+
const abilities = await loader.loadAll();
|
|
253
|
+
// Register all loaded abilities
|
|
254
|
+
for (const ability of abilities) {
|
|
255
|
+
await registry.register(ability);
|
|
256
|
+
}
|
|
257
|
+
loaded = true;
|
|
258
|
+
if (options.format === 'json') {
|
|
259
|
+
return {
|
|
260
|
+
success: true,
|
|
261
|
+
message: undefined,
|
|
262
|
+
data: {
|
|
263
|
+
directory,
|
|
264
|
+
loaded: abilities.length,
|
|
265
|
+
abilities: abilities.map((a) => a.abilityId),
|
|
266
|
+
},
|
|
267
|
+
exitCode: 0,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
return {
|
|
271
|
+
success: true,
|
|
272
|
+
message: `Loaded ${abilities.length} abilities from ${directory}`,
|
|
273
|
+
data: { directory, loaded: abilities.length },
|
|
274
|
+
exitCode: 0,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
return {
|
|
279
|
+
success: false,
|
|
280
|
+
message: `Failed to load abilities: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
281
|
+
data: undefined,
|
|
282
|
+
exitCode: 1,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=ability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ability.js","sourceRoot":"","sources":["../../src/commands/ability.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,uCAAuC;AACvC,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;AACzC,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;AAC/C,IAAI,MAAM,GAAG,KAAK,CAAC;AAEnB;;GAEG;AACH,KAAK,UAAU,YAAY;IACzB,IAAI,MAAM;QAAE,OAAO;IAEnB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,mBAAmB,CAAC;YACjC,YAAY,EAAE,6BAA6B,CAAC,YAAY;SACzD,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACzC,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAChC,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;QAC1B,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAc,EACd,OAAmB;IAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE9B,gDAAgD;IAChD,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC;IAED,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;QAChC,KAAK,KAAK;YACR,OAAO,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;QAClC,KAAK,MAAM;YACT,OAAO,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzC;YACE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,+BAA+B,UAAU,sCAAsC;gBACxF,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,CAAC;aACZ,CAAC;IACN,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,OAAmB;IAC9C,IAAI,CAAC;QACH,4BAA4B;QAC5B,MAAM,MAAM,GAA8D,EAAE,CAAC;QAC7E,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACrC,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC7B,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CACnC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CACpD,CAAC;QAEF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,qBAAqB;gBAC9B,IAAI,EAAE,EAAE;gBACR,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,2BAA2B;QAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS;YACzC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC;YACnC,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,uBAAuB;QACvB,MAAM,MAAM,GAAG,mEAAmE,CAAC;QACnF,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CACtM,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,UAAU,SAAS,CAAC,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5F,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;YAChG,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,IAAc,EAAE,OAAmB;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE1B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,oCAAoC;YAC7C,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE9C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,sBAAsB,SAAS,EAAE;gBAC1C,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,iBAAiB;QACjB,MAAM,KAAK,GAAG;YACZ,YAAY,OAAO,CAAC,SAAS,EAAE;YAC/B,iBAAiB,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE;YAC3D,aAAa,OAAO,CAAC,QAAQ,IAAI,KAAK,EAAE;YACxC,aAAa,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE;YACrC,YAAY,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;YAC5C,SAAS,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE;YAC5C,YAAY,OAAO,CAAC,OAAO,IAAI,KAAK,EAAE;YACtC,WAAW,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE;YACpC,EAAE;YACF,YAAY,OAAO,CAAC,OAAO,CAAC,MAAM,UAAU;YAC5C,KAAK;YACL,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG;gBAC1B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,mBAAmB;gBACrD,CAAC,CAAC,OAAO,CAAC,OAAO;SACpB,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;YAC7F,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,OAAmB;IAChD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,eAAe,CAAC;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,IAAI,cAAc,CAAC;QAC7D,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS;YAC9C,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,0BAA0B,CAAC;QAElE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,eAAe,CAC1C,OAAO,EACP,IAAI,EACJ,aAAa,EACb;YACE,YAAY;YACZ,SAAS;YACT,eAAe,EAAE,IAAI;SACtB,CACF,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,iBAAiB;QACjB,MAAM,KAAK,GAAG;YACZ,2BAA2B;YAC3B,2BAA2B;YAC3B,UAAU,MAAM,CAAC,OAAO,EAAE;YAC1B,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9D,EAAE;YACF,uBAAuB,MAAM,CAAC,iBAAiB,CAAC,MAAM,IAAI;YAC1D,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;YAC/D,EAAE;YACF,gBAAgB,MAAM,CAAC,UAAU,IAAI,KAAK,EAAE;YAC5C,cAAc,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;YAC/C,EAAE;YACF,6BAA6B,MAAM,CAAC,eAAe,CAAC,MAAM,UAAU;YACpE,KAAK;YACL,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI;gBAClC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,mBAAmB;gBAC7D,CAAC,CAAC,MAAM,CAAC,eAAe;SAC3B,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;YAClG,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,IAAc,EAAE,OAAmB;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,6BAA6B,CAAC,YAAY,CAAC;IAExE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QAEzC,gCAAgC;QAChC,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAChC,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,GAAG,IAAI,CAAC;QAEd,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE;oBACJ,SAAS;oBACT,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;iBAC7C;gBACD,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,UAAU,SAAS,CAAC,MAAM,mBAAmB,SAAS,EAAE;YACjE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE;YAC7C,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;YAChG,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Command
|
|
3
|
+
*
|
|
4
|
+
* CLI command for managing agents.
|
|
5
|
+
*/
|
|
6
|
+
import type { CommandResult, CLIOptions } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Handles the 'agent' command - manage agents
|
|
9
|
+
*
|
|
10
|
+
* Subcommands:
|
|
11
|
+
* agent list - List registered agents
|
|
12
|
+
* agent get <id> - Get agent details
|
|
13
|
+
* agent register - Register a new agent (from JSON input)
|
|
14
|
+
* agent run <id> - Execute an agent
|
|
15
|
+
* agent status <exec> - Get execution status
|
|
16
|
+
*/
|
|
17
|
+
export declare function agentCommand(args: string[], options: CLIOptions): Promise<CommandResult>;
|
|
18
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAgF7D;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,aAAa,CAAC,CAuBxB"}
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Command
|
|
3
|
+
*
|
|
4
|
+
* CLI command for managing agents.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'node:fs';
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import { createPersistentAgentRegistry, createAgentExecutor, createAgentLoader, DEFAULT_AGENT_DOMAIN_CONFIG, } from '@defai.digital/agent-domain';
|
|
9
|
+
import { DATA_DIR_NAME, AGENTS_FILENAME } from '@defai.digital/contracts';
|
|
10
|
+
// Storage path for persistent agents (matches MCP server)
|
|
11
|
+
const AGENT_STORAGE_PATH = path.join(process.cwd(), DATA_DIR_NAME, AGENTS_FILENAME);
|
|
12
|
+
// Path to example agents (relative to workspace root)
|
|
13
|
+
const EXAMPLE_AGENTS_DIR = path.join(process.cwd(), 'examples', 'agents');
|
|
14
|
+
// Singleton registry - initialized lazily
|
|
15
|
+
let _registry = null;
|
|
16
|
+
let _initPromise = null;
|
|
17
|
+
/**
|
|
18
|
+
* Get or create the shared agent registry
|
|
19
|
+
* Loads example agents on first access
|
|
20
|
+
*/
|
|
21
|
+
async function getRegistry() {
|
|
22
|
+
if (_registry !== null) {
|
|
23
|
+
return _registry;
|
|
24
|
+
}
|
|
25
|
+
if (_initPromise !== null) {
|
|
26
|
+
return _initPromise;
|
|
27
|
+
}
|
|
28
|
+
_initPromise = initializeRegistry();
|
|
29
|
+
_registry = await _initPromise;
|
|
30
|
+
return _registry;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Initialize registry and load example agents
|
|
34
|
+
*/
|
|
35
|
+
async function initializeRegistry() {
|
|
36
|
+
// Create persistent registry (same as MCP server)
|
|
37
|
+
const registry = createPersistentAgentRegistry({
|
|
38
|
+
storagePath: AGENT_STORAGE_PATH,
|
|
39
|
+
createDir: true,
|
|
40
|
+
loadOnInit: true,
|
|
41
|
+
});
|
|
42
|
+
// Load example agents if directory exists
|
|
43
|
+
if (fs.existsSync(EXAMPLE_AGENTS_DIR)) {
|
|
44
|
+
try {
|
|
45
|
+
const loader = createAgentLoader({
|
|
46
|
+
agentsDir: EXAMPLE_AGENTS_DIR,
|
|
47
|
+
extensions: ['.json', '.yaml', '.yml'],
|
|
48
|
+
});
|
|
49
|
+
const exampleAgents = await loader.loadAll();
|
|
50
|
+
for (const agent of exampleAgents) {
|
|
51
|
+
// Only load if not already registered
|
|
52
|
+
const exists = await registry.exists(agent.agentId);
|
|
53
|
+
if (!exists) {
|
|
54
|
+
try {
|
|
55
|
+
await registry.register(agent);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Ignore duplicate registration errors
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
// Log but don't fail - example agents are optional
|
|
65
|
+
console.warn('Failed to load example agents:', error instanceof Error ? error.message : error);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return registry;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Handles the 'agent' command - manage agents
|
|
72
|
+
*
|
|
73
|
+
* Subcommands:
|
|
74
|
+
* agent list - List registered agents
|
|
75
|
+
* agent get <id> - Get agent details
|
|
76
|
+
* agent register - Register a new agent (from JSON input)
|
|
77
|
+
* agent run <id> - Execute an agent
|
|
78
|
+
* agent status <exec> - Get execution status
|
|
79
|
+
*/
|
|
80
|
+
export async function agentCommand(args, options) {
|
|
81
|
+
const subcommand = args[0] ?? 'list';
|
|
82
|
+
const subArgs = args.slice(1);
|
|
83
|
+
switch (subcommand) {
|
|
84
|
+
case 'list':
|
|
85
|
+
return listAgents(options);
|
|
86
|
+
case 'get':
|
|
87
|
+
return getAgent(subArgs, options);
|
|
88
|
+
case 'register':
|
|
89
|
+
return registerAgent(options);
|
|
90
|
+
case 'run':
|
|
91
|
+
return runAgent(subArgs, options);
|
|
92
|
+
case 'remove':
|
|
93
|
+
return removeAgent(subArgs, options);
|
|
94
|
+
default:
|
|
95
|
+
return {
|
|
96
|
+
success: false,
|
|
97
|
+
message: `Unknown agent subcommand: ${subcommand}\nAvailable: list, get, register, run, remove`,
|
|
98
|
+
data: undefined,
|
|
99
|
+
exitCode: 1,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* List all registered agents
|
|
105
|
+
*/
|
|
106
|
+
async function listAgents(options) {
|
|
107
|
+
try {
|
|
108
|
+
const registry = await getRegistry();
|
|
109
|
+
const agents = await registry.list();
|
|
110
|
+
if (agents.length === 0) {
|
|
111
|
+
return {
|
|
112
|
+
success: true,
|
|
113
|
+
message: 'No agents registered.',
|
|
114
|
+
data: [],
|
|
115
|
+
exitCode: 0,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// Apply limit if specified
|
|
119
|
+
const limited = options.limit !== undefined
|
|
120
|
+
? agents.slice(0, options.limit)
|
|
121
|
+
: agents;
|
|
122
|
+
if (options.format === 'json') {
|
|
123
|
+
return {
|
|
124
|
+
success: true,
|
|
125
|
+
message: undefined,
|
|
126
|
+
data: limited,
|
|
127
|
+
exitCode: 0,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// Format as text table
|
|
131
|
+
const header = 'Agent ID | Description | Team | Enabled';
|
|
132
|
+
const separator = '-'.repeat(header.length);
|
|
133
|
+
const rows = limited.map((a) => `${(a.agentId ?? '').padEnd(20)} | ${(a.description ?? '').slice(0, 32).padEnd(32)} | ${(a.team ?? '-').padEnd(10)} | ${a.enabled ? 'Yes' : 'No'}`);
|
|
134
|
+
return {
|
|
135
|
+
success: true,
|
|
136
|
+
message: [header, separator, ...rows].join('\n'),
|
|
137
|
+
data: limited,
|
|
138
|
+
exitCode: 0,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
return {
|
|
143
|
+
success: false,
|
|
144
|
+
message: `Failed to list agents: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
145
|
+
data: undefined,
|
|
146
|
+
exitCode: 1,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get agent details by ID
|
|
152
|
+
*/
|
|
153
|
+
async function getAgent(args, options) {
|
|
154
|
+
const agentId = args[0];
|
|
155
|
+
if (agentId === undefined) {
|
|
156
|
+
return {
|
|
157
|
+
success: false,
|
|
158
|
+
message: 'Usage: ax agent get <agent-id>',
|
|
159
|
+
data: undefined,
|
|
160
|
+
exitCode: 1,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
const registry = await getRegistry();
|
|
165
|
+
const agent = await registry.get(agentId);
|
|
166
|
+
if (agent === undefined) {
|
|
167
|
+
return {
|
|
168
|
+
success: false,
|
|
169
|
+
message: `Agent not found: ${agentId}`,
|
|
170
|
+
data: undefined,
|
|
171
|
+
exitCode: 1,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
if (options.format === 'json') {
|
|
175
|
+
return {
|
|
176
|
+
success: true,
|
|
177
|
+
message: undefined,
|
|
178
|
+
data: agent,
|
|
179
|
+
exitCode: 0,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// Format as text
|
|
183
|
+
const lines = [
|
|
184
|
+
`Agent: ${agent.agentId}`,
|
|
185
|
+
`Description: ${agent.description}`,
|
|
186
|
+
`Version: ${agent.version ?? 'N/A'}`,
|
|
187
|
+
`Team: ${agent.team ?? 'N/A'}`,
|
|
188
|
+
`Enabled: ${agent.enabled ? 'Yes' : 'No'}`,
|
|
189
|
+
`Capabilities: ${agent.capabilities?.join(', ') ?? 'N/A'}`,
|
|
190
|
+
`Tags: ${agent.tags?.join(', ') ?? 'N/A'}`,
|
|
191
|
+
];
|
|
192
|
+
if (agent.workflow !== undefined && agent.workflow.length > 0) {
|
|
193
|
+
lines.push(`Workflow Steps: ${agent.workflow.length}`);
|
|
194
|
+
for (const step of agent.workflow) {
|
|
195
|
+
lines.push(` - ${step.stepId}: ${step.name} (${step.type})`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
success: true,
|
|
200
|
+
message: lines.join('\n'),
|
|
201
|
+
data: agent,
|
|
202
|
+
exitCode: 0,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
return {
|
|
207
|
+
success: false,
|
|
208
|
+
message: `Failed to get agent: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
209
|
+
data: undefined,
|
|
210
|
+
exitCode: 1,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Register a new agent from JSON input
|
|
216
|
+
*/
|
|
217
|
+
async function registerAgent(options) {
|
|
218
|
+
try {
|
|
219
|
+
if (options.input === undefined) {
|
|
220
|
+
return {
|
|
221
|
+
success: false,
|
|
222
|
+
message: 'Usage: ax agent register --input <json-string>',
|
|
223
|
+
data: undefined,
|
|
224
|
+
exitCode: 1,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
let profile;
|
|
228
|
+
try {
|
|
229
|
+
profile = JSON.parse(options.input);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return {
|
|
233
|
+
success: false,
|
|
234
|
+
message: 'Invalid JSON input. Please provide a valid JSON string.',
|
|
235
|
+
data: undefined,
|
|
236
|
+
exitCode: 1,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
const registry = await getRegistry();
|
|
240
|
+
await registry.register(profile);
|
|
241
|
+
return {
|
|
242
|
+
success: true,
|
|
243
|
+
message: `Agent registered: ${profile.agentId}`,
|
|
244
|
+
data: profile,
|
|
245
|
+
exitCode: 0,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
return {
|
|
250
|
+
success: false,
|
|
251
|
+
message: `Failed to register agent: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
252
|
+
data: undefined,
|
|
253
|
+
exitCode: 1,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Run an agent
|
|
259
|
+
*/
|
|
260
|
+
async function runAgent(args, options) {
|
|
261
|
+
const agentId = args[0];
|
|
262
|
+
if (agentId === undefined) {
|
|
263
|
+
return {
|
|
264
|
+
success: false,
|
|
265
|
+
message: 'Usage: ax agent run <agent-id> [--input <json>]',
|
|
266
|
+
data: undefined,
|
|
267
|
+
exitCode: 1,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
const registry = await getRegistry();
|
|
272
|
+
const executor = createAgentExecutor(registry, DEFAULT_AGENT_DOMAIN_CONFIG);
|
|
273
|
+
let input = {};
|
|
274
|
+
if (options.input !== undefined) {
|
|
275
|
+
try {
|
|
276
|
+
input = JSON.parse(options.input);
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
return {
|
|
280
|
+
success: false,
|
|
281
|
+
message: 'Invalid JSON input. Please provide a valid JSON string.',
|
|
282
|
+
data: undefined,
|
|
283
|
+
exitCode: 1,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const result = await executor.execute(agentId, input);
|
|
288
|
+
if (options.format === 'json') {
|
|
289
|
+
return {
|
|
290
|
+
success: result.success,
|
|
291
|
+
message: undefined,
|
|
292
|
+
data: result,
|
|
293
|
+
exitCode: result.success ? 0 : 1,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
if (result.success) {
|
|
297
|
+
const lines = [
|
|
298
|
+
`Agent executed successfully: ${agentId}`,
|
|
299
|
+
`Duration: ${result.totalDurationMs}ms`,
|
|
300
|
+
];
|
|
301
|
+
if (result.stepResults !== undefined && result.stepResults.length > 0) {
|
|
302
|
+
lines.push(`Steps completed: ${result.stepResults.filter((s) => s.success).length}/${result.stepResults.length}`);
|
|
303
|
+
}
|
|
304
|
+
return {
|
|
305
|
+
success: true,
|
|
306
|
+
message: lines.join('\n'),
|
|
307
|
+
data: result,
|
|
308
|
+
exitCode: 0,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
return {
|
|
313
|
+
success: false,
|
|
314
|
+
message: `Agent execution failed: ${result.error?.message ?? 'Unknown error'}`,
|
|
315
|
+
data: result,
|
|
316
|
+
exitCode: 1,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
return {
|
|
322
|
+
success: false,
|
|
323
|
+
message: `Failed to run agent: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
324
|
+
data: undefined,
|
|
325
|
+
exitCode: 1,
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Remove an agent
|
|
331
|
+
*/
|
|
332
|
+
async function removeAgent(args, _options) {
|
|
333
|
+
const agentId = args[0];
|
|
334
|
+
if (agentId === undefined) {
|
|
335
|
+
return {
|
|
336
|
+
success: false,
|
|
337
|
+
message: 'Usage: ax agent remove <agent-id>',
|
|
338
|
+
data: undefined,
|
|
339
|
+
exitCode: 1,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
try {
|
|
343
|
+
const registry = await getRegistry();
|
|
344
|
+
await registry.remove(agentId);
|
|
345
|
+
return {
|
|
346
|
+
success: true,
|
|
347
|
+
message: `Agent removed: ${agentId}`,
|
|
348
|
+
data: { agentId },
|
|
349
|
+
exitCode: 0,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
catch (error) {
|
|
353
|
+
return {
|
|
354
|
+
success: false,
|
|
355
|
+
message: `Failed to remove agent: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
356
|
+
data: undefined,
|
|
357
|
+
exitCode: 1,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=agent.js.map
|