@supaku/agentfactory 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/deployment/deployment-checker.d.ts +110 -0
  3. package/dist/src/deployment/deployment-checker.d.ts.map +1 -0
  4. package/dist/src/deployment/deployment-checker.js +242 -0
  5. package/dist/src/deployment/index.d.ts +3 -0
  6. package/dist/src/deployment/index.d.ts.map +1 -0
  7. package/dist/src/deployment/index.js +2 -0
  8. package/dist/src/index.d.ts +5 -0
  9. package/dist/src/index.d.ts.map +1 -0
  10. package/dist/src/index.js +4 -0
  11. package/dist/src/logger.d.ts +117 -0
  12. package/dist/src/logger.d.ts.map +1 -0
  13. package/dist/src/logger.js +430 -0
  14. package/dist/src/orchestrator/activity-emitter.d.ts +128 -0
  15. package/dist/src/orchestrator/activity-emitter.d.ts.map +1 -0
  16. package/dist/src/orchestrator/activity-emitter.js +406 -0
  17. package/dist/src/orchestrator/api-activity-emitter.d.ts +167 -0
  18. package/dist/src/orchestrator/api-activity-emitter.d.ts.map +1 -0
  19. package/dist/src/orchestrator/api-activity-emitter.js +469 -0
  20. package/dist/src/orchestrator/heartbeat-writer.d.ts +57 -0
  21. package/dist/src/orchestrator/heartbeat-writer.d.ts.map +1 -0
  22. package/dist/src/orchestrator/heartbeat-writer.js +137 -0
  23. package/dist/src/orchestrator/index.d.ts +20 -0
  24. package/dist/src/orchestrator/index.d.ts.map +1 -0
  25. package/dist/src/orchestrator/index.js +22 -0
  26. package/dist/src/orchestrator/log-analyzer.d.ts +160 -0
  27. package/dist/src/orchestrator/log-analyzer.d.ts.map +1 -0
  28. package/dist/src/orchestrator/log-analyzer.js +572 -0
  29. package/dist/src/orchestrator/log-config.d.ts +39 -0
  30. package/dist/src/orchestrator/log-config.d.ts.map +1 -0
  31. package/dist/src/orchestrator/log-config.js +45 -0
  32. package/dist/src/orchestrator/orchestrator.d.ts +246 -0
  33. package/dist/src/orchestrator/orchestrator.d.ts.map +1 -0
  34. package/dist/src/orchestrator/orchestrator.js +2525 -0
  35. package/dist/src/orchestrator/parse-work-result.d.ts +16 -0
  36. package/dist/src/orchestrator/parse-work-result.d.ts.map +1 -0
  37. package/dist/src/orchestrator/parse-work-result.js +73 -0
  38. package/dist/src/orchestrator/progress-logger.d.ts +72 -0
  39. package/dist/src/orchestrator/progress-logger.d.ts.map +1 -0
  40. package/dist/src/orchestrator/progress-logger.js +135 -0
  41. package/dist/src/orchestrator/session-logger.d.ts +159 -0
  42. package/dist/src/orchestrator/session-logger.d.ts.map +1 -0
  43. package/dist/src/orchestrator/session-logger.js +275 -0
  44. package/dist/src/orchestrator/state-recovery.d.ts +96 -0
  45. package/dist/src/orchestrator/state-recovery.d.ts.map +1 -0
  46. package/dist/src/orchestrator/state-recovery.js +301 -0
  47. package/dist/src/orchestrator/state-types.d.ts +165 -0
  48. package/dist/src/orchestrator/state-types.d.ts.map +1 -0
  49. package/dist/src/orchestrator/state-types.js +7 -0
  50. package/dist/src/orchestrator/stream-parser.d.ts +145 -0
  51. package/dist/src/orchestrator/stream-parser.d.ts.map +1 -0
  52. package/dist/src/orchestrator/stream-parser.js +131 -0
  53. package/dist/src/orchestrator/types.d.ts +205 -0
  54. package/dist/src/orchestrator/types.d.ts.map +1 -0
  55. package/dist/src/orchestrator/types.js +4 -0
  56. package/dist/src/providers/amp-provider.d.ts +20 -0
  57. package/dist/src/providers/amp-provider.d.ts.map +1 -0
  58. package/dist/src/providers/amp-provider.js +24 -0
  59. package/dist/src/providers/claude-provider.d.ts +18 -0
  60. package/dist/src/providers/claude-provider.d.ts.map +1 -0
  61. package/dist/src/providers/claude-provider.js +267 -0
  62. package/dist/src/providers/codex-provider.d.ts +21 -0
  63. package/dist/src/providers/codex-provider.d.ts.map +1 -0
  64. package/dist/src/providers/codex-provider.js +25 -0
  65. package/dist/src/providers/index.d.ts +42 -0
  66. package/dist/src/providers/index.d.ts.map +1 -0
  67. package/dist/src/providers/index.js +77 -0
  68. package/dist/src/providers/types.d.ts +147 -0
  69. package/dist/src/providers/types.d.ts.map +1 -0
  70. package/dist/src/providers/types.js +13 -0
  71. package/package.json +63 -0
