devteam-orchestrator-cli 0.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +309 -0
  3. package/dist/api-client.d.ts +199 -0
  4. package/dist/api-client.d.ts.map +1 -0
  5. package/dist/api-client.js +184 -0
  6. package/dist/api-client.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +252 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/approve.d.ts +5 -0
  12. package/dist/commands/approve.d.ts.map +1 -0
  13. package/dist/commands/approve.js +190 -0
  14. package/dist/commands/approve.js.map +1 -0
  15. package/dist/commands/config-cmd.d.ts +7 -0
  16. package/dist/commands/config-cmd.d.ts.map +1 -0
  17. package/dist/commands/config-cmd.js +113 -0
  18. package/dist/commands/config-cmd.js.map +1 -0
  19. package/dist/commands/deploy.d.ts +7 -0
  20. package/dist/commands/deploy.d.ts.map +1 -0
  21. package/dist/commands/deploy.js +179 -0
  22. package/dist/commands/deploy.js.map +1 -0
  23. package/dist/commands/init.d.ts +4 -0
  24. package/dist/commands/init.d.ts.map +1 -0
  25. package/dist/commands/init.js +118 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/login.d.ts +6 -0
  28. package/dist/commands/login.d.ts.map +1 -0
  29. package/dist/commands/login.js +73 -0
  30. package/dist/commands/login.js.map +1 -0
  31. package/dist/commands/logs.d.ts +6 -0
  32. package/dist/commands/logs.d.ts.map +1 -0
  33. package/dist/commands/logs.js +173 -0
  34. package/dist/commands/logs.js.map +1 -0
  35. package/dist/commands/plan.d.ts +8 -0
  36. package/dist/commands/plan.d.ts.map +1 -0
  37. package/dist/commands/plan.js +122 -0
  38. package/dist/commands/plan.js.map +1 -0
  39. package/dist/commands/run.d.ts +10 -0
  40. package/dist/commands/run.d.ts.map +1 -0
  41. package/dist/commands/run.js +154 -0
  42. package/dist/commands/run.js.map +1 -0
  43. package/dist/commands/status.d.ts +5 -0
  44. package/dist/commands/status.d.ts.map +1 -0
  45. package/dist/commands/status.js +159 -0
  46. package/dist/commands/status.js.map +1 -0
  47. package/dist/commands/tasks.d.ts +7 -0
  48. package/dist/commands/tasks.d.ts.map +1 -0
  49. package/dist/commands/tasks.js +112 -0
  50. package/dist/commands/tasks.js.map +1 -0
  51. package/dist/commands/templates.d.ts +6 -0
  52. package/dist/commands/templates.d.ts.map +1 -0
  53. package/dist/commands/templates.js +82 -0
  54. package/dist/commands/templates.js.map +1 -0
  55. package/dist/commands/workers.d.ts +4 -0
  56. package/dist/commands/workers.d.ts.map +1 -0
  57. package/dist/commands/workers.js +98 -0
  58. package/dist/commands/workers.js.map +1 -0
  59. package/dist/config.d.ts +29 -0
  60. package/dist/config.d.ts.map +1 -0
  61. package/dist/config.js +92 -0
  62. package/dist/config.js.map +1 -0
  63. package/dist/utils.d.ts +27 -0
  64. package/dist/utils.d.ts.map +1 -0
  65. package/dist/utils.js +212 -0
  66. package/dist/utils.js.map +1 -0
  67. package/package.json +60 -0
