@renseiai/agentfactory 0.8.2 → 0.8.4

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 (33) hide show
  1. package/dist/src/config/index.d.ts +2 -2
  2. package/dist/src/config/index.d.ts.map +1 -1
  3. package/dist/src/config/index.js +1 -1
  4. package/dist/src/config/repository-config.d.ts +92 -1
  5. package/dist/src/config/repository-config.d.ts.map +1 -1
  6. package/dist/src/config/repository-config.js +80 -2
  7. package/dist/src/config/repository-config.test.js +303 -2
  8. package/dist/src/orchestrator/detect-work-type.test.d.ts +2 -0
  9. package/dist/src/orchestrator/detect-work-type.test.d.ts.map +1 -0
  10. package/dist/src/orchestrator/detect-work-type.test.js +62 -0
  11. package/dist/src/orchestrator/heartbeat-writer.test.d.ts +2 -0
  12. package/dist/src/orchestrator/heartbeat-writer.test.d.ts.map +1 -0
  13. package/dist/src/orchestrator/heartbeat-writer.test.js +139 -0
  14. package/dist/src/orchestrator/orchestrator-utils.test.d.ts +2 -0
  15. package/dist/src/orchestrator/orchestrator-utils.test.d.ts.map +1 -0
  16. package/dist/src/orchestrator/orchestrator-utils.test.js +41 -0
  17. package/dist/src/orchestrator/orchestrator.d.ts +26 -0
  18. package/dist/src/orchestrator/orchestrator.d.ts.map +1 -1
  19. package/dist/src/orchestrator/orchestrator.js +111 -51
  20. package/dist/src/orchestrator/state-recovery.test.d.ts +2 -0
  21. package/dist/src/orchestrator/state-recovery.test.d.ts.map +1 -0
  22. package/dist/src/orchestrator/state-recovery.test.js +425 -0
  23. package/dist/src/orchestrator/types.d.ts +11 -1
  24. package/dist/src/orchestrator/types.d.ts.map +1 -1
  25. package/dist/src/providers/claude-provider.d.ts.map +1 -1
  26. package/dist/src/providers/claude-provider.js +6 -0
  27. package/dist/src/providers/index.d.ts +71 -15
  28. package/dist/src/providers/index.d.ts.map +1 -1
  29. package/dist/src/providers/index.js +156 -28
  30. package/dist/src/providers/index.test.d.ts +2 -0
  31. package/dist/src/providers/index.test.d.ts.map +1 -0
  32. package/dist/src/providers/index.test.js +225 -0
  33. package/package.json +3 -3