@@ -0,0 +1,20 @@
1
+ /**
2
+ * AmpCode (Sourcegraph Amp) Agent Provider (Stub)
3
+ *
4
+ * Will wrap @sourcegraph/amp-sdk to implement the AgentProvider interface.
5
+ * Currently a placeholder — install the SDK and implement when ready.
6
+ *
7
+ * Expected SDK pattern:
8
+ * import { execute } from '@sourcegraph/amp-sdk'
9
+ * const stream = execute({ prompt, cwd, ... })
10
+ * for await (const msg of stream) { ... }
11
+ * // resume: execute({ continue: threadId })
12
+ */
13
+ import type { AgentProvider, AgentSpawnConfig, AgentHandle } from './types';
14
+ export declare class AmpProvider implements AgentProvider {
15
+ readonly name: "amp";
16
+ spawn(_config: AgentSpawnConfig): AgentHandle;
17
+ resume(_sessionId: string, _config: AgentSpawnConfig): AgentHandle;
18
+ }
19
+ export declare function createAmpProvider(): AmpProvider;
20
+ //# sourceMappingURL=amp-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amp-provider.d.ts","sourceRoot":"","sources":["../../../src/providers/amp-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EACZ,MAAM,SAAS,CAAA;AAEhB,qBAAa,WAAY,YAAW,aAAa;IAC/C,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAS;IAE9B,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,WAAW;IAM7C,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,WAAW;CAKnE;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAE/C"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * AmpCode (Sourcegraph Amp) Agent Provider (Stub)
3
+ *
4
+ * Will wrap @sourcegraph/amp-sdk to implement the AgentProvider interface.
5
+ * Currently a placeholder — install the SDK and implement when ready.
6
+ *
7
+ * Expected SDK pattern:
8
+ * import { execute } from '@sourcegraph/amp-sdk'
9
+ * const stream = execute({ prompt, cwd, ... })
10
+ * for await (const msg of stream) { ... }
11
+ * // resume: execute({ continue: threadId })
12
+ */
13
+ export class AmpProvider {
14
+ name = 'amp';
15
+ spawn(_config) {
16
+ throw new Error('Amp provider is not yet implemented. Install @sourcegraph/amp-sdk and implement AmpProvider.');
17
+ }
18
+ resume(_sessionId, _config) {
19
+ throw new Error('Amp provider is not yet implemented. Install @sourcegraph/amp-sdk and implement AmpProvider.');
20
+ }
21
+ }
22
+ export function createAmpProvider() {
23
+ return new AmpProvider();
24
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Claude Agent Provider
3
+ *
4
+ * Wraps @anthropic-ai/claude-agent-sdk to implement the AgentProvider interface.
5
+ * Translates Claude SDK's `query()` and `SDKMessage` stream into normalized AgentEvents.
6
+ */
7
+ import type { AgentProvider, AgentSpawnConfig, AgentHandle } from './types';
8
+ export declare class ClaudeProvider implements AgentProvider {
9
+ readonly name: "claude";
10
+ spawn(config: AgentSpawnConfig): AgentHandle;
11
+ resume(sessionId: string, config: AgentSpawnConfig): AgentHandle;
12
+ private createHandle;
13
+ }
14
+ /**
15
+ * Create a new Claude provider instance
16
+ */
17
+ export declare function createClaudeProvider(): ClaudeProvider;
18
+ //# sourceMappingURL=claude-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-provider.d.ts","sourceRoot":"","sources":["../../../src/providers/claude-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EAEZ,MAAM,SAAS,CAAA;AAEhB,qBAAa,cAAe,YAAW,aAAa;IAClD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAS;IAEjC,KAAK,CAAC,MAAM,EAAE,gBAAgB,GAAG,WAAW;IAI5C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,WAAW;IAIhE,OAAO,CAAC,YAAY;CA2DrB;AAsND;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAErD"}
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Claude Agent Provider
3
+ *
4
+ * Wraps @anthropic-ai/claude-agent-sdk to implement the AgentProvider interface.
5
+ * Translates Claude SDK's `query()` and `SDKMessage` stream into normalized AgentEvents.
6
+ */
7
+ import { spawn } from 'child_process';
8
+ import { query, } from '@anthropic-ai/claude-agent-sdk';
9
+ export class ClaudeProvider {
10
+ name = 'claude';
11
+ spawn(config) {
12
+ return this.createHandle(config);
13
+ }
14
+ resume(sessionId, config) {
15
+ return this.createHandle(config, sessionId);
16
+ }
17
+ createHandle(config, resumeSessionId) {
18
+ const abortController = config.abortController;
19
+ const agentQuery = query({
20
+ prompt: config.prompt,
21
+ options: {
22
+ cwd: config.cwd,
23
+ env: config.env,
24
+ abortController,
25
+ permissionMode: 'acceptEdits',
26
+ disallowedTools: config.autonomous ? ['AskUserQuestion'] : [],
27
+ settingSources: ['project'],
28
+ systemPrompt: { type: 'preset', preset: 'claude_code' },
29
+ resume: resumeSessionId,
30
+ sandbox: config.sandboxEnabled
31
+ ? {
32
+ enabled: true,
33
+ autoAllowBashIfSandboxed: true,
34
+ excludedCommands: ['git', 'gh', 'pnpm', 'npm', 'npx', 'node', 'vercel'],
35
+ network: {
36
+ allowLocalBinding: true,
37
+ allowAllUnixSockets: true,
38
+ allowedDomains: ['*'],
39
+ },
40
+ }
41
+ : { enabled: false },
42
+ spawnClaudeCodeProcess: (spawnOptions) => {
43
+ const nodePath = process.execPath;
44
+ const args = spawnOptions.args || [];
45
+ const child = spawn(nodePath, args, {
46
+ cwd: spawnOptions.cwd,
47
+ env: spawnOptions.env,
48
+ stdio: ['pipe', 'pipe', 'pipe'],
49
+ });
50
+ config.onProcessSpawned?.(child.pid);
51
+ child.on('error', (err) => {
52
+ console.error('[ClaudeProvider] Child process error:', err.message);
53
+ });
54
+ if (spawnOptions.signal) {
55
+ const abortHandler = () => {
56
+ child.kill('SIGTERM');
57
+ };
58
+ spawnOptions.signal.addEventListener('abort', abortHandler);
59
+ child.once('exit', () => {
60
+ spawnOptions.signal.removeEventListener('abort', abortHandler);
61
+ });
62
+ }
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
+ return child;
65
+ },
66
+ },
67
+ });
68
+ return new ClaudeAgentHandle(agentQuery, abortController);
69
+ }
70
+ }
71
+ /**
72
+ * AgentHandle implementation wrapping a Claude SDK Query object.
73
+ */
74
+ class ClaudeAgentHandle {
75
+ sessionId = null;
76
+ agentQuery;
77
+ abortController;
78
+ constructor(agentQuery, abortController) {
79
+ this.agentQuery = agentQuery;
80
+ this.abortController = abortController;
81
+ }
82
+ get stream() {
83
+ return this.createEventStream();
84
+ }
85
+ async injectMessage(text) {
86
+ const sessionId = this.sessionId;
87
+ async function* userMessageGenerator() {
88
+ yield {
89
+ type: 'user',
90
+ message: {
91
+ role: 'user',
92
+ content: text,
93
+ },
94
+ parent_tool_use_id: null,
95
+ session_id: sessionId || '',
96
+ };
97
+ }
98
+ await this.agentQuery.streamInput(userMessageGenerator());
99
+ }
100
+ async stop() {
101
+ this.abortController.abort();
102
+ }
103
+ /**
104
+ * Returns the underlying Query object for direct access if needed.
105
+ * This is an escape hatch — prefer using the AgentHandle interface.
106
+ */
107
+ getRawQuery() {
108
+ return this.agentQuery;
109
+ }
110
+ async *createEventStream() {
111
+ for await (const message of this.agentQuery) {
112
+ const events = this.mapSDKMessage(message);
113
+ for (const event of events) {
114
+ yield event;
115
+ }
116
+ }
117
+ }
118
+ /**
119
+ * Map a single SDKMessage to one or more AgentEvents.
120
+ * Most messages map 1:1, but assistant messages with multiple content blocks
121
+ * may produce multiple events.
122
+ */
123
+ mapSDKMessage(message) {
124
+ switch (message.type) {
125
+ case 'system':
126
+ return this.mapSystemMessage(message);
127
+ case 'user':
128
+ return this.mapUserMessage(message);
129
+ case 'assistant':
130
+ return this.mapAssistantMessage(message);
131
+ case 'result':
132
+ return this.mapResultMessage(message);
133
+ case 'tool_progress':
134
+ return [{
135
+ type: 'tool_progress',
136
+ toolName: message.tool_name,
137
+ elapsedSeconds: message.elapsed_time_seconds,
138
+ raw: message,
139
+ }];
140
+ case 'stream_event':
141
+ // Partial streaming — skip (high frequency, low value for orchestrator)
142
+ return [];
143
+ case 'auth_status':
144
+ if (message.error) {
145
+ return [{
146
+ type: 'error',
147
+ message: message.error,
148
+ raw: message,
149
+ }];
150
+ }
151
+ return [{
152
+ type: 'system',
153
+ subtype: 'auth_status',
154
+ message: message.isAuthenticating ? 'Authenticating...' : 'Authenticated',
155
+ raw: message,
156
+ }];
157
+ default:
158
+ return [{
159
+ type: 'system',
160
+ subtype: 'unknown',
161
+ message: `Unhandled message type: ${message.type}`,
162
+ raw: message,
163
+ }];
164
+ }
165
+ }
166
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
167
+ mapSystemMessage(message) {
168
+ if (message.subtype === 'init') {
169
+ this.sessionId = message.session_id;
170
+ return [{
171
+ type: 'init',
172
+ sessionId: message.session_id,
173
+ raw: message,
174
+ }];
175
+ }
176
+ return [{
177
+ type: 'system',
178
+ subtype: message.subtype ?? 'unknown',
179
+ message: message.status ?? message.message,
180
+ raw: message,
181
+ }];
182
+ }
183
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
184
+ mapUserMessage(message) {
185
+ const events = [];
186
+ if (message.message?.content) {
187
+ for (const block of message.message.content) {
188
+ if (typeof block === 'object' &&
189
+ block !== null &&
190
+ 'type' in block &&
191
+ block.type === 'tool_result' &&
192
+ 'content' in block) {
193
+ events.push({
194
+ type: 'tool_result',
195
+ toolUseId: 'tool_use_id' in block ? String(block.tool_use_id) : undefined,
196
+ content: typeof block.content === 'string' ? block.content : JSON.stringify(block.content),
197
+ isError: 'is_error' in block && block.is_error === true,
198
+ raw: message,
199
+ });
200
+ }
201
+ }
202
+ }
203
+ // If no tool results were extracted, emit as a generic system event
204
+ if (events.length === 0) {
205
+ events.push({
206
+ type: 'system',
207
+ subtype: 'user_message',
208
+ raw: message,
209
+ });
210
+ }
211
+ return events;
212
+ }
213
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
214
+ mapAssistantMessage(message) {
215
+ const events = [];
216
+ if (message.message?.content) {
217
+ for (const block of message.message.content) {
218
+ if (block.type === 'text' && block.text) {
219
+ events.push({
220
+ type: 'assistant_text',
221
+ text: block.text,
222
+ raw: message,
223
+ });
224
+ }
225
+ else if (block.type === 'tool_use') {
226
+ events.push({
227
+ type: 'tool_use',
228
+ toolName: block.name,
229
+ toolUseId: block.id,
230
+ input: block.input,
231
+ raw: message,
232
+ });
233
+ }
234
+ }
235
+ }
236
+ return events;
237
+ }
238
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
239
+ mapResultMessage(message) {
240
+ if (message.subtype === 'success') {
241
+ return [{
242
+ type: 'result',
243
+ success: true,
244
+ message: message.result,
245
+ cost: {
246
+ totalCostUsd: message.total_cost_usd,
247
+ numTurns: message.num_turns,
248
+ },
249
+ raw: message,
250
+ }];
251
+ }
252
+ // Error result
253
+ return [{
254
+ type: 'result',
255
+ success: false,
256
+ errors: 'errors' in message && message.errors ? message.errors : [],
257
+ errorSubtype: message.subtype,
258
+ raw: message,
259
+ }];
260
+ }
261
+ }
262
+ /**
263
+ * Create a new Claude provider instance
264
+ */
265
+ export function createClaudeProvider() {
266
+ return new ClaudeProvider();
267
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * OpenAI Codex Agent Provider (Stub)
3
+ *
4
+ * Will wrap @openai/codex-sdk to implement the AgentProvider interface.
5
+ * Currently a placeholder — install the SDK and implement when ready.
6
+ *
7
+ * Expected SDK pattern:
8
+ * import { Codex } from '@openai/codex-sdk'
9
+ * const codex = new Codex({ apiKey })
10
+ * const thread = codex.startThread()
11
+ * const result = await thread.run(prompt)
12
+ * // or streamed: for await (const event of thread.runStreamed().events) { ... }
13
+ */
14
+ import type { AgentProvider, AgentSpawnConfig, AgentHandle } from './types';
15
+ export declare class CodexProvider implements AgentProvider {
16
+ readonly name: "codex";
17
+ spawn(_config: AgentSpawnConfig): AgentHandle;
18
+ resume(_sessionId: string, _config: AgentSpawnConfig): AgentHandle;
19
+ }
20
+ export declare function createCodexProvider(): CodexProvider;
21
+ //# sourceMappingURL=codex-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-provider.d.ts","sourceRoot":"","sources":["../../../src/providers/codex-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EACZ,MAAM,SAAS,CAAA;AAEhB,qBAAa,aAAc,YAAW,aAAa;IACjD,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAS;IAEhC,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,WAAW;IAM7C,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,WAAW;CAKnE;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CAEnD"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * OpenAI Codex Agent Provider (Stub)
3
+ *
4
+ * Will wrap @openai/codex-sdk to implement the AgentProvider interface.
5
+ * Currently a placeholder — install the SDK and implement when ready.
6
+ *
7
+ * Expected SDK pattern:
8
+ * import { Codex } from '@openai/codex-sdk'
9
+ * const codex = new Codex({ apiKey })
10
+ * const thread = codex.startThread()
11
+ * const result = await thread.run(prompt)
12
+ * // or streamed: for await (const event of thread.runStreamed().events) { ... }
13
+ */
14
+ export class CodexProvider {
15
+ name = 'codex';
16
+ spawn(_config) {
17
+ throw new Error('Codex provider is not yet implemented. Install @openai/codex-sdk and implement CodexProvider.');
18
+ }
19
+ resume(_sessionId, _config) {
20
+ throw new Error('Codex provider is not yet implemented. Install @openai/codex-sdk and implement CodexProvider.');
21
+ }
22
+ }
23
+ export function createCodexProvider() {
24
+ return new CodexProvider();
25
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Agent Provider Factory
3
+ *
4
+ * Creates provider instances based on name.
5
+ * Supports provider selection via env vars:
6
+ * AGENT_PROVIDER=claude (global default)
7
+ * AGENT_PROVIDER_SOCIAL=codex (per-project override)
8
+ * AGENT_PROVIDER_QA=amp (per-work-type override)
9
+ *
10
+ * Resolution order: work-type → project → env default → 'claude'
11
+ */
12
+ export type { AgentProviderName, AgentProvider, AgentSpawnConfig, AgentHandle, AgentEvent } from './types';
13
+ export type { AgentInitEvent, AgentSystemEvent, AgentAssistantTextEvent, AgentToolUseEvent, AgentToolResultEvent, AgentToolProgressEvent, AgentResultEvent, AgentErrorEvent, AgentCostData, } from './types';
14
+ export { ClaudeProvider, createClaudeProvider } from './claude-provider';
15
+ export { CodexProvider, createCodexProvider } from './codex-provider';
16
+ export { AmpProvider, createAmpProvider } from './amp-provider';
17
+ import type { AgentProvider, AgentProviderName } from './types';
18
+ /**
19
+ * Create a provider instance by name.
20
+ *
21
+ * @param name - Provider name ('claude', 'codex', 'amp')
22
+ * @returns AgentProvider instance
23
+ * @throws Error if provider name is unknown
24
+ */
25
+ export declare function createProvider(name: AgentProviderName): AgentProvider;
26
+ /**
27
+ * Resolve which provider to use based on env vars, project, and work type.
28
+ *
29
+ * Resolution order (highest priority first):
30
+ * 1. AGENT_PROVIDER_{WORKTYPE} (e.g., AGENT_PROVIDER_QA=amp)
31
+ * 2. AGENT_PROVIDER_{PROJECT} (e.g., AGENT_PROVIDER_SOCIAL=codex)
32
+ * 3. AGENT_PROVIDER (global default)
33
+ * 4. 'claude' (fallback)
34
+ *
35
+ * @param options - Project and work type context for resolution
36
+ * @returns The resolved provider name
37
+ */
38
+ export declare function resolveProviderName(options?: {
39
+ project?: string;
40
+ workType?: string;
41
+ }): AgentProviderName;
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC1G,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,aAAa,GACd,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAK/D;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAWrE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG,iBAAiB,CA2BpB"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Agent Provider Factory
3
+ *
4
+ * Creates provider instances based on name.
5
+ * Supports provider selection via env vars:
6
+ * AGENT_PROVIDER=claude (global default)
7
+ * AGENT_PROVIDER_SOCIAL=codex (per-project override)
8
+ * AGENT_PROVIDER_QA=amp (per-work-type override)
9
+ *
10
+ * Resolution order: work-type → project → env default → 'claude'
11
+ */
12
+ export { ClaudeProvider, createClaudeProvider } from './claude-provider';
13
+ export { CodexProvider, createCodexProvider } from './codex-provider';
14
+ export { AmpProvider, createAmpProvider } from './amp-provider';
15
+ import { ClaudeProvider } from './claude-provider';
16
+ import { CodexProvider } from './codex-provider';
17
+ import { AmpProvider } from './amp-provider';
18
+ /**
19
+ * Create a provider instance by name.
20
+ *
21
+ * @param name - Provider name ('claude', 'codex', 'amp')
22
+ * @returns AgentProvider instance
23
+ * @throws Error if provider name is unknown
24
+ */
25
+ export function createProvider(name) {
26
+ switch (name) {
27
+ case 'claude':
28
+ return new ClaudeProvider();
29
+ case 'codex':
30
+ return new CodexProvider();
31
+ case 'amp':
32
+ return new AmpProvider();
33
+ default:
34
+ throw new Error(`Unknown agent provider: ${name}. Supported: claude, codex, amp`);
35
+ }
36
+ }
37
+ /**
38
+ * Resolve which provider to use based on env vars, project, and work type.
39
+ *
40
+ * Resolution order (highest priority first):
41
+ * 1. AGENT_PROVIDER_{WORKTYPE} (e.g., AGENT_PROVIDER_QA=amp)
42
+ * 2. AGENT_PROVIDER_{PROJECT} (e.g., AGENT_PROVIDER_SOCIAL=codex)
43
+ * 3. AGENT_PROVIDER (global default)
44
+ * 4. 'claude' (fallback)
45
+ *
46
+ * @param options - Project and work type context for resolution
47
+ * @returns The resolved provider name
48
+ */
49
+ export function resolveProviderName(options) {
50
+ // Check work-type-specific override
51
+ if (options?.workType) {
52
+ const workTypeKey = `AGENT_PROVIDER_${options.workType.toUpperCase().replace(/-/g, '_')}`;
53
+ const workTypeProvider = process.env[workTypeKey];
54
+ if (workTypeProvider && isValidProviderName(workTypeProvider)) {
55
+ return workTypeProvider;
56
+ }
57
+ }
58
+ // Check project-specific override
59
+ if (options?.project) {
60
+ const projectKey = `AGENT_PROVIDER_${options.project.toUpperCase()}`;
61
+ const projectProvider = process.env[projectKey];
62
+ if (projectProvider && isValidProviderName(projectProvider)) {
63
+ return projectProvider;
64
+ }
65
+ }
66
+ // Check global default
67
+ const globalProvider = process.env.AGENT_PROVIDER;
68
+ if (globalProvider && isValidProviderName(globalProvider)) {
69
+ return globalProvider;
70
+ }
71
+ // Fallback
72
+ return 'claude';
73
+ }
74
+ const VALID_PROVIDER_NAMES = ['claude', 'codex', 'amp'];
75
+ function isValidProviderName(name) {
76
+ return VALID_PROVIDER_NAMES.includes(name);
77
+ }
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Agent Provider Interface
3
+ *
4
+ * Abstracts the underlying agent SDK (Claude, Codex, Amp, etc.)
5
+ * so the orchestrator is provider-agnostic.
6
+ *
7
+ * All three providers follow the same pattern:
8
+ * 1. Initialize with config + working directory
9
+ * 2. Send a prompt
10
+ * 3. Iterate over a stream of events
11
+ * 4. Get a final result with cost/token data
12
+ */
13
+ /** Supported agent provider names */
14
+ export type AgentProviderName = 'claude' | 'codex' | 'amp';
15
+ /**
16
+ * Agent Provider
17
+ *
18
+ * Each provider implements spawn/resume to create an AgentHandle
19
+ * that streams normalized AgentEvents.
20
+ */
21
+ export interface AgentProvider {
22
+ /** Provider identifier */
23
+ readonly name: AgentProviderName;
24
+ /** Spawn a new agent session */
25
+ spawn(config: AgentSpawnConfig): AgentHandle;
26
+ /** Resume a previously interrupted session */
27
+ resume(sessionId: string, config: AgentSpawnConfig): AgentHandle;
28
+ }
29
+ /**
30
+ * Configuration passed to a provider when spawning an agent.
31
+ * Provider implementations translate these to SDK-specific options.
32
+ */
33
+ export interface AgentSpawnConfig {
34
+ /** The prompt/instruction for the agent */
35
+ prompt: string;
36
+ /** Working directory for the agent */
37
+ cwd: string;
38
+ /** Environment variables to pass to the agent process */
39
+ env: Record<string, string>;
40
+ /** AbortController for cancellation support */
41
+ abortController: AbortController;
42
+ /** Whether agent runs in autonomous mode (no user input) */
43
+ autonomous: boolean;
44
+ /** Sandbox level for filesystem/network restrictions */
45
+ sandboxEnabled: boolean;
46
+ /**
47
+ * Callback to capture PID when the agent process is spawned.
48
+ * Providers call this once the underlying process is created.
49
+ */
50
+ onProcessSpawned?: (pid: number | undefined) => void;
51
+ }
52
+ /**
53
+ * Handle to a running agent session.
54
+ * Returned by AgentProvider.spawn() and AgentProvider.resume().
55
+ */
56
+ export interface AgentHandle {
57
+ /** Provider-specific session/thread ID (available after init event) */
58
+ sessionId: string | null;
59
+ /** Async iterable stream of normalized events */
60
+ stream: AsyncIterable<AgentEvent>;
61
+ /**
62
+ * Inject a follow-up user message into the running session.
63
+ * Used for user prompts without restarting the agent.
64
+ */
65
+ injectMessage(text: string): Promise<void>;
66
+ /**
67
+ * Stop the agent. Delegates to the provider's abort mechanism.
68
+ */
69
+ stop(): Promise<void>;
70
+ }
71
+ /**
72
+ * Normalized agent event.
73
+ * Each provider maps its native events to this common format.
74
+ */
75
+ export type AgentEvent = AgentInitEvent | AgentSystemEvent | AgentAssistantTextEvent | AgentToolUseEvent | AgentToolResultEvent | AgentToolProgressEvent | AgentResultEvent | AgentErrorEvent;
76
+ /** Agent initialized — contains session ID for resume */
77
+ export interface AgentInitEvent {
78
+ type: 'init';
79
+ sessionId: string;
80
+ raw: unknown;
81
+ }
82
+ /** System-level event (status changes, compaction, etc.) */
83
+ export interface AgentSystemEvent {
84
+ type: 'system';
85
+ subtype: string;
86
+ message?: string;
87
+ raw: unknown;
88
+ }
89
+ /** Assistant text output */
90
+ export interface AgentAssistantTextEvent {
91
+ type: 'assistant_text';
92
+ text: string;
93
+ raw: unknown;
94
+ }
95
+ /** Agent is invoking a tool */
96
+ export interface AgentToolUseEvent {
97
+ type: 'tool_use';
98
+ toolName: string;
99
+ toolUseId?: string;
100
+ input: Record<string, unknown>;
101
+ raw: unknown;
102
+ }
103
+ /** Tool execution result */
104
+ export interface AgentToolResultEvent {
105
+ type: 'tool_result';
106
+ toolName?: string;
107
+ toolUseId?: string;
108
+ content: string;
109
+ isError: boolean;
110
+ raw: unknown;
111
+ }
112
+ /** Tool execution progress update */
113
+ export interface AgentToolProgressEvent {
114
+ type: 'tool_progress';
115
+ toolName: string;
116
+ elapsedSeconds: number;
117
+ raw: unknown;
118
+ }
119
+ /** Final result — agent has finished */
120
+ export interface AgentResultEvent {
121
+ type: 'result';
122
+ success: boolean;
123
+ /** Completion message (only on success) */
124
+ message?: string;
125
+ /** Error messages (only on failure) */
126
+ errors?: string[];
127
+ /** Error subtype from the provider (e.g., 'error_during_execution', 'error_max_turns') */
128
+ errorSubtype?: string;
129
+ /** Cost/usage data */
130
+ cost?: AgentCostData;
131
+ raw: unknown;
132
+ }
133
+ /** Error event */
134
+ export interface AgentErrorEvent {
135
+ type: 'error';
136
+ message: string;
137
+ code?: string;
138
+ raw: unknown;
139
+ }
140
+ /** Cost and token usage data */
141
+ export interface AgentCostData {
142
+ inputTokens?: number;
143
+ outputTokens?: number;
144
+ totalCostUsd?: number;
145
+ numTurns?: number;
146
+ }
147
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/types.ts"],"names":[],"mappings":"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"}