@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.
Files changed (138) hide show
  1. package/LICENSE +214 -0
  2. package/dist/bin.d.ts +3 -0
  3. package/dist/bin.d.ts.map +1 -0
  4. package/dist/bin.js +11 -0
  5. package/dist/bin.js.map +1 -0
  6. package/dist/bootstrap.d.ts +144 -0
  7. package/dist/bootstrap.d.ts.map +1 -0
  8. package/dist/bootstrap.js +315 -0
  9. package/dist/bootstrap.js.map +1 -0
  10. package/dist/cli.d.ts +14 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +84 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands/ability.d.ts +17 -0
  15. package/dist/commands/ability.d.ts.map +1 -0
  16. package/dist/commands/ability.js +286 -0
  17. package/dist/commands/ability.js.map +1 -0
  18. package/dist/commands/agent.d.ts +18 -0
  19. package/dist/commands/agent.d.ts.map +1 -0
  20. package/dist/commands/agent.js +361 -0
  21. package/dist/commands/agent.js.map +1 -0
  22. package/dist/commands/call.d.ts +15 -0
  23. package/dist/commands/call.d.ts.map +1 -0
  24. package/dist/commands/call.js +503 -0
  25. package/dist/commands/call.js.map +1 -0
  26. package/dist/commands/cleanup.d.ts +18 -0
  27. package/dist/commands/cleanup.d.ts.map +1 -0
  28. package/dist/commands/cleanup.js +300 -0
  29. package/dist/commands/cleanup.js.map +1 -0
  30. package/dist/commands/config.d.ts +16 -0
  31. package/dist/commands/config.d.ts.map +1 -0
  32. package/dist/commands/config.js +513 -0
  33. package/dist/commands/config.js.map +1 -0
  34. package/dist/commands/discuss.d.ts +16 -0
  35. package/dist/commands/discuss.d.ts.map +1 -0
  36. package/dist/commands/discuss.js +700 -0
  37. package/dist/commands/discuss.js.map +1 -0
  38. package/dist/commands/doctor.d.ts +48 -0
  39. package/dist/commands/doctor.d.ts.map +1 -0
  40. package/dist/commands/doctor.js +356 -0
  41. package/dist/commands/doctor.js.map +1 -0
  42. package/dist/commands/guard.d.ts +12 -0
  43. package/dist/commands/guard.d.ts.map +1 -0
  44. package/dist/commands/guard.js +225 -0
  45. package/dist/commands/guard.js.map +1 -0
  46. package/dist/commands/help.d.ts +11 -0
  47. package/dist/commands/help.d.ts.map +1 -0
  48. package/dist/commands/help.js +180 -0
  49. package/dist/commands/help.js.map +1 -0
  50. package/dist/commands/history.d.ts +19 -0
  51. package/dist/commands/history.d.ts.map +1 -0
  52. package/dist/commands/history.js +200 -0
  53. package/dist/commands/history.js.map +1 -0
  54. package/dist/commands/index.d.ts +23 -0
  55. package/dist/commands/index.d.ts.map +1 -0
  56. package/dist/commands/index.js +26 -0
  57. package/dist/commands/index.js.map +1 -0
  58. package/dist/commands/iterate.d.ts +16 -0
  59. package/dist/commands/iterate.d.ts.map +1 -0
  60. package/dist/commands/iterate.js +72 -0
  61. package/dist/commands/iterate.js.map +1 -0
  62. package/dist/commands/list.d.ts +6 -0
  63. package/dist/commands/list.d.ts.map +1 -0
  64. package/dist/commands/list.js +62 -0
  65. package/dist/commands/list.js.map +1 -0
  66. package/dist/commands/mcp.d.ts +16 -0
  67. package/dist/commands/mcp.d.ts.map +1 -0
  68. package/dist/commands/mcp.js +57 -0
  69. package/dist/commands/mcp.js.map +1 -0
  70. package/dist/commands/resume.d.ts +18 -0
  71. package/dist/commands/resume.d.ts.map +1 -0
  72. package/dist/commands/resume.js +208 -0
  73. package/dist/commands/resume.js.map +1 -0
  74. package/dist/commands/review.d.ts +13 -0
  75. package/dist/commands/review.d.ts.map +1 -0
  76. package/dist/commands/review.js +450 -0
  77. package/dist/commands/review.js.map +1 -0
  78. package/dist/commands/run.d.ts +6 -0
  79. package/dist/commands/run.d.ts.map +1 -0
  80. package/dist/commands/run.js +158 -0
  81. package/dist/commands/run.js.map +1 -0
  82. package/dist/commands/scaffold.d.ts +20 -0
  83. package/dist/commands/scaffold.d.ts.map +1 -0
  84. package/dist/commands/scaffold.js +924 -0
  85. package/dist/commands/scaffold.js.map +1 -0
  86. package/dist/commands/session.d.ts +20 -0
  87. package/dist/commands/session.d.ts.map +1 -0
  88. package/dist/commands/session.js +504 -0
  89. package/dist/commands/session.js.map +1 -0
  90. package/dist/commands/setup.d.ts +14 -0
  91. package/dist/commands/setup.d.ts.map +1 -0
  92. package/dist/commands/setup.js +762 -0
  93. package/dist/commands/setup.js.map +1 -0
  94. package/dist/commands/status.d.ts +17 -0
  95. package/dist/commands/status.d.ts.map +1 -0
  96. package/dist/commands/status.js +227 -0
  97. package/dist/commands/status.js.map +1 -0
  98. package/dist/commands/trace.d.ts +6 -0
  99. package/dist/commands/trace.d.ts.map +1 -0
  100. package/dist/commands/trace.js +204 -0
  101. package/dist/commands/trace.js.map +1 -0
  102. package/dist/commands/update.d.ts +24 -0
  103. package/dist/commands/update.d.ts.map +1 -0
  104. package/dist/commands/update.js +296 -0
  105. package/dist/commands/update.js.map +1 -0
  106. package/dist/index.d.ts +8 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +13 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/parser.d.ts +14 -0
  111. package/dist/parser.d.ts.map +1 -0
  112. package/dist/parser.js +288 -0
  113. package/dist/parser.js.map +1 -0
  114. package/dist/types.d.ts +91 -0
  115. package/dist/types.d.ts.map +1 -0
  116. package/dist/types.js +29 -0
  117. package/dist/types.js.map +1 -0
  118. package/dist/utils/dangerous-op-guard.d.ts +33 -0
  119. package/dist/utils/dangerous-op-guard.d.ts.map +1 -0
  120. package/dist/utils/dangerous-op-guard.js +112 -0
  121. package/dist/utils/dangerous-op-guard.js.map +1 -0
  122. package/dist/utils/database.d.ts +85 -0
  123. package/dist/utils/database.d.ts.map +1 -0
  124. package/dist/utils/database.js +184 -0
  125. package/dist/utils/database.js.map +1 -0
  126. package/dist/utils/index.d.ts +7 -0
  127. package/dist/utils/index.d.ts.map +1 -0
  128. package/dist/utils/index.js +7 -0
  129. package/dist/utils/index.js.map +1 -0
  130. package/dist/utils/provider-factory.d.ts +31 -0
  131. package/dist/utils/provider-factory.d.ts.map +1 -0
  132. package/dist/utils/provider-factory.js +109 -0
  133. package/dist/utils/provider-factory.js.map +1 -0
  134. package/dist/utils/storage-instances.d.ts +19 -0
  135. package/dist/utils/storage-instances.d.ts.map +1 -0
  136. package/dist/utils/storage-instances.js +20 -0
  137. package/dist/utils/storage-instances.js.map +1 -0
  138. 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":"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"}
@@ -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