@ginkoai/cli 1.6.1 → 1.7.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/README.md +34 -0
- package/dist/commands/agent/agent-client.d.ts +150 -0
- package/dist/commands/agent/agent-client.d.ts.map +1 -0
- package/dist/commands/agent/agent-client.js +170 -0
- package/dist/commands/agent/agent-client.js.map +1 -0
- package/dist/commands/agent/index.d.ts +22 -0
- package/dist/commands/agent/index.d.ts.map +1 -0
- package/dist/commands/agent/index.js +121 -0
- package/dist/commands/agent/index.js.map +1 -0
- package/dist/commands/agent/list.d.ts +22 -0
- package/dist/commands/agent/list.d.ts.map +1 -0
- package/dist/commands/agent/list.js +119 -0
- package/dist/commands/agent/list.js.map +1 -0
- package/dist/commands/agent/register.d.ts +21 -0
- package/dist/commands/agent/register.d.ts.map +1 -0
- package/dist/commands/agent/register.js +97 -0
- package/dist/commands/agent/register.js.map +1 -0
- package/dist/commands/agent/status.d.ts +19 -0
- package/dist/commands/agent/status.d.ts.map +1 -0
- package/dist/commands/agent/status.js +271 -0
- package/dist/commands/agent/status.js.map +1 -0
- package/dist/commands/agent/work.d.ts +22 -0
- package/dist/commands/agent/work.d.ts.map +1 -0
- package/dist/commands/agent/work.js +459 -0
- package/dist/commands/agent/work.js.map +1 -0
- package/dist/commands/checkpoint/create.d.ts +27 -0
- package/dist/commands/checkpoint/create.d.ts.map +1 -0
- package/dist/commands/checkpoint/create.js +82 -0
- package/dist/commands/checkpoint/create.js.map +1 -0
- package/dist/commands/checkpoint/index.d.ts +23 -0
- package/dist/commands/checkpoint/index.d.ts.map +1 -0
- package/dist/commands/checkpoint/index.js +91 -0
- package/dist/commands/checkpoint/index.js.map +1 -0
- package/dist/commands/checkpoint/list.d.ts +27 -0
- package/dist/commands/checkpoint/list.d.ts.map +1 -0
- package/dist/commands/checkpoint/list.js +115 -0
- package/dist/commands/checkpoint/list.js.map +1 -0
- package/dist/commands/checkpoint/show.d.ts +23 -0
- package/dist/commands/checkpoint/show.d.ts.map +1 -0
- package/dist/commands/checkpoint/show.js +102 -0
- package/dist/commands/checkpoint/show.js.map +1 -0
- package/dist/commands/dlq.d.ts +24 -0
- package/dist/commands/dlq.d.ts.map +1 -0
- package/dist/commands/dlq.js +172 -0
- package/dist/commands/dlq.js.map +1 -0
- package/dist/commands/epic.d.ts +29 -0
- package/dist/commands/epic.d.ts.map +1 -0
- package/dist/commands/epic.js +322 -0
- package/dist/commands/epic.js.map +1 -0
- package/dist/commands/escalation/create.d.ts +22 -0
- package/dist/commands/escalation/create.d.ts.map +1 -0
- package/dist/commands/escalation/create.js +122 -0
- package/dist/commands/escalation/create.js.map +1 -0
- package/dist/commands/escalation/escalation-client.d.ts +101 -0
- package/dist/commands/escalation/escalation-client.d.ts.map +1 -0
- package/dist/commands/escalation/escalation-client.js +129 -0
- package/dist/commands/escalation/escalation-client.js.map +1 -0
- package/dist/commands/escalation/index.d.ts +22 -0
- package/dist/commands/escalation/index.d.ts.map +1 -0
- package/dist/commands/escalation/index.js +94 -0
- package/dist/commands/escalation/index.js.map +1 -0
- package/dist/commands/escalation/list.d.ts +24 -0
- package/dist/commands/escalation/list.d.ts.map +1 -0
- package/dist/commands/escalation/list.js +170 -0
- package/dist/commands/escalation/list.js.map +1 -0
- package/dist/commands/escalation/resolve.d.ts +20 -0
- package/dist/commands/escalation/resolve.d.ts.map +1 -0
- package/dist/commands/escalation/resolve.js +102 -0
- package/dist/commands/escalation/resolve.js.map +1 -0
- package/dist/commands/graph/api-client.d.ts +222 -1
- package/dist/commands/graph/api-client.d.ts.map +1 -1
- package/dist/commands/graph/api-client.js +82 -0
- package/dist/commands/graph/api-client.js.map +1 -1
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +9 -1
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/log.d.ts +3 -0
- package/dist/commands/log.d.ts.map +1 -1
- package/dist/commands/log.js +110 -16
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/notifications/history.d.ts +21 -0
- package/dist/commands/notifications/history.d.ts.map +1 -0
- package/dist/commands/notifications/history.js +160 -0
- package/dist/commands/notifications/history.js.map +1 -0
- package/dist/commands/notifications/index.d.ts +22 -0
- package/dist/commands/notifications/index.d.ts.map +1 -0
- package/dist/commands/notifications/index.js +87 -0
- package/dist/commands/notifications/index.js.map +1 -0
- package/dist/commands/notifications/list.d.ts +19 -0
- package/dist/commands/notifications/list.d.ts.map +1 -0
- package/dist/commands/notifications/list.js +132 -0
- package/dist/commands/notifications/list.js.map +1 -0
- package/dist/commands/notifications/test.d.ts +19 -0
- package/dist/commands/notifications/test.d.ts.map +1 -0
- package/dist/commands/notifications/test.js +217 -0
- package/dist/commands/notifications/test.js.map +1 -0
- package/dist/commands/orchestrate.d.ts +25 -0
- package/dist/commands/orchestrate.d.ts.map +1 -0
- package/dist/commands/orchestrate.js +858 -0
- package/dist/commands/orchestrate.js.map +1 -0
- package/dist/commands/sprint/deps.d.ts +29 -0
- package/dist/commands/sprint/deps.d.ts.map +1 -0
- package/dist/commands/sprint/deps.js +269 -0
- package/dist/commands/sprint/deps.js.map +1 -0
- package/dist/commands/sprint/index.d.ts +10 -5
- package/dist/commands/sprint/index.d.ts.map +1 -1
- package/dist/commands/sprint/index.js +26 -5
- package/dist/commands/sprint/index.js.map +1 -1
- package/dist/commands/start/index.d.ts.map +1 -1
- package/dist/commands/start/index.js +6 -0
- package/dist/commands/start/index.js.map +1 -1
- package/dist/commands/start/start-reflection.d.ts +11 -0
- package/dist/commands/start/start-reflection.d.ts.map +1 -1
- package/dist/commands/start/start-reflection.js +150 -12
- package/dist/commands/start/start-reflection.js.map +1 -1
- package/dist/commands/verify.d.ts +17 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +232 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/session-log-manager.d.ts +1 -1
- package/dist/core/session-log-manager.d.ts.map +1 -1
- package/dist/core/session-log-manager.js +12 -3
- package/dist/core/session-log-manager.js.map +1 -1
- package/dist/index.js +98 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/__tests__/task-timeout.test.d.ts +12 -0
- package/dist/lib/__tests__/task-timeout.test.d.ts.map +1 -0
- package/dist/lib/__tests__/task-timeout.test.js +278 -0
- package/dist/lib/__tests__/task-timeout.test.js.map +1 -0
- package/dist/lib/agent-heartbeat.d.ts +68 -0
- package/dist/lib/agent-heartbeat.d.ts.map +1 -0
- package/dist/lib/agent-heartbeat.js +117 -0
- package/dist/lib/agent-heartbeat.js.map +1 -0
- package/dist/lib/checkpoint.d.ts +85 -0
- package/dist/lib/checkpoint.d.ts.map +1 -0
- package/dist/lib/checkpoint.js +323 -0
- package/dist/lib/checkpoint.js.map +1 -0
- package/dist/lib/context-metrics.d.ts +230 -0
- package/dist/lib/context-metrics.d.ts.map +1 -0
- package/dist/lib/context-metrics.js +372 -0
- package/dist/lib/context-metrics.js.map +1 -0
- package/dist/lib/dead-letter-queue.d.ts +108 -0
- package/dist/lib/dead-letter-queue.d.ts.map +1 -0
- package/dist/lib/dead-letter-queue.js +378 -0
- package/dist/lib/dead-letter-queue.js.map +1 -0
- package/dist/lib/event-logger.d.ts +9 -1
- package/dist/lib/event-logger.d.ts.map +1 -1
- package/dist/lib/event-logger.js +45 -3
- package/dist/lib/event-logger.js.map +1 -1
- package/dist/lib/event-queue.d.ts.map +1 -1
- package/dist/lib/event-queue.js +13 -2
- package/dist/lib/event-queue.js.map +1 -1
- package/dist/lib/examples/timeout-demo.d.ts +13 -0
- package/dist/lib/examples/timeout-demo.d.ts.map +1 -0
- package/dist/lib/examples/timeout-demo.js +102 -0
- package/dist/lib/examples/timeout-demo.js.map +1 -0
- package/dist/lib/examples/timeout-integration-example.d.ts +17 -0
- package/dist/lib/examples/timeout-integration-example.d.ts.map +1 -0
- package/dist/lib/examples/timeout-integration-example.js +223 -0
- package/dist/lib/examples/timeout-integration-example.js.map +1 -0
- package/dist/lib/notification-hooks.d.ts +103 -0
- package/dist/lib/notification-hooks.d.ts.map +1 -0
- package/dist/lib/notification-hooks.js +223 -0
- package/dist/lib/notification-hooks.js.map +1 -0
- package/dist/lib/notifications/discord.d.ts +20 -0
- package/dist/lib/notifications/discord.d.ts.map +1 -0
- package/dist/lib/notifications/discord.js +140 -0
- package/dist/lib/notifications/discord.js.map +1 -0
- package/dist/lib/notifications/index.d.ts +66 -0
- package/dist/lib/notifications/index.d.ts.map +1 -0
- package/dist/lib/notifications/index.js +120 -0
- package/dist/lib/notifications/index.js.map +1 -0
- package/dist/lib/notifications/slack.d.ts +20 -0
- package/dist/lib/notifications/slack.d.ts.map +1 -0
- package/dist/lib/notifications/slack.js +186 -0
- package/dist/lib/notifications/slack.js.map +1 -0
- package/dist/lib/notifications/teams.d.ts +20 -0
- package/dist/lib/notifications/teams.d.ts.map +1 -0
- package/dist/lib/notifications/teams.js +146 -0
- package/dist/lib/notifications/teams.js.map +1 -0
- package/dist/lib/notifications/webhook.d.ts +23 -0
- package/dist/lib/notifications/webhook.d.ts.map +1 -0
- package/dist/lib/notifications/webhook.js +65 -0
- package/dist/lib/notifications/webhook.js.map +1 -0
- package/dist/lib/orchestrator-state.d.ts +194 -0
- package/dist/lib/orchestrator-state.d.ts.map +1 -0
- package/dist/lib/orchestrator-state.js +332 -0
- package/dist/lib/orchestrator-state.js.map +1 -0
- package/dist/lib/output-formatter.d.ts +25 -1
- package/dist/lib/output-formatter.d.ts.map +1 -1
- package/dist/lib/output-formatter.js +37 -17
- package/dist/lib/output-formatter.js.map +1 -1
- package/dist/lib/realtime-cursor.d.ts +107 -0
- package/dist/lib/realtime-cursor.d.ts.map +1 -0
- package/dist/lib/realtime-cursor.js +260 -0
- package/dist/lib/realtime-cursor.js.map +1 -0
- package/dist/lib/rollback.d.ts +86 -0
- package/dist/lib/rollback.d.ts.map +1 -0
- package/dist/lib/rollback.js +405 -0
- package/dist/lib/rollback.js.map +1 -0
- package/dist/lib/sprint-loader.d.ts +41 -2
- package/dist/lib/sprint-loader.d.ts.map +1 -1
- package/dist/lib/sprint-loader.js +335 -9
- package/dist/lib/sprint-loader.js.map +1 -1
- package/dist/lib/stale-agent-detector.d.ts +102 -0
- package/dist/lib/stale-agent-detector.d.ts.map +1 -0
- package/dist/lib/stale-agent-detector.js +156 -0
- package/dist/lib/stale-agent-detector.js.map +1 -0
- package/dist/lib/task-dependencies.d.ts +143 -0
- package/dist/lib/task-dependencies.d.ts.map +1 -0
- package/dist/lib/task-dependencies.js +357 -0
- package/dist/lib/task-dependencies.js.map +1 -0
- package/dist/lib/task-timeout.d.ts +153 -0
- package/dist/lib/task-timeout.d.ts.map +1 -0
- package/dist/lib/task-timeout.js +505 -0
- package/dist/lib/task-timeout.js.map +1 -0
- package/dist/lib/verification/build-check.d.ts +55 -0
- package/dist/lib/verification/build-check.d.ts.map +1 -0
- package/dist/lib/verification/build-check.js +111 -0
- package/dist/lib/verification/build-check.js.map +1 -0
- package/dist/lib/verification/index.d.ts +19 -0
- package/dist/lib/verification/index.d.ts.map +1 -0
- package/dist/lib/verification/index.js +17 -0
- package/dist/lib/verification/index.js.map +1 -0
- package/dist/lib/verification/lint-check.d.ts +34 -0
- package/dist/lib/verification/lint-check.d.ts.map +1 -0
- package/dist/lib/verification/lint-check.js +215 -0
- package/dist/lib/verification/lint-check.js.map +1 -0
- package/dist/lib/verification/test-runner.d.ts +50 -0
- package/dist/lib/verification/test-runner.d.ts.map +1 -0
- package/dist/lib/verification/test-runner.js +225 -0
- package/dist/lib/verification/test-runner.js.map +1 -0
- package/dist/templates/ai-instructions-template.d.ts +3 -2
- package/dist/templates/ai-instructions-template.d.ts.map +1 -1
- package/dist/templates/ai-instructions-template.js +104 -2
- package/dist/templates/ai-instructions-template.js.map +1 -1
- package/dist/templates/epic-template.md +319 -0
- package/dist/utils/command-helpers.d.ts +10 -0
- package/dist/utils/command-helpers.d.ts.map +1 -1
- package/dist/utils/command-helpers.js +59 -1
- package/dist/utils/command-helpers.js.map +1 -1
- package/dist/utils/pattern-confidence.d.ts +82 -0
- package/dist/utils/pattern-confidence.d.ts.map +1 -0
- package/dist/utils/pattern-confidence.js +172 -0
- package/dist/utils/pattern-confidence.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-07
|
|
5
|
+
* @tags: [escalation, api, client, epic-004, human-intervention]
|
|
6
|
+
* @related: [create.ts, list.ts, resolve.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [auth-storage]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Escalation API Client (EPIC-004 Sprint 5 TASK-7)
|
|
13
|
+
*
|
|
14
|
+
* Client for interacting with escalation management API endpoints
|
|
15
|
+
*/
|
|
16
|
+
import { getAccessToken, isAuthenticated } from '../../utils/auth-storage.js';
|
|
17
|
+
/**
|
|
18
|
+
* Escalation API client
|
|
19
|
+
*/
|
|
20
|
+
export class EscalationClient {
|
|
21
|
+
static apiUrl = process.env.GINKO_API_URL || 'https://app.ginkoai.com';
|
|
22
|
+
/**
|
|
23
|
+
* Check if user is authenticated
|
|
24
|
+
*/
|
|
25
|
+
static async requireAuth() {
|
|
26
|
+
if (!await isAuthenticated()) {
|
|
27
|
+
throw new Error('Not authenticated. Run "ginko login" first.');
|
|
28
|
+
}
|
|
29
|
+
const token = await getAccessToken();
|
|
30
|
+
if (!token) {
|
|
31
|
+
throw new Error('Failed to get access token. Run "ginko login" again.');
|
|
32
|
+
}
|
|
33
|
+
return token;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Make authenticated API request
|
|
37
|
+
*/
|
|
38
|
+
static async request(method, endpoint, body) {
|
|
39
|
+
const token = await this.requireAuth();
|
|
40
|
+
const url = `${this.apiUrl}${endpoint}`;
|
|
41
|
+
const debugMode = process.env.GINKO_DEBUG_API === 'true';
|
|
42
|
+
if (debugMode) {
|
|
43
|
+
console.log(`\n[Escalation API Debug] ${method} ${url}`);
|
|
44
|
+
if (body) {
|
|
45
|
+
console.log('[Escalation API Debug] Request body:', JSON.stringify(body, null, 2));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const response = await fetch(url, {
|
|
50
|
+
method,
|
|
51
|
+
headers: {
|
|
52
|
+
'Authorization': `Bearer ${token}`,
|
|
53
|
+
'Content-Type': 'application/json',
|
|
54
|
+
'X-Client-Version': 'ginko-cli@1.2.0',
|
|
55
|
+
},
|
|
56
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
57
|
+
});
|
|
58
|
+
if (debugMode) {
|
|
59
|
+
console.log(`[Escalation API Debug] Response status: ${response.status} ${response.statusText}`);
|
|
60
|
+
}
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
const errorData = await response.json();
|
|
63
|
+
if (debugMode) {
|
|
64
|
+
console.log('[Escalation API Debug] Error response:', JSON.stringify(errorData, null, 2));
|
|
65
|
+
}
|
|
66
|
+
throw new Error(errorData.error.message || `API error: ${response.status}`);
|
|
67
|
+
}
|
|
68
|
+
const responseData = await response.json();
|
|
69
|
+
if (debugMode) {
|
|
70
|
+
console.log('[Escalation API Debug] Response data:', JSON.stringify(responseData, null, 2));
|
|
71
|
+
}
|
|
72
|
+
return responseData;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error instanceof Error) {
|
|
76
|
+
throw new Error(`Failed to ${method} ${url}: ${error.message}`);
|
|
77
|
+
}
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create a new escalation
|
|
83
|
+
*/
|
|
84
|
+
static async create(data) {
|
|
85
|
+
return this.request('POST', '/api/v1/escalation', data);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* List escalations with optional filtering
|
|
89
|
+
*/
|
|
90
|
+
static async list(params = {}) {
|
|
91
|
+
const queryParams = new URLSearchParams();
|
|
92
|
+
if (params.status) {
|
|
93
|
+
queryParams.append('status', params.status);
|
|
94
|
+
}
|
|
95
|
+
if (params.severity) {
|
|
96
|
+
queryParams.append('severity', params.severity);
|
|
97
|
+
}
|
|
98
|
+
if (params.taskId) {
|
|
99
|
+
queryParams.append('taskId', params.taskId);
|
|
100
|
+
}
|
|
101
|
+
if (params.agentId) {
|
|
102
|
+
queryParams.append('agentId', params.agentId);
|
|
103
|
+
}
|
|
104
|
+
if (params.limit !== undefined) {
|
|
105
|
+
queryParams.append('limit', params.limit.toString());
|
|
106
|
+
}
|
|
107
|
+
if (params.offset !== undefined) {
|
|
108
|
+
queryParams.append('offset', params.offset.toString());
|
|
109
|
+
}
|
|
110
|
+
const queryString = queryParams.toString();
|
|
111
|
+
const endpoint = queryString ? `/api/v1/escalation?${queryString}` : '/api/v1/escalation';
|
|
112
|
+
return this.request('GET', endpoint);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Acknowledge an escalation
|
|
116
|
+
*/
|
|
117
|
+
static async acknowledge(escalationId, acknowledgedBy) {
|
|
118
|
+
const request = { acknowledgedBy };
|
|
119
|
+
return this.request('POST', `/api/v1/escalation/${escalationId}/acknowledge`, request);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Resolve an escalation
|
|
123
|
+
*/
|
|
124
|
+
static async resolve(escalationId, resolvedBy, resolution) {
|
|
125
|
+
const request = { resolvedBy, resolution };
|
|
126
|
+
return this.request('POST', `/api/v1/escalation/${escalationId}/resolve`, request);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=escalation-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escalation-client.js","sourceRoot":"","sources":["../../../src/commands/escalation/escalation-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-07
|
|
5
|
+
* @tags: [escalation, cli, epic-004, human-intervention, multi-agent]
|
|
6
|
+
* @related: [create.ts, list.ts, resolve.ts, escalation-client.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [commander, chalk]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Escalation Commands (EPIC-004 Sprint 5 TASK-7)
|
|
13
|
+
*
|
|
14
|
+
* CLI commands for human escalation management in multi-agent collaboration
|
|
15
|
+
*/
|
|
16
|
+
import { Command } from 'commander';
|
|
17
|
+
/**
|
|
18
|
+
* Main escalation command with subcommands
|
|
19
|
+
*/
|
|
20
|
+
export declare function escalationCommand(): Command;
|
|
21
|
+
export default escalationCommand;
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/escalation/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC;;GAEG;AACH,wBAAgB,iBAAiB,YA0EhC;AAGD,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-07
|
|
5
|
+
* @tags: [escalation, cli, epic-004, human-intervention, multi-agent]
|
|
6
|
+
* @related: [create.ts, list.ts, resolve.ts, escalation-client.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [commander, chalk]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Escalation Commands (EPIC-004 Sprint 5 TASK-7)
|
|
13
|
+
*
|
|
14
|
+
* CLI commands for human escalation management in multi-agent collaboration
|
|
15
|
+
*/
|
|
16
|
+
import { Command } from 'commander';
|
|
17
|
+
import chalk from 'chalk';
|
|
18
|
+
import { createEscalationCommand } from './create.js';
|
|
19
|
+
import { listEscalationsCommand } from './list.js';
|
|
20
|
+
import { resolveEscalationCommand } from './resolve.js';
|
|
21
|
+
/**
|
|
22
|
+
* Main escalation command with subcommands
|
|
23
|
+
*/
|
|
24
|
+
export function escalationCommand() {
|
|
25
|
+
const escalation = new Command('escalation')
|
|
26
|
+
.description('Manage human escalations for multi-agent collaboration (EPIC-004)')
|
|
27
|
+
.showHelpAfterError('(use --help for additional information)')
|
|
28
|
+
.addHelpText('after', `
|
|
29
|
+
${chalk.gray('Quick Start:')}
|
|
30
|
+
${chalk.green('ginko login')} ${chalk.gray('# Authenticate first')}
|
|
31
|
+
${chalk.green('ginko escalation create')} --task TASK-1 \\
|
|
32
|
+
--reason "..." \\
|
|
33
|
+
--severity high ${chalk.gray('# Create escalation')}
|
|
34
|
+
${chalk.green('ginko escalation list')} --status open ${chalk.gray('# List open escalations')}
|
|
35
|
+
${chalk.green('ginko escalation resolve')} <id> \\
|
|
36
|
+
--resolution "..." ${chalk.gray('# Resolve escalation')}
|
|
37
|
+
|
|
38
|
+
${chalk.gray('Usage Examples:')}
|
|
39
|
+
${chalk.green('ginko escalation create')} --task TASK-5 --reason "Ambiguous requirements" --severity medium
|
|
40
|
+
${chalk.green('ginko escalation list')} --status open --severity critical
|
|
41
|
+
${chalk.green('ginko escalation list')} --task TASK-1
|
|
42
|
+
${chalk.green('ginko escalation resolve')} escalation_123 --resolution "Clarified in ADR-050"
|
|
43
|
+
|
|
44
|
+
${chalk.gray('Features:')}
|
|
45
|
+
${chalk.cyan('🚨 Escalation Creation')} - Request human intervention
|
|
46
|
+
${chalk.cyan('📋 Escalation Discovery')} - List and filter escalations
|
|
47
|
+
${chalk.cyan('✅ Resolution Tracking')} - Record human decisions
|
|
48
|
+
${chalk.cyan('🔄 Task Unblocking')} - Resume work after resolution
|
|
49
|
+
|
|
50
|
+
${chalk.gray('Learn More:')}
|
|
51
|
+
${chalk.dim('https://docs.ginko.ai/escalations')}
|
|
52
|
+
`)
|
|
53
|
+
.action(() => {
|
|
54
|
+
// When called without subcommand, show help
|
|
55
|
+
escalation.help({ error: false });
|
|
56
|
+
});
|
|
57
|
+
// Create command
|
|
58
|
+
escalation
|
|
59
|
+
.command('create')
|
|
60
|
+
.description('Create a new escalation for human intervention')
|
|
61
|
+
.requiredOption('--task <taskId>', 'Task ID requiring escalation (e.g., "TASK-1")')
|
|
62
|
+
.requiredOption('--reason <reason>', 'Reason for escalation')
|
|
63
|
+
.requiredOption('--severity <severity>', 'Severity level (low|medium|high|critical)')
|
|
64
|
+
.option('--agent <agentId>', 'Agent ID (defaults to current agent from .ginko/agent.json)')
|
|
65
|
+
.action(async (options) => {
|
|
66
|
+
await createEscalationCommand(options);
|
|
67
|
+
});
|
|
68
|
+
// List command
|
|
69
|
+
escalation
|
|
70
|
+
.command('list')
|
|
71
|
+
.description('List escalations with optional filtering')
|
|
72
|
+
.option('--status <status>', 'Filter by status (open|acknowledged|resolved)')
|
|
73
|
+
.option('--severity <severity>', 'Filter by severity (low|medium|high|critical)')
|
|
74
|
+
.option('--task <taskId>', 'Filter by task ID')
|
|
75
|
+
.option('--agent <agentId>', 'Filter by agent ID')
|
|
76
|
+
.option('--limit <limit>', 'Max results (default 20, max 100)', '20')
|
|
77
|
+
.option('--offset <offset>', 'Pagination offset (default 0)', '0')
|
|
78
|
+
.action(async (options) => {
|
|
79
|
+
await listEscalationsCommand(options);
|
|
80
|
+
});
|
|
81
|
+
// Resolve command
|
|
82
|
+
escalation
|
|
83
|
+
.command('resolve <id>')
|
|
84
|
+
.description('Resolve an escalation with human decision')
|
|
85
|
+
.requiredOption('--resolution <resolution>', 'Resolution details')
|
|
86
|
+
.option('--resolved-by <email>', 'Email of person resolving (defaults to git user.email)')
|
|
87
|
+
.action(async (id, options) => {
|
|
88
|
+
await resolveEscalationCommand(id, options);
|
|
89
|
+
});
|
|
90
|
+
return escalation;
|
|
91
|
+
}
|
|
92
|
+
// Export for use in main CLI
|
|
93
|
+
export default escalationCommand;
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/escalation/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-07
|
|
5
|
+
* @tags: [escalation, list, cli, epic-004, human-intervention]
|
|
6
|
+
* @related: [index.ts, escalation-client.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [commander, chalk, ora]
|
|
10
|
+
*/
|
|
11
|
+
interface ListOptions {
|
|
12
|
+
status?: string;
|
|
13
|
+
severity?: string;
|
|
14
|
+
task?: string;
|
|
15
|
+
agent?: string;
|
|
16
|
+
limit?: string;
|
|
17
|
+
offset?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* List escalations
|
|
21
|
+
*/
|
|
22
|
+
export declare function listEscalationsCommand(options: ListOptions): Promise<void>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/escalation/list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAyDD;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuGhF"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-07
|
|
5
|
+
* @tags: [escalation, list, cli, epic-004, human-intervention]
|
|
6
|
+
* @related: [index.ts, escalation-client.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [commander, chalk, ora]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* List Escalations Command (EPIC-004 Sprint 5 TASK-7)
|
|
13
|
+
*
|
|
14
|
+
* List escalations with optional filtering and severity-based ordering
|
|
15
|
+
*/
|
|
16
|
+
import chalk from 'chalk';
|
|
17
|
+
import ora from 'ora';
|
|
18
|
+
import { EscalationClient } from './escalation-client.js';
|
|
19
|
+
/**
|
|
20
|
+
* Get severity color
|
|
21
|
+
*/
|
|
22
|
+
function getSeverityColor(severity) {
|
|
23
|
+
switch (severity) {
|
|
24
|
+
case 'critical':
|
|
25
|
+
return chalk.red(severity.toUpperCase());
|
|
26
|
+
case 'high':
|
|
27
|
+
return chalk.yellow(severity.toUpperCase());
|
|
28
|
+
case 'medium':
|
|
29
|
+
return chalk.blue(severity);
|
|
30
|
+
case 'low':
|
|
31
|
+
return chalk.gray(severity);
|
|
32
|
+
default:
|
|
33
|
+
return severity;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get status indicator
|
|
38
|
+
*/
|
|
39
|
+
function getStatusIndicator(status) {
|
|
40
|
+
switch (status) {
|
|
41
|
+
case 'open':
|
|
42
|
+
return chalk.red('●');
|
|
43
|
+
case 'acknowledged':
|
|
44
|
+
return chalk.yellow('●');
|
|
45
|
+
case 'resolved':
|
|
46
|
+
return chalk.green('●');
|
|
47
|
+
default:
|
|
48
|
+
return '●';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Format date for display
|
|
53
|
+
*/
|
|
54
|
+
function formatDate(dateString) {
|
|
55
|
+
const date = new Date(dateString);
|
|
56
|
+
const now = new Date();
|
|
57
|
+
const diffMs = now.getTime() - date.getTime();
|
|
58
|
+
const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
|
|
59
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
60
|
+
if (diffHours < 1) {
|
|
61
|
+
return chalk.red('< 1 hour ago');
|
|
62
|
+
}
|
|
63
|
+
else if (diffHours < 24) {
|
|
64
|
+
return chalk.yellow(`${diffHours}h ago`);
|
|
65
|
+
}
|
|
66
|
+
else if (diffDays < 7) {
|
|
67
|
+
return chalk.dim(`${diffDays}d ago`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return chalk.dim(date.toLocaleDateString());
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* List escalations
|
|
75
|
+
*/
|
|
76
|
+
export async function listEscalationsCommand(options) {
|
|
77
|
+
const spinner = ora('Loading escalations...').start();
|
|
78
|
+
try {
|
|
79
|
+
const limit = options.limit ? parseInt(options.limit, 10) : 20;
|
|
80
|
+
const offset = options.offset ? parseInt(options.offset, 10) : 0;
|
|
81
|
+
// Fetch escalations via API
|
|
82
|
+
const response = await EscalationClient.list({
|
|
83
|
+
status: options.status,
|
|
84
|
+
severity: options.severity,
|
|
85
|
+
taskId: options.task,
|
|
86
|
+
agentId: options.agent,
|
|
87
|
+
limit,
|
|
88
|
+
offset,
|
|
89
|
+
});
|
|
90
|
+
spinner.stop();
|
|
91
|
+
if (response.escalations.length === 0) {
|
|
92
|
+
console.log(chalk.dim('No escalations found'));
|
|
93
|
+
if (options.status || options.severity || options.task || options.agent) {
|
|
94
|
+
console.log('');
|
|
95
|
+
console.log(chalk.dim('💡 Try removing filters to see all escalations'));
|
|
96
|
+
}
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Display results
|
|
100
|
+
console.log('');
|
|
101
|
+
console.log(chalk.bold(`Escalations (${response.total} total, showing ${response.escalations.length})`));
|
|
102
|
+
console.log('');
|
|
103
|
+
for (const escalation of response.escalations) {
|
|
104
|
+
const status = getStatusIndicator(escalation.status);
|
|
105
|
+
const severity = getSeverityColor(escalation.severity);
|
|
106
|
+
const age = formatDate(escalation.createdAt);
|
|
107
|
+
console.log(`${status} ${severity} ${chalk.bold(escalation.taskId)} - ${escalation.reason}`);
|
|
108
|
+
console.log(chalk.dim(` ID: ${escalation.id}`));
|
|
109
|
+
console.log(chalk.dim(` Agent: ${escalation.agentId}`));
|
|
110
|
+
console.log(chalk.dim(` Created: ${age}`));
|
|
111
|
+
if (escalation.status === 'acknowledged' && escalation.acknowledgedBy) {
|
|
112
|
+
console.log(chalk.dim(` Acknowledged by: ${escalation.acknowledgedBy}`));
|
|
113
|
+
}
|
|
114
|
+
if (escalation.status === 'resolved' && escalation.resolvedBy && escalation.resolution) {
|
|
115
|
+
console.log(chalk.dim(` Resolved by: ${escalation.resolvedBy}`));
|
|
116
|
+
console.log(chalk.dim(` Resolution: ${escalation.resolution}`));
|
|
117
|
+
}
|
|
118
|
+
console.log('');
|
|
119
|
+
}
|
|
120
|
+
// Show pagination info
|
|
121
|
+
if (response.total > limit) {
|
|
122
|
+
const hasMore = offset + limit < response.total;
|
|
123
|
+
if (hasMore) {
|
|
124
|
+
console.log(chalk.dim(`💡 Use --offset ${offset + limit} to see more results`));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Show summary by severity for open escalations
|
|
128
|
+
if (!options.status || options.status === 'open') {
|
|
129
|
+
const openEscalations = response.escalations.filter(e => e.status === 'open');
|
|
130
|
+
if (openEscalations.length > 0) {
|
|
131
|
+
const critical = openEscalations.filter(e => e.severity === 'critical').length;
|
|
132
|
+
const high = openEscalations.filter(e => e.severity === 'high').length;
|
|
133
|
+
const medium = openEscalations.filter(e => e.severity === 'medium').length;
|
|
134
|
+
const low = openEscalations.filter(e => e.severity === 'low').length;
|
|
135
|
+
console.log(chalk.bold('Open Escalations Summary:'));
|
|
136
|
+
if (critical > 0)
|
|
137
|
+
console.log(chalk.red(` ${critical} critical`));
|
|
138
|
+
if (high > 0)
|
|
139
|
+
console.log(chalk.yellow(` ${high} high`));
|
|
140
|
+
if (medium > 0)
|
|
141
|
+
console.log(chalk.blue(` ${medium} medium`));
|
|
142
|
+
if (low > 0)
|
|
143
|
+
console.log(chalk.gray(` ${low} low`));
|
|
144
|
+
console.log('');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Show next steps
|
|
148
|
+
console.log(chalk.dim('💡 Next steps:'));
|
|
149
|
+
console.log(chalk.dim(' ginko escalation resolve <id> --resolution "..." # Resolve escalation'));
|
|
150
|
+
console.log(chalk.dim(' ginko escalation list --status resolved # View resolved'));
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
spinner.fail(chalk.red('Failed to list escalations'));
|
|
154
|
+
// Handle specific error codes
|
|
155
|
+
if (error.message.includes('Not authenticated')) {
|
|
156
|
+
console.error(chalk.red(' Not authenticated. Run `ginko login` first.'));
|
|
157
|
+
}
|
|
158
|
+
else if (error.message.includes('INVALID_STATUS')) {
|
|
159
|
+
console.error(chalk.red(' Invalid status. Must be: open, acknowledged, resolved'));
|
|
160
|
+
}
|
|
161
|
+
else if (error.message.includes('INVALID_SEVERITY')) {
|
|
162
|
+
console.error(chalk.red(' Invalid severity. Must be: low, medium, high, critical'));
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
console.error(chalk.red(` ${error.message}`));
|
|
166
|
+
}
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/escalation/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-07
|
|
5
|
+
* @tags: [escalation, resolve, cli, epic-004, human-intervention]
|
|
6
|
+
* @related: [index.ts, escalation-client.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [commander, chalk, ora]
|
|
10
|
+
*/
|
|
11
|
+
interface ResolveOptions {
|
|
12
|
+
resolution: string;
|
|
13
|
+
resolvedBy?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolve an escalation
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveEscalationCommand(escalationId: string, options: ResolveOptions): Promise<void>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/commands/escalation/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,UAAU,cAAc;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAcD;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC,CAyEf"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: command
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-07
|
|
5
|
+
* @tags: [escalation, resolve, cli, epic-004, human-intervention]
|
|
6
|
+
* @related: [index.ts, escalation-client.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [commander, chalk, ora]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Resolve Escalation Command (EPIC-004 Sprint 5 TASK-7)
|
|
13
|
+
*
|
|
14
|
+
* Resolve an escalation with human decision/guidance
|
|
15
|
+
*/
|
|
16
|
+
import chalk from 'chalk';
|
|
17
|
+
import ora from 'ora';
|
|
18
|
+
import { execSync } from 'child_process';
|
|
19
|
+
import { EscalationClient } from './escalation-client.js';
|
|
20
|
+
/**
|
|
21
|
+
* Get git user email
|
|
22
|
+
*/
|
|
23
|
+
function getGitUserEmail() {
|
|
24
|
+
try {
|
|
25
|
+
const email = execSync('git config user.email', { encoding: 'utf-8' }).trim();
|
|
26
|
+
return email || null;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolve an escalation
|
|
34
|
+
*/
|
|
35
|
+
export async function resolveEscalationCommand(escalationId, options) {
|
|
36
|
+
const spinner = ora('Resolving escalation...').start();
|
|
37
|
+
try {
|
|
38
|
+
// Validate escalation ID
|
|
39
|
+
if (!escalationId || escalationId.trim().length === 0) {
|
|
40
|
+
spinner.fail(chalk.red('Failed to resolve escalation'));
|
|
41
|
+
console.error(chalk.red(' Escalation ID is required'));
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
// Get resolvedBy (default to git user.email)
|
|
45
|
+
let resolvedBy = options.resolvedBy;
|
|
46
|
+
if (!resolvedBy) {
|
|
47
|
+
const gitEmail = getGitUserEmail();
|
|
48
|
+
if (!gitEmail) {
|
|
49
|
+
spinner.fail(chalk.red('Failed to resolve escalation'));
|
|
50
|
+
console.error(chalk.red(' Could not determine git user.email'));
|
|
51
|
+
console.error(chalk.red(' Either:'));
|
|
52
|
+
console.error(chalk.red(' - Set git config user.email'));
|
|
53
|
+
console.error(chalk.red(' - Use --resolved-by <email> to specify'));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
resolvedBy = gitEmail;
|
|
57
|
+
}
|
|
58
|
+
// Resolve escalation via API
|
|
59
|
+
const response = await EscalationClient.resolve(escalationId, resolvedBy, options.resolution);
|
|
60
|
+
if (!response.escalationId) {
|
|
61
|
+
spinner.fail(chalk.red('Failed to resolve escalation'));
|
|
62
|
+
console.error(chalk.red(' No escalation ID returned from API'));
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
spinner.succeed(chalk.green('Escalation resolved successfully'));
|
|
66
|
+
console.log('');
|
|
67
|
+
console.log(chalk.bold(' Resolution recorded'));
|
|
68
|
+
console.log(chalk.dim(` ID: ${response.escalationId}`));
|
|
69
|
+
console.log(chalk.dim(` Status: ${response.status}`));
|
|
70
|
+
console.log(chalk.dim(` Resolved by: ${response.resolvedBy}`));
|
|
71
|
+
console.log(chalk.dim(` Resolved at: ${new Date(response.resolvedAt).toLocaleString()}`));
|
|
72
|
+
console.log('');
|
|
73
|
+
console.log(chalk.bold(' Resolution:'));
|
|
74
|
+
console.log(chalk.dim(` ${response.resolution}`));
|
|
75
|
+
console.log('');
|
|
76
|
+
// Show next steps
|
|
77
|
+
console.log(chalk.dim('💡 Task is now unblocked and can resume'));
|
|
78
|
+
console.log(chalk.dim(' ginko escalation list --status open # View remaining escalations'));
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
spinner.fail(chalk.red('Failed to resolve escalation'));
|
|
82
|
+
// Handle specific error codes
|
|
83
|
+
if (error.message.includes('Not authenticated')) {
|
|
84
|
+
console.error(chalk.red(' Not authenticated. Run `ginko login` first.'));
|
|
85
|
+
}
|
|
86
|
+
else if (error.message.includes('ESCALATION_NOT_FOUND')) {
|
|
87
|
+
console.error(chalk.red(' Escalation not found or already resolved'));
|
|
88
|
+
console.error(chalk.red(' Use "ginko escalation list" to see available escalations'));
|
|
89
|
+
}
|
|
90
|
+
else if (error.message.includes('MISSING_RESOLVED_BY')) {
|
|
91
|
+
console.error(chalk.red(' resolvedBy is required'));
|
|
92
|
+
}
|
|
93
|
+
else if (error.message.includes('MISSING_RESOLUTION')) {
|
|
94
|
+
console.error(chalk.red(' Resolution details are required'));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.error(chalk.red(` ${error.message}`));
|
|
98
|
+
}
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/commands/escalation/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO1D;;GAEG;AACH,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9E,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,YAAoB,EACpB,OAAuB;IAEvB,MAAM,OAAO,GAAG,GAAG,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEvD,IAAI,CAAC;QACH,yBAAyB;QACzB,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,6CAA6C;QAC7C,IAAI,UAAU,GAAuB,OAAO,CAAC,UAAU,CAAC;QACxD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBACxD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;gBACjE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;gBACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBAC5D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;gBACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,UAAU,GAAG,QAAQ,CAAC;QACxB,CAAC;QAED,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAC7C,YAAY,EACZ,UAAU,EACV,OAAO,CAAC,UAAU,CACnB,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC,CAAC;IAClG,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAExD,8BAA8B;QAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC,CAAC;QACzF,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|