@ginkoai/cli 1.6.2 → 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/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/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 +21 -1
- package/dist/commands/graph/api-client.d.ts.map +1 -1
- package/dist/commands/graph/api-client.js +23 -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 +73 -14
- 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.map +1 -1
- package/dist/commands/start/start-reflection.js +8 -0
- 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/index.js +78 -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/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 +39 -2
- package/dist/lib/sprint-loader.d.ts.map +1 -1
- package/dist/lib/sprint-loader.js +255 -4
- 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/utils/command-helpers.d.ts.map +1 -1
- package/dist/utils/command-helpers.js +7 -0
- package/dist/utils/command-helpers.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-05
|
|
5
|
+
* @tags: [cursor, realtime, epic-004, multi-agent, event-stream]
|
|
6
|
+
* @related: [event-logger.ts, event-queue.ts, ../commands/graph/api-client.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: medium
|
|
9
|
+
* @dependencies: [auth-storage]
|
|
10
|
+
*
|
|
11
|
+
* Real-time cursor updates for EPIC-004 multi-agent coordination.
|
|
12
|
+
*
|
|
13
|
+
* Purpose: Push cursor position to cloud immediately after significant actions,
|
|
14
|
+
* enabling other agents to see work in near-real-time (< 5 seconds).
|
|
15
|
+
*
|
|
16
|
+
* When to update:
|
|
17
|
+
* - After task claim
|
|
18
|
+
* - After each logged event
|
|
19
|
+
* - After task completion
|
|
20
|
+
* - On session start/resume
|
|
21
|
+
*
|
|
22
|
+
* Configuration:
|
|
23
|
+
* - Flag: --realtime-cursor (default: true)
|
|
24
|
+
* - Env: GINKO_REALTIME_CURSOR=true|false
|
|
25
|
+
*/
|
|
26
|
+
import { getAccessToken, isAuthenticated } from '../utils/auth-storage.js';
|
|
27
|
+
import { getUserEmail, getProjectRoot } from '../utils/helpers.js';
|
|
28
|
+
import path from 'path';
|
|
29
|
+
import { execSync } from 'child_process';
|
|
30
|
+
/**
|
|
31
|
+
* Runtime override for realtime cursor (set by CLI options)
|
|
32
|
+
*/
|
|
33
|
+
let runtimeOverride;
|
|
34
|
+
/**
|
|
35
|
+
* Set runtime override for realtime cursor
|
|
36
|
+
* Called by CLI when --no-realtime-cursor is passed
|
|
37
|
+
*/
|
|
38
|
+
export function setRealtimeCursorEnabled(enabled) {
|
|
39
|
+
runtimeOverride = enabled;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get configuration for realtime cursor updates
|
|
43
|
+
*/
|
|
44
|
+
export function getRealtimeCursorConfig() {
|
|
45
|
+
// Check runtime override first (from CLI options)
|
|
46
|
+
if (runtimeOverride !== undefined) {
|
|
47
|
+
return {
|
|
48
|
+
enabled: runtimeOverride,
|
|
49
|
+
apiUrl: process.env.GINKO_API_URL || 'https://app.ginkoai.com',
|
|
50
|
+
debounceMs: 100,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// Default to enabled for EPIC-004 multi-agent coordination
|
|
54
|
+
// Can be disabled via GINKO_REALTIME_CURSOR=false
|
|
55
|
+
const enabled = process.env.GINKO_REALTIME_CURSOR !== 'false';
|
|
56
|
+
return {
|
|
57
|
+
enabled,
|
|
58
|
+
apiUrl: process.env.GINKO_API_URL || 'https://app.ginkoai.com',
|
|
59
|
+
debounceMs: 100, // Debounce rapid updates
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if realtime cursor updates are enabled
|
|
64
|
+
*/
|
|
65
|
+
export function isRealtimeCursorEnabled() {
|
|
66
|
+
return getRealtimeCursorConfig().enabled;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Last update timestamp for debouncing
|
|
70
|
+
*/
|
|
71
|
+
let lastUpdateTime = 0;
|
|
72
|
+
let pendingUpdate = null;
|
|
73
|
+
let updateTimer = null;
|
|
74
|
+
/**
|
|
75
|
+
* Push cursor update to cloud immediately
|
|
76
|
+
*
|
|
77
|
+
* Uses debouncing to prevent rapid-fire updates (e.g., multiple events logged in quick succession).
|
|
78
|
+
* Guarantees update within config.debounceMs after last call.
|
|
79
|
+
*
|
|
80
|
+
* @param update - Cursor update payload
|
|
81
|
+
* @returns Promise resolving when update is sent (or debounced)
|
|
82
|
+
*/
|
|
83
|
+
export async function pushCursorUpdate(update) {
|
|
84
|
+
const config = getRealtimeCursorConfig();
|
|
85
|
+
if (!config.enabled) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const now = Date.now();
|
|
89
|
+
pendingUpdate = update;
|
|
90
|
+
// Clear existing timer
|
|
91
|
+
if (updateTimer) {
|
|
92
|
+
clearTimeout(updateTimer);
|
|
93
|
+
}
|
|
94
|
+
// Debounce: wait for config.debounceMs after last call
|
|
95
|
+
const timeSinceLastUpdate = now - lastUpdateTime;
|
|
96
|
+
if (timeSinceLastUpdate < config.debounceMs) {
|
|
97
|
+
// Schedule update after debounce period
|
|
98
|
+
updateTimer = setTimeout(async () => {
|
|
99
|
+
if (pendingUpdate) {
|
|
100
|
+
await sendCursorUpdate(pendingUpdate);
|
|
101
|
+
pendingUpdate = null;
|
|
102
|
+
}
|
|
103
|
+
}, config.debounceMs - timeSinceLastUpdate);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Send immediately if outside debounce window
|
|
107
|
+
await sendCursorUpdate(update);
|
|
108
|
+
lastUpdateTime = now;
|
|
109
|
+
pendingUpdate = null;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Send cursor update to API
|
|
113
|
+
*/
|
|
114
|
+
async function sendCursorUpdate(update) {
|
|
115
|
+
try {
|
|
116
|
+
// Check authentication
|
|
117
|
+
if (!await isAuthenticated()) {
|
|
118
|
+
// Silently skip if not authenticated - don't block local-only usage
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const token = await getAccessToken();
|
|
122
|
+
if (!token) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
const config = getRealtimeCursorConfig();
|
|
126
|
+
const url = `${config.apiUrl}/api/v1/cursor/update`;
|
|
127
|
+
const response = await fetch(url, {
|
|
128
|
+
method: 'POST',
|
|
129
|
+
headers: {
|
|
130
|
+
'Authorization': `Bearer ${token}`,
|
|
131
|
+
'Content-Type': 'application/json',
|
|
132
|
+
'X-Client-Version': 'ginko-cli@1.2.0',
|
|
133
|
+
},
|
|
134
|
+
body: JSON.stringify(update),
|
|
135
|
+
});
|
|
136
|
+
if (!response.ok) {
|
|
137
|
+
// Log but don't throw - cursor update failure shouldn't block user
|
|
138
|
+
console.warn(`[RealtimeCursor] Update failed: ${response.status}`);
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
return await response.json();
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
// Network errors shouldn't block user operations
|
|
145
|
+
console.warn('[RealtimeCursor] Update error:', error instanceof Error ? error.message : String(error));
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get current context for cursor update
|
|
151
|
+
*/
|
|
152
|
+
async function getCurrentContext() {
|
|
153
|
+
const userEmail = await getUserEmail();
|
|
154
|
+
const projectRoot = await getProjectRoot();
|
|
155
|
+
const projectId = path.basename(projectRoot);
|
|
156
|
+
// Get current git branch
|
|
157
|
+
let branch = 'main';
|
|
158
|
+
try {
|
|
159
|
+
branch = execSync('git rev-parse --abbrev-ref HEAD', {
|
|
160
|
+
encoding: 'utf8',
|
|
161
|
+
cwd: projectRoot,
|
|
162
|
+
}).trim();
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Not in git repo or git not available
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
userId: userEmail,
|
|
169
|
+
projectId,
|
|
170
|
+
branch,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Update cursor on session start/resume
|
|
175
|
+
*/
|
|
176
|
+
export async function onSessionStart() {
|
|
177
|
+
if (!isRealtimeCursorEnabled())
|
|
178
|
+
return;
|
|
179
|
+
const context = await getCurrentContext();
|
|
180
|
+
await pushCursorUpdate({
|
|
181
|
+
...context,
|
|
182
|
+
status: 'active',
|
|
183
|
+
timestamp: new Date().toISOString(),
|
|
184
|
+
action: 'session_start',
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Update cursor after event is logged
|
|
189
|
+
*/
|
|
190
|
+
export async function onEventLogged(eventId) {
|
|
191
|
+
if (!isRealtimeCursorEnabled())
|
|
192
|
+
return;
|
|
193
|
+
const context = await getCurrentContext();
|
|
194
|
+
await pushCursorUpdate({
|
|
195
|
+
...context,
|
|
196
|
+
lastEventId: eventId,
|
|
197
|
+
status: 'busy',
|
|
198
|
+
timestamp: new Date().toISOString(),
|
|
199
|
+
action: 'event_logged',
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Update cursor when task is claimed
|
|
204
|
+
*/
|
|
205
|
+
export async function onTaskClaimed(taskId) {
|
|
206
|
+
if (!isRealtimeCursorEnabled())
|
|
207
|
+
return;
|
|
208
|
+
const context = await getCurrentContext();
|
|
209
|
+
await pushCursorUpdate({
|
|
210
|
+
...context,
|
|
211
|
+
currentTask: taskId,
|
|
212
|
+
status: 'busy',
|
|
213
|
+
timestamp: new Date().toISOString(),
|
|
214
|
+
action: 'task_claimed',
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Update cursor when task is completed
|
|
219
|
+
*/
|
|
220
|
+
export async function onTaskCompleted(taskId) {
|
|
221
|
+
if (!isRealtimeCursorEnabled())
|
|
222
|
+
return;
|
|
223
|
+
const context = await getCurrentContext();
|
|
224
|
+
await pushCursorUpdate({
|
|
225
|
+
...context,
|
|
226
|
+
currentTask: taskId,
|
|
227
|
+
status: 'active',
|
|
228
|
+
timestamp: new Date().toISOString(),
|
|
229
|
+
action: 'task_completed',
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Update cursor on handoff
|
|
234
|
+
*/
|
|
235
|
+
export async function onHandoff(finalEventId) {
|
|
236
|
+
if (!isRealtimeCursorEnabled())
|
|
237
|
+
return;
|
|
238
|
+
const context = await getCurrentContext();
|
|
239
|
+
await pushCursorUpdate({
|
|
240
|
+
...context,
|
|
241
|
+
lastEventId: finalEventId,
|
|
242
|
+
status: 'idle',
|
|
243
|
+
timestamp: new Date().toISOString(),
|
|
244
|
+
action: 'handoff',
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Flush any pending cursor update (for shutdown)
|
|
249
|
+
*/
|
|
250
|
+
export async function flushPendingCursorUpdate() {
|
|
251
|
+
if (updateTimer) {
|
|
252
|
+
clearTimeout(updateTimer);
|
|
253
|
+
updateTimer = null;
|
|
254
|
+
}
|
|
255
|
+
if (pendingUpdate) {
|
|
256
|
+
await sendCursorUpdate(pendingUpdate);
|
|
257
|
+
pendingUpdate = null;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=realtime-cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-cursor.js","sourceRoot":"","sources":["../../src/lib/realtime-cursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileType: utility
|
|
3
|
+
* @status: current
|
|
4
|
+
* @updated: 2025-12-07
|
|
5
|
+
* @tags: [rollback, resilience, checkpoint, git, epic-004-sprint5, task-3]
|
|
6
|
+
* @related: [checkpoint.ts, event-logger.ts, orchestrator-state.ts]
|
|
7
|
+
* @priority: high
|
|
8
|
+
* @complexity: high
|
|
9
|
+
* @dependencies: [fs-extra, simple-git, checkpoint.ts]
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Rollback result interface (EPIC-004 Sprint 5 TASK-3)
|
|
13
|
+
*
|
|
14
|
+
* Captures outcome of rollback operation including git operations,
|
|
15
|
+
* stash reference for potential undo, and audit information.
|
|
16
|
+
*/
|
|
17
|
+
export interface RollbackResult {
|
|
18
|
+
success: boolean;
|
|
19
|
+
checkpointId: string;
|
|
20
|
+
stashRef?: string;
|
|
21
|
+
previousCommit: string;
|
|
22
|
+
rolledBackTo: string;
|
|
23
|
+
filesRestored: number;
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Rollback entry for history tracking
|
|
28
|
+
*/
|
|
29
|
+
export interface RollbackEntry {
|
|
30
|
+
id: string;
|
|
31
|
+
checkpointId: string;
|
|
32
|
+
taskId: string;
|
|
33
|
+
agentId: string;
|
|
34
|
+
timestamp: Date;
|
|
35
|
+
previousCommit: string;
|
|
36
|
+
rolledBackTo: string;
|
|
37
|
+
stashRef?: string;
|
|
38
|
+
filesRestored: number;
|
|
39
|
+
reason?: string;
|
|
40
|
+
undone?: boolean;
|
|
41
|
+
undoneAt?: Date;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Rollback to a specific checkpoint
|
|
45
|
+
*
|
|
46
|
+
* Process:
|
|
47
|
+
* 1. Verify checkpoint exists
|
|
48
|
+
* 2. Stash current work (if dirty) with reference
|
|
49
|
+
* 3. Reset to checkpoint commit
|
|
50
|
+
* 4. Create rollback event
|
|
51
|
+
* 5. Release task for re-claiming
|
|
52
|
+
*
|
|
53
|
+
* @param checkpointId - Checkpoint ID to roll back to
|
|
54
|
+
* @param options - Rollback options
|
|
55
|
+
* @returns RollbackResult with success status and details
|
|
56
|
+
*/
|
|
57
|
+
export declare function rollbackToCheckpoint(checkpointId: string, options?: {
|
|
58
|
+
force?: boolean;
|
|
59
|
+
reason?: string;
|
|
60
|
+
}): Promise<RollbackResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Undo a rollback by applying the stashed changes
|
|
63
|
+
*
|
|
64
|
+
* @param stashRef - Git stash reference to apply
|
|
65
|
+
* @returns Success status and error message if failed
|
|
66
|
+
*/
|
|
67
|
+
export declare function undoRollback(stashRef: string): Promise<{
|
|
68
|
+
success: boolean;
|
|
69
|
+
error?: string;
|
|
70
|
+
}>;
|
|
71
|
+
/**
|
|
72
|
+
* Get rollback history, optionally filtered by task ID
|
|
73
|
+
*
|
|
74
|
+
* @param taskId - Optional task ID to filter by
|
|
75
|
+
* @returns Array of rollback entries, sorted by timestamp (newest first)
|
|
76
|
+
*/
|
|
77
|
+
export declare function getRollbackHistory(taskId?: string): Promise<RollbackEntry[]>;
|
|
78
|
+
/**
|
|
79
|
+
* Get rollback entry by ID
|
|
80
|
+
*/
|
|
81
|
+
export declare function getRollbackById(rollbackId: string): Promise<RollbackEntry | null>;
|
|
82
|
+
/**
|
|
83
|
+
* Clear rollback history (for testing)
|
|
84
|
+
*/
|
|
85
|
+
export declare function clearRollbackHistory(): Promise<void>;
|
|
86
|
+
//# sourceMappingURL=rollback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/lib/rollback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,IAAI,CAAC;CACjB;AAkJD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,cAAc,CAAC,CAqJzB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgElG;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAkBlF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CASvF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAa1D"}
|