@developerz.ai/aitm 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +30 -0
- package/dist/agent-config/agent-config-detector.d.ts +15 -0
- package/dist/agent-config/agent-config-detector.js +56 -0
- package/dist/agent-config/agent-config-detector.js.map +1 -0
- package/dist/cli/args.d.ts +37 -0
- package/dist/cli/args.js +238 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/cli.d.ts +15 -0
- package/dist/cli/cli.js +113 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/commands.d.ts +83 -0
- package/dist/cli/commands.js +521 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/compaction/compactor.d.ts +20 -0
- package/dist/compaction/compactor.js +75 -0
- package/dist/compaction/compactor.js.map +1 -0
- package/dist/config/config-loader.d.ts +25 -0
- package/dist/config/config-loader.js +275 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-writer.d.ts +14 -0
- package/dist/config/config-writer.js +178 -0
- package/dist/config/config-writer.js.map +1 -0
- package/dist/config/schema.d.ts +85 -0
- package/dist/config/schema.js +38 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/credentials/credentials.d.ts +15 -0
- package/dist/credentials/credentials.js +58 -0
- package/dist/credentials/credentials.js.map +1 -0
- package/dist/credentials/defaults.d.ts +2 -0
- package/dist/credentials/defaults.js +21 -0
- package/dist/credentials/defaults.js.map +1 -0
- package/dist/fs/atomic-write.d.ts +1 -0
- package/dist/fs/atomic-write.js +27 -0
- package/dist/fs/atomic-write.js.map +1 -0
- package/dist/github/errors.d.ts +18 -0
- package/dist/github/errors.js +20 -0
- package/dist/github/errors.js.map +1 -0
- package/dist/github/github-client.d.ts +47 -0
- package/dist/github/github-client.js +417 -0
- package/dist/github/github-client.js.map +1 -0
- package/dist/github/schema.d.ts +44 -0
- package/dist/github/schema.js +23 -0
- package/dist/github/schema.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/logger.d.ts +36 -0
- package/dist/logger/logger.js +123 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/loop/run-loop-adapter.d.ts +46 -0
- package/dist/loop/run-loop-adapter.js +270 -0
- package/dist/loop/run-loop-adapter.js.map +1 -0
- package/dist/loop/take-over-flow.d.ts +57 -0
- package/dist/loop/take-over-flow.js +183 -0
- package/dist/loop/take-over-flow.js.map +1 -0
- package/dist/loop/work-loop.d.ts +95 -0
- package/dist/loop/work-loop.js +211 -0
- package/dist/loop/work-loop.js.map +1 -0
- package/dist/mcp/mcp-client.d.ts +27 -0
- package/dist/mcp/mcp-client.js +123 -0
- package/dist/mcp/mcp-client.js.map +1 -0
- package/dist/mcp/schema.d.ts +53 -0
- package/dist/mcp/schema.js +39 -0
- package/dist/mcp/schema.js.map +1 -0
- package/dist/openrouter/client.d.ts +28 -0
- package/dist/openrouter/client.js +40 -0
- package/dist/openrouter/client.js.map +1 -0
- package/dist/openrouter/model-limits.d.ts +21 -0
- package/dist/openrouter/model-limits.js +39 -0
- package/dist/openrouter/model-limits.js.map +1 -0
- package/dist/openrouter/server-tools.d.ts +35 -0
- package/dist/openrouter/server-tools.js +25 -0
- package/dist/openrouter/server-tools.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +60 -0
- package/dist/orchestrator/orchestrator.js +180 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/subagent-tools.d.ts +44 -0
- package/dist/orchestrator/subagent-tools.js +133 -0
- package/dist/orchestrator/subagent-tools.js.map +1 -0
- package/dist/orchestrator/system-prompts.d.ts +4 -0
- package/dist/orchestrator/system-prompts.js +78 -0
- package/dist/orchestrator/system-prompts.js.map +1 -0
- package/dist/plan/plan-graph.d.ts +11 -0
- package/dist/plan/plan-graph.js +69 -0
- package/dist/plan/plan-graph.js.map +1 -0
- package/dist/plan/schema.d.ts +30 -0
- package/dist/plan/schema.js +24 -0
- package/dist/plan/schema.js.map +1 -0
- package/dist/state/schema.d.ts +88 -0
- package/dist/state/schema.js +53 -0
- package/dist/state/schema.js.map +1 -0
- package/dist/state/state-store.d.ts +16 -0
- package/dist/state/state-store.js +129 -0
- package/dist/state/state-store.js.map +1 -0
- package/dist/subagents/factory.d.ts +8 -0
- package/dist/subagents/factory.js +10 -0
- package/dist/subagents/factory.js.map +1 -0
- package/dist/subagents/planner.d.ts +31 -0
- package/dist/subagents/planner.js +83 -0
- package/dist/subagents/planner.js.map +1 -0
- package/dist/subagents/reviewer.d.ts +60 -0
- package/dist/subagents/reviewer.js +159 -0
- package/dist/subagents/reviewer.js.map +1 -0
- package/dist/subagents/worker.d.ts +71 -0
- package/dist/subagents/worker.js +180 -0
- package/dist/subagents/worker.js.map +1 -0
- package/dist/testing/temp-repo.d.ts +7 -0
- package/dist/testing/temp-repo.js +21 -0
- package/dist/testing/temp-repo.js.map +1 -0
- package/dist/tools/datetime.d.ts +12 -0
- package/dist/tools/datetime.js +42 -0
- package/dist/tools/datetime.js.map +1 -0
- package/dist/tools/fetch-html.d.ts +32 -0
- package/dist/tools/fetch-html.js +139 -0
- package/dist/tools/fetch-html.js.map +1 -0
- package/dist/tools/github-thread-tool.d.ts +10 -0
- package/dist/tools/github-thread-tool.js +36 -0
- package/dist/tools/github-thread-tool.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +31 -0
- package/dist/tools/web-fetch.js +223 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/workspace/worktree-pool.d.ts +21 -0
- package/dist/workspace/worktree-pool.js +104 -0
- package/dist/workspace/worktree-pool.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-loop-adapter.js","sourceRoot":"","sources":["../../src/loop/run-loop-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { LanguageModel } from 'ai';
|
|
2
|
+
import type { MergeMethod } from '../github/github-client.ts';
|
|
3
|
+
import type { CheckStatus, ReviewThread } from '../github/schema.ts';
|
|
4
|
+
import type { LoggerLike } from '../logger/logger.ts';
|
|
5
|
+
import type { PrGroup } from '../state/schema.ts';
|
|
6
|
+
import { type ReviewerResult, type ReviewerTools } from '../subagents/reviewer.ts';
|
|
7
|
+
import { type WorkerResult, type WorkerTools } from '../subagents/worker.ts';
|
|
8
|
+
export type TakeOverGithub = {
|
|
9
|
+
waitForChecks(pr: number): Promise<CheckStatus>;
|
|
10
|
+
listUnresolvedThreads(pr: number): Promise<ReviewThread[]>;
|
|
11
|
+
mergePr(pr: number, method: MergeMethod): Promise<void>;
|
|
12
|
+
replyToThread(threadId: string, body: string): Promise<void>;
|
|
13
|
+
resolveThread(threadId: string): Promise<void>;
|
|
14
|
+
};
|
|
15
|
+
export type TakeOverSubagents = {
|
|
16
|
+
reviewerModel: LanguageModel;
|
|
17
|
+
reviewerTools: ReviewerTools;
|
|
18
|
+
workerModel: LanguageModel;
|
|
19
|
+
workerTools: WorkerTools;
|
|
20
|
+
styleContents: string;
|
|
21
|
+
runReviewerOverride?: (input: {
|
|
22
|
+
pr: number;
|
|
23
|
+
threads: ReviewThread[];
|
|
24
|
+
worktreePath: string;
|
|
25
|
+
styleContents: string;
|
|
26
|
+
}) => Promise<ReviewerResult>;
|
|
27
|
+
runWorkerOverride?: (input: {
|
|
28
|
+
group: PrGroup;
|
|
29
|
+
worktreePath: string;
|
|
30
|
+
baseBranch: string;
|
|
31
|
+
styleContents: string;
|
|
32
|
+
rollingContext: string;
|
|
33
|
+
}) => Promise<WorkerResult>;
|
|
34
|
+
};
|
|
35
|
+
export type TakeOverFlowInput = {
|
|
36
|
+
pr: number;
|
|
37
|
+
worktreePath: string;
|
|
38
|
+
baseBranch: string;
|
|
39
|
+
github: TakeOverGithub;
|
|
40
|
+
subagents: TakeOverSubagents;
|
|
41
|
+
mergeMethod: MergeMethod;
|
|
42
|
+
maxIterations?: number;
|
|
43
|
+
cooldownMs?: number;
|
|
44
|
+
sleep?: (ms: number) => Promise<void>;
|
|
45
|
+
push: (worktreePath: string) => Promise<void>;
|
|
46
|
+
logger?: LoggerLike;
|
|
47
|
+
};
|
|
48
|
+
export type TakeOverResult = {
|
|
49
|
+
kind: 'merged';
|
|
50
|
+
pr: number;
|
|
51
|
+
iterations: number;
|
|
52
|
+
} | {
|
|
53
|
+
kind: 'blocked';
|
|
54
|
+
reason: string;
|
|
55
|
+
iterations: number;
|
|
56
|
+
};
|
|
57
|
+
export declare function runTakeOverFlow(input: TakeOverFlowInput): Promise<TakeOverResult>;
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// Take-over merge flow. Drives an externally-built PR (Claude Code, gh pr create, etc.)
|
|
2
|
+
// to merge: waits for CI, runs Reviewer to address unresolved review threads (CodeRabbit
|
|
3
|
+
// + human reviewers), pushes fixes, and merges. Mirrors the claude-task-master
|
|
4
|
+
// `merge_pr()` shape from src/claude_task_master/cli_commands/fix_pr.py:
|
|
5
|
+
//
|
|
6
|
+
// for iteration in 0..maxIterations:
|
|
7
|
+
// status = waitForChecks(pr)
|
|
8
|
+
// threads = listUnresolvedThreads(pr)
|
|
9
|
+
// if status == success and threads.empty: break
|
|
10
|
+
// if status == failure: runWorker (CI-fix path, optional)
|
|
11
|
+
// if threads.any: runReviewer per thread, push commits
|
|
12
|
+
// sleep(cooldown) # let CI restart
|
|
13
|
+
// mergePr(pr)
|
|
14
|
+
//
|
|
15
|
+
// Unlike WorkLoop.autoMergeFlow, this does NOT acquire a `git worktree`. The user is
|
|
16
|
+
// expected to be on the PR branch in their cwd; everything happens in-place. That's
|
|
17
|
+
// the simpler model and matches how a human reviewer would handle it.
|
|
18
|
+
//
|
|
19
|
+
// docs/vendor/ai-sdk/chunk-09.md §"Subagents" — Reviewer/Worker are built ad-hoc per loop
|
|
20
|
+
// iteration because their tool bindings (worktree, threads) change each iteration.
|
|
21
|
+
import { composeSystemPrompt } from '@developerz.ai/ai-claude-compat';
|
|
22
|
+
import { CiFailed } from "../github/errors.js";
|
|
23
|
+
import { createReviewerAgent, REVIEWER_SYSTEM_PREFIX, runReviewer, } from "../subagents/reviewer.js";
|
|
24
|
+
import { createWorkerAgent, runWorker, WORKER_SYSTEM_PREFIX, } from "../subagents/worker.js";
|
|
25
|
+
const DEFAULT_MAX_ITERATIONS = 10;
|
|
26
|
+
const DEFAULT_COOLDOWN_MS = 5_000;
|
|
27
|
+
export async function runTakeOverFlow(input) {
|
|
28
|
+
const maxIterations = input.maxIterations ?? DEFAULT_MAX_ITERATIONS;
|
|
29
|
+
const cooldownMs = input.cooldownMs ?? DEFAULT_COOLDOWN_MS;
|
|
30
|
+
const sleep = input.sleep ?? defaultSleep;
|
|
31
|
+
const log = input.logger;
|
|
32
|
+
// Hoisted so the post-loop merge can report how many iterations actually ran: on an
|
|
33
|
+
// early `break` it holds the break index, on natural exhaustion it equals maxIterations.
|
|
34
|
+
let iteration = 0;
|
|
35
|
+
for (; iteration < maxIterations; iteration++) {
|
|
36
|
+
log?.info('take-over: iteration start', { pr: input.pr, iteration });
|
|
37
|
+
// 1. Wait for CI to settle. waitForChecks throws CiFailed on hard failure; we treat
|
|
38
|
+
// that as "Worker should try to fix" rather than a fatal error.
|
|
39
|
+
const ciStatus = await observeCheckStatus(input.github, input.pr);
|
|
40
|
+
log?.info('take-over: ci status', { pr: input.pr, ciStatus });
|
|
41
|
+
// 2. Pull review threads. Always runs — even on CI failure, threads may exist and
|
|
42
|
+
// fixing them might happen to fix CI too.
|
|
43
|
+
const threads = await input.github.listUnresolvedThreads(input.pr);
|
|
44
|
+
log?.info('take-over: threads', { pr: input.pr, count: threads.length });
|
|
45
|
+
if (ciStatus === 'success' && threads.length === 0) {
|
|
46
|
+
// Happy path: nothing left to do. Merge.
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
let pushedSomething = false;
|
|
50
|
+
if (ciStatus === 'failure' || ciStatus === 'cancelled') {
|
|
51
|
+
const fixed = await runWorkerCiFix(input);
|
|
52
|
+
if (fixed.kind === 'blocked') {
|
|
53
|
+
return { kind: 'blocked', reason: fixed.reason, iterations: iteration };
|
|
54
|
+
}
|
|
55
|
+
if (fixed.kind === 'error') {
|
|
56
|
+
return { kind: 'blocked', reason: `worker error: ${fixed.error}`, iterations: iteration };
|
|
57
|
+
}
|
|
58
|
+
pushedSomething = true;
|
|
59
|
+
}
|
|
60
|
+
if (threads.length > 0) {
|
|
61
|
+
const reviewed = await runReviewerThreads(input, threads);
|
|
62
|
+
if (reviewed.kind === 'blocked') {
|
|
63
|
+
return { kind: 'blocked', reason: reviewed.reason, iterations: iteration };
|
|
64
|
+
}
|
|
65
|
+
if (reviewed.kind === 'error') {
|
|
66
|
+
return {
|
|
67
|
+
kind: 'blocked',
|
|
68
|
+
reason: `reviewer error: ${reviewed.error}`,
|
|
69
|
+
iterations: iteration,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Reviewer commits per-thread fixes via the bash tool; we still need to push them.
|
|
73
|
+
if (reviewed.resolutions.some((r) => r.kind === 'fixed')) {
|
|
74
|
+
pushedSomething = true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (pushedSomething) {
|
|
78
|
+
await input.push(input.worktreePath);
|
|
79
|
+
log?.info('take-over: pushed fixes', { pr: input.pr });
|
|
80
|
+
}
|
|
81
|
+
// Sleep so the next iteration's waitForChecks sees fresh CI state, not the stale
|
|
82
|
+
// success/failure from before our push triggered a new run.
|
|
83
|
+
if (cooldownMs > 0)
|
|
84
|
+
await sleep(cooldownMs);
|
|
85
|
+
}
|
|
86
|
+
// Final state check — make sure we didn't fall through the loop with a hung iteration.
|
|
87
|
+
const finalStatus = await observeCheckStatus(input.github, input.pr);
|
|
88
|
+
const finalThreads = await input.github.listUnresolvedThreads(input.pr);
|
|
89
|
+
if (finalStatus !== 'success') {
|
|
90
|
+
return {
|
|
91
|
+
kind: 'blocked',
|
|
92
|
+
reason: `CI ${finalStatus} after ${maxIterations} iteration(s). Inspect the PR and re-run.`,
|
|
93
|
+
iterations: maxIterations,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (finalThreads.length > 0) {
|
|
97
|
+
return {
|
|
98
|
+
kind: 'blocked',
|
|
99
|
+
reason: `${finalThreads.length} unresolved thread(s) after ${maxIterations} iteration(s).`,
|
|
100
|
+
iterations: maxIterations,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
await input.github.mergePr(input.pr, input.mergeMethod);
|
|
104
|
+
log?.info('take-over: merged', { pr: input.pr });
|
|
105
|
+
return { kind: 'merged', pr: input.pr, iterations: iteration };
|
|
106
|
+
}
|
|
107
|
+
// Convert waitForChecks' throw-on-failure semantics into a status return so the loop can
|
|
108
|
+
// treat CI failure as a recoverable state.
|
|
109
|
+
async function observeCheckStatus(github, pr) {
|
|
110
|
+
try {
|
|
111
|
+
return await github.waitForChecks(pr);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
if (err instanceof CiFailed)
|
|
115
|
+
return 'failure';
|
|
116
|
+
throw err;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function runReviewerThreads(input, threads) {
|
|
120
|
+
if (input.subagents.runReviewerOverride) {
|
|
121
|
+
return input.subagents.runReviewerOverride({
|
|
122
|
+
pr: input.pr,
|
|
123
|
+
threads,
|
|
124
|
+
worktreePath: input.worktreePath,
|
|
125
|
+
styleContents: input.subagents.styleContents,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
const agent = createReviewerAgent({
|
|
129
|
+
model: input.subagents.reviewerModel,
|
|
130
|
+
tools: input.subagents.reviewerTools,
|
|
131
|
+
systemPrompt: composeSystemPrompt(input.subagents.styleContents, REVIEWER_SYSTEM_PREFIX, input.worktreePath),
|
|
132
|
+
});
|
|
133
|
+
return runReviewer(agent, {
|
|
134
|
+
pr: input.pr,
|
|
135
|
+
threads,
|
|
136
|
+
worktreePath: input.worktreePath,
|
|
137
|
+
styleContents: input.subagents.styleContents,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// Worker CI-fix path. Build a synthetic PR group whose only task is "fix CI on this PR",
|
|
141
|
+
// then run the regular Worker. Worker emits a FileManifest and runs per-file editors —
|
|
142
|
+
// suitable for "test failed, fix it" if Worker has enough context from the worktree.
|
|
143
|
+
async function runWorkerCiFix(input) {
|
|
144
|
+
const group = {
|
|
145
|
+
id: `takeover-ci-${input.pr}`,
|
|
146
|
+
title: `Fix CI failures on PR #${input.pr}`,
|
|
147
|
+
tasks: [
|
|
148
|
+
`Read the CI logs (via gh) and fix every failing check on PR #${input.pr}.`,
|
|
149
|
+
'Run the project test/lint commands locally to verify, then stage fixes.',
|
|
150
|
+
],
|
|
151
|
+
dependsOn: [],
|
|
152
|
+
branch: null,
|
|
153
|
+
pr: input.pr,
|
|
154
|
+
status: 'in-progress',
|
|
155
|
+
};
|
|
156
|
+
if (input.subagents.runWorkerOverride) {
|
|
157
|
+
return input.subagents.runWorkerOverride({
|
|
158
|
+
group,
|
|
159
|
+
worktreePath: input.worktreePath,
|
|
160
|
+
baseBranch: input.baseBranch,
|
|
161
|
+
styleContents: input.subagents.styleContents,
|
|
162
|
+
rollingContext: '',
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
const agent = createWorkerAgent({
|
|
166
|
+
model: input.subagents.workerModel,
|
|
167
|
+
tools: input.subagents.workerTools,
|
|
168
|
+
systemPrompt: composeSystemPrompt(input.subagents.styleContents, WORKER_SYSTEM_PREFIX, input.worktreePath),
|
|
169
|
+
});
|
|
170
|
+
return runWorker(agent, {
|
|
171
|
+
group,
|
|
172
|
+
worktreePath: input.worktreePath,
|
|
173
|
+
baseBranch: input.baseBranch,
|
|
174
|
+
styleContents: input.subagents.styleContents,
|
|
175
|
+
rollingContext: '',
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
function defaultSleep(ms) {
|
|
179
|
+
return new Promise((resolve) => {
|
|
180
|
+
setTimeout(resolve, ms);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=take-over-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"take-over-flow.js","sourceRoot":"","sources":["../../src/loop/take-over-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { MergeMethod } from '../github/github-client.ts';
|
|
2
|
+
import type { CheckStatus, PullRequest, ReviewThread } from '../github/schema.ts';
|
|
3
|
+
import type { PrGroup, RunState } from '../state/schema.ts';
|
|
4
|
+
import type { ReviewerResult } from '../subagents/reviewer.ts';
|
|
5
|
+
import type { WorkerDelivery, WorkerResult } from '../subagents/worker.ts';
|
|
6
|
+
import type { Worktree } from '../workspace/worktree-pool.ts';
|
|
7
|
+
export type WorkerInvocation = {
|
|
8
|
+
group: PrGroup;
|
|
9
|
+
worktree: Worktree;
|
|
10
|
+
baseBranch: string;
|
|
11
|
+
};
|
|
12
|
+
export type ReviewerInvocation = {
|
|
13
|
+
pr: number;
|
|
14
|
+
threads: ReviewThread[];
|
|
15
|
+
worktree: Worktree;
|
|
16
|
+
};
|
|
17
|
+
export type WorkLoopOrchestrator = {
|
|
18
|
+
runWorker(input: WorkerInvocation): Promise<WorkerResult>;
|
|
19
|
+
finalizeCommit(group: PrGroup, delivery: WorkerDelivery, worktreePath: string): Promise<string>;
|
|
20
|
+
openPr(group: PrGroup, delivery: WorkerDelivery, baseBranch: string): Promise<PullRequest>;
|
|
21
|
+
runReviewer(input: ReviewerInvocation): Promise<ReviewerResult>;
|
|
22
|
+
};
|
|
23
|
+
export type WorkLoopGithub = {
|
|
24
|
+
defaultBranch(): Promise<string>;
|
|
25
|
+
waitForChecks(pr: number): Promise<CheckStatus>;
|
|
26
|
+
listUnresolvedThreads(pr: number): Promise<ReviewThread[]>;
|
|
27
|
+
mergePr(pr: number, method: MergeMethod): Promise<void>;
|
|
28
|
+
};
|
|
29
|
+
export type WorkLoopPool = {
|
|
30
|
+
acquire(groupId: string, branch: string, baseBranch: string): Promise<Worktree>;
|
|
31
|
+
release(groupId: string): Promise<void>;
|
|
32
|
+
};
|
|
33
|
+
export type WorkLoopState = {
|
|
34
|
+
update(mutator: (s: RunState) => RunState): Promise<RunState>;
|
|
35
|
+
};
|
|
36
|
+
export type WorkLoopGraph = {
|
|
37
|
+
ready(): PrGroup[];
|
|
38
|
+
isComplete(): boolean;
|
|
39
|
+
};
|
|
40
|
+
export type WorkLoopDeps = {
|
|
41
|
+
orchestrator: WorkLoopOrchestrator;
|
|
42
|
+
github: WorkLoopGithub;
|
|
43
|
+
state: WorkLoopState;
|
|
44
|
+
pool: WorkLoopPool;
|
|
45
|
+
graph: WorkLoopGraph;
|
|
46
|
+
concurrency: number;
|
|
47
|
+
autoMerge: boolean;
|
|
48
|
+
maxSessions: number | null;
|
|
49
|
+
mergeMethod?: MergeMethod;
|
|
50
|
+
initialSessionCount?: number;
|
|
51
|
+
};
|
|
52
|
+
export type GroupOutcome = {
|
|
53
|
+
groupId: string;
|
|
54
|
+
status: 'merged';
|
|
55
|
+
pr: number;
|
|
56
|
+
} | {
|
|
57
|
+
groupId: string;
|
|
58
|
+
status: 'awaiting-pr';
|
|
59
|
+
pr: number;
|
|
60
|
+
} | {
|
|
61
|
+
groupId: string;
|
|
62
|
+
status: 'blocked';
|
|
63
|
+
reason: string;
|
|
64
|
+
};
|
|
65
|
+
export type WorkLoopResult = {
|
|
66
|
+
kind: 'success';
|
|
67
|
+
outcomes: GroupOutcome[];
|
|
68
|
+
} | {
|
|
69
|
+
kind: 'awaiting-pr';
|
|
70
|
+
prs: number[];
|
|
71
|
+
outcomes: GroupOutcome[];
|
|
72
|
+
} | {
|
|
73
|
+
kind: 'blocked';
|
|
74
|
+
reason: string;
|
|
75
|
+
outcomes: GroupOutcome[];
|
|
76
|
+
} | {
|
|
77
|
+
kind: 'session-cap';
|
|
78
|
+
outcomes: GroupOutcome[];
|
|
79
|
+
};
|
|
80
|
+
export declare class WorkLoop {
|
|
81
|
+
private readonly deps;
|
|
82
|
+
private readonly outcomes;
|
|
83
|
+
private sessionCount;
|
|
84
|
+
constructor(deps: WorkLoopDeps);
|
|
85
|
+
run(): Promise<WorkLoopResult>;
|
|
86
|
+
runGroup(group: PrGroup): Promise<void>;
|
|
87
|
+
private processGroup;
|
|
88
|
+
private persistAfterSideEffect;
|
|
89
|
+
private autoMergeFlow;
|
|
90
|
+
private sessionCapReached;
|
|
91
|
+
private nextBatchSize;
|
|
92
|
+
private markStatus;
|
|
93
|
+
private incrementSessionCount;
|
|
94
|
+
private finalResult;
|
|
95
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// docs/architecture.md (WorkLoop row), docs/commands/start.md §Flow
|
|
2
|
+
// Drives the Orchestrator group-by-group. Extended for concurrent execution:
|
|
3
|
+
//
|
|
4
|
+
// while !plan.isComplete():
|
|
5
|
+
// ready = planGraph.ready()
|
|
6
|
+
// batch = ready.slice(0, free worker slots)
|
|
7
|
+
// await Promise.all(batch.map(g => runGroup(g)))
|
|
8
|
+
//
|
|
9
|
+
// Each runGroup acquires a WorktreePool slot, runs Worker, and on PR open hands off to
|
|
10
|
+
// the merge-pr flow (CI wait + Reviewer + GitHubClient.mergePr).
|
|
11
|
+
//
|
|
12
|
+
// Deps are structural ports — concrete classes (Orchestrator, GitHubClient, StateStore,
|
|
13
|
+
// WorktreePool, PlanGraph) satisfy them at runtime; tests pass literal stubs.
|
|
14
|
+
import { CiFailed } from "../github/errors.js";
|
|
15
|
+
const DEFAULT_MERGE_METHOD = 'squash';
|
|
16
|
+
// Thrown when a state-write fails *after* an external side effect (openPr/mergePr) already
|
|
17
|
+
// succeeded. Carries the real outcome so runGroup doesn't roll the group back to 'blocked'
|
|
18
|
+
// and cause a retry to reopen/re-merge work that already landed.
|
|
19
|
+
class StateWriteAfterSuccess extends Error {
|
|
20
|
+
outcome;
|
|
21
|
+
cause;
|
|
22
|
+
constructor(outcome, cause) {
|
|
23
|
+
super(`state write failed after external success: ${cause instanceof Error ? cause.message : String(cause)}`);
|
|
24
|
+
this.outcome = outcome;
|
|
25
|
+
this.cause = cause;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export class WorkLoop {
|
|
29
|
+
deps;
|
|
30
|
+
outcomes = [];
|
|
31
|
+
sessionCount;
|
|
32
|
+
constructor(deps) {
|
|
33
|
+
this.deps = deps;
|
|
34
|
+
this.sessionCount = deps.initialSessionCount ?? 0;
|
|
35
|
+
}
|
|
36
|
+
async run() {
|
|
37
|
+
const { graph, maxSessions, concurrency } = this.deps;
|
|
38
|
+
while (!graph.isComplete()) {
|
|
39
|
+
if (this.sessionCapReached(maxSessions)) {
|
|
40
|
+
return { kind: 'session-cap', outcomes: this.outcomes.slice() };
|
|
41
|
+
}
|
|
42
|
+
const ready = graph.ready();
|
|
43
|
+
if (ready.length === 0)
|
|
44
|
+
break;
|
|
45
|
+
const batchSize = this.nextBatchSize(ready.length, concurrency, maxSessions);
|
|
46
|
+
if (batchSize === 0) {
|
|
47
|
+
return { kind: 'session-cap', outcomes: this.outcomes.slice() };
|
|
48
|
+
}
|
|
49
|
+
const batch = ready.slice(0, batchSize);
|
|
50
|
+
await this.incrementSessionCount(batch.length);
|
|
51
|
+
await Promise.all(batch.map((g) => this.runGroup(g)));
|
|
52
|
+
}
|
|
53
|
+
return this.finalResult();
|
|
54
|
+
}
|
|
55
|
+
// Run a single group end-to-end: worktree → Worker → (optionally) merge-pr inline.
|
|
56
|
+
async runGroup(group) {
|
|
57
|
+
const branch = group.branch ?? `aitm/${group.id}`;
|
|
58
|
+
let acquired = false;
|
|
59
|
+
try {
|
|
60
|
+
const baseBranch = await this.deps.github.defaultBranch();
|
|
61
|
+
await this.markStatus(group.id, 'in-progress', { branch });
|
|
62
|
+
const worktree = await this.deps.pool.acquire(group.id, branch, baseBranch);
|
|
63
|
+
acquired = true;
|
|
64
|
+
try {
|
|
65
|
+
await this.processGroup({ ...group, branch }, worktree, baseBranch);
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
await this.deps.pool.release(group.id);
|
|
69
|
+
acquired = false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
if (acquired) {
|
|
74
|
+
// best-effort release if processGroup itself threw before the inner finally ran;
|
|
75
|
+
// the inner finally would have run already in normal flow, so this is defensive.
|
|
76
|
+
try {
|
|
77
|
+
await this.deps.pool.release(group.id);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
/* swallow */
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (err instanceof StateWriteAfterSuccess) {
|
|
84
|
+
// External side effect (openPr/mergePr) already succeeded; persist failed.
|
|
85
|
+
// Keep the real outcome so a retry doesn't reopen or re-merge.
|
|
86
|
+
this.outcomes.push(err.outcome);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
90
|
+
try {
|
|
91
|
+
await this.markStatus(group.id, 'blocked');
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
/* swallow secondary failures */
|
|
95
|
+
}
|
|
96
|
+
this.outcomes.push({ groupId: group.id, status: 'blocked', reason });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async processGroup(group, worktree, baseBranch) {
|
|
100
|
+
const { orchestrator } = this.deps;
|
|
101
|
+
const workerResult = await orchestrator.runWorker({ group, worktree, baseBranch });
|
|
102
|
+
if (workerResult.kind !== 'ok') {
|
|
103
|
+
const reason = workerResult.kind === 'blocked' ? workerResult.reason : workerResult.error;
|
|
104
|
+
await this.markStatus(group.id, 'blocked');
|
|
105
|
+
this.outcomes.push({ groupId: group.id, status: 'blocked', reason });
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const delivery = workerResult.delivery;
|
|
109
|
+
await orchestrator.finalizeCommit(group, delivery, worktree.path);
|
|
110
|
+
const pr = await orchestrator.openPr(group, delivery, baseBranch);
|
|
111
|
+
// openPr already landed externally; if persistence fails here, surface the real
|
|
112
|
+
// outcome via StateWriteAfterSuccess so the outer catch doesn't flip us to 'blocked'.
|
|
113
|
+
await this.persistAfterSideEffect({ groupId: group.id, status: 'awaiting-pr', pr: pr.number }, () => this.markStatus(group.id, 'awaiting-pr', { pr: pr.number }));
|
|
114
|
+
if (!this.deps.autoMerge) {
|
|
115
|
+
this.outcomes.push({ groupId: group.id, status: 'awaiting-pr', pr: pr.number });
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
await this.autoMergeFlow(group, pr, worktree, baseBranch);
|
|
119
|
+
// mergePr already landed externally; same guard as above.
|
|
120
|
+
await this.persistAfterSideEffect({ groupId: group.id, status: 'merged', pr: pr.number }, () => this.markStatus(group.id, 'merged'));
|
|
121
|
+
this.outcomes.push({ groupId: group.id, status: 'merged', pr: pr.number });
|
|
122
|
+
}
|
|
123
|
+
// Run a state write that follows a successful external side effect. If the write throws,
|
|
124
|
+
// wrap the error in StateWriteAfterSuccess so callers don't roll the outcome back.
|
|
125
|
+
async persistAfterSideEffect(outcome, write) {
|
|
126
|
+
try {
|
|
127
|
+
await write();
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
throw new StateWriteAfterSuccess(outcome, err);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async autoMergeFlow(group, pr, worktree, baseBranch) {
|
|
134
|
+
const { orchestrator, github } = this.deps;
|
|
135
|
+
// CI: wait for checks. On failure, ask Worker to fix and re-check.
|
|
136
|
+
try {
|
|
137
|
+
await github.waitForChecks(pr.number);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
if (!(err instanceof CiFailed))
|
|
141
|
+
throw err;
|
|
142
|
+
const fix = await orchestrator.runWorker({ group, worktree, baseBranch });
|
|
143
|
+
if (fix.kind !== 'ok') {
|
|
144
|
+
const reason = fix.kind === 'blocked' ? fix.reason : fix.error;
|
|
145
|
+
throw new Error(`worker CI fix failed: ${reason}`);
|
|
146
|
+
}
|
|
147
|
+
await orchestrator.finalizeCommit(group, fix.delivery, worktree.path);
|
|
148
|
+
await github.waitForChecks(pr.number);
|
|
149
|
+
}
|
|
150
|
+
// Review: resolve any unresolved threads via Reviewer.
|
|
151
|
+
const threads = await github.listUnresolvedThreads(pr.number);
|
|
152
|
+
if (threads.length > 0) {
|
|
153
|
+
const review = await orchestrator.runReviewer({ pr: pr.number, threads, worktree });
|
|
154
|
+
if (review.kind !== 'ok') {
|
|
155
|
+
const reason = review.kind === 'blocked' ? review.reason : review.error;
|
|
156
|
+
throw new Error(`reviewer failed: ${reason}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
await github.mergePr(pr.number, this.deps.mergeMethod ?? DEFAULT_MERGE_METHOD);
|
|
160
|
+
}
|
|
161
|
+
sessionCapReached(maxSessions) {
|
|
162
|
+
return maxSessions !== null && this.sessionCount >= maxSessions;
|
|
163
|
+
}
|
|
164
|
+
nextBatchSize(readyCount, concurrency, maxSessions) {
|
|
165
|
+
const remaining = maxSessions !== null ? Math.max(0, maxSessions - this.sessionCount) : readyCount;
|
|
166
|
+
return Math.min(concurrency, readyCount, remaining);
|
|
167
|
+
}
|
|
168
|
+
async markStatus(id, status, patch = {}) {
|
|
169
|
+
// Status transitions do not bump sessionCount — that's owned by incrementSessionCount,
|
|
170
|
+
// which fires once per batch dispatch so the in-memory and persisted counters agree.
|
|
171
|
+
await this.deps.state.update((s) => ({
|
|
172
|
+
...s,
|
|
173
|
+
prGroups: s.prGroups.map((g) => (g.id === id ? { ...g, ...patch, status } : g)),
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
176
|
+
// Single source of truth for session counting: bump both the in-memory counter (used by
|
|
177
|
+
// run() to enforce maxSessions) and the persisted counter (used by reporting/resume) in
|
|
178
|
+
// one call. Drops in-memory if persistence fails so the two stay aligned.
|
|
179
|
+
async incrementSessionCount(by) {
|
|
180
|
+
if (by <= 0)
|
|
181
|
+
return;
|
|
182
|
+
this.sessionCount += by;
|
|
183
|
+
try {
|
|
184
|
+
await this.deps.state.update((s) => ({ ...s, sessionCount: s.sessionCount + by }));
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
this.sessionCount -= by;
|
|
188
|
+
throw err;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
finalResult() {
|
|
192
|
+
const blocked = this.outcomes.find((o) => o.status === 'blocked');
|
|
193
|
+
if (blocked) {
|
|
194
|
+
return {
|
|
195
|
+
kind: 'blocked',
|
|
196
|
+
reason: `group ${blocked.groupId} blocked: ${blocked.reason}`,
|
|
197
|
+
outcomes: this.outcomes.slice(),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
if (!this.deps.autoMerge) {
|
|
201
|
+
const prs = this.outcomes
|
|
202
|
+
.filter((o) => o.status === 'awaiting-pr')
|
|
203
|
+
.map((o) => o.pr);
|
|
204
|
+
if (prs.length > 0) {
|
|
205
|
+
return { kind: 'awaiting-pr', prs, outcomes: this.outcomes.slice() };
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return { kind: 'success', outcomes: this.outcomes.slice() };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=work-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work-loop.js","sourceRoot":"","sources":["../../src/loop/work-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type MCPClient, type MCPClientConfig } from '@ai-sdk/mcp';
|
|
2
|
+
import type { ToolSet } from 'ai';
|
|
3
|
+
import type { Role } from '../credentials/credentials.ts';
|
|
4
|
+
import type { LoggerLike } from '../logger/logger.ts';
|
|
5
|
+
import type { McpServers } from './schema.ts';
|
|
6
|
+
export type TransportKind = 'stdio' | 'http' | 'sse';
|
|
7
|
+
export type CreateMcpClient = (config: MCPClientConfig) => Promise<MCPClient>;
|
|
8
|
+
export type McpClientInit = {
|
|
9
|
+
servers: McpServers;
|
|
10
|
+
roleAllowlist?: Partial<Record<Role, string[]>>;
|
|
11
|
+
createClient?: CreateMcpClient;
|
|
12
|
+
logger?: LoggerLike;
|
|
13
|
+
};
|
|
14
|
+
export declare class McpClientManager {
|
|
15
|
+
private readonly init;
|
|
16
|
+
private readonly createClient;
|
|
17
|
+
private servers;
|
|
18
|
+
constructor(init: McpClientInit);
|
|
19
|
+
connectAll(): Promise<void>;
|
|
20
|
+
toolsForRole(role: Role): ToolSet;
|
|
21
|
+
close(): Promise<void>;
|
|
22
|
+
connected(): Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
toolCount: number;
|
|
25
|
+
transport: string;
|
|
26
|
+
}>;
|
|
27
|
+
}
|