@generacy-ai/generacy 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 +207 -0
- package/bin/generacy.js +11 -0
- package/dist/agency/index.d.ts +68 -0
- package/dist/agency/index.d.ts.map +1 -0
- package/dist/agency/index.js +28 -0
- package/dist/agency/index.js.map +1 -0
- package/dist/agency/network.d.ts +41 -0
- package/dist/agency/network.d.ts.map +1 -0
- package/dist/agency/network.js +133 -0
- package/dist/agency/network.js.map +1 -0
- package/dist/agency/subprocess.d.ts +58 -0
- package/dist/agency/subprocess.d.ts.map +1 -0
- package/dist/agency/subprocess.js +216 -0
- package/dist/agency/subprocess.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +10 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +216 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.js +51 -0
- package/dist/cli/commands/doctor/checks/agency-mcp.js.map +1 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.js +68 -0
- package/dist/cli/commands/doctor/checks/anthropic-key.js.map +1 -0
- package/dist/cli/commands/doctor/checks/config.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/config.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/config.js +81 -0
- package/dist/cli/commands/doctor/checks/config.js.map +1 -0
- package/dist/cli/commands/doctor/checks/devcontainer.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/devcontainer.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/devcontainer.js +58 -0
- package/dist/cli/commands/doctor/checks/devcontainer.js.map +1 -0
- package/dist/cli/commands/doctor/checks/docker.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/docker.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/docker.js +71 -0
- package/dist/cli/commands/doctor/checks/docker.js.map +1 -0
- package/dist/cli/commands/doctor/checks/env-file.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/env-file.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/env-file.js +56 -0
- package/dist/cli/commands/doctor/checks/env-file.js.map +1 -0
- package/dist/cli/commands/doctor/checks/github-token.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/github-token.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/github-token.js +99 -0
- package/dist/cli/commands/doctor/checks/github-token.js.map +1 -0
- package/dist/cli/commands/doctor/checks/npm-packages.d.ts +3 -0
- package/dist/cli/commands/doctor/checks/npm-packages.d.ts.map +1 -0
- package/dist/cli/commands/doctor/checks/npm-packages.js +117 -0
- package/dist/cli/commands/doctor/checks/npm-packages.js.map +1 -0
- package/dist/cli/commands/doctor/formatter.d.ts +27 -0
- package/dist/cli/commands/doctor/formatter.d.ts.map +1 -0
- package/dist/cli/commands/doctor/formatter.js +162 -0
- package/dist/cli/commands/doctor/formatter.js.map +1 -0
- package/dist/cli/commands/doctor/index.d.ts +5 -0
- package/dist/cli/commands/doctor/index.d.ts.map +1 -0
- package/dist/cli/commands/doctor/index.js +8 -0
- package/dist/cli/commands/doctor/index.js.map +1 -0
- package/dist/cli/commands/doctor/registry.d.ts +48 -0
- package/dist/cli/commands/doctor/registry.d.ts.map +1 -0
- package/dist/cli/commands/doctor/registry.js +166 -0
- package/dist/cli/commands/doctor/registry.js.map +1 -0
- package/dist/cli/commands/doctor/runner.d.ts +14 -0
- package/dist/cli/commands/doctor/runner.d.ts.map +1 -0
- package/dist/cli/commands/doctor/runner.js +257 -0
- package/dist/cli/commands/doctor/runner.js.map +1 -0
- package/dist/cli/commands/doctor/types.d.ts +87 -0
- package/dist/cli/commands/doctor/types.d.ts.map +1 -0
- package/dist/cli/commands/doctor/types.js +2 -0
- package/dist/cli/commands/doctor/types.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +12 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +97 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init/conflicts.d.ts +36 -0
- package/dist/cli/commands/init/conflicts.d.ts.map +1 -0
- package/dist/cli/commands/init/conflicts.js +165 -0
- package/dist/cli/commands/init/conflicts.js.map +1 -0
- package/dist/cli/commands/init/github.d.ts +32 -0
- package/dist/cli/commands/init/github.d.ts.map +1 -0
- package/dist/cli/commands/init/github.js +161 -0
- package/dist/cli/commands/init/github.js.map +1 -0
- package/dist/cli/commands/init/index.d.ts +21 -0
- package/dist/cli/commands/init/index.d.ts.map +1 -0
- package/dist/cli/commands/init/index.js +175 -0
- package/dist/cli/commands/init/index.js.map +1 -0
- package/dist/cli/commands/init/prompts.d.ts +15 -0
- package/dist/cli/commands/init/prompts.d.ts.map +1 -0
- package/dist/cli/commands/init/prompts.js +281 -0
- package/dist/cli/commands/init/prompts.js.map +1 -0
- package/dist/cli/commands/init/repo-utils.d.ts +32 -0
- package/dist/cli/commands/init/repo-utils.d.ts.map +1 -0
- package/dist/cli/commands/init/repo-utils.js +112 -0
- package/dist/cli/commands/init/repo-utils.js.map +1 -0
- package/dist/cli/commands/init/resolver.d.ts +20 -0
- package/dist/cli/commands/init/resolver.d.ts.map +1 -0
- package/dist/cli/commands/init/resolver.js +273 -0
- package/dist/cli/commands/init/resolver.js.map +1 -0
- package/dist/cli/commands/init/summary.d.ts +21 -0
- package/dist/cli/commands/init/summary.d.ts.map +1 -0
- package/dist/cli/commands/init/summary.js +100 -0
- package/dist/cli/commands/init/summary.js.map +1 -0
- package/dist/cli/commands/init/types.d.ts +53 -0
- package/dist/cli/commands/init/types.d.ts.map +1 -0
- package/dist/cli/commands/init/types.js +2 -0
- package/dist/cli/commands/init/types.js.map +1 -0
- package/dist/cli/commands/init/writer.d.ts +22 -0
- package/dist/cli/commands/init/writer.d.ts.map +1 -0
- package/dist/cli/commands/init/writer.js +96 -0
- package/dist/cli/commands/init/writer.js.map +1 -0
- package/dist/cli/commands/orchestrator.d.ts +11 -0
- package/dist/cli/commands/orchestrator.d.ts.map +1 -0
- package/dist/cli/commands/orchestrator.js +291 -0
- package/dist/cli/commands/orchestrator.js.map +1 -0
- package/dist/cli/commands/run.d.ts +10 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +167 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/setup/auth.d.ts +11 -0
- package/dist/cli/commands/setup/auth.d.ts.map +1 -0
- package/dist/cli/commands/setup/auth.js +108 -0
- package/dist/cli/commands/setup/auth.js.map +1 -0
- package/dist/cli/commands/setup/build.d.ts +11 -0
- package/dist/cli/commands/setup/build.d.ts.map +1 -0
- package/dist/cli/commands/setup/build.js +212 -0
- package/dist/cli/commands/setup/build.js.map +1 -0
- package/dist/cli/commands/setup/services.d.ts +11 -0
- package/dist/cli/commands/setup/services.d.ts.map +1 -0
- package/dist/cli/commands/setup/services.js +294 -0
- package/dist/cli/commands/setup/services.js.map +1 -0
- package/dist/cli/commands/setup/workspace.d.ts +11 -0
- package/dist/cli/commands/setup/workspace.d.ts.map +1 -0
- package/dist/cli/commands/setup/workspace.js +215 -0
- package/dist/cli/commands/setup/workspace.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +7 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +19 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +10 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +164 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/worker.d.ts +10 -0
- package/dist/cli/commands/worker.d.ts.map +1 -0
- package/dist/cli/commands/worker.js +224 -0
- package/dist/cli/commands/worker.js.map +1 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +68 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/config.d.ts +49 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/config.js +110 -0
- package/dist/cli/utils/config.js.map +1 -0
- package/dist/cli/utils/exec.d.ts +39 -0
- package/dist/cli/utils/exec.d.ts.map +1 -0
- package/dist/cli/utils/exec.js +68 -0
- package/dist/cli/utils/exec.js.map +1 -0
- package/dist/cli/utils/logger.d.ts +47 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/cli/utils/logger.js +97 -0
- package/dist/cli/utils/logger.js.map +1 -0
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +13 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +104 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +266 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +304 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +160 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/validator.d.ts +60 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +112 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/health/server.d.ts +47 -0
- package/dist/health/server.d.ts.map +1 -0
- package/dist/health/server.js +92 -0
- package/dist/health/server.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/async-event-queue.d.ts +28 -0
- package/dist/orchestrator/async-event-queue.d.ts.map +1 -0
- package/dist/orchestrator/async-event-queue.js +57 -0
- package/dist/orchestrator/async-event-queue.js.map +1 -0
- package/dist/orchestrator/client.d.ts +110 -0
- package/dist/orchestrator/client.d.ts.map +1 -0
- package/dist/orchestrator/client.js +288 -0
- package/dist/orchestrator/client.js.map +1 -0
- package/dist/orchestrator/event-bus.d.ts +195 -0
- package/dist/orchestrator/event-bus.d.ts.map +1 -0
- package/dist/orchestrator/event-bus.js +557 -0
- package/dist/orchestrator/event-bus.js.map +1 -0
- package/dist/orchestrator/heartbeat.d.ts +71 -0
- package/dist/orchestrator/heartbeat.d.ts.map +1 -0
- package/dist/orchestrator/heartbeat.js +116 -0
- package/dist/orchestrator/heartbeat.js.map +1 -0
- package/dist/orchestrator/index.d.ts +25 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +15 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/job-handler.d.ts +109 -0
- package/dist/orchestrator/job-handler.d.ts.map +1 -0
- package/dist/orchestrator/job-handler.js +612 -0
- package/dist/orchestrator/job-handler.js.map +1 -0
- package/dist/orchestrator/job-queue.d.ts +81 -0
- package/dist/orchestrator/job-queue.d.ts.map +1 -0
- package/dist/orchestrator/job-queue.js +206 -0
- package/dist/orchestrator/job-queue.js.map +1 -0
- package/dist/orchestrator/label-monitor-bridge.d.ts +25 -0
- package/dist/orchestrator/label-monitor-bridge.d.ts.map +1 -0
- package/dist/orchestrator/label-monitor-bridge.js +57 -0
- package/dist/orchestrator/label-monitor-bridge.js.map +1 -0
- package/dist/orchestrator/log-buffer.d.ts +74 -0
- package/dist/orchestrator/log-buffer.d.ts.map +1 -0
- package/dist/orchestrator/log-buffer.js +104 -0
- package/dist/orchestrator/log-buffer.js.map +1 -0
- package/dist/orchestrator/redis-job-queue.d.ts +44 -0
- package/dist/orchestrator/redis-job-queue.d.ts.map +1 -0
- package/dist/orchestrator/redis-job-queue.js +300 -0
- package/dist/orchestrator/redis-job-queue.js.map +1 -0
- package/dist/orchestrator/router.d.ts +125 -0
- package/dist/orchestrator/router.d.ts.map +1 -0
- package/dist/orchestrator/router.js +143 -0
- package/dist/orchestrator/router.js.map +1 -0
- package/dist/orchestrator/server.d.ts +62 -0
- package/dist/orchestrator/server.d.ts.map +1 -0
- package/dist/orchestrator/server.js +711 -0
- package/dist/orchestrator/server.js.map +1 -0
- package/dist/orchestrator/types.d.ts +184 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +6 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/orchestrator/worker-registry.d.ts +110 -0
- package/dist/orchestrator/worker-registry.d.ts.map +1 -0
- package/dist/orchestrator/worker-registry.js +191 -0
- package/dist/orchestrator/worker-registry.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agency connection via HTTP
|
|
3
|
+
*/
|
|
4
|
+
export class NetworkAgency {
|
|
5
|
+
url;
|
|
6
|
+
logger;
|
|
7
|
+
timeout;
|
|
8
|
+
authToken;
|
|
9
|
+
connected = false;
|
|
10
|
+
sessionId;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.url = options.url.replace(/\/$/, '');
|
|
13
|
+
this.logger = options.logger;
|
|
14
|
+
this.timeout = options.timeout ?? 30000;
|
|
15
|
+
this.authToken = options.authToken ?? process.env['AGENCY_TOKEN'];
|
|
16
|
+
}
|
|
17
|
+
async connect() {
|
|
18
|
+
if (this.connected) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
this.logger.info(`Connecting to agency at ${this.url}`);
|
|
22
|
+
try {
|
|
23
|
+
// Initialize session
|
|
24
|
+
const response = await this.request('POST', '/mcp/initialize', {
|
|
25
|
+
protocolVersion: '2024-11-05',
|
|
26
|
+
capabilities: {},
|
|
27
|
+
clientInfo: {
|
|
28
|
+
name: 'generacy',
|
|
29
|
+
version: '0.0.1',
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
this.sessionId = response['sessionId'];
|
|
33
|
+
this.connected = true;
|
|
34
|
+
this.logger.info('Agency connected');
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
this.logger.error(`Failed to connect to agency: ${error}`);
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async disconnect() {
|
|
42
|
+
if (!this.connected) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.logger.info('Disconnecting from agency');
|
|
46
|
+
if (this.sessionId) {
|
|
47
|
+
try {
|
|
48
|
+
await this.request('DELETE', `/mcp/sessions/${this.sessionId}`);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
this.logger.warn(`Failed to close agency session: ${error}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
this.sessionId = undefined;
|
|
55
|
+
this.connected = false;
|
|
56
|
+
}
|
|
57
|
+
isConnected() {
|
|
58
|
+
return this.connected;
|
|
59
|
+
}
|
|
60
|
+
async listTools() {
|
|
61
|
+
if (!this.connected) {
|
|
62
|
+
throw new Error('Not connected to agency');
|
|
63
|
+
}
|
|
64
|
+
const response = await this.request('GET', '/mcp/tools');
|
|
65
|
+
return response.tools?.map(t => t.name) ?? [];
|
|
66
|
+
}
|
|
67
|
+
async callTool(request) {
|
|
68
|
+
if (!this.connected) {
|
|
69
|
+
throw new Error('Not connected to agency');
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
const result = await this.request('POST', '/mcp/tools/call', {
|
|
73
|
+
name: request.name,
|
|
74
|
+
arguments: request.arguments,
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
success: true,
|
|
78
|
+
result,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
return {
|
|
83
|
+
success: false,
|
|
84
|
+
error: error instanceof Error ? error.message : String(error),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Make an HTTP request to the agency service
|
|
90
|
+
*/
|
|
91
|
+
async request(method, path, body) {
|
|
92
|
+
const url = `${this.url}${path}`;
|
|
93
|
+
const controller = new AbortController();
|
|
94
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
95
|
+
try {
|
|
96
|
+
const headers = {
|
|
97
|
+
'Content-Type': 'application/json',
|
|
98
|
+
};
|
|
99
|
+
if (this.authToken) {
|
|
100
|
+
headers['Authorization'] = `Bearer ${this.authToken}`;
|
|
101
|
+
}
|
|
102
|
+
if (this.sessionId) {
|
|
103
|
+
headers['X-Session-ID'] = this.sessionId;
|
|
104
|
+
}
|
|
105
|
+
const response = await fetch(url, {
|
|
106
|
+
method,
|
|
107
|
+
headers,
|
|
108
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
109
|
+
signal: controller.signal,
|
|
110
|
+
});
|
|
111
|
+
if (!response.ok) {
|
|
112
|
+
let errorMessage = response.statusText;
|
|
113
|
+
try {
|
|
114
|
+
const errorData = await response.json();
|
|
115
|
+
errorMessage = errorData.error ?? errorData.message ?? errorMessage;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Ignore parse errors
|
|
119
|
+
}
|
|
120
|
+
throw new Error(`Agency request failed: ${response.status} ${errorMessage}`);
|
|
121
|
+
}
|
|
122
|
+
const text = await response.text();
|
|
123
|
+
if (!text) {
|
|
124
|
+
return {};
|
|
125
|
+
}
|
|
126
|
+
return JSON.parse(text);
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
clearTimeout(timeoutId);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/agency/network.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Logger } from '@generacy-ai/workflow-engine';
|
|
2
|
+
import type { AgencyConnection, ToolCallRequest, ToolCallResponse } from './index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Subprocess agency options
|
|
5
|
+
*/
|
|
6
|
+
export interface SubprocessAgencyOptions {
|
|
7
|
+
/** Command to launch agency */
|
|
8
|
+
command: string;
|
|
9
|
+
/** Command arguments */
|
|
10
|
+
args?: string[];
|
|
11
|
+
/** Logger instance */
|
|
12
|
+
logger: Logger;
|
|
13
|
+
/** Connection timeout in milliseconds */
|
|
14
|
+
timeout?: number;
|
|
15
|
+
/** Working directory */
|
|
16
|
+
cwd?: string;
|
|
17
|
+
/** Environment variables */
|
|
18
|
+
env?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Agency connection via subprocess
|
|
22
|
+
*/
|
|
23
|
+
export declare class SubprocessAgency implements AgencyConnection {
|
|
24
|
+
private readonly command;
|
|
25
|
+
private readonly args;
|
|
26
|
+
private readonly logger;
|
|
27
|
+
private readonly timeout;
|
|
28
|
+
private readonly cwd?;
|
|
29
|
+
private readonly env?;
|
|
30
|
+
private process;
|
|
31
|
+
private connected;
|
|
32
|
+
private messageId;
|
|
33
|
+
private pendingRequests;
|
|
34
|
+
private buffer;
|
|
35
|
+
constructor(options: SubprocessAgencyOptions);
|
|
36
|
+
connect(): Promise<void>;
|
|
37
|
+
disconnect(): Promise<void>;
|
|
38
|
+
isConnected(): boolean;
|
|
39
|
+
listTools(): Promise<string[]>;
|
|
40
|
+
callTool(request: ToolCallRequest): Promise<ToolCallResponse>;
|
|
41
|
+
/**
|
|
42
|
+
* Send an MCP request and wait for response
|
|
43
|
+
*/
|
|
44
|
+
private request;
|
|
45
|
+
/**
|
|
46
|
+
* Send an MCP message
|
|
47
|
+
*/
|
|
48
|
+
private sendMessage;
|
|
49
|
+
/**
|
|
50
|
+
* Handle incoming data
|
|
51
|
+
*/
|
|
52
|
+
private handleData;
|
|
53
|
+
/**
|
|
54
|
+
* Handle an MCP message
|
|
55
|
+
*/
|
|
56
|
+
private handleMessage;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=subprocess.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../src/agency/subprocess.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAEhB,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IAEf,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAkBD;;GAEG;AACH,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAyB;IAE9C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAGlB;IACL,OAAO,CAAC,MAAM,CAAM;gBAER,OAAO,EAAE,uBAAuB;IAStC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAuExB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBjC,WAAW,IAAI,OAAO;IAIhB,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAS9B,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuBnE;;OAEG;YACW,OAAO;IA4BrB;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAmBlB;;OAEG;IACH,OAAO,CAAC,aAAa;CAiBtB"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subprocess agency mode.
|
|
3
|
+
* Launches Agency MCP as a child process and communicates via stdio.
|
|
4
|
+
*/
|
|
5
|
+
import { spawn } from 'node:child_process';
|
|
6
|
+
/**
|
|
7
|
+
* Agency connection via subprocess
|
|
8
|
+
*/
|
|
9
|
+
export class SubprocessAgency {
|
|
10
|
+
command;
|
|
11
|
+
args;
|
|
12
|
+
logger;
|
|
13
|
+
timeout;
|
|
14
|
+
cwd;
|
|
15
|
+
env;
|
|
16
|
+
process = null;
|
|
17
|
+
connected = false;
|
|
18
|
+
messageId = 0;
|
|
19
|
+
pendingRequests = new Map();
|
|
20
|
+
buffer = '';
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.command = options.command;
|
|
23
|
+
this.args = options.args ?? [];
|
|
24
|
+
this.logger = options.logger;
|
|
25
|
+
this.timeout = options.timeout ?? 30000;
|
|
26
|
+
this.cwd = options.cwd;
|
|
27
|
+
this.env = options.env;
|
|
28
|
+
}
|
|
29
|
+
async connect() {
|
|
30
|
+
if (this.connected) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
this.logger.info(`Starting agency subprocess: ${this.command}`);
|
|
34
|
+
return new Promise((resolve, reject) => {
|
|
35
|
+
const timeoutId = setTimeout(() => {
|
|
36
|
+
reject(new Error('Agency connection timeout'));
|
|
37
|
+
this.disconnect();
|
|
38
|
+
}, this.timeout);
|
|
39
|
+
this.process = spawn(this.command, this.args, {
|
|
40
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
41
|
+
cwd: this.cwd,
|
|
42
|
+
env: { ...process.env, ...this.env },
|
|
43
|
+
});
|
|
44
|
+
this.process.on('error', (error) => {
|
|
45
|
+
clearTimeout(timeoutId);
|
|
46
|
+
this.logger.error(`Agency process error: ${error.message}`);
|
|
47
|
+
reject(error);
|
|
48
|
+
});
|
|
49
|
+
this.process.on('exit', (code, signal) => {
|
|
50
|
+
this.connected = false;
|
|
51
|
+
this.logger.info(`Agency process exited with code ${code}, signal ${signal}`);
|
|
52
|
+
});
|
|
53
|
+
this.process.stdout?.on('data', (data) => {
|
|
54
|
+
this.handleData(data.toString());
|
|
55
|
+
});
|
|
56
|
+
this.process.stderr?.on('data', (data) => {
|
|
57
|
+
this.logger.warn(`Agency stderr: ${data.toString()}`);
|
|
58
|
+
});
|
|
59
|
+
// Send initialize message
|
|
60
|
+
this.sendMessage({
|
|
61
|
+
jsonrpc: '2.0',
|
|
62
|
+
id: this.messageId++,
|
|
63
|
+
method: 'initialize',
|
|
64
|
+
params: {
|
|
65
|
+
protocolVersion: '2024-11-05',
|
|
66
|
+
capabilities: {},
|
|
67
|
+
clientInfo: {
|
|
68
|
+
name: 'generacy',
|
|
69
|
+
version: '0.0.1',
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
// Wait for initialization response
|
|
74
|
+
const initHandler = (result) => {
|
|
75
|
+
clearTimeout(timeoutId);
|
|
76
|
+
this.connected = true;
|
|
77
|
+
this.logger.info('Agency connected');
|
|
78
|
+
resolve();
|
|
79
|
+
};
|
|
80
|
+
this.pendingRequests.set(0, {
|
|
81
|
+
resolve: initHandler,
|
|
82
|
+
reject: (error) => {
|
|
83
|
+
clearTimeout(timeoutId);
|
|
84
|
+
reject(error);
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async disconnect() {
|
|
90
|
+
if (!this.process) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.logger.info('Disconnecting from agency');
|
|
94
|
+
// Clear pending requests
|
|
95
|
+
for (const [, { reject }] of this.pendingRequests) {
|
|
96
|
+
reject(new Error('Connection closed'));
|
|
97
|
+
}
|
|
98
|
+
this.pendingRequests.clear();
|
|
99
|
+
// Kill the process
|
|
100
|
+
this.process.kill();
|
|
101
|
+
this.process = null;
|
|
102
|
+
this.connected = false;
|
|
103
|
+
}
|
|
104
|
+
isConnected() {
|
|
105
|
+
return this.connected;
|
|
106
|
+
}
|
|
107
|
+
async listTools() {
|
|
108
|
+
if (!this.connected) {
|
|
109
|
+
throw new Error('Not connected to agency');
|
|
110
|
+
}
|
|
111
|
+
const response = await this.request('tools/list', {});
|
|
112
|
+
return response.tools?.map(t => t.name) ?? [];
|
|
113
|
+
}
|
|
114
|
+
async callTool(request) {
|
|
115
|
+
if (!this.connected) {
|
|
116
|
+
throw new Error('Not connected to agency');
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
const result = await this.request('tools/call', {
|
|
120
|
+
name: request.name,
|
|
121
|
+
arguments: request.arguments,
|
|
122
|
+
});
|
|
123
|
+
return {
|
|
124
|
+
success: true,
|
|
125
|
+
result,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
return {
|
|
130
|
+
success: false,
|
|
131
|
+
error: error instanceof Error ? error.message : String(error),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Send an MCP request and wait for response
|
|
137
|
+
*/
|
|
138
|
+
async request(method, params) {
|
|
139
|
+
return new Promise((resolve, reject) => {
|
|
140
|
+
const id = this.messageId++;
|
|
141
|
+
const timeoutId = setTimeout(() => {
|
|
142
|
+
this.pendingRequests.delete(id);
|
|
143
|
+
reject(new Error(`Request timeout: ${method}`));
|
|
144
|
+
}, this.timeout);
|
|
145
|
+
this.pendingRequests.set(id, {
|
|
146
|
+
resolve: (result) => {
|
|
147
|
+
clearTimeout(timeoutId);
|
|
148
|
+
resolve(result);
|
|
149
|
+
},
|
|
150
|
+
reject: (error) => {
|
|
151
|
+
clearTimeout(timeoutId);
|
|
152
|
+
reject(error);
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
this.sendMessage({
|
|
156
|
+
jsonrpc: '2.0',
|
|
157
|
+
id,
|
|
158
|
+
method,
|
|
159
|
+
params,
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Send an MCP message
|
|
165
|
+
*/
|
|
166
|
+
sendMessage(message) {
|
|
167
|
+
if (!this.process?.stdin) {
|
|
168
|
+
throw new Error('Process not started');
|
|
169
|
+
}
|
|
170
|
+
const content = JSON.stringify(message);
|
|
171
|
+
this.process.stdin.write(content + '\n');
|
|
172
|
+
this.logger.debug(`Sent MCP message: ${message.method ?? 'response'}`);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Handle incoming data
|
|
176
|
+
*/
|
|
177
|
+
handleData(data) {
|
|
178
|
+
this.buffer += data;
|
|
179
|
+
// Process complete lines
|
|
180
|
+
const lines = this.buffer.split('\n');
|
|
181
|
+
this.buffer = lines.pop() ?? '';
|
|
182
|
+
for (const line of lines) {
|
|
183
|
+
if (!line.trim())
|
|
184
|
+
continue;
|
|
185
|
+
try {
|
|
186
|
+
const message = JSON.parse(line);
|
|
187
|
+
this.handleMessage(message);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
this.logger.warn(`Failed to parse MCP message: ${line}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Handle an MCP message
|
|
196
|
+
*/
|
|
197
|
+
handleMessage(message) {
|
|
198
|
+
if (message.id !== undefined) {
|
|
199
|
+
const pending = this.pendingRequests.get(message.id);
|
|
200
|
+
if (pending) {
|
|
201
|
+
this.pendingRequests.delete(message.id);
|
|
202
|
+
if (message.error) {
|
|
203
|
+
pending.reject(new Error(message.error.message));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
pending.resolve(message.result);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else if (message.method) {
|
|
211
|
+
// Handle notifications
|
|
212
|
+
this.logger.debug(`Received MCP notification: ${message.method}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=subprocess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subprocess.js","sourceRoot":"","sources":["../../src/agency/subprocess.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent command implementation.
|
|
3
|
+
* Extends worker with Agency integration for tool routing.
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
/**
|
|
7
|
+
* Create the agent command
|
|
8
|
+
*/
|
|
9
|
+
export declare function agentCommand(): Command;
|
|
10
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CA8NtC"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent command implementation.
|
|
3
|
+
* Extends worker with Agency integration for tool routing.
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { hostname } from 'node:os';
|
|
8
|
+
import { getLogger, createWorkflowLogger } from '../utils/logger.js';
|
|
9
|
+
import { createConfig } from '../utils/config.js';
|
|
10
|
+
import { OrchestratorClient, HeartbeatManager, JobHandler, } from '../../orchestrator/index.js';
|
|
11
|
+
import { createHealthServer } from '../../health/server.js';
|
|
12
|
+
import { createAgencyConnection } from '../../agency/index.js';
|
|
13
|
+
/**
|
|
14
|
+
* Create the agent command
|
|
15
|
+
*/
|
|
16
|
+
export function agentCommand() {
|
|
17
|
+
const command = new Command('agent');
|
|
18
|
+
command
|
|
19
|
+
.description('Start an agent worker with Agency integration for AI tool routing')
|
|
20
|
+
.option('-u, --url <url>', 'Orchestrator URL', process.env['ORCHESTRATOR_URL'])
|
|
21
|
+
.option('-i, --worker-id <id>', 'Worker ID (auto-generated if not provided)')
|
|
22
|
+
.option('-n, --worker-name <name>', 'Worker name', `agent-${hostname()}`)
|
|
23
|
+
.option('-c, --capabilities <caps...>', 'Worker capabilities/tags', ['agent', 'ai'])
|
|
24
|
+
.option('-w, --workdir <path>', 'Working directory for job execution', process.cwd())
|
|
25
|
+
.option('-p, --health-port <port>', 'Health check port', '8080')
|
|
26
|
+
.option('--heartbeat-interval <ms>', 'Heartbeat interval in milliseconds', '30000')
|
|
27
|
+
.option('--poll-interval <ms>', 'Job poll interval in milliseconds', '5000')
|
|
28
|
+
.option('--agency-mode <mode>', 'Agency mode: subprocess or network', 'subprocess')
|
|
29
|
+
.option('--agency-url <url>', 'Agency URL for network mode', process.env['AGENCY_URL'])
|
|
30
|
+
.option('--agency-command <cmd>', 'Agency command for subprocess mode', 'npx @anthropic-ai/agency')
|
|
31
|
+
.action(async (options) => {
|
|
32
|
+
const logger = getLogger();
|
|
33
|
+
const workflowLogger = createWorkflowLogger(logger);
|
|
34
|
+
// Validate required options
|
|
35
|
+
if (!options['url']) {
|
|
36
|
+
logger.error('Orchestrator URL is required. Set ORCHESTRATOR_URL env var or use --url option');
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
// Create configuration
|
|
40
|
+
const config = createConfig({
|
|
41
|
+
orchestratorUrl: options['url'],
|
|
42
|
+
workerId: options['workerId'],
|
|
43
|
+
workdir: options['workdir'],
|
|
44
|
+
healthPort: parseInt(options['healthPort'], 10),
|
|
45
|
+
heartbeatInterval: parseInt(options['heartbeatInterval'], 10),
|
|
46
|
+
pollInterval: parseInt(options['pollInterval'], 10),
|
|
47
|
+
agencyMode: options['agencyMode'],
|
|
48
|
+
agencyUrl: options['agencyUrl'],
|
|
49
|
+
agencyCommand: options['agencyCommand'],
|
|
50
|
+
});
|
|
51
|
+
const workerId = config.workerId ?? randomUUID();
|
|
52
|
+
const workerName = options['workerName'] ?? `agent-${hostname()}`;
|
|
53
|
+
const capabilities = options['capabilities'] ?? ['agent', 'ai'];
|
|
54
|
+
logger.info({ workerId, workerName, capabilities, agencyMode: config.agencyMode }, 'Starting agent worker');
|
|
55
|
+
// Create agency connection
|
|
56
|
+
let agency = null;
|
|
57
|
+
try {
|
|
58
|
+
agency = await createAgencyConnection({
|
|
59
|
+
mode: config.agencyMode,
|
|
60
|
+
url: config.agencyUrl,
|
|
61
|
+
command: config.agencyCommand,
|
|
62
|
+
logger: workflowLogger,
|
|
63
|
+
});
|
|
64
|
+
await agency.connect();
|
|
65
|
+
logger.info('Agency connected');
|
|
66
|
+
// List available tools
|
|
67
|
+
const tools = await agency.listTools();
|
|
68
|
+
logger.info({ tools }, 'Available agency tools');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
logger.error({ error }, 'Failed to connect to agency');
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
// Create orchestrator client
|
|
75
|
+
const client = new OrchestratorClient({
|
|
76
|
+
baseUrl: config.orchestratorUrl,
|
|
77
|
+
});
|
|
78
|
+
// Register worker
|
|
79
|
+
const registration = {
|
|
80
|
+
id: workerId,
|
|
81
|
+
name: workerName,
|
|
82
|
+
capabilities,
|
|
83
|
+
maxConcurrent: 1,
|
|
84
|
+
healthEndpoint: `http://localhost:${config.healthPort}/health`,
|
|
85
|
+
metadata: {
|
|
86
|
+
agencyMode: config.agencyMode,
|
|
87
|
+
hasAgency: true,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
try {
|
|
91
|
+
await client.register(registration);
|
|
92
|
+
logger.info({ workerId }, 'Agent worker registered with orchestrator');
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
logger.error({ error }, 'Failed to register agent worker');
|
|
96
|
+
await agency?.disconnect();
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
// Create heartbeat manager
|
|
100
|
+
const heartbeatManager = new HeartbeatManager({
|
|
101
|
+
client,
|
|
102
|
+
workerId,
|
|
103
|
+
interval: config.heartbeatInterval,
|
|
104
|
+
onCommand: (cmd) => {
|
|
105
|
+
logger.info({ command: cmd }, 'Received command from orchestrator');
|
|
106
|
+
if (cmd.type === 'shutdown') {
|
|
107
|
+
logger.info('Shutdown requested by orchestrator');
|
|
108
|
+
shutdown();
|
|
109
|
+
}
|
|
110
|
+
else if (cmd.type === 'cancel') {
|
|
111
|
+
logger.info('Cancel requested by orchestrator');
|
|
112
|
+
jobHandler.cancelCurrentJob();
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
onError: (error) => {
|
|
116
|
+
logger.warn({ error: error.message }, 'Heartbeat failed');
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
// Create job handler
|
|
120
|
+
const jobHandler = new JobHandler({
|
|
121
|
+
client,
|
|
122
|
+
workerId,
|
|
123
|
+
pollInterval: config.pollInterval,
|
|
124
|
+
logger: workflowLogger,
|
|
125
|
+
workdir: config.workdir,
|
|
126
|
+
capabilities,
|
|
127
|
+
onJobStart: (job) => {
|
|
128
|
+
logger.info({ jobId: job.id, jobName: job.name }, 'Job started');
|
|
129
|
+
heartbeatManager.setStatus('busy');
|
|
130
|
+
heartbeatManager.setCurrentJob(job.id);
|
|
131
|
+
},
|
|
132
|
+
onJobComplete: (job, result) => {
|
|
133
|
+
logger.info({ jobId: job.id, status: result.status }, 'Job completed');
|
|
134
|
+
heartbeatManager.setStatus('idle');
|
|
135
|
+
heartbeatManager.setCurrentJob(undefined);
|
|
136
|
+
},
|
|
137
|
+
onError: (error, job) => {
|
|
138
|
+
logger.error({ error: error.message, jobId: job?.id }, 'Job error');
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
// Create health server
|
|
142
|
+
const healthServer = createHealthServer({
|
|
143
|
+
port: config.healthPort,
|
|
144
|
+
getStatus: () => ({
|
|
145
|
+
status: jobHandler.isBusy() ? 'busy' : 'healthy',
|
|
146
|
+
uptime: heartbeatManager.getUptime(),
|
|
147
|
+
lastHeartbeat: heartbeatManager.getLastHeartbeat()?.toISOString(),
|
|
148
|
+
currentJob: jobHandler.getCurrentJob()?.id,
|
|
149
|
+
metadata: {
|
|
150
|
+
agencyConnected: agency?.isConnected() ?? false,
|
|
151
|
+
},
|
|
152
|
+
}),
|
|
153
|
+
});
|
|
154
|
+
// Graceful shutdown handler
|
|
155
|
+
let isShuttingDown = false;
|
|
156
|
+
const shutdown = async () => {
|
|
157
|
+
if (isShuttingDown) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
isShuttingDown = true;
|
|
161
|
+
logger.info('Shutting down agent worker...');
|
|
162
|
+
heartbeatManager.setStatus('stopping');
|
|
163
|
+
// Stop accepting new jobs
|
|
164
|
+
jobHandler.stop();
|
|
165
|
+
// Wait for current job to finish (with timeout)
|
|
166
|
+
const shutdownTimeout = 60000; // 1 minute
|
|
167
|
+
const startTime = Date.now();
|
|
168
|
+
while (jobHandler.isBusy() && Date.now() - startTime < shutdownTimeout) {
|
|
169
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
170
|
+
}
|
|
171
|
+
// Force cancel if still running
|
|
172
|
+
if (jobHandler.isBusy()) {
|
|
173
|
+
logger.warn('Shutdown timeout reached, cancelling current job');
|
|
174
|
+
jobHandler.cancelCurrentJob();
|
|
175
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
176
|
+
}
|
|
177
|
+
// Stop heartbeat
|
|
178
|
+
heartbeatManager.stop();
|
|
179
|
+
// Disconnect from agency
|
|
180
|
+
try {
|
|
181
|
+
await agency?.disconnect();
|
|
182
|
+
logger.info('Agency disconnected');
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
logger.warn({ error }, 'Failed to disconnect from agency');
|
|
186
|
+
}
|
|
187
|
+
// Unregister from orchestrator
|
|
188
|
+
try {
|
|
189
|
+
await client.unregister(workerId);
|
|
190
|
+
logger.info('Agent worker unregistered from orchestrator');
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
logger.warn({ error }, 'Failed to unregister agent worker');
|
|
194
|
+
}
|
|
195
|
+
// Close health server
|
|
196
|
+
healthServer.close();
|
|
197
|
+
logger.info('Agent worker shutdown complete');
|
|
198
|
+
process.exit(0);
|
|
199
|
+
};
|
|
200
|
+
// Handle signals
|
|
201
|
+
process.on('SIGTERM', shutdown);
|
|
202
|
+
process.on('SIGINT', shutdown);
|
|
203
|
+
// Start services
|
|
204
|
+
heartbeatManager.start();
|
|
205
|
+
jobHandler.start();
|
|
206
|
+
healthServer.listen();
|
|
207
|
+
logger.info({
|
|
208
|
+
workerId,
|
|
209
|
+
orchestratorUrl: config.orchestratorUrl,
|
|
210
|
+
healthPort: config.healthPort,
|
|
211
|
+
agencyMode: config.agencyMode,
|
|
212
|
+
}, 'Agent worker started and ready to process jobs');
|
|
213
|
+
});
|
|
214
|
+
return command;
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=agent.js.map
|