@renseiai/agentfactory 0.8.8 → 0.8.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/config/index.d.ts +1 -1
- package/dist/src/config/index.d.ts.map +1 -1
- package/dist/src/config/index.js +1 -1
- package/dist/src/config/repository-config.d.ts +23 -0
- package/dist/src/config/repository-config.d.ts.map +1 -1
- package/dist/src/config/repository-config.js +27 -0
- package/dist/src/config/repository-config.test.js +140 -1
- package/dist/src/governor/decision-engine.d.ts +3 -0
- package/dist/src/governor/decision-engine.d.ts.map +1 -1
- package/dist/src/governor/decision-engine.js +11 -0
- package/dist/src/governor/decision-engine.test.js +33 -0
- package/dist/src/governor/governor-types.d.ts +1 -1
- package/dist/src/governor/governor-types.d.ts.map +1 -1
- package/dist/src/governor/governor.d.ts +17 -1
- package/dist/src/governor/governor.d.ts.map +1 -1
- package/dist/src/governor/governor.js +112 -1
- package/dist/src/governor/governor.test.js +155 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/orchestrator/issue-tracker-client.d.ts +4 -0
- package/dist/src/orchestrator/issue-tracker-client.d.ts.map +1 -1
- package/dist/src/orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/src/orchestrator/orchestrator.js +24 -0
- package/dist/src/orchestrator/parse-work-result.d.ts.map +1 -1
- package/dist/src/orchestrator/parse-work-result.js +6 -0
- package/dist/src/orchestrator/parse-work-result.test.js +19 -0
- package/dist/src/providers/index.d.ts +64 -1
- package/dist/src/providers/index.d.ts.map +1 -1
- package/dist/src/providers/index.js +132 -1
- package/dist/src/providers/index.test.js +340 -2
- package/dist/src/routing/index.d.ts +7 -0
- package/dist/src/routing/index.d.ts.map +1 -0
- package/dist/src/routing/index.js +6 -0
- package/dist/src/routing/observation-recorder.d.ts +19 -0
- package/dist/src/routing/observation-recorder.d.ts.map +1 -0
- package/dist/src/routing/observation-recorder.js +73 -0
- package/dist/src/routing/observation-recorder.test.d.ts +2 -0
- package/dist/src/routing/observation-recorder.test.d.ts.map +1 -0
- package/dist/src/routing/observation-recorder.test.js +322 -0
- package/dist/src/routing/observation-store.d.ts +40 -0
- package/dist/src/routing/observation-store.d.ts.map +1 -0
- package/dist/src/routing/observation-store.js +1 -0
- package/dist/src/routing/observation-store.test.d.ts +2 -0
- package/dist/src/routing/observation-store.test.d.ts.map +1 -0
- package/dist/src/routing/observation-store.test.js +138 -0
- package/dist/src/routing/posterior-store.d.ts +12 -0
- package/dist/src/routing/posterior-store.d.ts.map +1 -0
- package/dist/src/routing/posterior-store.js +13 -0
- package/dist/src/routing/posterior-store.test.d.ts +2 -0
- package/dist/src/routing/posterior-store.test.d.ts.map +1 -0
- package/dist/src/routing/posterior-store.test.js +37 -0
- package/dist/src/routing/reward.d.ts +16 -0
- package/dist/src/routing/reward.d.ts.map +1 -0
- package/dist/src/routing/reward.js +29 -0
- package/dist/src/routing/reward.test.d.ts +2 -0
- package/dist/src/routing/reward.test.d.ts.map +1 -0
- package/dist/src/routing/reward.test.js +210 -0
- package/dist/src/routing/routing-engine.d.ts +20 -0
- package/dist/src/routing/routing-engine.d.ts.map +1 -0
- package/dist/src/routing/routing-engine.js +113 -0
- package/dist/src/routing/routing-engine.test.d.ts +2 -0
- package/dist/src/routing/routing-engine.test.d.ts.map +1 -0
- package/dist/src/routing/routing-engine.test.js +310 -0
- package/dist/src/routing/types.d.ts +157 -0
- package/dist/src/routing/types.d.ts.map +1 -0
- package/dist/src/routing/types.js +68 -0
- package/dist/src/routing/types.test.d.ts +2 -0
- package/dist/src/routing/types.test.d.ts.map +1 -0
- package/dist/src/routing/types.test.js +184 -0
- package/dist/src/templates/types.d.ts +3 -0
- package/dist/src/templates/types.d.ts.map +1 -1
- package/dist/src/templates/types.js +2 -0
- package/dist/src/workflow/agent-cancellation.d.ts +37 -0
- package/dist/src/workflow/agent-cancellation.d.ts.map +1 -0
- package/dist/src/workflow/agent-cancellation.js +41 -0
- package/dist/src/workflow/agent-cancellation.test.d.ts +2 -0
- package/dist/src/workflow/agent-cancellation.test.d.ts.map +1 -0
- package/dist/src/workflow/agent-cancellation.test.js +86 -0
- package/dist/src/workflow/concurrency-semaphore.d.ts +21 -0
- package/dist/src/workflow/concurrency-semaphore.d.ts.map +1 -0
- package/dist/src/workflow/concurrency-semaphore.js +46 -0
- package/dist/src/workflow/concurrency-semaphore.test.d.ts +2 -0
- package/dist/src/workflow/concurrency-semaphore.test.d.ts.map +1 -0
- package/dist/src/workflow/concurrency-semaphore.test.js +183 -0
- package/dist/src/workflow/gate-state.d.ts +115 -0
- package/dist/src/workflow/gate-state.d.ts.map +1 -0
- package/dist/src/workflow/gate-state.js +185 -0
- package/dist/src/workflow/gate-state.test.d.ts +2 -0
- package/dist/src/workflow/gate-state.test.d.ts.map +1 -0
- package/dist/src/workflow/gate-state.test.js +251 -0
- package/dist/src/workflow/gates/gate-evaluator.d.ts +119 -0
- package/dist/src/workflow/gates/gate-evaluator.d.ts.map +1 -0
- package/dist/src/workflow/gates/gate-evaluator.js +243 -0
- package/dist/src/workflow/gates/gate-evaluator.test.d.ts +2 -0
- package/dist/src/workflow/gates/gate-evaluator.test.d.ts.map +1 -0
- package/dist/src/workflow/gates/gate-evaluator.test.js +240 -0
- package/dist/src/workflow/gates/signal-gate.d.ts +114 -0
- package/dist/src/workflow/gates/signal-gate.d.ts.map +1 -0
- package/dist/src/workflow/gates/signal-gate.js +216 -0
- package/dist/src/workflow/gates/signal-gate.test.d.ts +2 -0
- package/dist/src/workflow/gates/signal-gate.test.d.ts.map +1 -0
- package/dist/src/workflow/gates/signal-gate.test.js +199 -0
- package/dist/src/workflow/gates/timeout-engine.d.ts +96 -0
- package/dist/src/workflow/gates/timeout-engine.d.ts.map +1 -0
- package/dist/src/workflow/gates/timeout-engine.js +162 -0
- package/dist/src/workflow/gates/timeout-engine.test.d.ts +2 -0
- package/dist/src/workflow/gates/timeout-engine.test.d.ts.map +1 -0
- package/dist/src/workflow/gates/timeout-engine.test.js +186 -0
- package/dist/src/workflow/gates/timer-gate.d.ts +125 -0
- package/dist/src/workflow/gates/timer-gate.d.ts.map +1 -0
- package/dist/src/workflow/gates/timer-gate.js +381 -0
- package/dist/src/workflow/gates/timer-gate.test.d.ts +2 -0
- package/dist/src/workflow/gates/timer-gate.test.d.ts.map +1 -0
- package/dist/src/workflow/gates/timer-gate.test.js +211 -0
- package/dist/src/workflow/gates/webhook-gate.d.ts +132 -0
- package/dist/src/workflow/gates/webhook-gate.d.ts.map +1 -0
- package/dist/src/workflow/gates/webhook-gate.js +216 -0
- package/dist/src/workflow/gates/webhook-gate.test.d.ts +2 -0
- package/dist/src/workflow/gates/webhook-gate.test.d.ts.map +1 -0
- package/dist/src/workflow/gates/webhook-gate.test.js +182 -0
- package/dist/src/workflow/index.d.ts +23 -2
- package/dist/src/workflow/index.d.ts.map +1 -1
- package/dist/src/workflow/index.js +15 -1
- package/dist/src/workflow/parallelism-executor.d.ts +25 -0
- package/dist/src/workflow/parallelism-executor.d.ts.map +1 -0
- package/dist/src/workflow/parallelism-executor.js +53 -0
- package/dist/src/workflow/parallelism-executor.test.d.ts +2 -0
- package/dist/src/workflow/parallelism-executor.test.d.ts.map +1 -0
- package/dist/src/workflow/parallelism-executor.test.js +191 -0
- package/dist/src/workflow/parallelism-types.d.ts +80 -0
- package/dist/src/workflow/parallelism-types.d.ts.map +1 -0
- package/dist/src/workflow/parallelism-types.js +8 -0
- package/dist/src/workflow/phase-context-injector.d.ts +29 -0
- package/dist/src/workflow/phase-context-injector.d.ts.map +1 -0
- package/dist/src/workflow/phase-context-injector.js +43 -0
- package/dist/src/workflow/phase-context-injector.test.d.ts +2 -0
- package/dist/src/workflow/phase-context-injector.test.d.ts.map +1 -0
- package/dist/src/workflow/phase-context-injector.test.js +123 -0
- package/dist/src/workflow/phase-output-collector.d.ts +39 -0
- package/dist/src/workflow/phase-output-collector.d.ts.map +1 -0
- package/dist/src/workflow/phase-output-collector.js +141 -0
- package/dist/src/workflow/phase-output-collector.test.d.ts +2 -0
- package/dist/src/workflow/phase-output-collector.test.d.ts.map +1 -0
- package/dist/src/workflow/phase-output-collector.test.js +179 -0
- package/dist/src/workflow/strategies/fan-in-strategy.d.ts +21 -0
- package/dist/src/workflow/strategies/fan-in-strategy.d.ts.map +1 -0
- package/dist/src/workflow/strategies/fan-in-strategy.js +92 -0
- package/dist/src/workflow/strategies/fan-in-strategy.test.d.ts +2 -0
- package/dist/src/workflow/strategies/fan-in-strategy.test.d.ts.map +1 -0
- package/dist/src/workflow/strategies/fan-in-strategy.test.js +182 -0
- package/dist/src/workflow/strategies/fan-out-strategy.d.ts +16 -0
- package/dist/src/workflow/strategies/fan-out-strategy.d.ts.map +1 -0
- package/dist/src/workflow/strategies/fan-out-strategy.js +47 -0
- package/dist/src/workflow/strategies/fan-out-strategy.test.d.ts +2 -0
- package/dist/src/workflow/strategies/fan-out-strategy.test.d.ts.map +1 -0
- package/dist/src/workflow/strategies/fan-out-strategy.test.js +97 -0
- package/dist/src/workflow/strategies/index.d.ts +4 -0
- package/dist/src/workflow/strategies/index.d.ts.map +1 -0
- package/dist/src/workflow/strategies/index.js +3 -0
- package/dist/src/workflow/strategies/race-strategy.d.ts +19 -0
- package/dist/src/workflow/strategies/race-strategy.d.ts.map +1 -0
- package/dist/src/workflow/strategies/race-strategy.js +92 -0
- package/dist/src/workflow/strategies/race-strategy.test.d.ts +2 -0
- package/dist/src/workflow/strategies/race-strategy.test.d.ts.map +1 -0
- package/dist/src/workflow/strategies/race-strategy.test.js +318 -0
- package/dist/src/workflow/transition-engine.d.ts.map +1 -1
- package/dist/src/workflow/transition-engine.js +12 -0
- package/dist/src/workflow/transition-engine.test.js +92 -0
- package/dist/src/workflow/workflow-registry.d.ts +5 -1
- package/dist/src/workflow/workflow-registry.d.ts.map +1 -1
- package/dist/src/workflow/workflow-registry.js +8 -0
- package/dist/src/workflow/workflow-registry.test.js +54 -0
- package/dist/src/workflow/workflow-types.d.ts +151 -6
- package/dist/src/workflow/workflow-types.d.ts.map +1 -1
- package/dist/src/workflow/workflow-types.js +71 -1
- package/dist/src/workflow/workflow-types.test.js +293 -2
- package/package.json +2 -2
|
@@ -512,3 +512,158 @@ describe('WorkflowGovernor.scanOnce — PRIORITY override sorting', () => {
|
|
|
512
512
|
expect(dispatchWork.mock.calls[2][0]).toEqual(expect.objectContaining({ id: 'c' }));
|
|
513
513
|
});
|
|
514
514
|
});
|
|
515
|
+
// ---------------------------------------------------------------------------
|
|
516
|
+
// Parallel group dispatch
|
|
517
|
+
// ---------------------------------------------------------------------------
|
|
518
|
+
describe('WorkflowGovernor.scanOnce — parallel group dispatch', () => {
|
|
519
|
+
function makeWorkflowWithParallelism() {
|
|
520
|
+
return {
|
|
521
|
+
apiVersion: 'v1.1',
|
|
522
|
+
kind: 'WorkflowDefinition',
|
|
523
|
+
metadata: { name: 'test-parallel' },
|
|
524
|
+
phases: [
|
|
525
|
+
{ name: 'development', template: 'development' },
|
|
526
|
+
{ name: 'qa', template: 'qa' },
|
|
527
|
+
],
|
|
528
|
+
transitions: [
|
|
529
|
+
{ from: 'Backlog', to: 'development' },
|
|
530
|
+
{ from: 'Finished', to: 'qa' },
|
|
531
|
+
],
|
|
532
|
+
parallelism: [
|
|
533
|
+
{
|
|
534
|
+
name: 'dev-parallel',
|
|
535
|
+
phases: ['development'],
|
|
536
|
+
strategy: 'fan-out',
|
|
537
|
+
},
|
|
538
|
+
],
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
it('handles trigger-parallel-group by dispatching sub-issues', async () => {
|
|
542
|
+
const parentIssue = makeIssue({
|
|
543
|
+
id: 'parent-1',
|
|
544
|
+
identifier: 'SUP-100',
|
|
545
|
+
status: 'Backlog',
|
|
546
|
+
});
|
|
547
|
+
const subIssues = [
|
|
548
|
+
makeIssue({ id: 'sub-1', identifier: 'SUP-101', status: 'Backlog', parentId: 'parent-1' }),
|
|
549
|
+
makeIssue({ id: 'sub-2', identifier: 'SUP-102', status: 'Backlog', parentId: 'parent-1' }),
|
|
550
|
+
];
|
|
551
|
+
const dispatchWork = vi.fn().mockResolvedValue(undefined);
|
|
552
|
+
const getSubIssues = vi.fn().mockResolvedValue(subIssues);
|
|
553
|
+
const deps = makeMockDeps({
|
|
554
|
+
listIssues: vi.fn().mockResolvedValue([parentIssue]),
|
|
555
|
+
isParentIssue: vi.fn().mockResolvedValue(true),
|
|
556
|
+
dispatchWork,
|
|
557
|
+
getSubIssues,
|
|
558
|
+
});
|
|
559
|
+
const governor = new WorkflowGovernor(makeConfig({
|
|
560
|
+
workflow: { workflow: makeWorkflowWithParallelism(), useBuiltinDefault: false },
|
|
561
|
+
}), deps);
|
|
562
|
+
const results = await governor.scanOnce();
|
|
563
|
+
expect(results[0].actionsDispatched).toBe(1);
|
|
564
|
+
expect(getSubIssues).toHaveBeenCalledWith('parent-1');
|
|
565
|
+
// dispatchWork is called for each sub-issue via the ParallelismExecutor,
|
|
566
|
+
// plus once more to advance the parent to the next phase (trigger-qa)
|
|
567
|
+
expect(dispatchWork).toHaveBeenCalledTimes(3);
|
|
568
|
+
expect(dispatchWork).toHaveBeenCalledWith(expect.objectContaining({ id: 'sub-1' }), 'trigger-development');
|
|
569
|
+
expect(dispatchWork).toHaveBeenCalledWith(expect.objectContaining({ id: 'sub-2' }), 'trigger-development');
|
|
570
|
+
// Parent advanced to QA after parallel group completion
|
|
571
|
+
expect(dispatchWork).toHaveBeenCalledWith(expect.objectContaining({ id: 'parent-1' }), 'trigger-qa');
|
|
572
|
+
});
|
|
573
|
+
it('handles missing getSubIssues gracefully', async () => {
|
|
574
|
+
const parentIssue = makeIssue({
|
|
575
|
+
id: 'parent-1',
|
|
576
|
+
identifier: 'SUP-100',
|
|
577
|
+
status: 'Backlog',
|
|
578
|
+
});
|
|
579
|
+
const dispatchWork = vi.fn().mockResolvedValue(undefined);
|
|
580
|
+
const deps = makeMockDeps({
|
|
581
|
+
listIssues: vi.fn().mockResolvedValue([parentIssue]),
|
|
582
|
+
isParentIssue: vi.fn().mockResolvedValue(true),
|
|
583
|
+
dispatchWork,
|
|
584
|
+
// getSubIssues intentionally not provided
|
|
585
|
+
});
|
|
586
|
+
const governor = new WorkflowGovernor(makeConfig({
|
|
587
|
+
workflow: { workflow: makeWorkflowWithParallelism(), useBuiltinDefault: false },
|
|
588
|
+
}), deps);
|
|
589
|
+
const results = await governor.scanOnce();
|
|
590
|
+
// The action is counted as dispatched (the parallel group handler ran),
|
|
591
|
+
// but dispatchWork is NOT called for sub-issues since getSubIssues is missing
|
|
592
|
+
expect(results[0].actionsDispatched).toBe(1);
|
|
593
|
+
expect(dispatchWork).not.toHaveBeenCalled();
|
|
594
|
+
});
|
|
595
|
+
it('fan-in group completing advances parent to next phase', async () => {
|
|
596
|
+
const fanInWorkflow = {
|
|
597
|
+
apiVersion: 'v1.1',
|
|
598
|
+
kind: 'WorkflowDefinition',
|
|
599
|
+
metadata: { name: 'test-fan-in' },
|
|
600
|
+
phases: [
|
|
601
|
+
{ name: 'development', template: 'development' },
|
|
602
|
+
{ name: 'qa', template: 'qa' },
|
|
603
|
+
],
|
|
604
|
+
transitions: [
|
|
605
|
+
{ from: 'Backlog', to: 'development' },
|
|
606
|
+
{ from: 'Finished', to: 'qa' },
|
|
607
|
+
],
|
|
608
|
+
parallelism: [
|
|
609
|
+
{
|
|
610
|
+
name: 'dev-fan-in',
|
|
611
|
+
phases: ['development'],
|
|
612
|
+
strategy: 'fan-in',
|
|
613
|
+
waitForAll: true,
|
|
614
|
+
},
|
|
615
|
+
],
|
|
616
|
+
};
|
|
617
|
+
const parentIssue = makeIssue({
|
|
618
|
+
id: 'parent-1',
|
|
619
|
+
identifier: 'SUP-200',
|
|
620
|
+
status: 'Backlog',
|
|
621
|
+
});
|
|
622
|
+
const subIssues = [
|
|
623
|
+
makeIssue({ id: 'sub-1', identifier: 'SUP-201', status: 'Backlog', parentId: 'parent-1' }),
|
|
624
|
+
makeIssue({ id: 'sub-2', identifier: 'SUP-202', status: 'Backlog', parentId: 'parent-1' }),
|
|
625
|
+
makeIssue({ id: 'sub-3', identifier: 'SUP-203', status: 'Backlog', parentId: 'parent-1' }),
|
|
626
|
+
];
|
|
627
|
+
const dispatchWork = vi.fn().mockResolvedValue(undefined);
|
|
628
|
+
const getSubIssues = vi.fn().mockResolvedValue(subIssues);
|
|
629
|
+
const deps = makeMockDeps({
|
|
630
|
+
listIssues: vi.fn().mockResolvedValue([parentIssue]),
|
|
631
|
+
isParentIssue: vi.fn().mockResolvedValue(true),
|
|
632
|
+
dispatchWork,
|
|
633
|
+
getSubIssues,
|
|
634
|
+
});
|
|
635
|
+
const governor = new WorkflowGovernor(makeConfig({
|
|
636
|
+
workflow: { workflow: fanInWorkflow, useBuiltinDefault: false },
|
|
637
|
+
}), deps);
|
|
638
|
+
const results = await governor.scanOnce();
|
|
639
|
+
expect(results[0].actionsDispatched).toBe(1);
|
|
640
|
+
// All 3 sub-issues dispatched + 1 parent advancement to QA
|
|
641
|
+
expect(dispatchWork).toHaveBeenCalledTimes(4);
|
|
642
|
+
// Sub-issues dispatched for development
|
|
643
|
+
expect(dispatchWork).toHaveBeenCalledWith(expect.objectContaining({ id: 'sub-1' }), 'trigger-development');
|
|
644
|
+
expect(dispatchWork).toHaveBeenCalledWith(expect.objectContaining({ id: 'sub-2' }), 'trigger-development');
|
|
645
|
+
expect(dispatchWork).toHaveBeenCalledWith(expect.objectContaining({ id: 'sub-3' }), 'trigger-development');
|
|
646
|
+
// Parent advanced to QA after all fan-in tasks completed
|
|
647
|
+
expect(dispatchWork).toHaveBeenCalledWith(expect.objectContaining({ id: 'parent-1' }), 'trigger-qa');
|
|
648
|
+
});
|
|
649
|
+
it('non-parent issues with parallelism groups dispatch normally', async () => {
|
|
650
|
+
const issue = makeIssue({
|
|
651
|
+
id: 'issue-1',
|
|
652
|
+
identifier: 'SUP-100',
|
|
653
|
+
status: 'Backlog',
|
|
654
|
+
});
|
|
655
|
+
const dispatchWork = vi.fn().mockResolvedValue(undefined);
|
|
656
|
+
const deps = makeMockDeps({
|
|
657
|
+
listIssues: vi.fn().mockResolvedValue([issue]),
|
|
658
|
+
isParentIssue: vi.fn().mockResolvedValue(false),
|
|
659
|
+
dispatchWork,
|
|
660
|
+
});
|
|
661
|
+
const governor = new WorkflowGovernor(makeConfig({
|
|
662
|
+
workflow: { workflow: makeWorkflowWithParallelism(), useBuiltinDefault: false },
|
|
663
|
+
}), deps);
|
|
664
|
+
const results = await governor.scanOnce();
|
|
665
|
+
expect(results[0].actionsDispatched).toBe(1);
|
|
666
|
+
// Normal dispatch, not parallel
|
|
667
|
+
expect(dispatchWork).toHaveBeenCalledWith(expect.objectContaining({ id: 'issue-1' }), 'trigger-development');
|
|
668
|
+
});
|
|
669
|
+
});
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,aAAa,CAAA;AAC3B,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,aAAa,CAAA;AAC3B,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA"}
|
package/dist/src/index.js
CHANGED
|
@@ -20,6 +20,8 @@ export interface IssueTrackerIssue {
|
|
|
20
20
|
labels: string[];
|
|
21
21
|
teamName?: string;
|
|
22
22
|
projectName?: string;
|
|
23
|
+
/** Parent issue ID, if this issue is a sub-issue. Used to filter child issues from backlog scans. */
|
|
24
|
+
parentId?: string;
|
|
23
25
|
}
|
|
24
26
|
/**
|
|
25
27
|
* Configuration for creating an issue tracker session.
|
|
@@ -70,6 +72,8 @@ export interface IssueTrackerClient {
|
|
|
70
72
|
getIssue(idOrIdentifier: string): Promise<IssueTrackerIssue>;
|
|
71
73
|
/** Check whether an issue has sub-issues (is a parent) */
|
|
72
74
|
isParentIssue(issueId: string): Promise<boolean>;
|
|
75
|
+
/** Check whether an issue is a sub-issue (has a parent) */
|
|
76
|
+
isChildIssue(issueId: string): Promise<boolean>;
|
|
73
77
|
/** Create a comment on an issue */
|
|
74
78
|
createComment(issueId: string, body: string): Promise<{
|
|
75
79
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue-tracker-client.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/issue-tracker-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"issue-tracker-client.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/issue-tracker-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmCH,OAAO,KAAK,EAAE,aAAa,EAA0B,MAAM,iBAAiB,CAAA;AAa5E,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAElB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,2BAA2B,EAC5B,MAAM,YAAY,CAAA;AAmBnB;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CA6B1E;AA2vBD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,aAAa,GACtB,MAAM,CAGR;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,aAAa,CAerI;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAOtB;IACD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuC;IACpE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsC;IACnE,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmD;IACjF,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8C;IAC5E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA+D;IAEhG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiC;IAEhE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0C;IAE3E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiC;IAE9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0C;IAE3E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyC;IAEzE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwC;IACvE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyC;IAEzE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAyB;IAE1D,OAAO,CAAC,eAAe,CAAC,CAAU;IAElC,OAAO,CAAC,UAAU,CAAC,CAAkB;IAErC,OAAO,CAAC,YAAY,CAAC,CAAwB;IAE7C,OAAO,CAAC,WAAW,CAAC,CAAU;IAE9B,OAAO,CAAC,SAAS,CAAC,CAAQ;IAE1B,OAAO,CAAC,cAAc,CAAC,CAAQ;IAE/B,OAAO,CAAC,YAAY,CAAC,CAAQ;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAQ;IAC5B,OAAO,CAAC,eAAe,CAAC,CAAQ;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAE3C,OAAO,CAAC,iBAAiB,CAAC,CAAqD;IAE/E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;gBAEpB,MAAM,GAAE,kBAAuB,EAAE,MAAM,GAAE,kBAAuB;IAoJ5E;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;;;;;;OAOG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAKjF;;OAEG;IACG,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1062,6 +1062,11 @@ export class AgentOrchestrator {
|
|
|
1062
1062
|
for (const issue of allIssues) {
|
|
1063
1063
|
if (results.length >= maxIssues)
|
|
1064
1064
|
break;
|
|
1065
|
+
// Skip sub-issues — coordinators manage their lifecycle, not the backlog scanner
|
|
1066
|
+
if (issue.parentId) {
|
|
1067
|
+
console.log(`[orchestrator] Skipping sub-issue ${issue.identifier} — managed by parent coordinator`);
|
|
1068
|
+
continue;
|
|
1069
|
+
}
|
|
1065
1070
|
// Filter by allowedProjects from .agentfactory/config.yaml
|
|
1066
1071
|
if (this.allowedProjects && this.allowedProjects.length > 0) {
|
|
1067
1072
|
if (!issue.projectName || !this.allowedProjects.includes(issue.projectName)) {
|
|
@@ -2968,6 +2973,25 @@ ORCHESTRATOR_INSTALL=1 exec pnpm add "$@"
|
|
|
2968
2973
|
throw new Error(`Issue ${identifier} is in terminal status '${currentStatus}' — skipping ${workType ?? 'auto'} work. ` +
|
|
2969
2974
|
`The issue was likely accepted/canceled after being queued.`);
|
|
2970
2975
|
}
|
|
2976
|
+
// Guard: skip sub-issues that should be managed by a coordinator, not spawned independently.
|
|
2977
|
+
// Only applies when no explicit work type is provided (i.e., orchestrator auto-pickup).
|
|
2978
|
+
// Coordinators spawning sub-agents always pass an explicit work type, so they bypass this check.
|
|
2979
|
+
if (!workType) {
|
|
2980
|
+
try {
|
|
2981
|
+
const isChild = await this.client.isChildIssue(issueId);
|
|
2982
|
+
if (isChild) {
|
|
2983
|
+
throw new Error(`Issue ${identifier} is a sub-issue managed by a parent coordinator — skipping independent pickup. ` +
|
|
2984
|
+
`Sub-issues should only be processed by their parent's coordination agent.`);
|
|
2985
|
+
}
|
|
2986
|
+
}
|
|
2987
|
+
catch (err) {
|
|
2988
|
+
// Re-throw our own guard error; swallow API errors so we don't block on transient failures
|
|
2989
|
+
if (err instanceof Error && err.message.includes('managed by a parent coordinator')) {
|
|
2990
|
+
throw err;
|
|
2991
|
+
}
|
|
2992
|
+
console.warn(`Failed to check child status for ${identifier}:`, err);
|
|
2993
|
+
}
|
|
2994
|
+
}
|
|
2971
2995
|
// Defense in depth: re-validate git remote before spawning (guards against long-running instances)
|
|
2972
2996
|
if (this.config.repository) {
|
|
2973
2997
|
validateGitRemote(this.config.repository, this.gitRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-work-result.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/parse-work-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"parse-work-result.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/parse-work-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AA6GjD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,QAAQ,EAAE,aAAa,GACtB,eAAe,CAyCjB"}
|
|
@@ -91,6 +91,12 @@ const COORDINATION_FAIL_PATTERNS = [
|
|
|
91
91
|
// Explicit result labels
|
|
92
92
|
/\bCoordination\s+(?:Result|Status|Verdict):\s*\*{0,2}Fail(?:ed)?\*{0,2}/i,
|
|
93
93
|
/\bCoordination\s+Failed/i,
|
|
94
|
+
// Early-exit detection — agent reported progress instead of completing coordination
|
|
95
|
+
/\bI'll wait\b.*\bcomplete\b/i,
|
|
96
|
+
/\bagents?\s+(?:are|is)\s+(?:actively\s+)?(?:working|running|in\s+progress)\b/i,
|
|
97
|
+
/\bwork\s+is\s+in\s+progress\b/i,
|
|
98
|
+
/\bwait(?:ing)?\s+for\s+(?:them|sub-?\s*agents?|sub-?\s*issues?)\s+to\s+(?:complete|finish)\b/i,
|
|
99
|
+
/\bbefore\s+proceeding\s+to\s+(?:Layer|Wave|Phase)\s+\d/i,
|
|
94
100
|
];
|
|
95
101
|
/**
|
|
96
102
|
* Parse the agent's result message to determine whether the work passed or failed.
|
|
@@ -192,6 +192,25 @@ describe('parseWorkResult', () => {
|
|
|
192
192
|
it('checks fail patterns before pass patterns', () => {
|
|
193
193
|
expect(parseWorkResult('All 8/8 sub-issues completed.\n### Must Fix Before Merge\n1. Bad code', 'coordination')).toBe('failed');
|
|
194
194
|
});
|
|
195
|
+
// Early-exit detection — agent reported progress instead of completing
|
|
196
|
+
it('detects "I\'ll wait for them to complete" as early-exit fail', () => {
|
|
197
|
+
expect(parseWorkResult("Both agents are progressing well. I'll wait for them to complete before proceeding.", 'coordination')).toBe('failed');
|
|
198
|
+
});
|
|
199
|
+
it('detects "agents are actively working" as early-exit fail', () => {
|
|
200
|
+
expect(parseWorkResult('SUP-1552 agent has read the existing patterns. Agents are actively working on their sub-issues.', 'coordination')).toBe('failed');
|
|
201
|
+
});
|
|
202
|
+
it('detects "waiting for sub-agents to finish" as early-exit fail', () => {
|
|
203
|
+
expect(parseWorkResult('Spawned 2 agents. Waiting for sub-agents to finish their work.', 'coordination')).toBe('failed');
|
|
204
|
+
});
|
|
205
|
+
it('detects "before proceeding to Layer 2" as early-exit fail', () => {
|
|
206
|
+
expect(parseWorkResult('Wave 1 agents spawned. Will check results before proceeding to Layer 2.', 'coordination')).toBe('failed');
|
|
207
|
+
});
|
|
208
|
+
it('detects "work is in progress" as early-exit fail', () => {
|
|
209
|
+
expect(parseWorkResult('Work is in progress on 3 sub-issues. Status will be updated.', 'coordination')).toBe('failed');
|
|
210
|
+
});
|
|
211
|
+
it('early-exit patterns also apply to inflight-coordination', () => {
|
|
212
|
+
expect(parseWorkResult("Agents are actively running. I'll wait for them to complete.", 'inflight-coordination')).toBe('failed');
|
|
213
|
+
});
|
|
195
214
|
});
|
|
196
215
|
// QA coordination with real agent output formats
|
|
197
216
|
describe('QA coordination real-world patterns', () => {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Creates provider instances based on name.
|
|
5
5
|
* Supports provider selection via env vars, config, labels, and mentions.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* Sync resolution order (highest → lowest):
|
|
8
8
|
* 1. Issue label override (provider:codex)
|
|
9
9
|
* 2. Mention context override ("use codex", "@codex")
|
|
10
10
|
* 3. Config providers.byWorkType
|
|
@@ -14,6 +14,18 @@
|
|
|
14
14
|
* 7. Config providers.default
|
|
15
15
|
* 8. Env var AGENT_PROVIDER
|
|
16
16
|
* 9. Hardcoded 'claude'
|
|
17
|
+
*
|
|
18
|
+
* Async resolution order (with MAB routing):
|
|
19
|
+
* 1. Issue label override (provider:codex) — explicit human override
|
|
20
|
+
* 2. Mention context override ("use codex") — explicit human override
|
|
21
|
+
* 3. Config providers.byWorkType — static config
|
|
22
|
+
* 4. Config providers.byProject — static config
|
|
23
|
+
* 5. MAB-based intelligent routing — learned routing (feature-flagged)
|
|
24
|
+
* 6. Env var AGENT_PROVIDER_{WORKTYPE} — static fallback
|
|
25
|
+
* 7. Env var AGENT_PROVIDER_{PROJECT} — static fallback
|
|
26
|
+
* 8. Config providers.default — static fallback
|
|
27
|
+
* 9. Env var AGENT_PROVIDER — static fallback
|
|
28
|
+
* 10. Hardcoded 'claude' — ultimate fallback
|
|
17
29
|
*/
|
|
18
30
|
export type { AgentProviderName, AgentProvider, AgentSpawnConfig, AgentHandle, AgentEvent } from './types.js';
|
|
19
31
|
export type { AgentInitEvent, AgentSystemEvent, AgentAssistantTextEvent, AgentToolUseEvent, AgentToolResultEvent, AgentToolProgressEvent, AgentResultEvent, AgentErrorEvent, AgentCostData, } from './types.js';
|
|
@@ -23,6 +35,8 @@ export { AmpProvider, createAmpProvider } from './amp-provider.js';
|
|
|
23
35
|
export { SpringAiProvider, createSpringAiProvider } from './spring-ai-provider.js';
|
|
24
36
|
export { A2aProvider, createA2aProvider } from './a2a-provider.js';
|
|
25
37
|
import type { AgentProvider, AgentProviderName } from './types.js';
|
|
38
|
+
import type { PosteriorStore } from '../routing/posterior-store.js';
|
|
39
|
+
import type { RoutingConfig } from '../routing/types.js';
|
|
26
40
|
/** Provider configuration from .agentfactory/config.yaml */
|
|
27
41
|
export interface ProvidersConfig {
|
|
28
42
|
/** Default provider for all agents */
|
|
@@ -50,6 +64,20 @@ export interface ProviderResolutionResult {
|
|
|
50
64
|
name: AgentProviderName;
|
|
51
65
|
source: string;
|
|
52
66
|
}
|
|
67
|
+
/** Context for MAB-based routing in async provider resolution */
|
|
68
|
+
export interface RoutingContext {
|
|
69
|
+
/** Posterior store instance (from server) for reading MAB posteriors */
|
|
70
|
+
posteriorStore?: PosteriorStore;
|
|
71
|
+
/** Routing configuration (from repo config) */
|
|
72
|
+
routingConfig?: RoutingConfig;
|
|
73
|
+
/** Providers to consider for MAB selection (defaults to all valid providers) */
|
|
74
|
+
availableProviders?: AgentProviderName[];
|
|
75
|
+
}
|
|
76
|
+
/** Extended resolution context for async provider resolution with MAB routing */
|
|
77
|
+
export interface AsyncProviderResolutionContext extends ProviderResolutionContext {
|
|
78
|
+
/** Optional routing context for MAB-based intelligent routing */
|
|
79
|
+
routingContext?: RoutingContext;
|
|
80
|
+
}
|
|
53
81
|
export declare const PROVIDER_ALIASES: Record<string, AgentProviderName>;
|
|
54
82
|
/**
|
|
55
83
|
* Create a provider instance by name.
|
|
@@ -96,5 +124,40 @@ export declare function resolveProviderWithSource(context?: ProviderResolutionCo
|
|
|
96
124
|
* @returns The resolved provider name
|
|
97
125
|
*/
|
|
98
126
|
export declare function resolveProviderName(options?: ProviderResolutionContext): AgentProviderName;
|
|
127
|
+
/**
|
|
128
|
+
* Async version of resolveProviderWithSource() that includes MAB-based
|
|
129
|
+
* intelligent routing as tier 5 in the cascade.
|
|
130
|
+
*
|
|
131
|
+
* Resolution order (highest → lowest):
|
|
132
|
+
* 1. Issue label override (provider:codex) — explicit human override
|
|
133
|
+
* 2. Mention context override ("use codex") — explicit human override
|
|
134
|
+
* 3. Config providers.byWorkType — static config
|
|
135
|
+
* 4. Config providers.byProject — static config
|
|
136
|
+
* 5. MAB-based intelligent routing — learned routing (feature-flagged)
|
|
137
|
+
* 6. Env var AGENT_PROVIDER_{WORKTYPE} — static fallback
|
|
138
|
+
* 7. Env var AGENT_PROVIDER_{PROJECT} — static fallback
|
|
139
|
+
* 8. Config providers.default — static fallback
|
|
140
|
+
* 9. Env var AGENT_PROVIDER — static fallback
|
|
141
|
+
* 10. Hardcoded 'claude' — ultimate fallback
|
|
142
|
+
*
|
|
143
|
+
* MAB routing (tier 5) only activates when:
|
|
144
|
+
* - routingContext.posteriorStore is provided
|
|
145
|
+
* - routingContext.routingConfig?.enabled is true
|
|
146
|
+
* - context.workType is defined
|
|
147
|
+
*
|
|
148
|
+
* If selectProvider() throws or returns low confidence, falls through silently.
|
|
149
|
+
*
|
|
150
|
+
* @param context - Full resolution context including optional routing context
|
|
151
|
+
* @returns The resolved provider name and its source
|
|
152
|
+
*/
|
|
153
|
+
export declare function resolveProviderWithSourceAsync(context?: AsyncProviderResolutionContext): Promise<ProviderResolutionResult>;
|
|
154
|
+
/**
|
|
155
|
+
* Async version of resolveProviderName() that includes MAB-based
|
|
156
|
+
* intelligent routing.
|
|
157
|
+
*
|
|
158
|
+
* @param options - Resolution context including optional routing context
|
|
159
|
+
* @returns The resolved provider name
|
|
160
|
+
*/
|
|
161
|
+
export declare function resolveProviderNameAsync(options?: AsyncProviderResolutionContext): Promise<AgentProviderName>;
|
|
99
162
|
export declare function isValidProviderName(name: string): name is AgentProviderName;
|
|
100
163
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Creates provider instances based on name.
|
|
5
5
|
* Supports provider selection via env vars, config, labels, and mentions.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* Sync resolution order (highest → lowest):
|
|
8
8
|
* 1. Issue label override (provider:codex)
|
|
9
9
|
* 2. Mention context override ("use codex", "@codex")
|
|
10
10
|
* 3. Config providers.byWorkType
|
|
@@ -14,6 +14,18 @@
|
|
|
14
14
|
* 7. Config providers.default
|
|
15
15
|
* 8. Env var AGENT_PROVIDER
|
|
16
16
|
* 9. Hardcoded 'claude'
|
|
17
|
+
*
|
|
18
|
+
* Async resolution order (with MAB routing):
|
|
19
|
+
* 1. Issue label override (provider:codex) — explicit human override
|
|
20
|
+
* 2. Mention context override ("use codex") — explicit human override
|
|
21
|
+
* 3. Config providers.byWorkType — static config
|
|
22
|
+
* 4. Config providers.byProject — static config
|
|
23
|
+
* 5. MAB-based intelligent routing — learned routing (feature-flagged)
|
|
24
|
+
* 6. Env var AGENT_PROVIDER_{WORKTYPE} — static fallback
|
|
25
|
+
* 7. Env var AGENT_PROVIDER_{PROJECT} — static fallback
|
|
26
|
+
* 8. Config providers.default — static fallback
|
|
27
|
+
* 9. Env var AGENT_PROVIDER — static fallback
|
|
28
|
+
* 10. Hardcoded 'claude' — ultimate fallback
|
|
17
29
|
*/
|
|
18
30
|
export { ClaudeProvider, createClaudeProvider } from './claude-provider.js';
|
|
19
31
|
export { CodexProvider, createCodexProvider } from './codex-provider.js';
|
|
@@ -25,6 +37,7 @@ import { CodexProvider } from './codex-provider.js';
|
|
|
25
37
|
import { AmpProvider } from './amp-provider.js';
|
|
26
38
|
import { SpringAiProvider } from './spring-ai-provider.js';
|
|
27
39
|
import { A2aProvider } from './a2a-provider.js';
|
|
40
|
+
import { logger } from '../logger.js';
|
|
28
41
|
// ---------------------------------------------------------------------------
|
|
29
42
|
// Aliases — friendly names that map to real provider names
|
|
30
43
|
// ---------------------------------------------------------------------------
|
|
@@ -200,6 +213,124 @@ export function resolveProviderName(options) {
|
|
|
200
213
|
return resolveProviderWithSource(options).name;
|
|
201
214
|
}
|
|
202
215
|
// ---------------------------------------------------------------------------
|
|
216
|
+
// Async provider resolution (with MAB routing)
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
/**
|
|
219
|
+
* Async version of resolveProviderWithSource() that includes MAB-based
|
|
220
|
+
* intelligent routing as tier 5 in the cascade.
|
|
221
|
+
*
|
|
222
|
+
* Resolution order (highest → lowest):
|
|
223
|
+
* 1. Issue label override (provider:codex) — explicit human override
|
|
224
|
+
* 2. Mention context override ("use codex") — explicit human override
|
|
225
|
+
* 3. Config providers.byWorkType — static config
|
|
226
|
+
* 4. Config providers.byProject — static config
|
|
227
|
+
* 5. MAB-based intelligent routing — learned routing (feature-flagged)
|
|
228
|
+
* 6. Env var AGENT_PROVIDER_{WORKTYPE} — static fallback
|
|
229
|
+
* 7. Env var AGENT_PROVIDER_{PROJECT} — static fallback
|
|
230
|
+
* 8. Config providers.default — static fallback
|
|
231
|
+
* 9. Env var AGENT_PROVIDER — static fallback
|
|
232
|
+
* 10. Hardcoded 'claude' — ultimate fallback
|
|
233
|
+
*
|
|
234
|
+
* MAB routing (tier 5) only activates when:
|
|
235
|
+
* - routingContext.posteriorStore is provided
|
|
236
|
+
* - routingContext.routingConfig?.enabled is true
|
|
237
|
+
* - context.workType is defined
|
|
238
|
+
*
|
|
239
|
+
* If selectProvider() throws or returns low confidence, falls through silently.
|
|
240
|
+
*
|
|
241
|
+
* @param context - Full resolution context including optional routing context
|
|
242
|
+
* @returns The resolved provider name and its source
|
|
243
|
+
*/
|
|
244
|
+
export async function resolveProviderWithSourceAsync(context) {
|
|
245
|
+
// 1. Issue label override
|
|
246
|
+
if (context?.labels?.length) {
|
|
247
|
+
const fromLabel = extractProviderFromLabels(context.labels);
|
|
248
|
+
if (fromLabel) {
|
|
249
|
+
return { name: fromLabel, source: `label provider:${fromLabel}` };
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// 2. Mention context override
|
|
253
|
+
if (context?.mentionContext) {
|
|
254
|
+
const fromMention = extractProviderFromMention(context.mentionContext);
|
|
255
|
+
if (fromMention) {
|
|
256
|
+
return { name: fromMention, source: `mention "${context.mentionContext.substring(0, 30)}"` };
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// 3. Config byWorkType
|
|
260
|
+
if (context?.workType && context?.configProviders?.byWorkType) {
|
|
261
|
+
const configWorkType = context.configProviders.byWorkType[context.workType];
|
|
262
|
+
if (configWorkType && isValidProviderName(configWorkType)) {
|
|
263
|
+
return { name: configWorkType, source: `config providers.byWorkType.${context.workType}` };
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// 4. Config byProject
|
|
267
|
+
if (context?.project && context?.configProviders?.byProject) {
|
|
268
|
+
const configProject = context.configProviders.byProject[context.project];
|
|
269
|
+
if (configProject && isValidProviderName(configProject)) {
|
|
270
|
+
return { name: configProject, source: `config providers.byProject.${context.project}` };
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// 5. MAB-based intelligent routing (feature-flagged)
|
|
274
|
+
if (context?.routingContext?.posteriorStore &&
|
|
275
|
+
context?.routingContext?.routingConfig?.enabled &&
|
|
276
|
+
context?.workType) {
|
|
277
|
+
try {
|
|
278
|
+
const { selectProvider } = await import('../routing/routing-engine.js');
|
|
279
|
+
const availableProviders = context.routingContext.availableProviders ?? VALID_PROVIDER_NAMES;
|
|
280
|
+
const decision = await selectProvider(context.routingContext.posteriorStore, context.workType, availableProviders, context.routingContext.routingConfig);
|
|
281
|
+
// Only use MAB decision if confidence exceeds a meaningful threshold
|
|
282
|
+
// and it's not purely exploratory due to uncertainty
|
|
283
|
+
if (decision.confidence > 0 && decision.explorationReason !== 'uncertainty') {
|
|
284
|
+
return { name: decision.selectedProvider, source: 'mab-routing' };
|
|
285
|
+
}
|
|
286
|
+
// Low confidence or uncertainty-driven exploration — fall through to static fallbacks
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
logger.warn('MAB routing failed, falling through to static fallbacks', {
|
|
290
|
+
error: err instanceof Error ? err.message : String(err),
|
|
291
|
+
workType: context.workType,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// 6. Env var AGENT_PROVIDER_{WORKTYPE}
|
|
296
|
+
if (context?.workType) {
|
|
297
|
+
const workTypeKey = `AGENT_PROVIDER_${context.workType.toUpperCase().replace(/-/g, '_')}`;
|
|
298
|
+
const workTypeProvider = process.env[workTypeKey];
|
|
299
|
+
if (workTypeProvider && isValidProviderName(workTypeProvider)) {
|
|
300
|
+
return { name: workTypeProvider, source: `env ${workTypeKey}` };
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// 7. Env var AGENT_PROVIDER_{PROJECT}
|
|
304
|
+
if (context?.project) {
|
|
305
|
+
const projectKey = `AGENT_PROVIDER_${context.project.toUpperCase()}`;
|
|
306
|
+
const projectProvider = process.env[projectKey];
|
|
307
|
+
if (projectProvider && isValidProviderName(projectProvider)) {
|
|
308
|
+
return { name: projectProvider, source: `env ${projectKey}` };
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// 8. Config providers.default
|
|
312
|
+
if (context?.configProviders?.default && isValidProviderName(context.configProviders.default)) {
|
|
313
|
+
return { name: context.configProviders.default, source: 'config providers.default' };
|
|
314
|
+
}
|
|
315
|
+
// 9. Env var AGENT_PROVIDER
|
|
316
|
+
const globalProvider = process.env.AGENT_PROVIDER;
|
|
317
|
+
if (globalProvider && isValidProviderName(globalProvider)) {
|
|
318
|
+
return { name: globalProvider, source: 'env AGENT_PROVIDER' };
|
|
319
|
+
}
|
|
320
|
+
// 10. Hardcoded fallback
|
|
321
|
+
return { name: 'claude', source: 'default' };
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Async version of resolveProviderName() that includes MAB-based
|
|
325
|
+
* intelligent routing.
|
|
326
|
+
*
|
|
327
|
+
* @param options - Resolution context including optional routing context
|
|
328
|
+
* @returns The resolved provider name
|
|
329
|
+
*/
|
|
330
|
+
export async function resolveProviderNameAsync(options) {
|
|
331
|
+
return (await resolveProviderWithSourceAsync(options)).name;
|
|
332
|
+
}
|
|
333
|
+
// ---------------------------------------------------------------------------
|
|
203
334
|
// Internal helpers
|
|
204
335
|
// ---------------------------------------------------------------------------
|
|
205
336
|
const VALID_PROVIDER_NAMES = ['claude', 'codex', 'amp', 'spring-ai', 'a2a'];
|