@renseiai/agentfactory 0.8.3 → 0.8.5

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 (34) hide show
  1. package/dist/src/config/index.d.ts +1 -1
  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 +53 -0
  5. package/dist/src/config/repository-config.d.ts.map +1 -1
  6. package/dist/src/config/repository-config.js +23 -0
  7. package/dist/src/config/repository-config.test.js +91 -1
  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 +25 -0
  18. package/dist/src/orchestrator/orchestrator.d.ts.map +1 -1
  19. package/dist/src/orchestrator/orchestrator.js +92 -43
  20. package/dist/src/orchestrator/parse-work-result.d.ts.map +1 -1
  21. package/dist/src/orchestrator/parse-work-result.js +6 -0
  22. package/dist/src/orchestrator/parse-work-result.test.js +13 -0
  23. package/dist/src/orchestrator/state-recovery.test.d.ts +2 -0
  24. package/dist/src/orchestrator/state-recovery.test.d.ts.map +1 -0
  25. package/dist/src/orchestrator/state-recovery.test.js +425 -0
  26. package/dist/src/orchestrator/types.d.ts +11 -1
  27. package/dist/src/orchestrator/types.d.ts.map +1 -1
  28. package/dist/src/providers/index.d.ts +71 -15
  29. package/dist/src/providers/index.d.ts.map +1 -1
  30. package/dist/src/providers/index.js +156 -28
  31. package/dist/src/providers/index.test.d.ts +2 -0
  32. package/dist/src/providers/index.test.d.ts.map +1 -0
  33. package/dist/src/providers/index.test.js +225 -0
  34. package/package.json +3 -3
@@ -1,3 +1,3 @@
1
- export { loadRepositoryConfig, RepositoryConfigSchema, ProjectConfigSchema, getEffectiveAllowedProjects, getProjectConfig, getProjectPath } from './repository-config.js';
1
+ export { loadRepositoryConfig, RepositoryConfigSchema, ProjectConfigSchema, ProvidersConfigSchema, getEffectiveAllowedProjects, getProjectConfig, getProjectPath, getProvidersConfig } from './repository-config.js';
2
2
  export type { RepositoryConfig, ProjectConfig } from './repository-config.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACzK,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AACpN,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA"}
@@ -1 +1 @@
1
- export { loadRepositoryConfig, RepositoryConfigSchema, ProjectConfigSchema, getEffectiveAllowedProjects, getProjectConfig, getProjectPath } from './repository-config.js';
1
+ export { loadRepositoryConfig, RepositoryConfigSchema, ProjectConfigSchema, ProvidersConfigSchema, getEffectiveAllowedProjects, getProjectConfig, getProjectPath, getProvidersConfig } from './repository-config.js';
@@ -7,6 +7,7 @@
7
7
  * - Project allowlisting for the orchestrator (allowedProjects field)
8
8
  */
9
9
  import { z } from 'zod';
10
+ import type { ProvidersConfig } from '../providers/index.js';
10
11
  /** Per-project configuration (object form of projectPaths values) */