@@ -0,0 +1,184 @@
1
+ import fetch from 'node-fetch';
2
+ import { getEffectiveApiUrl, getEffectiveWsUrl, requireApiKey } from './config.js';
3
+ import WebSocket from 'ws';
4
+ export class ApiClient {
5
+ baseUrl;
6
+ wsUrl;
7
+ apiKey;
8
+ constructor() {
9
+ this.baseUrl = getEffectiveApiUrl();
10
+ this.wsUrl = getEffectiveWsUrl();
11
+ this.apiKey = '';
12
+ }
13
+ ensureAuth() {
14
+ this.apiKey = requireApiKey();
15
+ }
16
+ headers() {
17
+ return {
18
+ 'Content-Type': 'application/json',
19
+ Authorization: `Bearer ${this.apiKey}`,
20
+ 'User-Agent': '@devteam/cli 0.1.0',
21
+ };
22
+ }
23
+ async request(method, path, body) {
24
+ this.ensureAuth();
25
+ const url = `${this.baseUrl}${path}`;
26
+ const opts = {
27
+ method,
28
+ headers: this.headers(),
29
+ };
30
+ if (body) {
31
+ opts.body = JSON.stringify(body);
32
+ }
33
+ let res;
34
+ try {
35
+ res = await fetch(url, opts);
36
+ }
37
+ catch (err) {
38
+ const message = err instanceof Error ? err.message : String(err);
39
+ return {
40
+ ok: false,
41
+ status: 0,
42
+ data: {},
43
+ error: `Connection failed: ${message}. Is the API running at ${this.baseUrl}?`,
44
+ };
45
+ }
46
+ let data;
47
+ try {
48
+ data = (await res.json());
49
+ }
50
+ catch {
51
+ data = {};
52
+ }
53
+ if (!res.ok) {
54
+ return {
55
+ ok: false,
56
+ status: res.status,
57
+ data,
58
+ error: data?.error ??
59
+ data?.message ??
60
+ `HTTP ${res.status} ${res.statusText}`,
61
+ };
62
+ }
63
+ return { ok: true, status: res.status, data };
64
+ }
65
+ // ── Health / Status ──────────────────────────────────────────────────
66
+ async getStatus() {
67
+ return this.request('GET', '/api/status');
68
+ }
69
+ async healthCheck() {
70
+ return this.request('GET', '/api/health');
71
+ }
72
+ // ── Tasks ────────────────────────────────────────────────────────────
73
+ async createTask(payload) {
74
+ return this.request('POST', '/api/tasks', payload);
75
+ }
76
+ async listTasks(options) {
77
+ const params = new URLSearchParams();
78
+ if (options?.status)
79
+ params.set('status', options.status);
80
+ if (options?.limit)
81
+ params.set('limit', String(options.limit));
82
+ if (options?.offset)
83
+ params.set('offset', String(options.offset));
84
+ if (options?.queue)
85
+ params.set('queue', options.queue);
86
+ const qs = params.toString();
87
+ return this.request('GET', `/api/tasks${qs ? '?' + qs : ''}`);
88
+ }
89
+ async getTask(taskId) {
90
+ return this.request('GET', `/api/tasks/${taskId}`);
91
+ }
92
+ async cancelTask(taskId) {
93
+ return this.request('POST', `/api/tasks/${taskId}/cancel`);
94
+ }
95
+ // ── Plans ────────────────────────────────────────────────────────────
96
+ async createPlan(payload) {
97
+ return this.request('POST', '/api/plans', payload);
98
+ }
99
+ async executePlan(planId) {
100
+ return this.request('POST', `/api/plans/${planId}/execute`);
101
+ }
102
+ // ── Templates ────────────────────────────────────────────────────────
103
+ async listTemplates(options) {
104
+ const params = new URLSearchParams();
105
+ if (options?.search)
106
+ params.set('search', options.search);
107
+ if (options?.industry)
108
+ params.set('industry', options.industry);
109
+ if (options?.category)
110
+ params.set('category', options.category);
111
+ const qs = params.toString();
112
+ return this.request('GET', `/api/templates${qs ? '?' + qs : ''}`);
113
+ }
114
+ async getTemplate(templateId) {
115
+ return this.request('GET', `/api/templates/${templateId}`);
116
+ }
117
+ async deployTemplate(payload) {
118
+ return this.request('POST', '/api/deploy', payload);
119
+ }
120
+ // ── Workers ──────────────────────────────────────────────────────────
121
+ async listWorkers() {
122
+ return this.request('GET', '/api/workers');
123
+ }
124
+ // ── Approvals (HITL) ────────────────────────────────────────────────
125
+ async listApprovals() {
126
+ return this.request('GET', '/api/approvals');
127
+ }
128
+ async submitApproval(action) {
129
+ return this.request('POST', '/api/approvals', action);
130
+ }
131
+ // ── WebSocket streaming ──────────────────────────────────────────────
132
+ streamTaskLogs(taskId, callbacks) {
133
+ this.ensureAuth();
134
+ const url = `${this.wsUrl}/tasks/${taskId}/logs`;
135
+ const ws = new WebSocket(url, {
136
+ headers: {
137
+ Authorization: `Bearer ${this.apiKey}`,
138
+ },
139
+ });
140
+ ws.on('message', (raw) => {
141
+ try {
142
+ const msg = JSON.parse(raw.toString());
143
+ callbacks.onMessage(msg);
144
+ }
145
+ catch {
146
+ callbacks.onMessage({
147
+ type: 'output',
148
+ timestamp: new Date().toISOString(),
149
+ content: raw.toString(),
150
+ });
151
+ }
152
+ });
153
+ ws.on('error', (err) => {
154
+ callbacks.onError(err);
155
+ });
156
+ ws.on('close', () => {
157
+ callbacks.onClose();
158
+ });
159
+ return ws;
160
+ }
161
+ streamAllEvents(callbacks) {
162
+ this.ensureAuth();
163
+ const url = `${this.wsUrl}/events`;
164
+ const ws = new WebSocket(url, {
165
+ headers: {
166
+ Authorization: `Bearer ${this.apiKey}`,
167
+ },
168
+ });
169
+ ws.on('message', (raw) => {
170
+ try {
171
+ const msg = JSON.parse(raw.toString());
172
+ callbacks.onMessage(msg);
173
+ }
174
+ catch {
175
+ callbacks.onMessage({ raw: raw.toString() });
176
+ }
177
+ });
178
+ ws.on('error', callbacks.onError);
179
+ ws.on('close', callbacks.onClose);
180
+ return ws;
181
+ }
182
+ }
183
+ export const apiClient = new ApiClient();
184
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,252 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { initCommand } from './commands/init.js';
5
+ import { loginCommand, logoutCommand } from './commands/login.js';
6
+ import { runCommand } from './commands/run.js';
7
+ import { planCommand } from './commands/plan.js';
8
+ import { deployCommand } from './commands/deploy.js';
9
+ import { templatesCommand } from './commands/templates.js';
10
+ import { statusCommand } from './commands/status.js';
11
+ import { tasksCommand } from './commands/tasks.js';
12
+ import { logsCommand } from './commands/logs.js';
13
+ import { approveCommand } from './commands/approve.js';
14
+ import { workersCommand } from './commands/workers.js';
15
+ import { configCommand } from './commands/config-cmd.js';
16
+ import { handleError } from './utils.js';
17
+ const program = new Command();
18
+ program
19
+ .name('devteam')
20
+ .description('CLI tool for DevTeam Orchestrator - AI agent swarm management')
21
+ .version('0.1.0', '-v, --version')
22
+ .configureHelp({
23
+ sortSubcommands: true,
24
+ });
25
+ // ── init ─────────────────────────────────────────────────────────────────
26
+ program
27
+ .command('init')
28
+ .description('Initialize a new project (creates devteam.config.json)')
29
+ .option('-y, --yes', 'Accept all defaults without prompting')
30
+ .action(async (options) => {
31
+ try {
32
+ await initCommand(options);
33
+ }
34
+ catch (err) {
35
+ handleError(err);
36
+ }
37
+ });
38
+ // ── login ────────────────────────────────────────────────────────────────
39
+ program
40
+ .command('login')
41
+ .description('Authenticate with the DevTeam API')
42
+ .option('-k, --key <api-key>', 'API key (or enter interactively)')
43
+ .option('-u, --url <api-url>', 'API server URL')
44
+ .action(async (options) => {
45
+ try {
46
+ await loginCommand(options);
47
+ }
48
+ catch (err) {
49
+ handleError(err);
50
+ }
51
+ });
52
+ program
53
+ .command('logout')
54
+ .description('Remove stored API credentials')
55
+ .action(async () => {
56
+ try {
57
+ await logoutCommand();
58
+ }
59
+ catch (err) {
60
+ handleError(err);
61
+ }
62
+ });
63
+ // ── run ──────────────────────────────────────────────────────────────────
64
+ program
65
+ .command('run <prompt...>')
66
+ .description('Run a quick agent task')
67
+ .option('-q, --queue <queue>', 'Target queue (gpu-queue, general-queue)')
68
+ .option('-p, --priority <priority>', 'Task priority (low, normal, high, critical)')
69
+ .option('-w, --worker <worker>', 'Target specific worker')
70
+ .option('-t, --tag <tags...>', 'Tags for the task')
71
+ .option('--timeout <ms>', 'Task timeout in milliseconds')
72
+ .option('--no-stream', 'Do not stream live output')
73
+ .option('--json', 'Output in JSON format')
74
+ .action(async (promptParts, options) => {
75
+ try {
76
+ const prompt = promptParts.join(' ');
77
+ await runCommand(prompt, options);
78
+ }
79
+ catch (err) {
80
+ handleError(err);
81
+ }
82
+ });
83
+ // ── plan ─────────────────────────────────────────────────────────────────
84
+ program
85
+ .command('plan <goal...>')
86
+ .description('Create an execution plan with DAG visualization')
87
+ .option('--max-steps <n>', 'Maximum number of steps')
88
+ .option('--budget <amount>', 'Budget limit in dollars')
89
+ .option('-c, --constraint <constraints...>', 'Constraints for the plan')
90
+ .option('-x, --execute', 'Execute immediately after creation')
91
+ .option('--json', 'Output in JSON format')
92
+ .action(async (goalParts, options) => {
93
+ try {
94
+ const goal = goalParts.join(' ');
95
+ await planCommand(goal, options);
96
+ }
97
+ catch (err) {
98
+ handleError(err);
99
+ }
100
+ });
101
+ // ── deploy ───────────────────────────────────────────────────────────────
102
+ program
103
+ .command('deploy <template-id>')
104
+ .description('Deploy a template with interactive inputs')
105
+ .option('-q, --queue <queue>', 'Target queue')
106
+ .option('-i, --input <inputs...>', 'Template inputs as key=value pairs')
107
+ .option('--dry-run', 'Validate without deploying')
108
+ .option('--json', 'Output in JSON format')
109
+ .action(async (templateId, options) => {
110
+ try {
111
+ await deployCommand(templateId, options);
112
+ }
113
+ catch (err) {
114
+ handleError(err);
115
+ }
116
+ });
117
+ // ── templates ────────────────────────────────────────────────────────────
118
+ program
119
+ .command('templates [search]')
120
+ .description('Browse and search the template marketplace')
121
+ .option('--industry <industry>', 'Filter by industry')
122
+ .option('--category <category>', 'Filter by category')
123
+ .option('--json', 'Output in JSON format')
124
+ .action(async (search, options) => {
125
+ try {
126
+ await templatesCommand(search, options);
127
+ }
128
+ catch (err) {
129
+ handleError(err);
130
+ }
131
+ });
132
+ // ── status ───────────────────────────────────────────────────────────────
133
+ program
134
+ .command('status')
135
+ .description('Show cluster status (workers, queues, tasks)')
136
+ .option('--json', 'Output in JSON format')
137
+ .option('-w, --watch', 'Watch mode: refresh every 5 seconds')
138
+ .action(async (options) => {
139
+ try {
140
+ await statusCommand(options);
141
+ }
142
+ catch (err) {
143
+ handleError(err);
144
+ }
145
+ });
146
+ // ── tasks ────────────────────────────────────────────────────────────────
147
+ program
148
+ .command('tasks')
149
+ .description('List recent tasks with status')
150
+ .option('-s, --status <status>', 'Filter by status (pending, running, completed, failed)')
151
+ .option('-q, --queue <queue>', 'Filter by queue')
152
+ .option('-l, --limit <n>', 'Number of tasks to show', '20')
153
+ .option('--json', 'Output in JSON format')
154
+ .action(async (options) => {
155
+ try {
156
+ await tasksCommand(options);
157
+ }
158
+ catch (err) {
159
+ handleError(err);
160
+ }
161
+ });
162
+ // ── logs ─────────────────────────────────────────────────────────────────
163
+ program
164
+ .command('logs <task-id>')
165
+ .description('Stream live agent output via WebSocket')
166
+ .option('-f, --follow', 'Follow mode: keep streaming even after task completes')
167
+ .option('--timestamps', 'Show timestamps for each log line')
168
+ .option('--json', 'Output raw JSON messages')
169
+ .action(async (taskId, options) => {
170
+ try {
171
+ await logsCommand(taskId, options);
172
+ }
173
+ catch (err) {
174
+ handleError(err);
175
+ }
176
+ });
177
+ // ── approve ──────────────────────────────────────────────────────────────
178
+ program
179
+ .command('approve')
180
+ .description('Interactive HITL approval queue')
181
+ .option('--auto', 'Auto-approve all pending items')
182
+ .option('--json', 'Output in JSON format')
183
+ .action(async (options) => {
184
+ try {
185
+ await approveCommand({
186
+ json: options.json,
187
+ autoApprove: options.auto,
188
+ });
189
+ }
190
+ catch (err) {
191
+ handleError(err);
192
+ }
193
+ });
194
+ // ── workers ──────────────────────────────────────────────────────────────
195
+ program
196
+ .command('workers')
197
+ .description('Show connected worker nodes')
198
+ .option('--json', 'Output in JSON format')
199
+ .action(async (options) => {
200
+ try {
201
+ await workersCommand(options);
202
+ }
203
+ catch (err) {
204
+ handleError(err);
205
+ }
206
+ });
207
+ // ── config ───────────────────────────────────────────────────────────────
208
+ program
209
+ .command('config')
210
+ .description('View and edit CLI configuration')
211
+ .option('--set <key=value>', 'Set a configuration value')
212
+ .option('--get <key>', 'Get a configuration value')
213
+ .option('--reset', 'Reset all configuration to defaults')
214
+ .option('--json', 'Output in JSON format')
215
+ .action(async (options) => {
216
+ try {
217
+ await configCommand(options);
218
+ }
219
+ catch (err) {
220
+ handleError(err);
221
+ }
222
+ });
223
+ // ── Custom help ──────────────────────────────────────────────────────────
224
+ program.addHelpText('after', `
225
+ ${chalk.bold('Examples:')}
226
+ ${chalk.gray('$')} devteam init ${chalk.gray('Initialize a project')}
227
+ ${chalk.gray('$')} devteam login ${chalk.gray('Authenticate with API key')}
228
+ ${chalk.gray('$')} devteam run "Review this PR" ${chalk.gray('Quick agent task')}
229
+ ${chalk.gray('$')} devteam plan "Build REST API" ${chalk.gray('Generate execution plan')}
230
+ ${chalk.gray('$')} devteam deploy contract-review-v1 ${chalk.gray('Deploy a template')}
231
+ ${chalk.gray('$')} devteam templates --industry legal ${chalk.gray('Browse templates')}
232
+ ${chalk.gray('$')} devteam status ${chalk.gray('Cluster overview')}
233
+ ${chalk.gray('$')} devteam tasks --status running ${chalk.gray('Filter running tasks')}
234
+ ${chalk.gray('$')} devteam logs abc123 ${chalk.gray('Stream task output')}
235
+ ${chalk.gray('$')} devteam approve ${chalk.gray('Review pending approvals')}
236
+ ${chalk.gray('$')} devteam workers ${chalk.gray('Show worker nodes')}
237
+
238
+ ${chalk.bold('Documentation:')}
239
+ ${chalk.cyan('https://devteam.marsala.dev/docs/cli')}
240
+ `);
241
+ // ── Parse and run ────────────────────────────────────────────────────────
242
+ // Show help if no command provided
243
+ if (!process.argv.slice(2).length) {
244
+ console.log('');
245
+ console.log(chalk.bold.cyan(' DevTeam CLI') +
246
+ chalk.gray(' v0.1.0 - AI Agent Swarm Management'));
247
+ console.log('');
248
+ program.outputHelp();
249
+ process.exit(0);
250
+ }
251
+ program.parse(process.argv);
252
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function approveCommand(options: {
2
+ json?: boolean;
3
+ autoApprove?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=approve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.d.ts","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"AAMA,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDhB"}
@@ -0,0 +1,190 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import inquirer from 'inquirer';
4
+ import { apiClient } from '../api-client.js';
5
+ import { relativeTime, formatError } from '../utils.js';
6
+ export async function approveCommand(options) {
7
+ const spinner = ora({
8
+ text: 'Fetching pending approvals...',
9
+ color: 'cyan',
10
+ }).start();
11
+ try {
12
+ const response = await apiClient.listApprovals();
13
+ if (!response.ok) {
14
+ spinner.fail(`Failed to fetch approvals: ${response.error}`);
15
+ process.exit(1);
16
+ }
17
+ const approvals = response.data.approvals || [];
18
+ spinner.stop();
19
+ if (options.json) {
20
+ console.log(JSON.stringify(response.data, null, 2));
21
+ return;
22
+ }
23
+ if (approvals.length === 0) {
24
+ console.log('');
25
+ console.log(chalk.green(' No pending approvals. All clear!'));
26
+ console.log('');
27
+ return;
28
+ }
29
+ console.log('');
30
+ console.log(chalk.bold(` \uD83D\uDD14 ${approvals.length} pending approval(s)`));
31
+ console.log('');
32
+ // Process each approval interactively
33
+ for (let i = 0; i < approvals.length; i++) {
34
+ const approval = approvals[i];
35
+ const result = await processApproval(approval, i + 1, approvals.length, options.autoApprove);
36
+ if (result === 'quit')
37
+ break;
38
+ }
39
+ console.log('');
40
+ console.log(chalk.gray(' Approval session complete.'));
41
+ console.log('');
42
+ }
43
+ catch (err) {
44
+ spinner.fail('Failed to fetch approvals');
45
+ console.error(formatError(err));
46
+ process.exit(1);
47
+ }
48
+ }
49
+ async function processApproval(approval, index, total, autoApprove) {
50
+ const riskColors = {
51
+ high: chalk.red.bold,
52
+ critical: chalk.bgRed.white.bold,
53
+ medium: chalk.yellow,
54
+ low: chalk.green,
55
+ };
56
+ const riskFn = riskColors[approval.risk.toLowerCase()] || chalk.white;
57
+ console.log(chalk.gray(` [${index}/${total}]`));
58
+ console.log('');
59
+ console.log(` ${riskFn(`[${approval.risk.toUpperCase()} RISK]`)} ${chalk.bold(approval.title)}`);
60
+ console.log(` ${chalk.gray(approval.description)}`);
61
+ console.log('');
62
+ console.log(` ${chalk.gray('Type:')} ${approval.type}`);
63
+ console.log(` ${chalk.gray('Task:')} ${chalk.cyan(approval.taskId)}`);
64
+ console.log(` ${chalk.gray('Confidence:')} ${formatConfidence(approval.confidence)}`);
65
+ console.log(` ${chalk.gray('Waiting:')} ${relativeTime(approval.createdAt)}`);
66
+ if (approval.expiresAt) {
67
+ console.log(` ${chalk.gray('Expires:')} ${approval.expiresAt}`);
68
+ }
69
+ console.log('');
70
+ if (autoApprove) {
71
+ // Auto-approve mode
72
+ const spinner = ora('Auto-approving...').start();
73
+ const result = await apiClient.submitApproval({
74
+ taskId: approval.taskId,
75
+ action: 'approve',
76
+ comment: 'Auto-approved via CLI',
77
+ });
78
+ if (result.ok) {
79
+ spinner.succeed(`Approved: ${approval.title}`);
80
+ }
81
+ else {
82
+ spinner.fail(`Failed: ${result.error}`);
83
+ }
84
+ return 'continue';
85
+ }
86
+ // Interactive mode
87
+ const { action } = await inquirer.prompt([
88
+ {
89
+ type: 'expand',
90
+ name: 'action',
91
+ message: 'Action:',
92
+ choices: [
93
+ { key: 'a', name: 'Approve', value: 'approve' },
94
+ { key: 'r', name: 'Reject', value: 'reject' },
95
+ { key: 'v', name: 'View details', value: 'view' },
96
+ { key: 's', name: 'Skip', value: 'skip' },
97
+ { key: 'q', name: 'Quit', value: 'quit' },
98
+ ],
99
+ default: 0,
100
+ },
101
+ ]);
102
+ switch (action) {
103
+ case 'approve': {
104
+ const { comment } = await inquirer.prompt([
105
+ {
106
+ type: 'input',
107
+ name: 'comment',
108
+ message: 'Comment (optional):',
109
+ default: '',
110
+ },
111
+ ]);
112
+ const spinner = ora('Submitting approval...').start();
113
+ const result = await apiClient.submitApproval({
114
+ taskId: approval.taskId,
115
+ action: 'approve',
116
+ comment: comment || undefined,
117
+ });
118
+ if (result.ok) {
119
+ spinner.succeed(chalk.green('Approved'));
120
+ }
121
+ else {
122
+ spinner.fail(`Approval failed: ${result.error}`);
123
+ }
124
+ console.log('');
125
+ return 'continue';
126
+ }
127
+ case 'reject': {
128
+ const { reason } = await inquirer.prompt([
129
+ {
130
+ type: 'input',
131
+ name: 'reason',
132
+ message: 'Rejection reason:',
133
+ validate: (input) => input.trim().length > 0 || 'Please provide a reason for rejection',
134
+ },
135
+ ]);
136
+ const spinner = ora('Submitting rejection...').start();
137
+ const result = await apiClient.submitApproval({
138
+ taskId: approval.taskId,
139
+ action: 'reject',
140
+ comment: reason,
141
+ });
142
+ if (result.ok) {
143
+ spinner.succeed(chalk.red('Rejected'));
144
+ }
145
+ else {
146
+ spinner.fail(`Rejection failed: ${result.error}`);
147
+ }
148
+ console.log('');
149
+ return 'continue';
150
+ }
151
+ case 'view': {
152
+ console.log('');
153
+ console.log(chalk.bold.underline(' Approval Details:'));
154
+ console.log('');
155
+ console.log(` ${chalk.gray('ID:')} ${approval.id}`);
156
+ console.log(` ${chalk.gray('Task ID:')} ${approval.taskId}`);
157
+ console.log(` ${chalk.gray('Type:')} ${approval.type}`);
158
+ console.log(` ${chalk.gray('Risk Level:')} ${riskColors[approval.risk.toLowerCase()]?.(approval.risk.toUpperCase()) || approval.risk}`);
159
+ console.log(` ${chalk.gray('Confidence:')} ${formatConfidence(approval.confidence)}`);
160
+ console.log(` ${chalk.gray('Created:')} ${approval.createdAt}`);
161
+ if (Object.keys(approval.details).length > 0) {
162
+ console.log('');
163
+ console.log(chalk.gray(' Additional details:'));
164
+ for (const [key, value] of Object.entries(approval.details)) {
165
+ console.log(` ${chalk.gray(key + ':')} ${JSON.stringify(value)}`);
166
+ }
167
+ }
168
+ console.log('');
169
+ // Re-prompt after viewing
170
+ return processApproval(approval, index, total, autoApprove);
171
+ }
172
+ case 'skip':
173
+ console.log(chalk.gray(' Skipped'));
174
+ console.log('');
175
+ return 'continue';
176
+ case 'quit':
177
+ return 'quit';
178
+ default:
179
+ return 'continue';
180
+ }
181
+ }
182
+ function formatConfidence(confidence) {
183
+ const pct = Math.round(confidence * 100);
184
+ if (pct >= 80)
185
+ return chalk.green(`${pct}%`);
186
+ if (pct >= 60)
187
+ return chalk.yellow(`${pct}%`);
188
+ return chalk.red(`${pct}%`);
189
+ }
190
+ //# sourceMappingURL=approve.js.map