@generacy-ai/generacy-plugin-copilot 0.0.0-preview-20260304013206
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +140 -0
- package/dist/errors.d.ts +70 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +116 -0
- package/dist/errors.js.map +1 -0
- package/dist/github/client.d.ts +46 -0
- package/dist/github/client.d.ts.map +1 -0
- package/dist/github/client.js +165 -0
- package/dist/github/client.js.map +1 -0
- package/dist/github/types.d.ts +91 -0
- package/dist/github/types.d.ts.map +1 -0
- package/dist/github/types.js +7 -0
- package/dist/github/types.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin/copilot-plugin.d.ts +90 -0
- package/dist/plugin/copilot-plugin.d.ts.map +1 -0
- package/dist/plugin/copilot-plugin.js +289 -0
- package/dist/plugin/copilot-plugin.js.map +1 -0
- package/dist/polling/status-poller.d.ts +36 -0
- package/dist/polling/status-poller.d.ts.map +1 -0
- package/dist/polling/status-poller.js +142 -0
- package/dist/polling/status-poller.js.map +1 -0
- package/dist/polling/types.d.ts +62 -0
- package/dist/polling/types.d.ts.map +1 -0
- package/dist/polling/types.js +16 -0
- package/dist/polling/types.js.map +1 -0
- package/dist/schemas.d.ts +341 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +176 -0
- package/dist/schemas.js.map +1 -0
- package/dist/types.d.ts +161 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace/types.d.ts +61 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/dist/workspace/types.js +7 -0
- package/dist/workspace/types.js.map +1 -0
- package/dist/workspace/workspace-manager.d.ts +65 -0
- package/dist/workspace/workspace-manager.d.ts.map +1 -0
- package/dist/workspace/workspace-manager.js +294 -0
- package/dist/workspace/workspace-manager.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @generacy-ai/generacy-plugin-copilot
|
|
3
|
+
*
|
|
4
|
+
* Main plugin class extending AbstractDevAgentPlugin and implementing CopilotPluginInterface.
|
|
5
|
+
*/
|
|
6
|
+
import pino from 'pino';
|
|
7
|
+
import { FacetError } from '@generacy-ai/latency';
|
|
8
|
+
import { AbstractDevAgentPlugin, } from '@generacy-ai/latency-plugin-dev-agent';
|
|
9
|
+
import { CopilotPluginOptionsSchema } from '../schemas.js';
|
|
10
|
+
import { GitHubClient } from '../github/client.js';
|
|
11
|
+
import { WorkspaceManager } from '../workspace/workspace-manager.js';
|
|
12
|
+
/**
|
|
13
|
+
* GitHub Copilot Workspace plugin for Generacy.
|
|
14
|
+
*
|
|
15
|
+
* Extends AbstractDevAgentPlugin to provide the standard DevAgent interface
|
|
16
|
+
* while also exposing Copilot Workspace-specific functionality.
|
|
17
|
+
*
|
|
18
|
+
* Note: Due to the lack of a public Copilot Workspace API, this plugin
|
|
19
|
+
* operates in a tracking/monitoring mode, inferring workspace status
|
|
20
|
+
* from GitHub Issues and Pull Requests. The DevAgent interface methods
|
|
21
|
+
* (`invoke`, `invokeStream`) create workspaces and monitor them to completion.
|
|
22
|
+
*/
|
|
23
|
+
export class CopilotPlugin extends AbstractDevAgentPlugin {
|
|
24
|
+
githubClient;
|
|
25
|
+
workspaceManager;
|
|
26
|
+
logger;
|
|
27
|
+
pollingConfig;
|
|
28
|
+
isDisposed = false;
|
|
29
|
+
constructor(options) {
|
|
30
|
+
super({ defaultTimeoutMs: options.defaultTimeoutMs ?? 300_000 }); // 5 minute default for workspace operations
|
|
31
|
+
// Validate options
|
|
32
|
+
const validated = CopilotPluginOptionsSchema.parse(options);
|
|
33
|
+
// Initialize logger
|
|
34
|
+
this.logger = validated.logger ?? pino({
|
|
35
|
+
name: 'copilot-plugin',
|
|
36
|
+
level: process.env['LOG_LEVEL'] ?? 'info',
|
|
37
|
+
});
|
|
38
|
+
// Initialize GitHub client
|
|
39
|
+
this.githubClient = new GitHubClient({
|
|
40
|
+
token: validated.githubToken,
|
|
41
|
+
baseUrl: validated.apiBaseUrl,
|
|
42
|
+
});
|
|
43
|
+
// Store polling config
|
|
44
|
+
this.pollingConfig = validated.polling ?? {};
|
|
45
|
+
// Initialize workspace manager
|
|
46
|
+
this.workspaceManager = new WorkspaceManager(this.githubClient, {
|
|
47
|
+
pollingConfig: this.pollingConfig,
|
|
48
|
+
defaultOptions: validated.workspaceDefaults,
|
|
49
|
+
logger: this.logger,
|
|
50
|
+
});
|
|
51
|
+
this.logger.info('CopilotPlugin initialized');
|
|
52
|
+
}
|
|
53
|
+
// ==========================================================================
|
|
54
|
+
// AbstractDevAgentPlugin abstract method implementations
|
|
55
|
+
// ==========================================================================
|
|
56
|
+
/**
|
|
57
|
+
* Invoke Copilot Workspace with a prompt (implements abstract method).
|
|
58
|
+
*
|
|
59
|
+
* Creates a workspace for the given prompt and waits for completion.
|
|
60
|
+
* Since there's no public API for Copilot Workspace, this monitors
|
|
61
|
+
* the workspace status via GitHub until completion or timeout.
|
|
62
|
+
*/
|
|
63
|
+
async doInvoke(prompt, options) {
|
|
64
|
+
this.ensureNotDisposed();
|
|
65
|
+
// Extract issue URL from prompt or metadata
|
|
66
|
+
const issueUrl = this.extractIssueUrl(prompt, options.metadata);
|
|
67
|
+
if (!issueUrl) {
|
|
68
|
+
throw new FacetError('Prompt must contain or metadata must include an issueUrl for Copilot Workspace', 'VALIDATION');
|
|
69
|
+
}
|
|
70
|
+
this.logger.debug({ issueUrl, invocationId: options.invocationId }, 'Starting Copilot invocation');
|
|
71
|
+
// Create workspace for tracking
|
|
72
|
+
const workspace = await this.workspaceManager.createWorkspace({
|
|
73
|
+
issueUrl,
|
|
74
|
+
});
|
|
75
|
+
// Collect output as we monitor the workspace
|
|
76
|
+
const output = [];
|
|
77
|
+
let finalStatus = 'pending';
|
|
78
|
+
try {
|
|
79
|
+
// Stream status updates until completion (terminal states: merged, failed, not_available)
|
|
80
|
+
for await (const event of this.workspaceManager.streamStatus(workspace.id)) {
|
|
81
|
+
if (options.signal.aborted) {
|
|
82
|
+
throw new FacetError('Invocation was cancelled', 'CANCELLED');
|
|
83
|
+
}
|
|
84
|
+
output.push(`Status: ${event.previousStatus} → ${event.status}`);
|
|
85
|
+
finalStatus = event.status;
|
|
86
|
+
if (finalStatus === 'merged' || finalStatus === 'failed' || finalStatus === 'not_available') {
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Get final changes if merged
|
|
91
|
+
if (finalStatus === 'merged') {
|
|
92
|
+
const changes = await this.workspaceManager.getChanges(workspace.id);
|
|
93
|
+
output.push(`\nCompleted with ${changes.length} file changes:`);
|
|
94
|
+
for (const change of changes) {
|
|
95
|
+
output.push(` - ${change.path} (${change.type})`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
output: output.join('\n'),
|
|
100
|
+
invocationId: options.invocationId,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (error instanceof FacetError) {
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
throw new FacetError(error instanceof Error ? error.message : String(error), 'UNKNOWN', { cause: error });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Stream Copilot Workspace status updates (implements abstract method).
|
|
112
|
+
*
|
|
113
|
+
* Creates a workspace and yields status updates as stream chunks.
|
|
114
|
+
*/
|
|
115
|
+
async *doInvokeStream(prompt, options) {
|
|
116
|
+
this.ensureNotDisposed();
|
|
117
|
+
// Extract issue URL from prompt or metadata
|
|
118
|
+
const issueUrl = this.extractIssueUrl(prompt, options.metadata);
|
|
119
|
+
if (!issueUrl) {
|
|
120
|
+
throw new FacetError('Prompt must contain or metadata must include an issueUrl for Copilot Workspace', 'VALIDATION');
|
|
121
|
+
}
|
|
122
|
+
this.logger.debug({ issueUrl, invocationId: options.invocationId }, 'Starting Copilot stream');
|
|
123
|
+
// Create workspace for tracking
|
|
124
|
+
const workspace = await this.workspaceManager.createWorkspace({
|
|
125
|
+
issueUrl,
|
|
126
|
+
});
|
|
127
|
+
yield {
|
|
128
|
+
text: `Workspace created: ${workspace.id}\n`,
|
|
129
|
+
metadata: { workspaceId: workspace.id, status: 'created' },
|
|
130
|
+
};
|
|
131
|
+
// Stream status updates until terminal state (merged, failed, not_available)
|
|
132
|
+
for await (const event of this.workspaceManager.streamStatus(workspace.id)) {
|
|
133
|
+
if (options.signal.aborted) {
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
yield {
|
|
137
|
+
text: `Status: ${event.previousStatus} → ${event.status}\n`,
|
|
138
|
+
metadata: {
|
|
139
|
+
workspaceId: workspace.id,
|
|
140
|
+
previousStatus: event.previousStatus,
|
|
141
|
+
status: event.status,
|
|
142
|
+
timestamp: event.timestamp.toISOString(),
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
if (event.status === 'merged' || event.status === 'failed' || event.status === 'not_available') {
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Yield final changes if merged
|
|
150
|
+
const status = await this.workspaceManager.pollWorkspaceStatus(workspace.id);
|
|
151
|
+
if (status === 'merged') {
|
|
152
|
+
const changes = await this.workspaceManager.getChanges(workspace.id);
|
|
153
|
+
yield {
|
|
154
|
+
text: `\nCompleted with ${changes.length} file changes\n`,
|
|
155
|
+
metadata: { changes: changes.map((c) => ({ path: c.path, type: c.type })) },
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Return Copilot Workspace capabilities (implements abstract method).
|
|
161
|
+
*/
|
|
162
|
+
async doGetCapabilities() {
|
|
163
|
+
return {
|
|
164
|
+
streaming: true,
|
|
165
|
+
cancellation: true,
|
|
166
|
+
models: ['copilot-workspace'],
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// ==========================================================================
|
|
170
|
+
// Copilot-specific public API (for backwards compatibility)
|
|
171
|
+
// ==========================================================================
|
|
172
|
+
/**
|
|
173
|
+
* Create a new workspace for tracking.
|
|
174
|
+
*
|
|
175
|
+
* Note: This does not create an actual Copilot Workspace (no public API).
|
|
176
|
+
* It sets up tracking for when a workspace is manually created via GitHub.
|
|
177
|
+
*/
|
|
178
|
+
async createWorkspace(params) {
|
|
179
|
+
this.ensureNotDisposed();
|
|
180
|
+
this.logger.debug({ issueUrl: params.issueUrl }, 'Creating workspace');
|
|
181
|
+
const workspace = await this.workspaceManager.createWorkspace(params);
|
|
182
|
+
this.logger.info({ workspaceId: workspace.id, issueUrl: params.issueUrl }, 'Workspace created for tracking');
|
|
183
|
+
return workspace;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get an existing workspace by ID.
|
|
187
|
+
*/
|
|
188
|
+
async getWorkspace(workspaceId) {
|
|
189
|
+
this.ensureNotDisposed();
|
|
190
|
+
return this.workspaceManager.getWorkspace(workspaceId);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Poll the current status of a workspace.
|
|
194
|
+
*
|
|
195
|
+
* Status is inferred from GitHub PR state since there's no direct
|
|
196
|
+
* Copilot Workspace API to query.
|
|
197
|
+
*/
|
|
198
|
+
async pollWorkspaceStatus(workspaceId) {
|
|
199
|
+
this.ensureNotDisposed();
|
|
200
|
+
this.logger.debug({ workspaceId }, 'Polling workspace status');
|
|
201
|
+
const status = await this.workspaceManager.pollWorkspaceStatus(workspaceId);
|
|
202
|
+
this.logger.debug({ workspaceId, status }, 'Workspace status polled');
|
|
203
|
+
return status;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get file changes from a completed workspace.
|
|
207
|
+
*
|
|
208
|
+
* Returns changes from the associated pull request.
|
|
209
|
+
*/
|
|
210
|
+
async getChanges(workspaceId) {
|
|
211
|
+
this.ensureNotDisposed();
|
|
212
|
+
this.logger.debug({ workspaceId }, 'Getting workspace changes');
|
|
213
|
+
const changes = await this.workspaceManager.getChanges(workspaceId);
|
|
214
|
+
this.logger.debug({ workspaceId, changeCount: changes.length }, 'Workspace changes retrieved');
|
|
215
|
+
return changes;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get the pull request associated with the workspace.
|
|
219
|
+
*/
|
|
220
|
+
async getPullRequest(workspaceId) {
|
|
221
|
+
this.ensureNotDisposed();
|
|
222
|
+
this.logger.debug({ workspaceId }, 'Getting workspace pull request');
|
|
223
|
+
const pr = await this.workspaceManager.getPullRequest(workspaceId);
|
|
224
|
+
if (pr) {
|
|
225
|
+
this.logger.debug({ workspaceId, prNumber: pr.number }, 'Pull request retrieved');
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
this.logger.debug({ workspaceId }, 'No pull request found');
|
|
229
|
+
}
|
|
230
|
+
return pr;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Stream status updates from a workspace.
|
|
234
|
+
*
|
|
235
|
+
* Polls GitHub at configured intervals and yields events
|
|
236
|
+
* when status changes are detected.
|
|
237
|
+
*/
|
|
238
|
+
async *streamStatus(workspaceId) {
|
|
239
|
+
this.ensureNotDisposed();
|
|
240
|
+
this.logger.debug({ workspaceId }, 'Starting status stream');
|
|
241
|
+
let eventCount = 0;
|
|
242
|
+
for await (const event of this.workspaceManager.streamStatus(workspaceId)) {
|
|
243
|
+
eventCount++;
|
|
244
|
+
this.logger.debug({
|
|
245
|
+
workspaceId,
|
|
246
|
+
previousStatus: event.previousStatus,
|
|
247
|
+
status: event.status,
|
|
248
|
+
}, 'Status change detected');
|
|
249
|
+
yield event;
|
|
250
|
+
}
|
|
251
|
+
this.logger.debug({ workspaceId, eventCount }, 'Status stream completed');
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Dispose of the plugin and cleanup resources.
|
|
255
|
+
*/
|
|
256
|
+
async dispose() {
|
|
257
|
+
if (this.isDisposed) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
this.logger.info('Disposing CopilotPlugin');
|
|
261
|
+
this.workspaceManager.clear();
|
|
262
|
+
this.isDisposed = true;
|
|
263
|
+
this.logger.info('CopilotPlugin disposed');
|
|
264
|
+
}
|
|
265
|
+
// ==========================================================================
|
|
266
|
+
// Private helper methods
|
|
267
|
+
// ==========================================================================
|
|
268
|
+
ensureNotDisposed() {
|
|
269
|
+
if (this.isDisposed) {
|
|
270
|
+
throw new FacetError('Plugin has been disposed', 'VALIDATION');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Extract issue URL from prompt text or metadata.
|
|
275
|
+
*/
|
|
276
|
+
extractIssueUrl(prompt, metadata) {
|
|
277
|
+
// Check metadata first
|
|
278
|
+
if (metadata?.issueUrl && typeof metadata.issueUrl === 'string') {
|
|
279
|
+
return metadata.issueUrl;
|
|
280
|
+
}
|
|
281
|
+
// Try to extract from prompt text (GitHub issue URL pattern)
|
|
282
|
+
const urlMatch = prompt.match(/https:\/\/github\.com\/[^/]+\/[^/]+\/issues\/\d+/);
|
|
283
|
+
if (urlMatch) {
|
|
284
|
+
return urlMatch[0];
|
|
285
|
+
}
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=copilot-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-plugin.js","sourceRoot":"","sources":["../../src/plugin/copilot-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @generacy-ai/generacy-plugin-copilot
|
|
3
|
+
*
|
|
4
|
+
* Status polling with exponential backoff.
|
|
5
|
+
*/
|
|
6
|
+
import { type WorkspaceStatus, type WorkspaceStatusEvent } from '../types.js';
|
|
7
|
+
import { type PollingConfig, type PollResult, type StatusCallback, type StatusChecker } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Status poller with exponential backoff.
|
|
10
|
+
*/
|
|
11
|
+
export declare class StatusPoller {
|
|
12
|
+
private readonly config;
|
|
13
|
+
private readonly workspaceId;
|
|
14
|
+
constructor(workspaceId: string, config?: Partial<PollingConfig>);
|
|
15
|
+
/**
|
|
16
|
+
* Poll until a terminal status is reached or timeout.
|
|
17
|
+
*/
|
|
18
|
+
pollUntilTerminal(checkStatus: StatusChecker, onStatusChange?: StatusCallback): Promise<PollResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Create an async generator that yields status events.
|
|
21
|
+
*/
|
|
22
|
+
streamStatus(checkStatus: StatusChecker): AsyncGenerator<WorkspaceStatusEvent>;
|
|
23
|
+
/**
|
|
24
|
+
* Single poll operation.
|
|
25
|
+
*/
|
|
26
|
+
pollOnce(checkStatus: StatusChecker): Promise<WorkspaceStatus>;
|
|
27
|
+
private createInitialState;
|
|
28
|
+
private calculateNextInterval;
|
|
29
|
+
private isTimedOut;
|
|
30
|
+
private sleep;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a status poller with the given configuration.
|
|
34
|
+
*/
|
|
35
|
+
export declare function createStatusPoller(workspaceId: string, config?: Partial<PollingConfig>): StatusPoller;
|
|
36
|
+
//# sourceMappingURL=status-poller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-poller.d.ts","sourceRoot":"","sources":["../../src/polling/status-poller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAoB,KAAK,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAChG,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,UAAU,EAEf,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAKpE;;OAEG;IACG,iBAAiB,CACrB,WAAW,EAAE,aAAa,EAC1B,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,UAAU,CAAC;IAsDtB;;OAEG;IACI,YAAY,CAAC,WAAW,EAAE,aAAa,GAAG,cAAc,CAAC,oBAAoB,CAAC;IAmDrF;;OAEG;IACG,QAAQ,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAIpE,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,KAAK;CAGd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,YAAY,CAEd"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @generacy-ai/generacy-plugin-copilot
|
|
3
|
+
*
|
|
4
|
+
* Status polling with exponential backoff.
|
|
5
|
+
*/
|
|
6
|
+
import { PollingTimeoutError } from '../errors.js';
|
|
7
|
+
import { isTerminalStatus } from '../types.js';
|
|
8
|
+
import { DEFAULT_POLLING_CONFIG, } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Status poller with exponential backoff.
|
|
11
|
+
*/
|
|
12
|
+
export class StatusPoller {
|
|
13
|
+
config;
|
|
14
|
+
workspaceId;
|
|
15
|
+
constructor(workspaceId, config = {}) {
|
|
16
|
+
this.workspaceId = workspaceId;
|
|
17
|
+
this.config = { ...DEFAULT_POLLING_CONFIG, ...config };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Poll until a terminal status is reached or timeout.
|
|
21
|
+
*/
|
|
22
|
+
async pollUntilTerminal(checkStatus, onStatusChange) {
|
|
23
|
+
const state = this.createInitialState();
|
|
24
|
+
let previousStatus = 'pending';
|
|
25
|
+
let currentStatus = 'pending';
|
|
26
|
+
while (state.isActive) {
|
|
27
|
+
// Check timeout
|
|
28
|
+
if (this.isTimedOut(state)) {
|
|
29
|
+
throw new PollingTimeoutError(this.workspaceId, this.config.timeoutMs ?? 0, state.pollCount);
|
|
30
|
+
}
|
|
31
|
+
// Check max retries
|
|
32
|
+
if (state.pollCount >= this.config.maxRetries) {
|
|
33
|
+
state.isActive = false;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
// Wait for next poll interval
|
|
37
|
+
if (state.pollCount > 0) {
|
|
38
|
+
await this.sleep(state.currentIntervalMs);
|
|
39
|
+
state.currentIntervalMs = this.calculateNextInterval(state.currentIntervalMs);
|
|
40
|
+
}
|
|
41
|
+
// Poll status
|
|
42
|
+
state.pollCount++;
|
|
43
|
+
state.lastPolledAt = new Date();
|
|
44
|
+
currentStatus = await checkStatus();
|
|
45
|
+
// Notify on status change
|
|
46
|
+
if (currentStatus !== previousStatus) {
|
|
47
|
+
onStatusChange?.(currentStatus, previousStatus);
|
|
48
|
+
previousStatus = currentStatus;
|
|
49
|
+
}
|
|
50
|
+
// Check for terminal status
|
|
51
|
+
if (isTerminalStatus(currentStatus)) {
|
|
52
|
+
state.isActive = false;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const durationMs = Date.now() - state.startedAt.getTime();
|
|
57
|
+
return {
|
|
58
|
+
status: currentStatus,
|
|
59
|
+
isTerminal: isTerminalStatus(currentStatus),
|
|
60
|
+
pollCount: state.pollCount,
|
|
61
|
+
durationMs,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create an async generator that yields status events.
|
|
66
|
+
*/
|
|
67
|
+
async *streamStatus(checkStatus) {
|
|
68
|
+
const state = this.createInitialState();
|
|
69
|
+
let previousStatus = 'pending';
|
|
70
|
+
let currentStatus = 'pending';
|
|
71
|
+
while (state.isActive) {
|
|
72
|
+
// Check timeout
|
|
73
|
+
if (this.isTimedOut(state)) {
|
|
74
|
+
throw new PollingTimeoutError(this.workspaceId, this.config.timeoutMs ?? 0, state.pollCount);
|
|
75
|
+
}
|
|
76
|
+
// Check max retries
|
|
77
|
+
if (state.pollCount >= this.config.maxRetries) {
|
|
78
|
+
state.isActive = false;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
// Wait for next poll interval
|
|
82
|
+
if (state.pollCount > 0) {
|
|
83
|
+
await this.sleep(state.currentIntervalMs);
|
|
84
|
+
state.currentIntervalMs = this.calculateNextInterval(state.currentIntervalMs);
|
|
85
|
+
}
|
|
86
|
+
// Poll status
|
|
87
|
+
state.pollCount++;
|
|
88
|
+
state.lastPolledAt = new Date();
|
|
89
|
+
currentStatus = await checkStatus();
|
|
90
|
+
// Yield status event if changed
|
|
91
|
+
if (currentStatus !== previousStatus) {
|
|
92
|
+
yield {
|
|
93
|
+
workspaceId: this.workspaceId,
|
|
94
|
+
previousStatus,
|
|
95
|
+
status: currentStatus,
|
|
96
|
+
timestamp: new Date(),
|
|
97
|
+
};
|
|
98
|
+
previousStatus = currentStatus;
|
|
99
|
+
}
|
|
100
|
+
// Check for terminal status
|
|
101
|
+
if (isTerminalStatus(currentStatus)) {
|
|
102
|
+
state.isActive = false;
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Single poll operation.
|
|
109
|
+
*/
|
|
110
|
+
async pollOnce(checkStatus) {
|
|
111
|
+
return checkStatus();
|
|
112
|
+
}
|
|
113
|
+
createInitialState() {
|
|
114
|
+
return {
|
|
115
|
+
pollCount: 0,
|
|
116
|
+
currentIntervalMs: this.config.initialIntervalMs,
|
|
117
|
+
startedAt: new Date(),
|
|
118
|
+
isActive: true,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
calculateNextInterval(currentInterval) {
|
|
122
|
+
const nextInterval = currentInterval * this.config.backoffMultiplier;
|
|
123
|
+
return Math.min(nextInterval, this.config.maxIntervalMs);
|
|
124
|
+
}
|
|
125
|
+
isTimedOut(state) {
|
|
126
|
+
if (!this.config.timeoutMs) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
const elapsed = Date.now() - state.startedAt.getTime();
|
|
130
|
+
return elapsed >= this.config.timeoutMs;
|
|
131
|
+
}
|
|
132
|
+
sleep(ms) {
|
|
133
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create a status poller with the given configuration.
|
|
138
|
+
*/
|
|
139
|
+
export function createStatusPoller(workspaceId, config) {
|
|
140
|
+
return new StatusPoller(workspaceId, config);
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=status-poller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-poller.js","sourceRoot":"","sources":["../../src/polling/status-poller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @generacy-ai/generacy-plugin-copilot
|
|
3
|
+
*
|
|
4
|
+
* Polling infrastructure type definitions.
|
|
5
|
+
*/
|
|
6
|
+
import type { WorkspaceStatus } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Polling configuration with defaults.
|
|
9
|
+
*/
|
|
10
|
+
export interface PollingConfig {
|
|
11
|
+
/** Initial polling interval in milliseconds */
|
|
12
|
+
initialIntervalMs: number;
|
|
13
|
+
/** Maximum polling interval in milliseconds */
|
|
14
|
+
maxIntervalMs: number;
|
|
15
|
+
/** Backoff multiplier for interval growth */
|
|
16
|
+
backoffMultiplier: number;
|
|
17
|
+
/** Maximum number of poll attempts */
|
|
18
|
+
maxRetries: number;
|
|
19
|
+
/** Timeout for the entire polling operation (ms) */
|
|
20
|
+
timeoutMs?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Default polling configuration values.
|
|
24
|
+
*/
|
|
25
|
+
export declare const DEFAULT_POLLING_CONFIG: PollingConfig;
|
|
26
|
+
/**
|
|
27
|
+
* Internal polling state.
|
|
28
|
+
*/
|
|
29
|
+
export interface PollState {
|
|
30
|
+
/** Last poll timestamp */
|
|
31
|
+
lastPolledAt?: Date;
|
|
32
|
+
/** Number of poll attempts */
|
|
33
|
+
pollCount: number;
|
|
34
|
+
/** Current interval in ms */
|
|
35
|
+
currentIntervalMs: number;
|
|
36
|
+
/** Polling start time */
|
|
37
|
+
startedAt: Date;
|
|
38
|
+
/** Whether polling is active */
|
|
39
|
+
isActive: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Status check function type.
|
|
43
|
+
*/
|
|
44
|
+
export type StatusChecker = () => Promise<WorkspaceStatus>;
|
|
45
|
+
/**
|
|
46
|
+
* Status callback for streaming.
|
|
47
|
+
*/
|
|
48
|
+
export type StatusCallback = (status: WorkspaceStatus, previousStatus: WorkspaceStatus) => void;
|
|
49
|
+
/**
|
|
50
|
+
* Polling result.
|
|
51
|
+
*/
|
|
52
|
+
export interface PollResult {
|
|
53
|
+
/** Final status */
|
|
54
|
+
status: WorkspaceStatus;
|
|
55
|
+
/** Whether a terminal state was reached */
|
|
56
|
+
isTerminal: boolean;
|
|
57
|
+
/** Total poll count */
|
|
58
|
+
pollCount: number;
|
|
59
|
+
/** Duration in ms */
|
|
60
|
+
durationMs: number;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/polling/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,aAMpC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,SAAS,EAAE,IAAI,CAAC;IAChB,gCAAgC;IAChC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,KAAK,IAAI,CAAC;AAEhG;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,mBAAmB;IACnB,MAAM,EAAE,eAAe,CAAC;IACxB,2CAA2C;IAC3C,UAAU,EAAE,OAAO,CAAC;IACpB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @generacy-ai/generacy-plugin-copilot
|
|
3
|
+
*
|
|
4
|
+
* Polling infrastructure type definitions.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Default polling configuration values.
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_POLLING_CONFIG = {
|
|
10
|
+
initialIntervalMs: 5000,
|
|
11
|
+
maxIntervalMs: 60000,
|
|
12
|
+
backoffMultiplier: 1.5,
|
|
13
|
+
maxRetries: 100,
|
|
14
|
+
timeoutMs: 3600000, // 1 hour
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/polling/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAkB;IACnD,iBAAiB,EAAE,IAAI;IACvB,aAAa,EAAE,KAAK;IACpB,iBAAiB,EAAE,GAAG;IACtB,UAAU,EAAE,GAAG;IACf,SAAS,EAAE,OAAO,EAAE,SAAS;CAC9B,CAAC"}
|