@@ -0,0 +1,425 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ vi.mock('fs', () => ({
3
+ existsSync: vi.fn(),
4
+ readFileSync: vi.fn(),
5
+ writeFileSync: vi.fn(),
6
+ mkdirSync: vi.fn(),
7
+ }));
8
+ import { existsSync, readFileSync } from 'fs';
9
+ import { resolve } from 'path';
10
+ import { getAgentDir, getStatePath, getHeartbeatPath, getTodosPath, isHeartbeatFresh, readWorktreeState, readHeartbeat, checkRecovery, createInitialState, buildRecoveryPrompt, getHeartbeatTimeoutFromEnv, getMaxRecoveryAttemptsFromEnv, } from './state-recovery.js';
11
+ const WORKTREE = '/tmp/test-worktree';
12
+ function makeState(overrides = {}) {
13
+ return {
14
+ issueId: 'uuid-123',
15
+ issueIdentifier: 'SUP-42',
16
+ linearSessionId: 'session-1',
17
+ providerSessionId: null,
18
+ workType: 'development',
19
+ prompt: 'Fix the bug',
20
+ startedAt: 1000,
21
+ status: 'running',
22
+ currentPhase: null,
23
+ lastUpdatedAt: 2000,
24
+ recoveryAttempts: 0,
25
+ workerId: null,
26
+ pid: 1234,
27
+ taskListId: 'SUP-42-DEV',
28
+ ...overrides,
29
+ };
30
+ }
31
+ function makeHeartbeat(overrides = {}) {
32
+ return {
33
+ timestamp: Date.now(),
34
+ pid: 1234,
35
+ memoryUsageMB: 128,
36
+ uptime: 60,
37
+ lastActivityType: 'tool_use',
38
+ lastActivityTimestamp: Date.now(),
39
+ toolCallsCount: 10,
40
+ currentOperation: null,
41
+ ...overrides,
42
+ };
43
+ }
44
+ beforeEach(() => {
45
+ vi.clearAllMocks();
46
+ });
47
+ describe('getAgentDir', () => {
48
+ it('returns .agent directory under worktree path', () => {
49
+ expect(getAgentDir(WORKTREE)).toBe(resolve(WORKTREE, '.agent'));
50
+ });
51
+ });
52
+ describe('getStatePath', () => {
53
+ it('returns state.json path under .agent directory', () => {
54
+ expect(getStatePath(WORKTREE)).toBe(resolve(WORKTREE, '.agent', 'state.json'));
55
+ });
56
+ });
57
+ describe('getHeartbeatPath', () => {
58
+ it('returns heartbeat.json path under .agent directory', () => {
59
+ expect(getHeartbeatPath(WORKTREE)).toBe(resolve(WORKTREE, '.agent', 'heartbeat.json'));
60
+ });
61
+ });
62
+ describe('getTodosPath', () => {
63
+ it('returns todos.json path under .agent directory', () => {
64
+ expect(getTodosPath(WORKTREE)).toBe(resolve(WORKTREE, '.agent', 'todos.json'));
65
+ });
66
+ });
67
+ describe('isHeartbeatFresh', () => {
68
+ it('returns false for null heartbeat', () => {
69
+ expect(isHeartbeatFresh(null)).toBe(false);
70
+ });
71
+ it('returns true when heartbeat is within timeout', () => {
72
+ const heartbeat = makeHeartbeat({ timestamp: Date.now() - 1000 });
73
+ expect(isHeartbeatFresh(heartbeat, 30000)).toBe(true);
74
+ });
75
+ it('returns false when heartbeat is older than timeout', () => {
76
+ const heartbeat = makeHeartbeat({ timestamp: Date.now() - 60000 });
77
+ expect(isHeartbeatFresh(heartbeat, 30000)).toBe(false);
78
+ });
79
+ it('uses default timeout of 30000ms when not specified', () => {
80
+ const fresh = makeHeartbeat({ timestamp: Date.now() - 10000 });
81
+ const stale = makeHeartbeat({ timestamp: Date.now() - 31000 });
82
+ expect(isHeartbeatFresh(fresh)).toBe(true);
83
+ expect(isHeartbeatFresh(stale)).toBe(false);
84
+ });
85
+ });
86
+ describe('readWorktreeState', () => {
87
+ it('returns parsed state when file exists', () => {
88
+ const state = makeState();
89
+ vi.mocked(existsSync).mockReturnValue(true);
90
+ vi.mocked(readFileSync).mockReturnValue(JSON.stringify(state));
91
+ const result = readWorktreeState(WORKTREE);
92
+ expect(result).toEqual(state);
93
+ expect(existsSync).toHaveBeenCalledWith(getStatePath(WORKTREE));
94
+ });
95
+ it('returns null when file does not exist', () => {
96
+ vi.mocked(existsSync).mockReturnValue(false);
97
+ expect(readWorktreeState(WORKTREE)).toBeNull();
98
+ });
99
+ it('returns null when file contains invalid JSON', () => {
100
+ vi.mocked(existsSync).mockReturnValue(true);
101
+ vi.mocked(readFileSync).mockReturnValue('not json');
102
+ expect(readWorktreeState(WORKTREE)).toBeNull();
103
+ });
104
+ });
105
+ describe('readHeartbeat', () => {
106
+ it('returns parsed heartbeat when file exists', () => {
107
+ const heartbeat = makeHeartbeat();
108
+ vi.mocked(existsSync).mockReturnValue(true);
109
+ vi.mocked(readFileSync).mockReturnValue(JSON.stringify(heartbeat));
110
+ const result = readHeartbeat(WORKTREE);
111
+ expect(result).toEqual(heartbeat);
112
+ expect(existsSync).toHaveBeenCalledWith(getHeartbeatPath(WORKTREE));
113
+ });
114
+ it('returns null when file does not exist', () => {
115
+ vi.mocked(existsSync).mockReturnValue(false);
116
+ expect(readHeartbeat(WORKTREE)).toBeNull();
117
+ });
118
+ });
119
+ describe('checkRecovery', () => {
120
+ it('returns no_state when .agent directory does not exist', () => {
121
+ vi.mocked(existsSync).mockReturnValue(false);
122
+ const result = checkRecovery(WORKTREE);
123
+ expect(result.canRecover).toBe(false);
124
+ expect(result.agentAlive).toBe(false);
125
+ expect(result.reason).toBe('no_state');
126
+ expect(result.message).toContain('No .agent directory');
127
+ });
128
+ it('returns no_state when state.json does not exist', () => {
129
+ // .agent dir exists, but state.json does not
130
+ vi.mocked(existsSync).mockImplementation((path) => {
131
+ if (String(path).endsWith('.agent'))
132
+ return true;
133
+ return false;
134
+ });
135
+ const result = checkRecovery(WORKTREE);
136
+ expect(result.canRecover).toBe(false);
137
+ expect(result.reason).toBe('no_state');
138
+ expect(result.message).toContain('No state.json');
139
+ });
140
+ it('returns invalid_state when issueId is missing', () => {
141
+ const state = makeState({ issueId: '' });
142
+ vi.mocked(existsSync).mockReturnValue(true);
143
+ vi.mocked(readFileSync).mockReturnValue(JSON.stringify(state));
144
+ const result = checkRecovery(WORKTREE);
145
+ expect(result.canRecover).toBe(false);
146
+ expect(result.reason).toBe('invalid_state');
147
+ expect(result.state).toEqual(state);
148
+ });
149
+ it('returns invalid_state when issueIdentifier is missing', () => {
150
+ const state = makeState({ issueIdentifier: '' });
151
+ vi.mocked(existsSync).mockReturnValue(true);
152
+ vi.mocked(readFileSync).mockReturnValue(JSON.stringify(state));
153
+ const result = checkRecovery(WORKTREE);
154
+ expect(result.canRecover).toBe(false);
155
+ expect(result.reason).toBe('invalid_state');
156
+ });
157
+ it('returns agent_alive when heartbeat is fresh', () => {
158
+ const state = makeState();
159
+ const heartbeat = makeHeartbeat({ timestamp: Date.now(), pid: 9999 });
160
+ vi.mocked(existsSync).mockReturnValue(true);
161
+ vi.mocked(readFileSync).mockImplementation((path) => {
162
+ if (String(path).includes('heartbeat'))
163
+ return JSON.stringify(heartbeat);
164
+ return JSON.stringify(state);
165
+ });
166
+ const result = checkRecovery(WORKTREE);
167
+ expect(result.canRecover).toBe(false);
168
+ expect(result.agentAlive).toBe(true);
169
+ expect(result.reason).toBe('agent_alive');
170
+ expect(result.message).toContain('PID: 9999');
171
+ });
172
+ it('returns max_attempts when recovery attempts exhausted', () => {
173
+ const state = makeState({ recoveryAttempts: 3 });
174
+ const heartbeat = makeHeartbeat({ timestamp: Date.now() - 60000 });
175
+ vi.mocked(existsSync).mockReturnValue(true);
176
+ vi.mocked(readFileSync).mockImplementation((path) => {
177
+ if (String(path).includes('heartbeat'))
178
+ return JSON.stringify(heartbeat);
179
+ return JSON.stringify(state);
180
+ });
181
+ const result = checkRecovery(WORKTREE);
182
+ expect(result.canRecover).toBe(false);
183
+ expect(result.reason).toBe('max_attempts');
184
+ expect(result.message).toContain('3/3');
185
+ });
186
+ it('respects custom maxRecoveryAttempts', () => {
187
+ const state = makeState({ recoveryAttempts: 1 });
188
+ const heartbeat = makeHeartbeat({ timestamp: Date.now() - 60000 });
189
+ vi.mocked(existsSync).mockReturnValue(true);
190
+ vi.mocked(readFileSync).mockImplementation((path) => {
191
+ if (String(path).includes('heartbeat'))
192
+ return JSON.stringify(heartbeat);
193
+ return JSON.stringify(state);
194
+ });
195
+ const result = checkRecovery(WORKTREE, { maxRecoveryAttempts: 1 });
196
+ expect(result.canRecover).toBe(false);
197
+ expect(result.reason).toBe('max_attempts');
198
+ });
199
+ it('returns recoverable when state is valid and agent is not alive', () => {
200
+ const state = makeState({ recoveryAttempts: 0 });
201
+ const heartbeat = makeHeartbeat({ timestamp: Date.now() - 60000 });
202
+ vi.mocked(existsSync).mockImplementation((path) => {
203
+ // todos.json does not exist
204
+ if (String(path).includes('todos'))
205
+ return false;
206
+ return true;
207
+ });
208
+ vi.mocked(readFileSync).mockImplementation((path) => {
209
+ if (String(path).includes('heartbeat'))
210
+ return JSON.stringify(heartbeat);
211
+ return JSON.stringify(state);
212
+ });
213
+ const result = checkRecovery(WORKTREE);
214
+ expect(result.canRecover).toBe(true);
215
+ expect(result.agentAlive).toBe(false);
216
+ expect(result.state).toEqual(state);
217
+ expect(result.message).toContain('Recovery possible');
218
+ expect(result.message).toContain('1/3');
219
+ });
220
+ it('includes todos when present in recoverable result', () => {
221
+ const state = makeState({ recoveryAttempts: 1 });
222
+ const heartbeat = makeHeartbeat({ timestamp: Date.now() - 60000 });
223
+ const todos = {
224
+ updatedAt: Date.now(),
225
+ items: [{ content: 'Fix tests', status: 'pending', activeForm: 'Fixing tests' }],
226
+ };
227
+ vi.mocked(existsSync).mockReturnValue(true);
228
+ vi.mocked(readFileSync).mockImplementation((path) => {
229
+ if (String(path).includes('heartbeat'))
230
+ return JSON.stringify(heartbeat);
231
+ if (String(path).includes('todos'))
232
+ return JSON.stringify(todos);
233
+ return JSON.stringify(state);
234
+ });
235
+ const result = checkRecovery(WORKTREE);
236
+ expect(result.canRecover).toBe(true);
237
+ expect(result.todos).toEqual(todos);
238
+ expect(result.message).toContain('2/3');
239
+ });
240
+ });
241
+ describe('createInitialState', () => {
242
+ it('creates state with all required fields', () => {
243
+ const before = Date.now();
244
+ const state = createInitialState({
245
+ issueId: 'uuid-1',
246
+ issueIdentifier: 'SUP-10',
247
+ linearSessionId: 'sess-1',
248
+ workType: 'development',
249
+ prompt: 'Do the thing',
250
+ });
251
+ const after = Date.now();
252
+ expect(state.issueId).toBe('uuid-1');
253
+ expect(state.issueIdentifier).toBe('SUP-10');
254
+ expect(state.linearSessionId).toBe('sess-1');
255
+ expect(state.providerSessionId).toBeNull();
256
+ expect(state.workType).toBe('development');
257
+ expect(state.prompt).toBe('Do the thing');
258
+ expect(state.startedAt).toBeGreaterThanOrEqual(before);
259
+ expect(state.startedAt).toBeLessThanOrEqual(after);
260
+ expect(state.status).toBe('initializing');
261
+ expect(state.currentPhase).toBeNull();
262
+ expect(state.lastUpdatedAt).toBe(state.startedAt);
263
+ expect(state.recoveryAttempts).toBe(0);
264
+ expect(state.workerId).toBeNull();
265
+ expect(state.pid).toBeNull();
266
+ expect(state.taskListId).toBe('SUP-10-DEV');
267
+ });
268
+ it('sets workerId and pid when provided', () => {
269
+ const state = createInitialState({
270
+ issueId: 'uuid-2',
271
+ issueIdentifier: 'SUP-20',
272
+ linearSessionId: null,
273
+ workType: 'qa',
274
+ prompt: 'Run QA',
275
+ workerId: 'worker-1',
276
+ pid: 5678,
277
+ });
278
+ expect(state.workerId).toBe('worker-1');
279
+ expect(state.pid).toBe(5678);
280
+ expect(state.taskListId).toBe('SUP-20-QA');
281
+ });
282
+ it('generates correct taskListId for different work types', () => {
283
+ const cases = [
284
+ ['research', 'RES'],
285
+ ['backlog-creation', 'BC'],
286
+ ['development', 'DEV'],
287
+ ['coordination', 'COORD'],
288
+ ['qa', 'QA'],
289
+ ['acceptance', 'AC'],
290
+ ['refinement', 'REF'],
291
+ ];
292
+ for (const [workType, suffix] of cases) {
293
+ const state = createInitialState({
294
+ issueId: 'id',
295
+ issueIdentifier: 'X-1',
296
+ linearSessionId: null,
297
+ workType: workType,
298
+ prompt: 'test',
299
+ });
300
+ expect(state.taskListId).toBe(`X-1-${suffix}`);
301
+ }
302
+ });
303
+ });
304
+ describe('buildRecoveryPrompt', () => {
305
+ it('includes issue identifier and work type', () => {
306
+ const state = makeState();
307
+ const prompt = buildRecoveryPrompt(state);
308
+ expect(prompt).toContain('SUP-42');
309
+ expect(prompt).toContain('development');
310
+ });
311
+ it('includes recovery attempt number', () => {
312
+ const state = makeState({ recoveryAttempts: 2 });
313
+ const prompt = buildRecoveryPrompt(state);
314
+ expect(prompt).toContain('Recovery attempt: 3');
315
+ });
316
+ it('includes current phase when present', () => {
317
+ const state = makeState({ currentPhase: 'testing' });
318
+ const prompt = buildRecoveryPrompt(state);
319
+ expect(prompt).toContain('Last phase: testing');
320
+ });
321
+ it('omits phase line when currentPhase is null', () => {
322
+ const state = makeState({ currentPhase: null });
323
+ const prompt = buildRecoveryPrompt(state);
324
+ expect(prompt).not.toContain('Last phase:');
325
+ });
326
+ it('includes original prompt', () => {
327
+ const state = makeState({ prompt: 'Implement feature X' });
328
+ const prompt = buildRecoveryPrompt(state);
329
+ expect(prompt).toContain('Original prompt: Implement feature X');
330
+ });
331
+ it('includes task list ID', () => {
332
+ const state = makeState();
333
+ const prompt = buildRecoveryPrompt(state);
334
+ expect(prompt).toContain('Task list ID: SUP-42-DEV');
335
+ });
336
+ it('includes todos when provided', () => {
337
+ const state = makeState();
338
+ const todos = {
339
+ updatedAt: Date.now(),
340
+ items: [
341
+ { content: 'Write tests', status: 'completed', activeForm: 'Writing tests' },
342
+ { content: 'Update docs', status: 'in_progress', activeForm: 'Updating docs' },
343
+ { content: 'Deploy', status: 'pending', activeForm: 'Deploying' },
344
+ ],
345
+ };
346
+ const prompt = buildRecoveryPrompt(state, todos);
347
+ expect(prompt).toContain('PREVIOUS TODO LIST');
348
+ expect(prompt).toContain('[completed] Write tests');
349
+ expect(prompt).toContain('[in_progress] Update docs');
350
+ expect(prompt).toContain('[pending] Deploy');
351
+ });
352
+ it('omits todo section when todos is undefined', () => {
353
+ const state = makeState();
354
+ const prompt = buildRecoveryPrompt(state);
355
+ expect(prompt).not.toContain('PREVIOUS TODO LIST');
356
+ });
357
+ it('omits todo section when todos has no items', () => {
358
+ const state = makeState();
359
+ const todos = { updatedAt: Date.now(), items: [] };
360
+ const prompt = buildRecoveryPrompt(state, todos);
361
+ expect(prompt).not.toContain('PREVIOUS TODO LIST');
362
+ });
363
+ });
364
+ describe('getHeartbeatTimeoutFromEnv', () => {
365
+ const originalEnv = process.env.AGENT_HEARTBEAT_TIMEOUT_MS;
366
+ afterEach(() => {
367
+ if (originalEnv === undefined) {
368
+ delete process.env.AGENT_HEARTBEAT_TIMEOUT_MS;
369
+ }
370
+ else {
371
+ process.env.AGENT_HEARTBEAT_TIMEOUT_MS = originalEnv;
372
+ }
373
+ });
374
+ it('returns default 30000 when env var is not set', () => {
375
+ delete process.env.AGENT_HEARTBEAT_TIMEOUT_MS;
376
+ expect(getHeartbeatTimeoutFromEnv()).toBe(30000);
377
+ });
378
+ it('parses valid integer from env var', () => {
379
+ process.env.AGENT_HEARTBEAT_TIMEOUT_MS = '60000';
380
+ expect(getHeartbeatTimeoutFromEnv()).toBe(60000);
381
+ });
382
+ it('returns default for non-numeric env var', () => {
383
+ process.env.AGENT_HEARTBEAT_TIMEOUT_MS = 'abc';
384
+ expect(getHeartbeatTimeoutFromEnv()).toBe(30000);
385
+ });
386
+ it('returns default for zero value', () => {
387
+ process.env.AGENT_HEARTBEAT_TIMEOUT_MS = '0';
388
+ expect(getHeartbeatTimeoutFromEnv()).toBe(30000);
389
+ });
390
+ it('returns default for negative value', () => {
391
+ process.env.AGENT_HEARTBEAT_TIMEOUT_MS = '-5000';
392
+ expect(getHeartbeatTimeoutFromEnv()).toBe(30000);
393
+ });
394
+ });
395
+ describe('getMaxRecoveryAttemptsFromEnv', () => {
396
+ const originalEnv = process.env.AGENT_MAX_RECOVERY_ATTEMPTS;
397
+ afterEach(() => {
398
+ if (originalEnv === undefined) {
399
+ delete process.env.AGENT_MAX_RECOVERY_ATTEMPTS;
400
+ }
401
+ else {
402
+ process.env.AGENT_MAX_RECOVERY_ATTEMPTS = originalEnv;
403
+ }
404
+ });
405
+ it('returns default 3 when env var is not set', () => {
406
+ delete process.env.AGENT_MAX_RECOVERY_ATTEMPTS;
407
+ expect(getMaxRecoveryAttemptsFromEnv()).toBe(3);
408
+ });
409
+ it('parses valid integer from env var', () => {
410
+ process.env.AGENT_MAX_RECOVERY_ATTEMPTS = '5';
411
+ expect(getMaxRecoveryAttemptsFromEnv()).toBe(5);
412
+ });
413
+ it('returns default for non-numeric env var', () => {
414
+ process.env.AGENT_MAX_RECOVERY_ATTEMPTS = 'xyz';
415
+ expect(getMaxRecoveryAttemptsFromEnv()).toBe(3);
416
+ });
417
+ it('returns default for zero value', () => {
418
+ process.env.AGENT_MAX_RECOVERY_ATTEMPTS = '0';
419
+ expect(getMaxRecoveryAttemptsFromEnv()).toBe(3);
420
+ });
421
+ it('returns default for negative value', () => {
422
+ process.env.AGENT_MAX_RECOVERY_ATTEMPTS = '-1';
423
+ expect(getMaxRecoveryAttemptsFromEnv()).toBe(3);
424
+ });
425
+ });
@@ -2,7 +2,7 @@
2
2
  * Agent Orchestrator Types
