@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.
Files changed (244) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +207 -0
  3. package/bin/generacy.js +11 -0
  4. package/dist/agency/index.d.ts +68 -0
  5. package/dist/agency/index.d.ts.map +1 -0
  6. package/dist/agency/index.js +28 -0
  7. package/dist/agency/index.js.map +1 -0
  8. package/dist/agency/network.d.ts +41 -0
  9. package/dist/agency/network.d.ts.map +1 -0
  10. package/dist/agency/network.js +133 -0
  11. package/dist/agency/network.js.map +1 -0
  12. package/dist/agency/subprocess.d.ts +58 -0
  13. package/dist/agency/subprocess.d.ts.map +1 -0
  14. package/dist/agency/subprocess.js +216 -0
  15. package/dist/agency/subprocess.js.map +1 -0
  16. package/dist/cli/commands/agent.d.ts +10 -0
  17. package/dist/cli/commands/agent.d.ts.map +1 -0
  18. package/dist/cli/commands/agent.js +216 -0
  19. package/dist/cli/commands/agent.js.map +1 -0
  20. package/dist/cli/commands/doctor/checks/agency-mcp.d.ts +3 -0
  21. package/dist/cli/commands/doctor/checks/agency-mcp.d.ts.map +1 -0
  22. package/dist/cli/commands/doctor/checks/agency-mcp.js +51 -0
  23. package/dist/cli/commands/doctor/checks/agency-mcp.js.map +1 -0
  24. package/dist/cli/commands/doctor/checks/anthropic-key.d.ts +3 -0
  25. package/dist/cli/commands/doctor/checks/anthropic-key.d.ts.map +1 -0
  26. package/dist/cli/commands/doctor/checks/anthropic-key.js +68 -0
  27. package/dist/cli/commands/doctor/checks/anthropic-key.js.map +1 -0
  28. package/dist/cli/commands/doctor/checks/config.d.ts +3 -0
  29. package/dist/cli/commands/doctor/checks/config.d.ts.map +1 -0
  30. package/dist/cli/commands/doctor/checks/config.js +81 -0
  31. package/dist/cli/commands/doctor/checks/config.js.map +1 -0
  32. package/dist/cli/commands/doctor/checks/devcontainer.d.ts +3 -0
  33. package/dist/cli/commands/doctor/checks/devcontainer.d.ts.map +1 -0
  34. package/dist/cli/commands/doctor/checks/devcontainer.js +58 -0
  35. package/dist/cli/commands/doctor/checks/devcontainer.js.map +1 -0
  36. package/dist/cli/commands/doctor/checks/docker.d.ts +3 -0
  37. package/dist/cli/commands/doctor/checks/docker.d.ts.map +1 -0
  38. package/dist/cli/commands/doctor/checks/docker.js +71 -0
  39. package/dist/cli/commands/doctor/checks/docker.js.map +1 -0
  40. package/dist/cli/commands/doctor/checks/env-file.d.ts +3 -0
  41. package/dist/cli/commands/doctor/checks/env-file.d.ts.map +1 -0
  42. package/dist/cli/commands/doctor/checks/env-file.js +56 -0
  43. package/dist/cli/commands/doctor/checks/env-file.js.map +1 -0
  44. package/dist/cli/commands/doctor/checks/github-token.d.ts +3 -0
  45. package/dist/cli/commands/doctor/checks/github-token.d.ts.map +1 -0
  46. package/dist/cli/commands/doctor/checks/github-token.js +99 -0
  47. package/dist/cli/commands/doctor/checks/github-token.js.map +1 -0
  48. package/dist/cli/commands/doctor/checks/npm-packages.d.ts +3 -0
  49. package/dist/cli/commands/doctor/checks/npm-packages.d.ts.map +1 -0
  50. package/dist/cli/commands/doctor/checks/npm-packages.js +117 -0
  51. package/dist/cli/commands/doctor/checks/npm-packages.js.map +1 -0
  52. package/dist/cli/commands/doctor/formatter.d.ts +27 -0
  53. package/dist/cli/commands/doctor/formatter.d.ts.map +1 -0
  54. package/dist/cli/commands/doctor/formatter.js +162 -0
  55. package/dist/cli/commands/doctor/formatter.js.map +1 -0
  56. package/dist/cli/commands/doctor/index.d.ts +5 -0
  57. package/dist/cli/commands/doctor/index.d.ts.map +1 -0
  58. package/dist/cli/commands/doctor/index.js +8 -0
  59. package/dist/cli/commands/doctor/index.js.map +1 -0
  60. package/dist/cli/commands/doctor/registry.d.ts +48 -0
  61. package/dist/cli/commands/doctor/registry.d.ts.map +1 -0
  62. package/dist/cli/commands/doctor/registry.js +166 -0
  63. package/dist/cli/commands/doctor/registry.js.map +1 -0
  64. package/dist/cli/commands/doctor/runner.d.ts +14 -0
  65. package/dist/cli/commands/doctor/runner.d.ts.map +1 -0
  66. package/dist/cli/commands/doctor/runner.js +257 -0
  67. package/dist/cli/commands/doctor/runner.js.map +1 -0
  68. package/dist/cli/commands/doctor/types.d.ts +87 -0
  69. package/dist/cli/commands/doctor/types.d.ts.map +1 -0
  70. package/dist/cli/commands/doctor/types.js +2 -0
  71. package/dist/cli/commands/doctor/types.js.map +1 -0
  72. package/dist/cli/commands/doctor.d.ts +12 -0
  73. package/dist/cli/commands/doctor.d.ts.map +1 -0
  74. package/dist/cli/commands/doctor.js +97 -0
  75. package/dist/cli/commands/doctor.js.map +1 -0
  76. package/dist/cli/commands/init/conflicts.d.ts +36 -0
  77. package/dist/cli/commands/init/conflicts.d.ts.map +1 -0
  78. package/dist/cli/commands/init/conflicts.js +165 -0
  79. package/dist/cli/commands/init/conflicts.js.map +1 -0
  80. package/dist/cli/commands/init/github.d.ts +32 -0
  81. package/dist/cli/commands/init/github.d.ts.map +1 -0
  82. package/dist/cli/commands/init/github.js +161 -0
  83. package/dist/cli/commands/init/github.js.map +1 -0
  84. package/dist/cli/commands/init/index.d.ts +21 -0
  85. package/dist/cli/commands/init/index.d.ts.map +1 -0
  86. package/dist/cli/commands/init/index.js +175 -0
  87. package/dist/cli/commands/init/index.js.map +1 -0
  88. package/dist/cli/commands/init/prompts.d.ts +15 -0
  89. package/dist/cli/commands/init/prompts.d.ts.map +1 -0
  90. package/dist/cli/commands/init/prompts.js +281 -0
  91. package/dist/cli/commands/init/prompts.js.map +1 -0
  92. package/dist/cli/commands/init/repo-utils.d.ts +32 -0
  93. package/dist/cli/commands/init/repo-utils.d.ts.map +1 -0
  94. package/dist/cli/commands/init/repo-utils.js +112 -0
  95. package/dist/cli/commands/init/repo-utils.js.map +1 -0
  96. package/dist/cli/commands/init/resolver.d.ts +20 -0
  97. package/dist/cli/commands/init/resolver.d.ts.map +1 -0
  98. package/dist/cli/commands/init/resolver.js +273 -0
  99. package/dist/cli/commands/init/resolver.js.map +1 -0
  100. package/dist/cli/commands/init/summary.d.ts +21 -0
  101. package/dist/cli/commands/init/summary.d.ts.map +1 -0
  102. package/dist/cli/commands/init/summary.js +100 -0
  103. package/dist/cli/commands/init/summary.js.map +1 -0
  104. package/dist/cli/commands/init/types.d.ts +53 -0
  105. package/dist/cli/commands/init/types.d.ts.map +1 -0
  106. package/dist/cli/commands/init/types.js +2 -0
  107. package/dist/cli/commands/init/types.js.map +1 -0
  108. package/dist/cli/commands/init/writer.d.ts +22 -0
  109. package/dist/cli/commands/init/writer.d.ts.map +1 -0
  110. package/dist/cli/commands/init/writer.js +96 -0
  111. package/dist/cli/commands/init/writer.js.map +1 -0
  112. package/dist/cli/commands/orchestrator.d.ts +11 -0
  113. package/dist/cli/commands/orchestrator.d.ts.map +1 -0
  114. package/dist/cli/commands/orchestrator.js +291 -0
  115. package/dist/cli/commands/orchestrator.js.map +1 -0
  116. package/dist/cli/commands/run.d.ts +10 -0
  117. package/dist/cli/commands/run.d.ts.map +1 -0
  118. package/dist/cli/commands/run.js +167 -0
  119. package/dist/cli/commands/run.js.map +1 -0
  120. package/dist/cli/commands/setup/auth.d.ts +11 -0
  121. package/dist/cli/commands/setup/auth.d.ts.map +1 -0
  122. package/dist/cli/commands/setup/auth.js +108 -0
  123. package/dist/cli/commands/setup/auth.js.map +1 -0
  124. package/dist/cli/commands/setup/build.d.ts +11 -0
  125. package/dist/cli/commands/setup/build.d.ts.map +1 -0
  126. package/dist/cli/commands/setup/build.js +212 -0
  127. package/dist/cli/commands/setup/build.js.map +1 -0
  128. package/dist/cli/commands/setup/services.d.ts +11 -0
  129. package/dist/cli/commands/setup/services.d.ts.map +1 -0
  130. package/dist/cli/commands/setup/services.js +294 -0
  131. package/dist/cli/commands/setup/services.js.map +1 -0
  132. package/dist/cli/commands/setup/workspace.d.ts +11 -0
  133. package/dist/cli/commands/setup/workspace.d.ts.map +1 -0
  134. package/dist/cli/commands/setup/workspace.js +215 -0
  135. package/dist/cli/commands/setup/workspace.js.map +1 -0
  136. package/dist/cli/commands/setup.d.ts +7 -0
  137. package/dist/cli/commands/setup.d.ts.map +1 -0
  138. package/dist/cli/commands/setup.js +19 -0
  139. package/dist/cli/commands/setup.js.map +1 -0
  140. package/dist/cli/commands/validate.d.ts +10 -0
  141. package/dist/cli/commands/validate.d.ts.map +1 -0
  142. package/dist/cli/commands/validate.js +164 -0
  143. package/dist/cli/commands/validate.js.map +1 -0
  144. package/dist/cli/commands/worker.d.ts +10 -0
  145. package/dist/cli/commands/worker.d.ts.map +1 -0
  146. package/dist/cli/commands/worker.js +224 -0
  147. package/dist/cli/commands/worker.js.map +1 -0
  148. package/dist/cli/index.d.ts +14 -0
  149. package/dist/cli/index.d.ts.map +1 -0
  150. package/dist/cli/index.js +68 -0
  151. package/dist/cli/index.js.map +1 -0
  152. package/dist/cli/utils/config.d.ts +49 -0
  153. package/dist/cli/utils/config.d.ts.map +1 -0
  154. package/dist/cli/utils/config.js +110 -0
  155. package/dist/cli/utils/config.js.map +1 -0
  156. package/dist/cli/utils/exec.d.ts +39 -0
  157. package/dist/cli/utils/exec.d.ts.map +1 -0
  158. package/dist/cli/utils/exec.js +68 -0
  159. package/dist/cli/utils/exec.js.map +1 -0
  160. package/dist/cli/utils/logger.d.ts +47 -0
  161. package/dist/cli/utils/logger.d.ts.map +1 -0
  162. package/dist/cli/utils/logger.js +97 -0
  163. package/dist/cli/utils/logger.js.map +1 -0
  164. package/dist/config/index.d.ts +10 -0
  165. package/dist/config/index.d.ts.map +1 -0
  166. package/dist/config/index.js +13 -0
  167. package/dist/config/index.js.map +1 -0
  168. package/dist/config/loader.d.ts +104 -0
  169. package/dist/config/loader.d.ts.map +1 -0
  170. package/dist/config/loader.js +266 -0
  171. package/dist/config/loader.js.map +1 -0
  172. package/dist/config/schema.d.ts +304 -0
  173. package/dist/config/schema.d.ts.map +1 -0
  174. package/dist/config/schema.js +160 -0
  175. package/dist/config/schema.js.map +1 -0
  176. package/dist/config/validator.d.ts +60 -0
  177. package/dist/config/validator.d.ts.map +1 -0
  178. package/dist/config/validator.js +112 -0
  179. package/dist/config/validator.js.map +1 -0
  180. package/dist/health/server.d.ts +47 -0
  181. package/dist/health/server.d.ts.map +1 -0
  182. package/dist/health/server.js +92 -0
  183. package/dist/health/server.js.map +1 -0
  184. package/dist/index.d.ts +21 -0
  185. package/dist/index.d.ts.map +1 -0
  186. package/dist/index.js +22 -0
  187. package/dist/index.js.map +1 -0
  188. package/dist/orchestrator/async-event-queue.d.ts +28 -0
  189. package/dist/orchestrator/async-event-queue.d.ts.map +1 -0
  190. package/dist/orchestrator/async-event-queue.js +57 -0
  191. package/dist/orchestrator/async-event-queue.js.map +1 -0
  192. package/dist/orchestrator/client.d.ts +110 -0
  193. package/dist/orchestrator/client.d.ts.map +1 -0
  194. package/dist/orchestrator/client.js +288 -0
  195. package/dist/orchestrator/client.js.map +1 -0
  196. package/dist/orchestrator/event-bus.d.ts +195 -0
  197. package/dist/orchestrator/event-bus.d.ts.map +1 -0
  198. package/dist/orchestrator/event-bus.js +557 -0
  199. package/dist/orchestrator/event-bus.js.map +1 -0
  200. package/dist/orchestrator/heartbeat.d.ts +71 -0
  201. package/dist/orchestrator/heartbeat.d.ts.map +1 -0
  202. package/dist/orchestrator/heartbeat.js +116 -0
  203. package/dist/orchestrator/heartbeat.js.map +1 -0
  204. package/dist/orchestrator/index.d.ts +25 -0
  205. package/dist/orchestrator/index.d.ts.map +1 -0
  206. package/dist/orchestrator/index.js +15 -0
  207. package/dist/orchestrator/index.js.map +1 -0
  208. package/dist/orchestrator/job-handler.d.ts +109 -0
  209. package/dist/orchestrator/job-handler.d.ts.map +1 -0
  210. package/dist/orchestrator/job-handler.js +612 -0
  211. package/dist/orchestrator/job-handler.js.map +1 -0
  212. package/dist/orchestrator/job-queue.d.ts +81 -0
  213. package/dist/orchestrator/job-queue.d.ts.map +1 -0
  214. package/dist/orchestrator/job-queue.js +206 -0
  215. package/dist/orchestrator/job-queue.js.map +1 -0
  216. package/dist/orchestrator/label-monitor-bridge.d.ts +25 -0
  217. package/dist/orchestrator/label-monitor-bridge.d.ts.map +1 -0
  218. package/dist/orchestrator/label-monitor-bridge.js +57 -0
  219. package/dist/orchestrator/label-monitor-bridge.js.map +1 -0
  220. package/dist/orchestrator/log-buffer.d.ts +74 -0
  221. package/dist/orchestrator/log-buffer.d.ts.map +1 -0
  222. package/dist/orchestrator/log-buffer.js +104 -0
  223. package/dist/orchestrator/log-buffer.js.map +1 -0
  224. package/dist/orchestrator/redis-job-queue.d.ts +44 -0
  225. package/dist/orchestrator/redis-job-queue.d.ts.map +1 -0
  226. package/dist/orchestrator/redis-job-queue.js +300 -0
  227. package/dist/orchestrator/redis-job-queue.js.map +1 -0
  228. package/dist/orchestrator/router.d.ts +125 -0
  229. package/dist/orchestrator/router.d.ts.map +1 -0
  230. package/dist/orchestrator/router.js +143 -0
  231. package/dist/orchestrator/router.js.map +1 -0
  232. package/dist/orchestrator/server.d.ts +62 -0
  233. package/dist/orchestrator/server.d.ts.map +1 -0
  234. package/dist/orchestrator/server.js +711 -0
  235. package/dist/orchestrator/server.js.map +1 -0
  236. package/dist/orchestrator/types.d.ts +184 -0
  237. package/dist/orchestrator/types.d.ts.map +1 -0
  238. package/dist/orchestrator/types.js +6 -0
  239. package/dist/orchestrator/types.js.map +1 -0
  240. package/dist/orchestrator/worker-registry.d.ts +110 -0
  241. package/dist/orchestrator/worker-registry.d.ts.map +1 -0
  242. package/dist/orchestrator/worker-registry.js +191 -0
  243. package/dist/orchestrator/worker-registry.js.map +1 -0
  244. 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