11
12
  export declare const ProjectConfigSchema: z.ZodObject<{
12
13
  path: z.ZodString;
@@ -22,6 +23,30 @@ export declare const ProjectConfigSchema: z.ZodObject<{
22
23
  validateCommand: z.ZodOptional<z.ZodString>;
23
24
  }, z.core.$strip>;
24
25
  export type ProjectConfig = z.infer<typeof ProjectConfigSchema>;
26
+ /** Provider selection configuration */
27
+ export declare const ProvidersConfigSchema: z.ZodObject<{
28
+ default: z.ZodOptional<z.ZodEnum<{
29
+ claude: "claude";
30
+ codex: "codex";
31
+ amp: "amp";
32
+ "spring-ai": "spring-ai";
33
+ a2a: "a2a";
34
+ }>>;
35
+ byWorkType: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodEnum<{
36
+ claude: "claude";
37
+ codex: "codex";
38
+ amp: "amp";
39
+ "spring-ai": "spring-ai";
40
+ a2a: "a2a";
41
+ }>>>;
42
+ byProject: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodEnum<{
43
+ claude: "claude";
44
+ codex: "codex";
45
+ amp: "amp";
46
+ "spring-ai": "spring-ai";
47
+ a2a: "a2a";
48
+ }>>>;
49
+ }, z.core.$strip>;
25
50
  export declare const RepositoryConfigSchema: z.ZodObject<{
26
51
  apiVersion: z.ZodString;
27
52
  kind: z.ZodLiteral<"RepositoryConfig">;
@@ -52,6 +77,29 @@ export declare const RepositoryConfigSchema: z.ZodObject<{
52
77
  buildCommand: z.ZodOptional<z.ZodString>;
53
78
  testCommand: z.ZodOptional<z.ZodString>;
54
79
  validateCommand: z.ZodOptional<z.ZodString>;
80
+ providers: z.ZodOptional<z.ZodObject<{
81
+ default: z.ZodOptional<z.ZodEnum<{
82
+ claude: "claude";
83
+ codex: "codex";
84
+ amp: "amp";
85
+ "spring-ai": "spring-ai";
86
+ a2a: "a2a";
87
+ }>>;
88
+ byWorkType: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodEnum<{
89
+ claude: "claude";
90
+ codex: "codex";
91
+ amp: "amp";
92
+ "spring-ai": "spring-ai";
93
+ a2a: "a2a";
94
+ }>>>;
95
+ byProject: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodEnum<{
96
+ claude: "claude";
97
+ codex: "codex";
98
+ amp: "amp";
99
+ "spring-ai": "spring-ai";
100
+ a2a: "a2a";
101
+ }>>>;
102
+ }, z.core.$strip>>;
55
103
  }, z.core.$strip>;
56
104
  export type RepositoryConfig = z.infer<typeof RepositoryConfigSchema>;
57
105
  /**
@@ -71,6 +119,11 @@ export declare function getProjectConfig(config: RepositoryConfig, projectName:
71
119
  * Handles both string shorthand and object form.
72
120
  */
73
121
  export declare function getProjectPath(config: RepositoryConfig, projectName: string): string | undefined;
122
+ /**
123
+ * Returns the providers config from a RepositoryConfig, if present.
124
+ * Convenience helper for passing to ProviderResolutionContext.configProviders.
125
+ */
126
+ export declare function getProvidersConfig(config: RepositoryConfig): ProvidersConfig | undefined;
74
127
  /**
75
128
  * Load and validate .agentfactory/config.yaml from the given git root.
76
129
  *
@@ -1 +1 @@
1
- {"version":3,"file":"repository-config.d.ts","sourceRoot":"","sources":["../../../src/config/repository-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AASvB,qEAAqE;AACrE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;iBAW9B,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAQ/D,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8ClC,CAAA;AAMD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAMrE;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE,GAAG,SAAS,CAK1F;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAepG;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKhG;AAMD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAQ7E"}
1
+ {"version":3,"file":"repository-config.d.ts","sourceRoot":"","sources":["../../../src/config/repository-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAM5D,qEAAqE;AACrE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;iBAW9B,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAW/D,uCAAuC;AACvC,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;iBAOhC,CAAA;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmDlC,CAAA;AAMD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAMrE;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE,GAAG,SAAS,CAK1F;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAepG;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKhG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,GAAG,SAAS,CAExF;AAMD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAQ7E"}
@@ -31,6 +31,17 @@ export const ProjectConfigSchema = z.object({
31
31
  * String values are normalized to { path: value } by getProjectConfig().
32
32
  */
33
33
  const ProjectPathValueSchema = z.union([z.string(), ProjectConfigSchema]);
34
+ /** Valid agent provider names */
35
+ const AgentProviderNameSchema = z.enum(['claude', 'codex', 'amp', 'spring-ai', 'a2a']);
36
+ /** Provider selection configuration */
37
+ export const ProvidersConfigSchema = z.object({
38
+ /** Default provider for all agents */
39
+ default: AgentProviderNameSchema.optional(),
40
+ /** Provider overrides by work type (e.g., { qa: 'codex' }) */
41
+ byWorkType: z.record(z.string(), AgentProviderNameSchema).optional(),
42
+ /** Provider overrides by project name (e.g., { Social: 'codex' }) */
43
+ byProject: z.record(z.string(), AgentProviderNameSchema).optional(),
44
+ });
34
45
  export const RepositoryConfigSchema = z.object({
35
46
  apiVersion: z.string(),
36
47
  kind: z.literal('RepositoryConfig'),
@@ -74,6 +85,11 @@ export const RepositoryConfigSchema = z.object({
74
85
  * Injected into workflow templates as {{validateCommand}}.
75
86
  */
76
87
  validateCommand: z.string().optional(),
88
+ /**
89
+ * Provider selection configuration.
90
+ * Allows routing agents to different providers by work type or project.
91
+ */
92
+ providers: ProvidersConfigSchema.optional(),
77
93
  }).refine((data) => !(data.allowedProjects && data.projectPaths), { message: 'allowedProjects and projectPaths are mutually exclusive — use one or the other' });
78
94
  // ---------------------------------------------------------------------------
79
95
  // Helpers
@@ -122,6 +138,13 @@ export function getProjectPath(config, projectName) {
122
138
  return undefined;
123
139
  return typeof value === 'string' ? value : value.path;
124
140
  }
141
+ /**
142
+ * Returns the providers config from a RepositoryConfig, if present.
143
+ * Convenience helper for passing to ProviderResolutionContext.configProviders.
144
+ */
145
+ export function getProvidersConfig(config) {
146
+ return config.providers;
147
+ }
125
148
  // ---------------------------------------------------------------------------
126
149
  // Loader
127
150
  // ---------------------------------------------------------------------------
@@ -1,6 +1,6 @@
1
1
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
2
  import { existsSync, readFileSync } from 'fs';
3
- import { loadRepositoryConfig, RepositoryConfigSchema, getEffectiveAllowedProjects, getProjectConfig, getProjectPath } from './repository-config.js';
3
+ import { loadRepositoryConfig, RepositoryConfigSchema, getEffectiveAllowedProjects, getProjectConfig, getProjectPath, getProvidersConfig, ProvidersConfigSchema } from './repository-config.js';
4
4
  vi.mock('fs', () => ({
5
5
  existsSync: vi.fn(),
6
6
  readFileSync: vi.fn(),
@@ -458,3 +458,93 @@ describe('getProjectPath', () => {
458
458
  expect(getProjectPath(config, 'Social')).toBeUndefined();
459
459
  });
460
460
  });
461
+ describe('ProvidersConfigSchema', () => {
462
+ it('validates a complete providers config', () => {
463
+ const result = ProvidersConfigSchema.parse({
464
+ default: 'codex',
465
+ byWorkType: { qa: 'amp', development: 'claude' },
466
+ byProject: { Social: 'codex' },
467
+ });
468
+ expect(result.default).toBe('codex');
469
+ expect(result.byWorkType).toEqual({ qa: 'amp', development: 'claude' });
470
+ expect(result.byProject).toEqual({ Social: 'codex' });
471
+ });
472
+ it('validates an empty object', () => {
473
+ const result = ProvidersConfigSchema.parse({});
474
+ expect(result.default).toBeUndefined();
475
+ expect(result.byWorkType).toBeUndefined();
476
+ expect(result.byProject).toBeUndefined();
477
+ });
478
+ it('rejects invalid provider names', () => {
479
+ expect(() => ProvidersConfigSchema.parse({ default: 'invalid' })).toThrow();
480
+ });
481
+ it('rejects invalid provider names in byWorkType', () => {
482
+ expect(() => ProvidersConfigSchema.parse({ byWorkType: { qa: 'invalid' } })).toThrow();
483
+ });
484
+ });
485
+ describe('RepositoryConfigSchema with providers', () => {
486
+ it('validates config with providers field', () => {
487
+ const result = RepositoryConfigSchema.parse({
488
+ apiVersion: 'v1',
489
+ kind: 'RepositoryConfig',
490
+ providers: {
491
+ default: 'codex',
492
+ byWorkType: { qa: 'amp' },
493
+ },
494
+ });
495
+ expect(result.providers).toEqual({
496
+ default: 'codex',
497
+ byWorkType: { qa: 'amp' },
498
+ });
499
+ });
500
+ it('validates config without providers field', () => {
501
+ const result = RepositoryConfigSchema.parse({
502
+ apiVersion: 'v1',
503
+ kind: 'RepositoryConfig',
504
+ });
505
+ expect(result.providers).toBeUndefined();
506
+ });
507
+ });
508
+ describe('loadRepositoryConfig with providers', () => {
509
+ beforeEach(() => {
510
+ vi.clearAllMocks();
511
+ });
512
+ afterEach(() => {
513
+ vi.restoreAllMocks();
514
+ });
515
+ it('parses config with providers section', () => {
516
+ mockExistsSync.mockReturnValue(true);
517
+ mockReadFileSync.mockReturnValue(`apiVersion: v1
518
+ kind: RepositoryConfig
519
+ providers:
520
+ default: codex
521
+ byWorkType:
522
+ qa: amp
523
+ byProject:
524
+ Social: claude
525
+ `);
526
+ const result = loadRepositoryConfig('/some/repo');
527
+ expect(result?.providers).toEqual({
528
+ default: 'codex',
529
+ byWorkType: { qa: 'amp' },
530
+ byProject: { Social: 'claude' },
531
+ });
532
+ });
533
+ });
534
+ describe('getProvidersConfig', () => {
535
+ it('returns providers config when present', () => {
536
+ const config = RepositoryConfigSchema.parse({
537
+ apiVersion: 'v1',
538
+ kind: 'RepositoryConfig',
539
+ providers: { default: 'codex' },
540
+ });
541
+ expect(getProvidersConfig(config)).toEqual({ default: 'codex' });
542
+ });
543
+ it('returns undefined when providers not set', () => {
544
+ const config = RepositoryConfigSchema.parse({
545
+ apiVersion: 'v1',
546
+ kind: 'RepositoryConfig',
547
+ });
548
+ expect(getProvidersConfig(config)).toBeUndefined();
549
+ });
550
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=detect-work-type.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-work-type.test.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/detect-work-type.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { detectWorkType } from './orchestrator.js';
3
+ describe('detectWorkType', () => {
4
+ describe('leaf issues (isParent=false)', () => {
5
+ it('maps Backlog status to development', () => {
6
+ expect(detectWorkType('Backlog', false)).toBe('development');
7
+ });
8
+ it('maps Finished status to qa', () => {
9
+ expect(detectWorkType('Finished', false)).toBe('qa');
10
+ });
11
+ it('maps Delivered status to acceptance', () => {
12
+ expect(detectWorkType('Delivered', false)).toBe('acceptance');
13
+ });
14
+ it('maps Rejected status to refinement', () => {
15
+ expect(detectWorkType('Rejected', false)).toBe('refinement');
16
+ });
17
+ it('maps Icebox status to research', () => {
18
+ expect(detectWorkType('Icebox', false)).toBe('research');
19
+ });
20
+ it('maps Started status to inflight', () => {
21
+ expect(detectWorkType('Started', false)).toBe('inflight');
22
+ });
23
+ it('defaults unknown status to development', () => {
24
+ expect(detectWorkType('SomeUnknownStatus', false)).toBe('development');
25
+ });
26
+ });
27
+ describe('parent issues (isParent=true)', () => {
28
+ it('upgrades Backlog/development to coordination', () => {
29
+ expect(detectWorkType('Backlog', true)).toBe('coordination');
30
+ });
31
+ it('upgrades Finished/qa to qa-coordination', () => {
32
+ expect(detectWorkType('Finished', true)).toBe('qa-coordination');
33
+ });
34
+ it('upgrades Delivered/acceptance to acceptance-coordination', () => {
35
+ expect(detectWorkType('Delivered', true)).toBe('acceptance-coordination');
36
+ });
37
+ it('upgrades Rejected/refinement to refinement-coordination', () => {
38
+ expect(detectWorkType('Rejected', true)).toBe('refinement-coordination');
39
+ });
40
+ it('does not upgrade research (Icebox) — no coordination variant', () => {
41
+ expect(detectWorkType('Icebox', true)).toBe('research');
42
+ });
43
+ it('does not upgrade inflight (Started) — no coordination variant', () => {
44
+ expect(detectWorkType('Started', true)).toBe('inflight');
45
+ });
46
+ it('upgrades unknown status (defaults to development → coordination)', () => {
47
+ expect(detectWorkType('SomeUnknownStatus', true)).toBe('coordination');
48
+ });
49
+ });
50
+ describe('post-refinement rework scenario (SUP-1116 bug)', () => {
51
+ it('parent issue returning to Backlog after refinement gets coordination, not development', () => {
52
+ // This is the exact scenario that caused SUP-1116 to fail:
53
+ // After refinement-coordination completed, the parent moved to Backlog.
54
+ // The orchestrator's run() previously hardcoded 'development', which loaded
55
+ // the wrong template and the agent asked for human input instead of
56
+ // autonomously dispatching sub-agents.
57
+ const workType = detectWorkType('Backlog', true);
58
+ expect(workType).toBe('coordination');
59
+ expect(workType).not.toBe('development');
60
+ });
61
+ });
62
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=heartbeat-writer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat-writer.test.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/heartbeat-writer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,139 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ vi.mock('fs', () => ({
3
+ existsSync: vi.fn().mockReturnValue(true),
4
+ writeFileSync: vi.fn(),
5
+ renameSync: vi.fn(),
6
+ mkdirSync: vi.fn(),
7
+ }));
8
+ import { writeFileSync, renameSync, existsSync, mkdirSync } from 'fs';
9
+ import { createHeartbeatWriter, HeartbeatWriter, getHeartbeatIntervalFromEnv, } from './heartbeat-writer.js';
10
+ const defaultConfig = {
11
+ agentDir: '/tmp/test-agent',
12
+ pid: 12345,
13
+ intervalMs: 1000,
14
+ startTime: Date.now(),
15
+ };
16
+ describe('HeartbeatWriter', () => {
17
+ beforeEach(() => {
18
+ vi.useFakeTimers();
19
+ vi.clearAllMocks();
20
+ vi.mocked(existsSync).mockReturnValue(true);
21
+ });
22
+ afterEach(() => {
23
+ vi.useRealTimers();
24
+ });
25
+ it('createHeartbeatWriter returns a HeartbeatWriter instance', () => {
26
+ const writer = createHeartbeatWriter(defaultConfig);
27
+ expect(writer).toBeInstanceOf(HeartbeatWriter);
28
+ });
29
+ it('start() writes initial heartbeat immediately', () => {
30
+ const writer = createHeartbeatWriter(defaultConfig);
31
+ writer.start();
32
+ expect(vi.mocked(writeFileSync)).toHaveBeenCalledTimes(1);
33
+ expect(vi.mocked(renameSync)).toHaveBeenCalledTimes(1);
34
+ writer.stop();
35
+ });
36
+ it('start() creates directory if it does not exist', () => {
37
+ vi.mocked(existsSync).mockReturnValue(false);
38
+ const writer = createHeartbeatWriter(defaultConfig);
39
+ writer.start();
40
+ expect(vi.mocked(mkdirSync)).toHaveBeenCalledWith(expect.any(String), { recursive: true });
41
+ writer.stop();
42
+ });
43
+ it('start() is idempotent - calling twice does not create two intervals', () => {
44
+ const writer = createHeartbeatWriter(defaultConfig);
45
+ writer.start();
46
+ writer.start();
47
+ // Only the initial heartbeat from the first start() call
48
+ expect(vi.mocked(writeFileSync)).toHaveBeenCalledTimes(1);
49
+ // Advance by one interval - should only get one additional write
50
+ vi.advanceTimersByTime(defaultConfig.intervalMs);
51
+ expect(vi.mocked(writeFileSync)).toHaveBeenCalledTimes(2);
52
+ writer.stop();
53
+ });
54
+ it('stop() clears the interval', () => {
55
+ const writer = createHeartbeatWriter(defaultConfig);
56
+ writer.start();
57
+ // Initial write
58
+ expect(vi.mocked(writeFileSync)).toHaveBeenCalledTimes(1);
59
+ writer.stop();
60
+ // Advance time - no more writes should happen
61
+ vi.advanceTimersByTime(defaultConfig.intervalMs * 5);
62
+ expect(vi.mocked(writeFileSync)).toHaveBeenCalledTimes(1);
63
+ });
64
+ it('start() throws after stop() has been called', () => {
65
+ const writer = createHeartbeatWriter(defaultConfig);
66
+ writer.start();
67
+ writer.stop();
68
+ expect(() => writer.start()).toThrow('HeartbeatWriter has been stopped and cannot be restarted');
69
+ });
70
+ it('updateActivity("tool_use", "Bash") increments tool call count', () => {
71
+ const writer = createHeartbeatWriter(defaultConfig);
72
+ writer.start();
73
+ vi.mocked(writeFileSync).mockClear();
74
+ vi.mocked(renameSync).mockClear();
75
+ writer.updateActivity('tool_use', 'Bash');
76
+ writer.updateActivity('tool_use', 'Read');
77
+ // Trigger a heartbeat write to inspect the state
78
+ vi.advanceTimersByTime(defaultConfig.intervalMs);
79
+ const writeCall = vi.mocked(writeFileSync).mock.calls[0];
80
+ const written = JSON.parse(writeCall[1]);
81
+ expect(written.toolCallsCount).toBe(2);
82
+ writer.stop();
83
+ });
84
+ it('recordToolCall("Read") delegates to updateActivity', () => {
85
+ const writer = createHeartbeatWriter(defaultConfig);
86
+ writer.start();
87
+ vi.mocked(writeFileSync).mockClear();
88
+ vi.mocked(renameSync).mockClear();
89
+ writer.recordToolCall('Read');
90
+ vi.advanceTimersByTime(defaultConfig.intervalMs);
91
+ const writeCall = vi.mocked(writeFileSync).mock.calls[0];
92
+ const written = JSON.parse(writeCall[1]);
93
+ expect(written.lastActivityType).toBe('tool_use');
94
+ expect(written.currentOperation).toBe('Read');
95
+ expect(written.toolCallsCount).toBe(1);
96
+ writer.stop();
97
+ });
98
+ it('recordThinking() sets activity type to "thinking"', () => {
99
+ const writer = createHeartbeatWriter(defaultConfig);
100
+ writer.start();
101
+ vi.mocked(writeFileSync).mockClear();
102
+ vi.mocked(renameSync).mockClear();
103
+ writer.recordThinking();
104
+ vi.advanceTimersByTime(defaultConfig.intervalMs);
105
+ const writeCall = vi.mocked(writeFileSync).mock.calls[0];
106
+ const written = JSON.parse(writeCall[1]);
107
+ expect(written.lastActivityType).toBe('thinking');
108
+ writer.stop();
109
+ });
110
+ it('heartbeat writes use atomic pattern (writeFileSync to .tmp, renameSync to final)', () => {
111
+ const writer = createHeartbeatWriter(defaultConfig);
112
+ writer.start();
113
+ const tmpPath = vi.mocked(writeFileSync).mock.calls[0][0];
114
+ expect(tmpPath).toMatch(/\.tmp$/);
115
+ const renameArgs = vi.mocked(renameSync).mock.calls[0];
116
+ expect(renameArgs[0]).toBe(tmpPath);
117
+ expect(renameArgs[1].endsWith('heartbeat.json')).toBe(true);
118
+ writer.stop();
119
+ });
120
+ });
121
+ describe('getHeartbeatIntervalFromEnv', () => {
122
+ const originalEnv = process.env.AGENT_HEARTBEAT_INTERVAL_MS;
123
+ afterEach(() => {
124
+ if (originalEnv === undefined) {
125
+ delete process.env.AGENT_HEARTBEAT_INTERVAL_MS;
126
+ }
127
+ else {
128
+ process.env.AGENT_HEARTBEAT_INTERVAL_MS = originalEnv;
129
+ }
130
+ });
131
+ it('returns default 10000 when env var is not set', () => {
132
+ delete process.env.AGENT_HEARTBEAT_INTERVAL_MS;
133
+ expect(getHeartbeatIntervalFromEnv()).toBe(10000);
134
+ });
135
+ it('reads AGENT_HEARTBEAT_INTERVAL_MS env var', () => {
136
+ process.env.AGENT_HEARTBEAT_INTERVAL_MS = '5000';
137
+ expect(getHeartbeatIntervalFromEnv()).toBe(5000);
138
+ });
139
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=orchestrator-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-utils.test.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/orchestrator-utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { getWorktreeIdentifier } from './orchestrator.js';
3
+ describe('getWorktreeIdentifier', () => {
4
+ it('returns identifier with DEV suffix for development', () => {
5
+ expect(getWorktreeIdentifier('SUP-123', 'development')).toBe('SUP-123-DEV');
6
+ });
7
+ it('returns identifier with QA suffix for qa', () => {
8
+ expect(getWorktreeIdentifier('SUP-123', 'qa')).toBe('SUP-123-QA');
9
+ });
10
+ it('returns identifier with AC suffix for acceptance', () => {
11
+ expect(getWorktreeIdentifier('SUP-123', 'acceptance')).toBe('SUP-123-AC');
12
+ });
13
+ it('returns identifier with COORD suffix for coordination', () => {
14
+ expect(getWorktreeIdentifier('SUP-123', 'coordination')).toBe('SUP-123-COORD');
15
+ });
16
+ it('returns identifier with RES suffix for research', () => {
17
+ expect(getWorktreeIdentifier('SUP-123', 'research')).toBe('SUP-123-RES');
18
+ });
19
+ it('returns identifier with BC suffix for backlog-creation', () => {
20
+ expect(getWorktreeIdentifier('SUP-123', 'backlog-creation')).toBe('SUP-123-BC');
21
+ });
22
+ it('returns identifier with INF suffix for inflight', () => {
23
+ expect(getWorktreeIdentifier('SUP-123', 'inflight')).toBe('SUP-123-INF');
24
+ });
25
+ it('returns identifier with REF suffix for refinement', () => {
26
+ expect(getWorktreeIdentifier('SUP-123', 'refinement')).toBe('SUP-123-REF');
27
+ });
28
+ it('returns identifier with QA-COORD suffix for qa-coordination', () => {
29
+ expect(getWorktreeIdentifier('SUP-123', 'qa-coordination')).toBe('SUP-123-QA-COORD');
30
+ });
31
+ it('returns identifier with AC-COORD suffix for acceptance-coordination', () => {
32
+ expect(getWorktreeIdentifier('SUP-123', 'acceptance-coordination')).toBe('SUP-123-AC-COORD');
33
+ });
34
+ it('returns identifier with REF-COORD suffix for refinement-coordination', () => {
35
+ expect(getWorktreeIdentifier('SUP-123', 'refinement-coordination')).toBe('SUP-123-REF-COORD');
36
+ });
37
+ it('works with different issue identifier formats', () => {
38
+ expect(getWorktreeIdentifier('PROJ-1', 'development')).toBe('PROJ-1-DEV');
39
+ expect(getWorktreeIdentifier('AB-99999', 'qa')).toBe('AB-99999-QA');
40
+ });
41
+ });
@@ -22,6 +22,15 @@ export declare function validateGitRemote(expectedRepo: string, cwd?: string): v
22
22
  * @returns Worktree identifier with suffix (e.g., "SUP-294-QA")
23
23
  */
24
24
  export declare function getWorktreeIdentifier(issueIdentifier: string, workType: AgentWorkType): string;
25
+ /**
26
+ * Detect the appropriate work type for an issue based on its status,
27
+ * upgrading to coordination variants for parent issues with sub-issues.
28
+ *
29
+ * This prevents parent issues returning to Backlog after refinement from
30
+ * being dispatched as 'development' (which uses the wrong template and
31
+ * produces no sub-agent orchestration).
32
+ */
33
+ export declare function detectWorkType(statusName: string, isParent: boolean): AgentWorkType;
25
34
  export declare class AgentOrchestrator {
26
35
  private readonly config;
27
36
  private readonly client;
@@ -29,6 +38,8 @@ export declare class AgentOrchestrator {
29
38
  private readonly activeAgents;
30
39
  private readonly agentHandles;
31
40
  private provider;
41
+ private readonly providerCache;
42
+ private configProviders?;
32
43
  private readonly agentSessions;
33
44
  private readonly activityEmitters;
34
45
  private readonly sessionToIssue;
@@ -61,6 +72,15 @@ export declare class AgentOrchestrator {
61
72
  * @returns Timeout configuration with inactivity and max session values
62
73
  */
63
74
  private getTimeoutConfig;
75
+ /**
76
+ * Detect the appropriate work type for an issue, upgrading to coordination
77
+ * variants for parent issues that have sub-issues.
78
+ *
79
+ * This prevents parent issues returning to Backlog after refinement from
80
+ * being dispatched as 'development' (which uses the wrong template and
81
+ * produces no sub-agent orchestration).
82
+ */
83
+ detectWorkType(issueId: string, statusName: string): Promise<AgentWorkType>;
64
84
  /**
65
85
  * Get backlog issues for the configured project
66
86
  */
@@ -189,6 +209,11 @@ export declare class AgentOrchestrator {
189
209
  * @deprecated Use linkDependencies() instead. This now delegates to linkDependencies.
190
210
  */
191
211
  preInstallDependencies(worktreePath: string, identifier: string): void;
212
+ /**
213
+ * Resolve the provider for a specific spawn, using the full priority cascade.
214
+ * Returns a cached provider instance (creating one if needed) and the resolved name.
215
+ */
216
+ private resolveProviderForSpawn;
192
217
  /**
193
218
  * Spawn a Claude agent for a specific issue using the Agent SDK
194
219
  */
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"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"}