mcp-copilot-worker 1.0.1
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 +209 -0
- package/bin/mcp-copilot-worker.mjs +3 -0
- package/dist/src/app.d.ts +71 -0
- package/dist/src/app.js +306 -0
- package/dist/src/app.js.map +1 -0
- package/dist/src/cli/doctor.d.ts +2 -0
- package/dist/src/cli/doctor.js +99 -0
- package/dist/src/cli/doctor.js.map +1 -0
- package/dist/src/config/defaults.d.ts +3 -0
- package/dist/src/config/defaults.js +4 -0
- package/dist/src/config/defaults.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +98 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/system-status.d.ts +19 -0
- package/dist/src/mcp/system-status.js +20 -0
- package/dist/src/mcp/system-status.js.map +1 -0
- package/dist/src/mcp/task-markdown.d.ts +3 -0
- package/dist/src/mcp/task-markdown.js +70 -0
- package/dist/src/mcp/task-markdown.js.map +1 -0
- package/dist/src/mcp/tool-banners.d.ts +4 -0
- package/dist/src/mcp/tool-banners.js +26 -0
- package/dist/src/mcp/tool-banners.js.map +1 -0
- package/dist/src/mcp/tool-definitions.d.ts +111 -0
- package/dist/src/mcp/tool-definitions.js +134 -0
- package/dist/src/mcp/tool-definitions.js.map +1 -0
- package/dist/src/services/copilot-runtime.d.ts +35 -0
- package/dist/src/services/copilot-runtime.js +237 -0
- package/dist/src/services/copilot-runtime.js.map +1 -0
- package/dist/src/services/fleet-mode.d.ts +15 -0
- package/dist/src/services/fleet-mode.js +26 -0
- package/dist/src/services/fleet-mode.js.map +1 -0
- package/dist/src/services/model-catalog.d.ts +16 -0
- package/dist/src/services/model-catalog.js +95 -0
- package/dist/src/services/model-catalog.js.map +1 -0
- package/dist/src/services/output-log.d.ts +7 -0
- package/dist/src/services/output-log.js +59 -0
- package/dist/src/services/output-log.js.map +1 -0
- package/dist/src/services/profile-manager.d.ts +34 -0
- package/dist/src/services/profile-manager.js +113 -0
- package/dist/src/services/profile-manager.js.map +1 -0
- package/dist/src/services/question-registry.d.ts +29 -0
- package/dist/src/services/question-registry.js +115 -0
- package/dist/src/services/question-registry.js.map +1 -0
- package/dist/src/services/spawn-validation.d.ts +9 -0
- package/dist/src/services/spawn-validation.js +53 -0
- package/dist/src/services/spawn-validation.js.map +1 -0
- package/dist/src/services/task-manager.d.ts +34 -0
- package/dist/src/services/task-manager.js +107 -0
- package/dist/src/services/task-manager.js.map +1 -0
- package/dist/src/services/task-persistence.d.ts +20 -0
- package/dist/src/services/task-persistence.js +67 -0
- package/dist/src/services/task-persistence.js.map +1 -0
- package/dist/src/services/task-store.d.ts +12 -0
- package/dist/src/services/task-store.js +167 -0
- package/dist/src/services/task-store.js.map +1 -0
- package/dist/src/services/workspace-isolation.d.ts +13 -0
- package/dist/src/services/workspace-isolation.js +74 -0
- package/dist/src/services/workspace-isolation.js.map +1 -0
- package/dist/src/templates/agent-prompt.d.ts +6 -0
- package/dist/src/templates/agent-prompt.js +58 -0
- package/dist/src/templates/agent-prompt.js.map +1 -0
- package/dist/src/types/task.d.ts +79 -0
- package/dist/src/types/task.js +22 -0
- package/dist/src/types/task.js.map +1 -0
- package/package.json +63 -0
- package/src/app.ts +344 -0
- package/src/cli/doctor.ts +112 -0
- package/src/config/defaults.ts +3 -0
- package/src/index.ts +128 -0
- package/src/mcp/system-status.ts +41 -0
- package/src/mcp/task-markdown.ts +81 -0
- package/src/mcp/tool-banners.ts +32 -0
- package/src/mcp/tool-definitions.ts +163 -0
- package/src/services/copilot-runtime.ts +305 -0
- package/src/services/fleet-mode.ts +39 -0
- package/src/services/model-catalog.ts +136 -0
- package/src/services/output-log.ts +68 -0
- package/src/services/profile-manager.ts +165 -0
- package/src/services/question-registry.ts +169 -0
- package/src/services/spawn-validation.ts +75 -0
- package/src/services/task-manager.ts +144 -0
- package/src/services/task-persistence.ts +100 -0
- package/src/services/task-store.ts +207 -0
- package/src/services/workspace-isolation.ts +100 -0
- package/src/templates/agent-prompt.ts +71 -0
- package/src/types/task.ts +95 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-definitions.js","sourceRoot":"","sources":["../../../src/mcp/tool-definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type CopilotClientOptions } from '@github/copilot-sdk';
|
|
2
|
+
import type { TaskRecord } from '../types/task.js';
|
|
3
|
+
import type { CopilotProfile } from './profile-manager.js';
|
|
4
|
+
import type { ProfileManager } from './profile-manager.js';
|
|
5
|
+
import type { QuestionRegistry } from './question-registry.js';
|
|
6
|
+
import type { TaskManager } from './task-manager.js';
|
|
7
|
+
export interface BuildCopilotClientOptionsInput {
|
|
8
|
+
cwd: string;
|
|
9
|
+
profile: CopilotProfile;
|
|
10
|
+
cliPath?: string | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildCopilotClientOptions(input: BuildCopilotClientOptionsInput): CopilotClientOptions;
|
|
13
|
+
export declare class CopilotRuntime {
|
|
14
|
+
private readonly clients;
|
|
15
|
+
private readonly taskManager;
|
|
16
|
+
private readonly profileManager;
|
|
17
|
+
private readonly questionRegistry;
|
|
18
|
+
constructor(input: {
|
|
19
|
+
taskManager: TaskManager;
|
|
20
|
+
profileManager: ProfileManager;
|
|
21
|
+
questionRegistry: QuestionRegistry;
|
|
22
|
+
});
|
|
23
|
+
runTask(task: TaskRecord): Promise<void>;
|
|
24
|
+
shutdown(): Promise<void>;
|
|
25
|
+
resolveRequestedModel(cwd: string, requestedModel?: string): Promise<string>;
|
|
26
|
+
describeCurrentProfileModels(cwd: string): Promise<{
|
|
27
|
+
latestModelIds?: string[] | undefined;
|
|
28
|
+
description?: string | undefined;
|
|
29
|
+
}>;
|
|
30
|
+
private bindSessionEvents;
|
|
31
|
+
private getClient;
|
|
32
|
+
private resolveProfile;
|
|
33
|
+
private loadModelCatalog;
|
|
34
|
+
private toModelCatalogInput;
|
|
35
|
+
}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { accessSync, constants } from 'node:fs';
|
|
2
|
+
import { delimiter, join } from 'node:path';
|
|
3
|
+
import { CopilotClient, approveAll, } from '@github/copilot-sdk';
|
|
4
|
+
import { DEFAULT_MODEL, DEFAULT_TIMEOUT_MS } from '../config/defaults.js';
|
|
5
|
+
import { buildAgentPrompt } from '../templates/agent-prompt.js';
|
|
6
|
+
import { TaskStatus } from '../types/task.js';
|
|
7
|
+
import { startFleetModeIfEnabled } from './fleet-mode.js';
|
|
8
|
+
import { buildModelCatalog, describeAllowedModels, resolveModelAlias, } from './model-catalog.js';
|
|
9
|
+
function canExecute(path) {
|
|
10
|
+
try {
|
|
11
|
+
accessSync(path, constants.X_OK);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function resolveCopilotCliPath(explicitPath) {
|
|
19
|
+
if (explicitPath && canExecute(explicitPath)) {
|
|
20
|
+
return explicitPath;
|
|
21
|
+
}
|
|
22
|
+
const configuredPath = process.env.COPILOT_CLI_PATH;
|
|
23
|
+
if (configuredPath && canExecute(configuredPath)) {
|
|
24
|
+
return configuredPath;
|
|
25
|
+
}
|
|
26
|
+
for (const segment of (process.env.PATH ?? '').split(delimiter)) {
|
|
27
|
+
if (!segment) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const candidate = join(segment, 'copilot');
|
|
31
|
+
if (canExecute(candidate)) {
|
|
32
|
+
return candidate;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return explicitPath ?? configuredPath ?? 'copilot';
|
|
36
|
+
}
|
|
37
|
+
export function buildCopilotClientOptions(input) {
|
|
38
|
+
return {
|
|
39
|
+
cliPath: resolveCopilotCliPath(input.cliPath),
|
|
40
|
+
cliArgs: ['--config-dir', input.profile.configDir],
|
|
41
|
+
cwd: input.cwd,
|
|
42
|
+
useLoggedInUser: true,
|
|
43
|
+
useStdio: false,
|
|
44
|
+
autoStart: true,
|
|
45
|
+
autoRestart: false,
|
|
46
|
+
logLevel: 'error',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function isRateLimitError(error) {
|
|
50
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
51
|
+
const normalized = message.toLowerCase();
|
|
52
|
+
return (normalized.includes('rate limit') ||
|
|
53
|
+
normalized.includes('too many requests') ||
|
|
54
|
+
normalized.includes('429') ||
|
|
55
|
+
normalized.includes('quota'));
|
|
56
|
+
}
|
|
57
|
+
export class CopilotRuntime {
|
|
58
|
+
clients = new Map();
|
|
59
|
+
taskManager;
|
|
60
|
+
profileManager;
|
|
61
|
+
questionRegistry;
|
|
62
|
+
constructor(input) {
|
|
63
|
+
this.taskManager = input.taskManager;
|
|
64
|
+
this.profileManager = input.profileManager;
|
|
65
|
+
this.questionRegistry = input.questionRegistry;
|
|
66
|
+
}
|
|
67
|
+
async runTask(task) {
|
|
68
|
+
try {
|
|
69
|
+
const profile = this.resolveProfile(task);
|
|
70
|
+
const client = await this.getClient(task.baseCwd ?? task.cwd, profile);
|
|
71
|
+
const prompt = await buildAgentPrompt({
|
|
72
|
+
agentType: task.agentType,
|
|
73
|
+
prompt: task.prompt,
|
|
74
|
+
contextFiles: task.contextFiles,
|
|
75
|
+
});
|
|
76
|
+
const session = task.sessionId
|
|
77
|
+
? await client.resumeSession(task.sessionId, {
|
|
78
|
+
onPermissionRequest: approveAll,
|
|
79
|
+
onUserInputRequest: (request, invocation) => this.questionRegistry.register({
|
|
80
|
+
taskId: task.id,
|
|
81
|
+
sessionId: invocation.sessionId,
|
|
82
|
+
question: request.question,
|
|
83
|
+
choices: request.choices,
|
|
84
|
+
allowFreeform: request.allowFreeform,
|
|
85
|
+
}),
|
|
86
|
+
streaming: true,
|
|
87
|
+
})
|
|
88
|
+
: await client.createSession({
|
|
89
|
+
model: task.model,
|
|
90
|
+
onPermissionRequest: approveAll,
|
|
91
|
+
onUserInputRequest: (request, invocation) => this.questionRegistry.register({
|
|
92
|
+
taskId: task.id,
|
|
93
|
+
sessionId: invocation.sessionId,
|
|
94
|
+
question: request.question,
|
|
95
|
+
choices: request.choices,
|
|
96
|
+
allowFreeform: request.allowFreeform,
|
|
97
|
+
}),
|
|
98
|
+
streaming: true,
|
|
99
|
+
});
|
|
100
|
+
await this.taskManager.registerExecution(task.id, {
|
|
101
|
+
abort: async () => {
|
|
102
|
+
await session.abort().catch(() => { });
|
|
103
|
+
},
|
|
104
|
+
cleanup: async () => {
|
|
105
|
+
await session.disconnect().catch(() => { });
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
await this.taskManager.updateTask(task.id, {
|
|
109
|
+
status: TaskStatus.RUNNING,
|
|
110
|
+
sessionId: session.sessionId,
|
|
111
|
+
profileId: profile.id,
|
|
112
|
+
profileConfigDir: profile.configDir,
|
|
113
|
+
});
|
|
114
|
+
this.bindSessionEvents(task.id, session);
|
|
115
|
+
await this.taskManager.appendOutput(task.id, `[session] profile: ${profile.id} (${profile.configDir})`);
|
|
116
|
+
const fleetStarted = await startFleetModeIfEnabled(session, task.prompt);
|
|
117
|
+
if (fleetStarted) {
|
|
118
|
+
await this.taskManager.appendOutput(task.id, '[fleet] started');
|
|
119
|
+
}
|
|
120
|
+
await session.sendAndWait({ prompt }, task.timeoutMs ?? DEFAULT_TIMEOUT_MS);
|
|
121
|
+
await this.taskManager.updateTask(task.id, {
|
|
122
|
+
status: TaskStatus.COMPLETED,
|
|
123
|
+
endTime: new Date().toISOString(),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
if (isRateLimitError(error)) {
|
|
128
|
+
this.profileManager.markFailure('rate_limit');
|
|
129
|
+
await this.taskManager.updateTask(task.id, {
|
|
130
|
+
status: TaskStatus.RATE_LIMITED,
|
|
131
|
+
error: error instanceof Error ? error.message : String(error),
|
|
132
|
+
endTime: new Date().toISOString(),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
await this.taskManager.updateTask(task.id, {
|
|
137
|
+
status: TaskStatus.FAILED,
|
|
138
|
+
error: error instanceof Error ? error.message : String(error),
|
|
139
|
+
endTime: new Date().toISOString(),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
await this.taskManager.clearExecution(task.id);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async shutdown() {
|
|
148
|
+
await Promise.all([...this.clients.values()].map(async (client) => {
|
|
149
|
+
await client.stop().catch(async () => {
|
|
150
|
+
await client.forceStop().catch(() => { });
|
|
151
|
+
});
|
|
152
|
+
}));
|
|
153
|
+
this.clients.clear();
|
|
154
|
+
}
|
|
155
|
+
async resolveRequestedModel(cwd, requestedModel) {
|
|
156
|
+
const profile = this.profileManager.getCurrentProfile();
|
|
157
|
+
const catalog = await this.loadModelCatalog(cwd, profile);
|
|
158
|
+
const rawModel = requestedModel ?? DEFAULT_MODEL;
|
|
159
|
+
const resolved = resolveModelAlias(rawModel, catalog);
|
|
160
|
+
if (!resolved) {
|
|
161
|
+
throw new Error(`Unsupported model "${rawModel}" for profile ${profile.id} (${profile.configDir}). ${describeAllowedModels(catalog)}`);
|
|
162
|
+
}
|
|
163
|
+
return resolved;
|
|
164
|
+
}
|
|
165
|
+
async describeCurrentProfileModels(cwd) {
|
|
166
|
+
try {
|
|
167
|
+
const profile = this.profileManager.getCurrentProfile();
|
|
168
|
+
const catalog = await this.loadModelCatalog(cwd, profile);
|
|
169
|
+
return {
|
|
170
|
+
latestModelIds: catalog.latestModelIds.length > 0 ? catalog.latestModelIds : undefined,
|
|
171
|
+
description: describeAllowedModels(catalog),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
return {
|
|
176
|
+
description: `Copilot model id. Model inventory unavailable: ${error instanceof Error ? error.message : String(error)}`,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
bindSessionEvents(taskId, session) {
|
|
181
|
+
session.on('assistant.message', (event) => {
|
|
182
|
+
void this.taskManager.appendOutput(taskId, event.data.content);
|
|
183
|
+
});
|
|
184
|
+
session.on('tool.execution_start', (event) => {
|
|
185
|
+
void this.taskManager.appendOutput(taskId, `[tool] start: ${event.data.toolName}`);
|
|
186
|
+
});
|
|
187
|
+
session.on('tool.execution_complete', (event) => {
|
|
188
|
+
const label = 'toolName' in event.data ? event.data.toolName : event.data.toolCallId;
|
|
189
|
+
void this.taskManager.appendOutput(taskId, `[tool] complete: ${label} success=${String(event.data.success)}`);
|
|
190
|
+
});
|
|
191
|
+
session.on('session.error', (event) => {
|
|
192
|
+
void this.taskManager.appendOutput(taskId, `[error] ${event.data.message}`);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
async getClient(cwd, profile) {
|
|
196
|
+
const key = `${cwd}:${profile.configDir}`;
|
|
197
|
+
const existing = this.clients.get(key);
|
|
198
|
+
if (existing) {
|
|
199
|
+
return existing;
|
|
200
|
+
}
|
|
201
|
+
const client = new CopilotClient(buildCopilotClientOptions({ cwd, profile }));
|
|
202
|
+
await client.start();
|
|
203
|
+
const auth = await client.getAuthStatus();
|
|
204
|
+
if (!auth.isAuthenticated) {
|
|
205
|
+
throw new Error(`Copilot profile "${profile.configDir}" is not authenticated. Run \`copilot login --config-dir ${profile.configDir}\`.`);
|
|
206
|
+
}
|
|
207
|
+
this.clients.set(key, client);
|
|
208
|
+
return client;
|
|
209
|
+
}
|
|
210
|
+
resolveProfile(task) {
|
|
211
|
+
if (task.profileConfigDir && task.profileId) {
|
|
212
|
+
const match = this.profileManager.getProfiles().find((profile) => profile.id === task.profileId);
|
|
213
|
+
if (match) {
|
|
214
|
+
return match;
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
id: task.profileId,
|
|
218
|
+
configDir: task.profileConfigDir,
|
|
219
|
+
failureCount: 0,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
return this.profileManager.getCurrentProfile();
|
|
223
|
+
}
|
|
224
|
+
async loadModelCatalog(cwd, profile) {
|
|
225
|
+
const client = await this.getClient(cwd, profile);
|
|
226
|
+
const models = await client.listModels();
|
|
227
|
+
return buildModelCatalog(models.map((model) => this.toModelCatalogInput(model)));
|
|
228
|
+
}
|
|
229
|
+
toModelCatalogInput(model) {
|
|
230
|
+
return {
|
|
231
|
+
id: model.id,
|
|
232
|
+
name: model.name,
|
|
233
|
+
policyState: model.policy?.state,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=copilot-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-runtime.js","sourceRoot":"","sources":["../../../src/services/copilot-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const COPILOT_ENABLE_FLEET_ENV = "COPILOT_ENABLE_FLEET";
|
|
2
|
+
export interface FleetRpcSession {
|
|
3
|
+
rpc: {
|
|
4
|
+
fleet: {
|
|
5
|
+
start: (input: {
|
|
6
|
+
prompt?: string;
|
|
7
|
+
}) => Promise<{
|
|
8
|
+
started: boolean;
|
|
9
|
+
}>;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export declare function isFleetModeEnabled(value?: string | undefined): boolean;
|
|
14
|
+
export declare function buildFleetPrompt(taskPrompt: string): string;
|
|
15
|
+
export declare function startFleetModeIfEnabled(session: FleetRpcSession, taskPrompt: string): Promise<boolean>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const COPILOT_ENABLE_FLEET_ENV = 'COPILOT_ENABLE_FLEET';
|
|
2
|
+
const TRUTHY_VALUES = new Set(['1', 'true', 'yes', 'on']);
|
|
3
|
+
export function isFleetModeEnabled(value = process.env[COPILOT_ENABLE_FLEET_ENV]) {
|
|
4
|
+
return value !== undefined && TRUTHY_VALUES.has(value.trim().toLowerCase());
|
|
5
|
+
}
|
|
6
|
+
export function buildFleetPrompt(taskPrompt) {
|
|
7
|
+
return [
|
|
8
|
+
'You are one worker in a Copilot fleet assisting the primary agent.',
|
|
9
|
+
'Work in parallel, focus on independently useful evidence, and surface concrete edits or commands the primary agent can apply immediately.',
|
|
10
|
+
'Do not take ownership of the final deliverable unless the primary agent explicitly assigns a bounded subtask that requires it.',
|
|
11
|
+
'Do not write the user-facing final answer or directly create the requested final artifact by default. Prefer scouting, verification, and support work that unblocks the primary agent.',
|
|
12
|
+
'Do not ask the user questions. Do not restate the entire task. Stay concise and execution-focused.',
|
|
13
|
+
'Primary task:',
|
|
14
|
+
taskPrompt.trim(),
|
|
15
|
+
].join('\n\n');
|
|
16
|
+
}
|
|
17
|
+
export async function startFleetModeIfEnabled(session, taskPrompt) {
|
|
18
|
+
if (!isFleetModeEnabled()) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const result = await session.rpc.fleet.start({
|
|
22
|
+
prompt: buildFleetPrompt(taskPrompt),
|
|
23
|
+
});
|
|
24
|
+
return result.started;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=fleet-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet-mode.js","sourceRoot":"","sources":["../../../src/services/fleet-mode.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAE/D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAU1D,MAAM,UAAU,kBAAkB,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAC9E,OAAO,KAAK,KAAK,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,OAAO;QACL,oEAAoE;QACpE,2IAA2I;QAC3I,gIAAgI;QAChI,wLAAwL;QACxL,oGAAoG;QACpG,eAAe;QACf,UAAU,CAAC,IAAI,EAAE;KAClB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAwB,EAAE,UAAkB;IACxF,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;QAC3C,MAAM,EAAE,gBAAgB,CAAC,UAAU,CAAC;KACrC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ModelCatalogInput {
|
|
2
|
+
id: string;
|
|
3
|
+
name?: string | undefined;
|
|
4
|
+
policyState?: 'enabled' | 'disabled' | 'unconfigured' | undefined;
|
|
5
|
+
}
|
|
6
|
+
export interface ModelAliasMapping {
|
|
7
|
+
alias: string;
|
|
8
|
+
canonical: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ModelCatalog {
|
|
11
|
+
latestModelIds: string[];
|
|
12
|
+
aliasMappings: ModelAliasMapping[];
|
|
13
|
+
}
|
|
14
|
+
export declare function buildModelCatalog(models: ModelCatalogInput[]): ModelCatalog;
|
|
15
|
+
export declare function resolveModelAlias(requestedModel: string, catalog: ModelCatalog): string | undefined;
|
|
16
|
+
export declare function describeAllowedModels(catalog: ModelCatalog): string;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const MANUALLY_EXCLUDED_MODEL_IDS = new Set(['gpt-4.1', 'claude-opus-4.6-fast']);
|
|
2
|
+
function isSelectableModel(model) {
|
|
3
|
+
return (model.policyState !== 'disabled' &&
|
|
4
|
+
model.policyState !== 'unconfigured' &&
|
|
5
|
+
!MANUALLY_EXCLUDED_MODEL_IDS.has(model.id));
|
|
6
|
+
}
|
|
7
|
+
function parseModelId(id) {
|
|
8
|
+
const match = /^(.*)-(\d+(?:\.\d+)?)(?:-(.+))?$/.exec(id);
|
|
9
|
+
if (!match) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
const prefix = match[1];
|
|
13
|
+
const version = match[2];
|
|
14
|
+
const suffix = match[3];
|
|
15
|
+
if (!prefix || !version) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const major = version.split('.')[0];
|
|
19
|
+
const familyBase = prefix.includes('-') ? prefix : `${prefix}-${major}`;
|
|
20
|
+
return {
|
|
21
|
+
family: suffix ? `${familyBase}-${suffix}` : familyBase,
|
|
22
|
+
version: version.split('.').map((part) => Number.parseInt(part, 10)),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function compareVersions(left, right) {
|
|
26
|
+
const length = Math.max(left.length, right.length);
|
|
27
|
+
for (let index = 0; index < length; index += 1) {
|
|
28
|
+
const leftPart = left[index] ?? 0;
|
|
29
|
+
const rightPart = right[index] ?? 0;
|
|
30
|
+
if (leftPart !== rightPart) {
|
|
31
|
+
return leftPart - rightPart;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
export function buildModelCatalog(models) {
|
|
37
|
+
const selectable = models.filter(isSelectableModel);
|
|
38
|
+
const latestByFamily = new Map();
|
|
39
|
+
const passthrough = new Set();
|
|
40
|
+
for (const model of selectable) {
|
|
41
|
+
const parsed = parseModelId(model.id);
|
|
42
|
+
if (!parsed) {
|
|
43
|
+
passthrough.add(model.id);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const existing = latestByFamily.get(parsed.family);
|
|
47
|
+
if (!existing || compareVersions(parsed.version, existing.version) > 0) {
|
|
48
|
+
latestByFamily.set(parsed.family, { id: model.id, version: parsed.version });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const aliasMappings = selectable
|
|
52
|
+
.map((model) => {
|
|
53
|
+
const parsed = parseModelId(model.id);
|
|
54
|
+
if (!parsed) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
const canonical = latestByFamily.get(parsed.family)?.id;
|
|
58
|
+
if (!canonical || canonical === model.id) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
alias: model.id,
|
|
63
|
+
canonical,
|
|
64
|
+
};
|
|
65
|
+
})
|
|
66
|
+
.filter((mapping) => mapping !== undefined)
|
|
67
|
+
.sort((left, right) => left.alias.localeCompare(right.alias));
|
|
68
|
+
const latestModelIds = [
|
|
69
|
+
...new Set([
|
|
70
|
+
...passthrough,
|
|
71
|
+
...[...latestByFamily.values()].map((entry) => entry.id),
|
|
72
|
+
]),
|
|
73
|
+
].sort((left, right) => left.localeCompare(right));
|
|
74
|
+
return {
|
|
75
|
+
latestModelIds,
|
|
76
|
+
aliasMappings,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export function resolveModelAlias(requestedModel, catalog) {
|
|
80
|
+
if (catalog.latestModelIds.includes(requestedModel)) {
|
|
81
|
+
return requestedModel;
|
|
82
|
+
}
|
|
83
|
+
return catalog.aliasMappings.find((mapping) => mapping.alias === requestedModel)?.canonical;
|
|
84
|
+
}
|
|
85
|
+
export function describeAllowedModels(catalog) {
|
|
86
|
+
const allowed = catalog.latestModelIds.join(', ');
|
|
87
|
+
if (catalog.aliasMappings.length === 0) {
|
|
88
|
+
return `Allowed models: ${allowed}`;
|
|
89
|
+
}
|
|
90
|
+
const aliases = catalog.aliasMappings
|
|
91
|
+
.map((mapping) => `${mapping.alias} -> ${mapping.canonical}`)
|
|
92
|
+
.join(', ');
|
|
93
|
+
return `Allowed models: ${allowed}. Accepted legacy aliases: ${aliases}`;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=model-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../../../src/services/model-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function getOutputDir(cwd: string): string;
|
|
2
|
+
export declare function getOutputPath(cwd: string, taskId: string): string;
|
|
3
|
+
export declare class OutputLogService {
|
|
4
|
+
create(cwd: string, taskId: string): Promise<string>;
|
|
5
|
+
append(cwd: string, taskId: string, line: string): Promise<void>;
|
|
6
|
+
finalize(cwd: string, taskId: string, status: string, error?: string): Promise<void>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { mkdir, open, readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
const OUTPUT_DIR_NAME = '.super-agents';
|
|
4
|
+
function sanitizeTaskId(taskId) {
|
|
5
|
+
return taskId.replace(/[\/\\:\x00]/g, '_');
|
|
6
|
+
}
|
|
7
|
+
export function getOutputDir(cwd) {
|
|
8
|
+
return join(cwd, OUTPUT_DIR_NAME);
|
|
9
|
+
}
|
|
10
|
+
export function getOutputPath(cwd, taskId) {
|
|
11
|
+
return join(getOutputDir(cwd), `${sanitizeTaskId(taskId)}.output`);
|
|
12
|
+
}
|
|
13
|
+
function timestamp() {
|
|
14
|
+
return new Date().toISOString();
|
|
15
|
+
}
|
|
16
|
+
export class OutputLogService {
|
|
17
|
+
async create(cwd, taskId) {
|
|
18
|
+
await mkdir(getOutputDir(cwd), { recursive: true });
|
|
19
|
+
const outputPath = getOutputPath(cwd, taskId);
|
|
20
|
+
const handle = await open(outputPath, 'a+');
|
|
21
|
+
try {
|
|
22
|
+
const existing = await readFile(outputPath, 'utf8').catch(() => '');
|
|
23
|
+
if (!existing) {
|
|
24
|
+
await handle.writeFile(`# Task: ${taskId}\n# Started: ${timestamp()}\n# Working directory: ${cwd}\n${'─'.repeat(60)}\n`, 'utf8');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
finally {
|
|
28
|
+
await handle.close();
|
|
29
|
+
}
|
|
30
|
+
return outputPath;
|
|
31
|
+
}
|
|
32
|
+
async append(cwd, taskId, line) {
|
|
33
|
+
const outputPath = await this.create(cwd, taskId);
|
|
34
|
+
const handle = await open(outputPath, 'a');
|
|
35
|
+
try {
|
|
36
|
+
await handle.writeFile(`[${timestamp()}] ${line}\n`, 'utf8');
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
await handle.close();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async finalize(cwd, taskId, status, error) {
|
|
43
|
+
const outputPath = await this.create(cwd, taskId);
|
|
44
|
+
const handle = await open(outputPath, 'a');
|
|
45
|
+
try {
|
|
46
|
+
const footer = [
|
|
47
|
+
`${'─'.repeat(60)}`,
|
|
48
|
+
`# Completed: ${timestamp()}`,
|
|
49
|
+
`# Status: ${status}`,
|
|
50
|
+
error ? `# Error: ${error}` : null,
|
|
51
|
+
].filter(Boolean).join('\n');
|
|
52
|
+
await handle.writeFile(`${footer}\n`, 'utf8');
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
await handle.close();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=output-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-log.js","sourceRoot":"","sources":["../../../src/services/output-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { PersistedProfileState } from '../types/task.js';
|
|
2
|
+
export interface CopilotProfile {
|
|
3
|
+
id: string;
|
|
4
|
+
configDir: string;
|
|
5
|
+
cooldownUntil?: number | undefined;
|
|
6
|
+
failureCount: number;
|
|
7
|
+
lastFailureReason?: string | undefined;
|
|
8
|
+
}
|
|
9
|
+
export interface ProfileManagerOptions {
|
|
10
|
+
profileDirs?: string[] | undefined;
|
|
11
|
+
cooldownMs?: number | undefined;
|
|
12
|
+
now?: (() => number) | undefined;
|
|
13
|
+
persistedProfiles?: PersistedProfileState[] | undefined;
|
|
14
|
+
}
|
|
15
|
+
export interface ProfileRotationResult {
|
|
16
|
+
success: boolean;
|
|
17
|
+
allExhausted?: boolean | undefined;
|
|
18
|
+
currentProfile?: CopilotProfile | undefined;
|
|
19
|
+
}
|
|
20
|
+
export declare class ProfileManager {
|
|
21
|
+
private readonly cooldownMs;
|
|
22
|
+
private readonly now;
|
|
23
|
+
private readonly profiles;
|
|
24
|
+
private currentIndex;
|
|
25
|
+
constructor(options?: ProfileManagerOptions);
|
|
26
|
+
static fromEnvironment(now?: () => number): ProfileManager;
|
|
27
|
+
hydrate(persistedProfiles: PersistedProfileState[]): void;
|
|
28
|
+
getProfiles(): CopilotProfile[];
|
|
29
|
+
getCurrentProfile(): CopilotProfile;
|
|
30
|
+
markFailure(reason: string): ProfileRotationResult;
|
|
31
|
+
resetExpiredCooldowns(): void;
|
|
32
|
+
toPersistedState(): PersistedProfileState[];
|
|
33
|
+
private findFirstAvailableIndex;
|
|
34
|
+
}
|