3
3
  */
4
4
  import type { AgentWorkType } from '@renseiai/agentfactory-linear';
5
- import type { AgentProvider } from '../providers/types.js';
5
+ import type { AgentProvider, AgentProviderName } from '../providers/types.js';
6
6
  /**
7
7
  * Result of parsing an agent's output to determine pass/fail
8
8
  * Used for QA and acceptance work types to decide status transitions
@@ -137,6 +137,8 @@ export interface AgentProcess {
137
137
  stopReason?: 'user_request' | 'timeout';
138
138
  /** Last activity timestamp for inactivity timeout tracking */
139
139
  lastActivityAt: Date;
140
+ /** Provider name used to spawn this agent */
141
+ providerName?: AgentProviderName;
140
142
  /** Total cost in USD (accumulated from provider result events) */
141
143
  totalCostUsd?: number;
142
144
  /** Total input tokens used */
@@ -175,6 +177,10 @@ export interface SpawnAgentOptions {
175
177
  teamName?: string;
176
178
  /** Project name for path scoping in monorepos */
177
179
  projectName?: string;
180
+ /** Issue labels (used for provider resolution via "provider:<name>" labels) */
181
+ labels?: string[];
182
+ /** Mention/prompt context text (used for provider resolution via "use <provider>" patterns) */
183
+ mentionContext?: string;
178
184
  }
179
185
  export interface OrchestratorStreamConfig {
180
186
  /** Minimum interval between activities in ms (default: 500ms) */
@@ -228,5 +234,9 @@ export interface SpawnAgentWithResumeOptions {
228
234
  teamName?: string;
229
235
  /** Project name for path scoping in monorepos */
230
236
  projectName?: string;
237
+ /** Issue labels (used for provider resolution via "provider:<name>" labels) */
238
+ labels?: string[];
239
+ /** Mention/prompt context text (used for provider resolution via "use <provider>" patterns) */
240
+ mentionContext?: string;
231
241
  }
232
242
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"claude-provider.d.ts","sourceRoot":"","sources":["../../../src/providers/claude-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EAEZ,MAAM,YAAY,CAAA;AA0EnB,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;CAsKrB;AAsND;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAErD"}
1
+ {"version":3,"file":"claude-provider.d.ts","sourceRoot":"","sources":["../../../src/providers/claude-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EAEZ,MAAM,YAAY,CAAA;AA0EnB,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;CA4KrB;AAsND;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAErD"}
@@ -137,6 +137,12 @@ export class ClaudeProvider {
137
137
  'Bash(cargo:*)',
138
138
  'Bash(rustc:*)',
139
139
  'Bash(go:*)',
140
+ // iOS/Apple development tools
141
+ 'Bash(xcodebuild:*)',
142
+ 'Bash(xcrun:*)',
143
+ 'Bash(xcodegen:*)',
144
+ 'Bash(swift:*)',
145
+ 'Bash(swiftlint:*)',
140
146
  'Bash(bash:*)',
141
147
  'Bash(sh:*)',
142
148
  'Bash(./:*)',
@@ -2,12 +2,18 @@
2
2
  * Agent Provider Factory
3
3
  *
4
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)
5
+ * Supports provider selection via env vars, config, labels, and mentions.
9
6
  *
10
- * Resolution order: work-typeproject → env default → 'claude'
7
+ * Resolution order (highestlowest):
8
+ * 1. Issue label override (provider:codex)
9
+ * 2. Mention context override ("use codex", "@codex")
10
+ * 3. Config providers.byWorkType
11
+ * 4. Config providers.byProject
12
+ * 5. Env var AGENT_PROVIDER_{WORKTYPE}
13
+ * 6. Env var AGENT_PROVIDER_{PROJECT}
14
+ * 7. Config providers.default
15
+ * 8. Env var AGENT_PROVIDER
16
+ * 9. Hardcoded 'claude'
11
17
  */
12
18
  export type { AgentProviderName, AgentProvider, AgentSpawnConfig, AgentHandle, AgentEvent } from './types.js';
13
19
  export type { AgentInitEvent, AgentSystemEvent, AgentAssistantTextEvent, AgentToolUseEvent, AgentToolResultEvent, AgentToolProgressEvent, AgentResultEvent, AgentErrorEvent, AgentCostData, } from './types.js';
@@ -17,6 +23,34 @@ export { AmpProvider, createAmpProvider } from './amp-provider.js';
17
23
  export { SpringAiProvider, createSpringAiProvider } from './spring-ai-provider.js';
18
24
  export { A2aProvider, createA2aProvider } from './a2a-provider.js';
19
25
  import type { AgentProvider, AgentProviderName } from './types.js';
26
+ /** Provider configuration from .agentfactory/config.yaml */
27
+ export interface ProvidersConfig {
28
+ /** Default provider for all agents */
29
+ default?: AgentProviderName;
30
+ /** Provider overrides by work type (e.g., { qa: 'codex' }) */
31
+ byWorkType?: Record<string, AgentProviderName>;
32
+ /** Provider overrides by project name (e.g., { Social: 'codex' }) */
33
+ byProject?: Record<string, AgentProviderName>;
34
+ }
35
+ /** Context for resolving which provider to use for a specific spawn */
36
+ export interface ProviderResolutionContext {
37
+ /** Project name (e.g., "Social") */
38
+ project?: string;
39
+ /** Work type (e.g., "qa", "development") */
40
+ workType?: string;
41
+ /** Issue labels (scanned for "provider:<name>") */
42
+ labels?: string[];
43
+ /** Mention text (scanned for "use <provider>", "@<provider>", "provider:<provider>") */
44
+ mentionContext?: string;
45
+ /** Config-driven provider settings from .agentfactory/config.yaml */
46
+ configProviders?: ProvidersConfig;
47
+ }
48
+ /** Result of provider resolution with source for logging */
49
+ export interface ProviderResolutionResult {
50
+ name: AgentProviderName;
51
+ source: string;
52
+ }
53
+ export declare const PROVIDER_ALIASES: Record<string, AgentProviderName>;
20
54
  /**
21
55
  * Create a provider instance by name.
22
56
  *
@@ -26,19 +60,41 @@ import type { AgentProvider, AgentProviderName } from './types.js';
26
60
  */
27
61
  export declare function createProvider(name: AgentProviderName): AgentProvider;
28
62
  /**
29
- * Resolve which provider to use based on env vars, project, and work type.
63
+ * Extract provider name from issue labels.
64
+ * Looks for labels matching "provider:<name>" pattern.
65
+ */
66
+ export declare function extractProviderFromLabels(labels: string[]): AgentProviderName | null;
67
+ /**
68
+ * Extract provider name from mention/prompt context text.
69
+ * Matches: "use <provider>", "@<provider>", "provider:<provider>"
70
+ * Case-insensitive, word-boundary aware.
71
+ */
72
+ export declare function extractProviderFromMention(text: string): AgentProviderName | null;
73
+ /**
74
+ * Resolve which provider to use with full priority cascade.
30
75
  *
31
- * Resolution order (highest priority first):
32
- * 1. AGENT_PROVIDER_{WORKTYPE} (e.g., AGENT_PROVIDER_QA=amp)
33
- * 2. AGENT_PROVIDER_{PROJECT} (e.g., AGENT_PROVIDER_SOCIAL=codex)
34
- * 3. AGENT_PROVIDER (global default)
35
- * 4. 'claude' (fallback)
76
+ * Resolution order (highest lowest):
77
+ * 1. Issue label override (provider:codex)
78
+ * 2. Mention context override ("use codex", "@codex")
79
+ * 3. Config providers.byWorkType
80
+ * 4. Config providers.byProject
81
+ * 5. Env var AGENT_PROVIDER_{WORKTYPE}
82
+ * 6. Env var AGENT_PROVIDER_{PROJECT}
83
+ * 7. Config providers.default
84
+ * 8. Env var AGENT_PROVIDER
85
+ * 9. Hardcoded 'claude'
86
+ *
87
+ * @param context - Full resolution context (backwards-compatible with old { project, workType } shape)
88
+ * @returns The resolved provider name and its source
89
+ */
90
+ export declare function resolveProviderWithSource(context?: ProviderResolutionContext): ProviderResolutionResult;
91
+ /**
92
+ * Resolve which provider to use based on context.
93
+ * Backwards-compatible wrapper around resolveProviderWithSource().
36
94
  *
37
95
  * @param options - Project and work type context for resolution
38
96
  * @returns The resolved provider name
39
97
  */
40
- export declare function resolveProviderName(options?: {
41
- project?: string;
42
- workType?: string;
43
- }): AgentProviderName;
98
+ export declare function resolveProviderName(options?: ProviderResolutionContext): AgentProviderName;
99
+ export declare function isValidProviderName(name: string): name is AgentProviderName;
44
100
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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,YAAY,CAAA;AAC7G,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,aAAa,GACd,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACxE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAClF,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAOlE;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAerE;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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC7G,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,aAAa,GACd,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACxE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAClF,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAWlE,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,OAAO,CAAC,EAAE,iBAAiB,CAAA;IAC3B,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IAC9C,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;CAC9C;AAED,uEAAuE;AACvE,MAAM,WAAW,yBAAyB;IACxC,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,qEAAqE;IACrE,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC;AAED,4DAA4D;AAC5D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,iBAAiB,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;CACf;AAMD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAK9D,CAAA;AAMD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAkBrE;AAMD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,GAAG,IAAI,CAWpF;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CA6BjF;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,wBAAwB,CAgEvG;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,iBAAiB,CAE1F;AAQD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,iBAAiB,CAE3E"}