@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.
Files changed (126) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +30 -0
  3. package/dist/agent-config/agent-config-detector.d.ts +15 -0
  4. package/dist/agent-config/agent-config-detector.js +56 -0
  5. package/dist/agent-config/agent-config-detector.js.map +1 -0
  6. package/dist/cli/args.d.ts +37 -0
  7. package/dist/cli/args.js +238 -0
  8. package/dist/cli/args.js.map +1 -0
  9. package/dist/cli/cli.d.ts +15 -0
  10. package/dist/cli/cli.js +113 -0
  11. package/dist/cli/cli.js.map +1 -0
  12. package/dist/cli/commands.d.ts +83 -0
  13. package/dist/cli/commands.js +521 -0
  14. package/dist/cli/commands.js.map +1 -0
  15. package/dist/compaction/compactor.d.ts +20 -0
  16. package/dist/compaction/compactor.js +75 -0
  17. package/dist/compaction/compactor.js.map +1 -0
  18. package/dist/config/config-loader.d.ts +25 -0
  19. package/dist/config/config-loader.js +275 -0
  20. package/dist/config/config-loader.js.map +1 -0
  21. package/dist/config/config-writer.d.ts +14 -0
  22. package/dist/config/config-writer.js +178 -0
  23. package/dist/config/config-writer.js.map +1 -0
  24. package/dist/config/schema.d.ts +85 -0
  25. package/dist/config/schema.js +38 -0
  26. package/dist/config/schema.js.map +1 -0
  27. package/dist/credentials/credentials.d.ts +15 -0
  28. package/dist/credentials/credentials.js +58 -0
  29. package/dist/credentials/credentials.js.map +1 -0
  30. package/dist/credentials/defaults.d.ts +2 -0
  31. package/dist/credentials/defaults.js +21 -0
  32. package/dist/credentials/defaults.js.map +1 -0
  33. package/dist/fs/atomic-write.d.ts +1 -0
  34. package/dist/fs/atomic-write.js +27 -0
  35. package/dist/fs/atomic-write.js.map +1 -0
  36. package/dist/github/errors.d.ts +18 -0
  37. package/dist/github/errors.js +20 -0
  38. package/dist/github/errors.js.map +1 -0
  39. package/dist/github/github-client.d.ts +47 -0
  40. package/dist/github/github-client.js +417 -0
  41. package/dist/github/github-client.js.map +1 -0
  42. package/dist/github/schema.d.ts +44 -0
  43. package/dist/github/schema.js +23 -0
  44. package/dist/github/schema.js.map +1 -0
  45. package/dist/index.d.ts +26 -0
  46. package/dist/index.js +22 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/logger/logger.d.ts +36 -0
  49. package/dist/logger/logger.js +123 -0
  50. package/dist/logger/logger.js.map +1 -0
  51. package/dist/loop/run-loop-adapter.d.ts +46 -0
  52. package/dist/loop/run-loop-adapter.js +270 -0
  53. package/dist/loop/run-loop-adapter.js.map +1 -0
  54. package/dist/loop/take-over-flow.d.ts +57 -0
  55. package/dist/loop/take-over-flow.js +183 -0
  56. package/dist/loop/take-over-flow.js.map +1 -0
  57. package/dist/loop/work-loop.d.ts +95 -0
  58. package/dist/loop/work-loop.js +211 -0
  59. package/dist/loop/work-loop.js.map +1 -0
  60. package/dist/mcp/mcp-client.d.ts +27 -0
  61. package/dist/mcp/mcp-client.js +123 -0
  62. package/dist/mcp/mcp-client.js.map +1 -0
  63. package/dist/mcp/schema.d.ts +53 -0
  64. package/dist/mcp/schema.js +39 -0
  65. package/dist/mcp/schema.js.map +1 -0
  66. package/dist/openrouter/client.d.ts +28 -0
  67. package/dist/openrouter/client.js +40 -0
  68. package/dist/openrouter/client.js.map +1 -0
  69. package/dist/openrouter/model-limits.d.ts +21 -0
  70. package/dist/openrouter/model-limits.js +39 -0
  71. package/dist/openrouter/model-limits.js.map +1 -0
  72. package/dist/openrouter/server-tools.d.ts +35 -0
  73. package/dist/openrouter/server-tools.js +25 -0
  74. package/dist/openrouter/server-tools.js.map +1 -0
  75. package/dist/orchestrator/orchestrator.d.ts +60 -0
  76. package/dist/orchestrator/orchestrator.js +180 -0
  77. package/dist/orchestrator/orchestrator.js.map +1 -0
  78. package/dist/orchestrator/subagent-tools.d.ts +44 -0
  79. package/dist/orchestrator/subagent-tools.js +133 -0
  80. package/dist/orchestrator/subagent-tools.js.map +1 -0
  81. package/dist/orchestrator/system-prompts.d.ts +4 -0
  82. package/dist/orchestrator/system-prompts.js +78 -0
  83. package/dist/orchestrator/system-prompts.js.map +1 -0
  84. package/dist/plan/plan-graph.d.ts +11 -0
  85. package/dist/plan/plan-graph.js +69 -0
  86. package/dist/plan/plan-graph.js.map +1 -0
  87. package/dist/plan/schema.d.ts +30 -0
  88. package/dist/plan/schema.js +24 -0
  89. package/dist/plan/schema.js.map +1 -0
  90. package/dist/state/schema.d.ts +88 -0
  91. package/dist/state/schema.js +53 -0
  92. package/dist/state/schema.js.map +1 -0
  93. package/dist/state/state-store.d.ts +16 -0
  94. package/dist/state/state-store.js +129 -0
  95. package/dist/state/state-store.js.map +1 -0
  96. package/dist/subagents/factory.d.ts +8 -0
  97. package/dist/subagents/factory.js +10 -0
  98. package/dist/subagents/factory.js.map +1 -0
  99. package/dist/subagents/planner.d.ts +31 -0
  100. package/dist/subagents/planner.js +83 -0
  101. package/dist/subagents/planner.js.map +1 -0
  102. package/dist/subagents/reviewer.d.ts +60 -0
  103. package/dist/subagents/reviewer.js +159 -0
  104. package/dist/subagents/reviewer.js.map +1 -0
  105. package/dist/subagents/worker.d.ts +71 -0
  106. package/dist/subagents/worker.js +180 -0
  107. package/dist/subagents/worker.js.map +1 -0
  108. package/dist/testing/temp-repo.d.ts +7 -0
  109. package/dist/testing/temp-repo.js +21 -0
  110. package/dist/testing/temp-repo.js.map +1 -0
  111. package/dist/tools/datetime.d.ts +12 -0
  112. package/dist/tools/datetime.js +42 -0
  113. package/dist/tools/datetime.js.map +1 -0
  114. package/dist/tools/fetch-html.d.ts +32 -0
  115. package/dist/tools/fetch-html.js +139 -0
  116. package/dist/tools/fetch-html.js.map +1 -0
  117. package/dist/tools/github-thread-tool.d.ts +10 -0
  118. package/dist/tools/github-thread-tool.js +36 -0
  119. package/dist/tools/github-thread-tool.js.map +1 -0
  120. package/dist/tools/web-fetch.d.ts +31 -0
  121. package/dist/tools/web-fetch.js +223 -0
  122. package/dist/tools/web-fetch.js.map +1 -0
  123. package/dist/workspace/worktree-pool.d.ts +21 -0
  124. package/dist/workspace/worktree-pool.js +104 -0
  125. package/dist/workspace/worktree-pool.js.map +1 -0
  126. package/package.json +50 -0
@@ -0,0 +1,521 @@
1
+ // docs/commands/start.md, docs/commands/merge-pr.md, docs/commands/config.md
2
+ // Dispatcher only. Each command does precondition checks → wires deps → kicks WorkLoop / writes config.
3
+ //
4
+ // The heavy WorkLoop+Orchestrator wiring is exposed via the `runLoop` / `runMergeFlow`
5
+ // injection seams so this module stays pure dispatch and is unit-testable without
6
+ // spinning up real subagents. Default seam implementations live below; integration
7
+ // tests (PR 12) cover the end-to-end stack.
8
+ import { homedir } from 'node:os';
9
+ import { join, resolve as resolvePath } from 'node:path';
10
+ import { AgentConfigDetector } from "../agent-config/agent-config-detector.js";
11
+ import { ConfigLoader } from "../config/config-loader.js";
12
+ import { ConfigWriter } from "../config/config-writer.js";
13
+ import { Credentials } from "../credentials/credentials.js";
14
+ import { DEFAULT_MODELS } from "../credentials/defaults.js";
15
+ import { GitHubClient } from "../github/github-client.js";
16
+ import { localEditTools, runLoopAdapter } from "../loop/run-loop-adapter.js";
17
+ import { StateStore } from "../state/state-store.js";
18
+ export async function runStart(args, ctx = {}) {
19
+ const cwd = ctx.cwd ?? process.cwd();
20
+ const homeDir = ctx.homeDir ?? homedir();
21
+ const env = ctx.env ?? process.env;
22
+ const loader = new ConfigLoader(cwd, homeDir, env);
23
+ let resolved;
24
+ try {
25
+ resolved = await loader.resolve(toCliOverrides(args));
26
+ }
27
+ catch (err) {
28
+ return { code: 1, message: errMsg(err) };
29
+ }
30
+ try {
31
+ Credentials.assertApiKeyPresent(resolved);
32
+ }
33
+ catch (err) {
34
+ return { code: 1, message: errMsg(err) };
35
+ }
36
+ const credentials = new Credentials(resolved);
37
+ const detector = new AgentConfigDetector(cwd);
38
+ const detectOpts = {};
39
+ if (args.stylePath !== undefined)
40
+ detectOpts.stylePath = args.stylePath;
41
+ else if (resolved.stylePath !== null)
42
+ detectOpts.stylePath = resolved.stylePath;
43
+ let agentConfig;
44
+ try {
45
+ agentConfig = await detector.detect(detectOpts);
46
+ }
47
+ catch (err) {
48
+ return { code: 1, message: errMsg(err) };
49
+ }
50
+ if (!agentConfig) {
51
+ return {
52
+ code: 1,
53
+ message: 'No CLAUDE.md or AGENTS.md found in the target repo (and no --style override). Add one or pass --style <path>.',
54
+ };
55
+ }
56
+ const authStatus = ctx.authStatus ?? defaultAuthStatus;
57
+ let auth;
58
+ try {
59
+ auth = await authStatus(cwd);
60
+ }
61
+ catch (err) {
62
+ return { code: 1, message: errMsg(err) };
63
+ }
64
+ if (!auth.ok) {
65
+ return { code: 1, message: 'gh CLI is not authenticated. Run `gh auth login`.' };
66
+ }
67
+ const github = new GitHubClient(cwd);
68
+ const stateDir = resolvePath(cwd, '.ai-task-master');
69
+ const state = new StateStore(stateDir);
70
+ // Resume detection: if a previous run left a valid state.json, skip re-init so
71
+ // runId and prGroups are preserved. Only fall back on expected "missing/invalid
72
+ // prior state" cases (ENOENT, JSON parse failure, schema mismatch); surface every
73
+ // other error (permissions, IO) as a hard failure rather than silently re-initing.
74
+ let resuming = false;
75
+ let existingState = null;
76
+ try {
77
+ existingState = await state.read();
78
+ resuming = true;
79
+ }
80
+ catch (err) {
81
+ if (!isMissingOrInvalidState(err, stateDir)) {
82
+ return { code: 1, message: `Could not read run state: ${errMsg(err)}` };
83
+ }
84
+ // No valid state.json — proceed with fresh init.
85
+ }
86
+ if (!resuming) {
87
+ const initial = buildInitialRunState({ resolved, agentConfig });
88
+ try {
89
+ await state.init(initial);
90
+ await state.writeGoal(args.goal, args.criteria);
91
+ await loader.writeSnapshot(resolved, stateDir);
92
+ }
93
+ catch (err) {
94
+ return { code: 1, message: errMsg(err) };
95
+ }
96
+ }
97
+ // Planning phase (issue #17): a one-shot step that runs the Planner once, before the loop,
98
+ // so `prGroups` is populated and the loop has something to iterate. Gated on whether a plan
99
+ // is already persisted — not merely on `resuming` — because a prior run whose planning
100
+ // blocked leaves a resumable state.json with empty `prGroups`; that case must re-plan rather
101
+ // than hand the loop an empty plan. Only runs when a `runPlanner` seam is injected; otherwise
102
+ // planning is handled inside the WorkLoop adapter (merged default), keeping production
103
+ // behaviour unchanged and this module pure dispatch.
104
+ const hasPersistedPlan = (existingState?.prGroups.length ?? 0) > 0;
105
+ if (ctx.runPlanner && !hasPersistedPlan) {
106
+ let plan;
107
+ try {
108
+ plan = await ctx.runPlanner({
109
+ cwd,
110
+ resolved,
111
+ credentials,
112
+ agentConfig,
113
+ goal: args.goal,
114
+ criteria: args.criteria,
115
+ });
116
+ }
117
+ catch (err) {
118
+ return { code: 1, message: errMsg(err) };
119
+ }
120
+ if (plan.kind === 'blocked') {
121
+ return { code: 1, message: plan.reason };
122
+ }
123
+ try {
124
+ await state.update((s) => ({ ...s, status: 'working', prGroups: plan.groups }));
125
+ }
126
+ catch (err) {
127
+ return { code: 1, message: `Failed to persist plan: ${errMsg(err)}` };
128
+ }
129
+ }
130
+ const runLoop = ctx.runLoop ?? defaultRunLoop;
131
+ let result;
132
+ try {
133
+ result = await runLoop({
134
+ cwd,
135
+ resolved,
136
+ credentials,
137
+ agentConfig,
138
+ state,
139
+ github,
140
+ goal: args.goal,
141
+ criteria: args.criteria,
142
+ });
143
+ }
144
+ catch (err) {
145
+ return { code: 1, message: errMsg(err) };
146
+ }
147
+ // Persist the first awaiting-pr number into state so `aitm merge-pr` (with no --pr)
148
+ // can pick it up. WorkLoop tracks per-group PR numbers but does not nominate one as
149
+ // "current"; that's a CLI-level concern resolved here.
150
+ if (result.kind === 'awaiting-pr' && result.prs.length > 0) {
151
+ const firstPr = result.prs[0];
152
+ if (firstPr !== undefined) {
153
+ try {
154
+ await state.update((s) => ({ ...s, currentPr: firstPr }));
155
+ }
156
+ catch (err) {
157
+ return { code: 1, message: `Failed to persist currentPr: ${errMsg(err)}` };
158
+ }
159
+ }
160
+ }
161
+ return mapResultToExit(result);
162
+ }
163
+ export async function runMergePr(args, ctx = {}) {
164
+ const cwd = ctx.cwd ?? process.cwd();
165
+ const homeDir = ctx.homeDir ?? homedir();
166
+ const env = ctx.env ?? process.env;
167
+ const loader = new ConfigLoader(cwd, homeDir, env);
168
+ let resolved;
169
+ try {
170
+ resolved = await loader.resolve({});
171
+ }
172
+ catch (err) {
173
+ return { code: 1, message: errMsg(err) };
174
+ }
175
+ try {
176
+ Credentials.assertApiKeyPresent(resolved);
177
+ }
178
+ catch (err) {
179
+ return { code: 1, message: errMsg(err) };
180
+ }
181
+ const credentials = new Credentials(resolved);
182
+ const stateDir = resolvePath(cwd, '.ai-task-master');
183
+ const state = new StateStore(stateDir);
184
+ const github = ctx.github ?? new GitHubClient(cwd);
185
+ // Take-over flow: `aitm merge-pr` (no args, no prior state) should work against any PR
186
+ // the user built by hand — e.g. via Claude Code or `gh pr create`. We mirror the
187
+ // claude-task-master `merge_pr` pattern: try to read existing state, and if absent,
188
+ // synthesize a minimal one from --pr (or the current branch's PR) and persist it so
189
+ // subsequent calls resume.
190
+ let runState;
191
+ try {
192
+ runState = await state.read();
193
+ }
194
+ catch (err) {
195
+ if (!isFileNotFound(err)) {
196
+ return {
197
+ code: 1,
198
+ message: `Run state at ${join(stateDir, 'state.json')} is unreadable: ${errMsg(err)}. Fix or delete the file to start fresh.`,
199
+ };
200
+ }
201
+ const synth = await synthesizeTakeoverState({ args, github, resolved });
202
+ if (synth.kind === 'error')
203
+ return synth.exit;
204
+ runState = synth.state;
205
+ try {
206
+ await state.init(runState);
207
+ }
208
+ catch (initErr) {
209
+ return { code: 1, message: errMsg(initErr) };
210
+ }
211
+ }
212
+ const pr = args.pr ?? runState.currentPr ?? undefined;
213
+ if (pr === undefined) {
214
+ return {
215
+ code: 1,
216
+ message: 'No PR to merge. Pass --pr <N>, switch to the PR branch, or run `aitm start` to populate state.',
217
+ };
218
+ }
219
+ const detector = new AgentConfigDetector(cwd);
220
+ const detectOpts = {};
221
+ if (runState.options.stylePath !== null)
222
+ detectOpts.stylePath = runState.options.stylePath;
223
+ let agentConfig;
224
+ try {
225
+ agentConfig = await detector.detect(detectOpts);
226
+ }
227
+ catch (err) {
228
+ return { code: 1, message: errMsg(err) };
229
+ }
230
+ if (!agentConfig) {
231
+ return {
232
+ code: 1,
233
+ message: 'No CLAUDE.md or AGENTS.md found in the target repo (and no stylePath in state). Add one or pass --style on `aitm start`.',
234
+ };
235
+ }
236
+ const authStatus = ctx.authStatus ?? defaultAuthStatus;
237
+ let auth;
238
+ try {
239
+ auth = await authStatus(cwd);
240
+ }
241
+ catch (err) {
242
+ return { code: 1, message: errMsg(err) };
243
+ }
244
+ if (!auth.ok) {
245
+ return { code: 1, message: 'gh CLI is not authenticated. Run `gh auth login`.' };
246
+ }
247
+ const runMergeFlow = ctx.runMergeFlow ?? defaultRunMergeFlow;
248
+ let result;
249
+ try {
250
+ result = await runMergeFlow({
251
+ cwd,
252
+ pr,
253
+ resume: args.resume,
254
+ resolved,
255
+ credentials,
256
+ agentConfig,
257
+ state,
258
+ runState,
259
+ github,
260
+ });
261
+ }
262
+ catch (err) {
263
+ return { code: 1, message: errMsg(err) };
264
+ }
265
+ return mapResultToExit(result);
266
+ }
267
+ export async function runConfig(args, ctx = {}) {
268
+ const cwd = ctx.cwd ?? process.cwd();
269
+ const homeDir = ctx.homeDir ?? homedir();
270
+ const stdout = ctx.stdout ?? ((chunk) => process.stdout.write(chunk));
271
+ const writer = new ConfigWriter(cwd, homeDir);
272
+ try {
273
+ switch (args.kind) {
274
+ case 'config-set':
275
+ await writer.set(args.scope, args.key, args.value);
276
+ return { code: 0 };
277
+ case 'config-unset':
278
+ await writer.unset(args.scope, args.key);
279
+ return { code: 0 };
280
+ case 'config-get': {
281
+ const value = await writer.get(args.scope, args.key);
282
+ stdout(`${formatConfigValue(value)}\n`);
283
+ return { code: 0 };
284
+ }
285
+ case 'config-list': {
286
+ const file = await writer.list(args.scope);
287
+ // Never dump the API key in cleartext — `config list` output lands in terminals/logs.
288
+ const safe = file.openrouterApiKey
289
+ ? { ...file, openrouterApiKey: maskSecret(file.openrouterApiKey) }
290
+ : file;
291
+ stdout(`${JSON.stringify(safe, null, 2)}\n`);
292
+ return { code: 0 };
293
+ }
294
+ default:
295
+ return {
296
+ code: 1,
297
+ message: `Unknown config subcommand: ${args.kind}`,
298
+ };
299
+ }
300
+ }
301
+ catch (err) {
302
+ return { code: 1, message: errMsg(err) };
303
+ }
304
+ }
305
+ // ---- helpers ---------------------------------------------------------------
306
+ function toCliOverrides(args) {
307
+ const out = {};
308
+ if (args.maxPrs !== undefined)
309
+ out.maxPrs = args.maxPrs;
310
+ if (args.maxSessions !== undefined)
311
+ out.maxSessions = args.maxSessions === 0 ? null : args.maxSessions;
312
+ if (args.autoMerge !== undefined)
313
+ out.autoMerge = args.autoMerge;
314
+ if (args.stylePath !== undefined)
315
+ out.stylePath = args.stylePath;
316
+ if (args.model !== undefined)
317
+ out.model = args.model;
318
+ if (args.concurrency !== undefined && args.concurrency > 0)
319
+ out.concurrency = args.concurrency;
320
+ return out;
321
+ }
322
+ function mapResultToExit(result) {
323
+ switch (result.kind) {
324
+ case 'success':
325
+ return { code: 0 };
326
+ case 'blocked':
327
+ return { code: 1, message: result.reason };
328
+ case 'session-cap':
329
+ return { code: 0, message: 'Session cap reached. Run `aitm start` again to resume.' };
330
+ case 'awaiting-pr':
331
+ return {
332
+ code: 0,
333
+ message: `PR(s) opened: ${result.prs.join(', ')}. Run \`aitm merge-pr\` to drive them to merge.`,
334
+ };
335
+ }
336
+ }
337
+ function buildInitialRunState(input) {
338
+ const now = new Date().toISOString();
339
+ const agentConfigFile = input.agentConfig.flavor === 'claude'
340
+ ? 'CLAUDE.md'
341
+ : input.agentConfig.flavor === 'agents'
342
+ ? 'AGENTS.md'
343
+ : 'custom';
344
+ return {
345
+ status: 'planning',
346
+ prGroups: [],
347
+ currentGroupIndex: 0,
348
+ currentTaskIndex: 0,
349
+ sessionCount: 0,
350
+ currentPr: null,
351
+ runId: `run-${Date.now().toString(36)}`,
352
+ provider: 'openrouter',
353
+ model: input.resolved.models.generic ?? DEFAULT_MODELS.generic,
354
+ agentConfigFile,
355
+ createdAt: now,
356
+ updatedAt: now,
357
+ options: {
358
+ autoMerge: input.resolved.autoMerge,
359
+ maxPrs: input.resolved.maxPrs,
360
+ maxSessions: input.resolved.maxSessions,
361
+ mergeMethod: input.resolved.mergeMethod,
362
+ stylePath: input.resolved.stylePath,
363
+ concurrency: input.resolved.concurrency,
364
+ },
365
+ };
366
+ }
367
+ function errMsg(err) {
368
+ return err instanceof Error ? err.message : String(err);
369
+ }
370
+ // Recognises "no valid prior state" — the only conditions where we fall through to a
371
+ // fresh init. ENOENT means the file is absent. StateStore.read() prefixes any JSON
372
+ // parse or Zod schema error with the state-file path, so we match that prefix to
373
+ // distinguish corrupt state from genuine IO/permission errors.
374
+ function isMissingOrInvalidState(err, stateDir) {
375
+ if (typeof err === 'object' &&
376
+ err !== null &&
377
+ 'code' in err &&
378
+ err.code === 'ENOENT') {
379
+ return true;
380
+ }
381
+ if (err instanceof Error) {
382
+ const stateFile = join(stateDir, 'state.json');
383
+ if (err.message.startsWith(`${stateFile}:`))
384
+ return true;
385
+ }
386
+ return false;
387
+ }
388
+ // Mask a secret for display: keep the non-secret `sk-or-` prefix + last 4 chars so the user can
389
+ // confirm WHICH key is set without exposing it. Short values are fully hidden.
390
+ function maskSecret(value) {
391
+ return value.length <= 12 ? '***' : `${value.slice(0, 6)}…${value.slice(-4)}`;
392
+ }
393
+ function formatConfigValue(value) {
394
+ if (value === undefined)
395
+ return '';
396
+ if (typeof value === 'string')
397
+ return value;
398
+ return JSON.stringify(value, null, 2);
399
+ }
400
+ const defaultAuthStatus = (cwd) => new GitHubClient(cwd).authStatus();
401
+ // Default loop seam — production wiring of Planner → PlanGraph → WorktreePool → WorkLoop with
402
+ // the Orchestrator/Worker/Reviewer subagents and MCP tools. Lives in run-loop-adapter.ts so this
403
+ // module stays pure dispatch; the adapter exposes its own seams for unit + integration tests.
404
+ async function defaultRunLoop(input) {
405
+ return runLoopAdapter(input);
406
+ }
407
+ // Real merge-pr adapter. Drives runTakeOverFlow against the cwd worktree: wait CI →
408
+ // Reviewer per unresolved thread → push → loop → merge. See src/loop/take-over-flow.ts
409
+ // for the iteration shape (mirrors claude-task-master `merge_pr`).
410
+ async function defaultRunMergeFlow(input) {
411
+ const { runTakeOverFlow } = await import("../loop/take-over-flow.js");
412
+ const { execa } = await import('execa');
413
+ const { githubThreadTool } = await import("../tools/github-thread-tool.js");
414
+ const worktreePath = input.cwd;
415
+ const baseBranch = await input.github.defaultBranch();
416
+ const styleContents = input.agentConfig.contents;
417
+ // Build the Claude-Code-style tool surface scoped to the cwd worktree. The Worker gets the
418
+ // full read/write/edit/search/bash set; the Reviewer adds the `github` thread tool.
419
+ const workerTools = localEditTools(worktreePath);
420
+ const github = githubThreadTool({ github: input.github });
421
+ const result = await runTakeOverFlow({
422
+ pr: input.pr,
423
+ worktreePath,
424
+ baseBranch,
425
+ github: input.github,
426
+ mergeMethod: input.runState.options.mergeMethod,
427
+ push: async (cwd) => {
428
+ const r = await execa('git', ['push'], { cwd });
429
+ if (r.exitCode !== 0) {
430
+ throw new Error(`git push failed: ${r.stderr || r.stdout}`);
431
+ }
432
+ },
433
+ subagents: {
434
+ reviewerModel: input.credentials.modelFor('reviewer'),
435
+ reviewerTools: { ...workerTools, github },
436
+ workerModel: input.credentials.modelFor('worker'),
437
+ workerTools,
438
+ styleContents,
439
+ },
440
+ });
441
+ if (result.kind === 'merged') {
442
+ return {
443
+ kind: 'success',
444
+ outcomes: [{ groupId: `takeover-${result.pr}`, status: 'merged', pr: result.pr }],
445
+ };
446
+ }
447
+ return {
448
+ kind: 'blocked',
449
+ reason: result.reason,
450
+ outcomes: [{ groupId: `takeover-${input.pr}`, status: 'blocked', reason: result.reason }],
451
+ };
452
+ }
453
+ // Build a minimal RunState that lets `merge-pr` take over a PR opened outside aitm. PR
454
+ // number comes from --pr or, failing that, from `gh pr view` against the current branch.
455
+ async function synthesizeTakeoverState(input) {
456
+ const { args, github, resolved } = input;
457
+ let pr = args.pr ?? null;
458
+ if (pr === null) {
459
+ let branch;
460
+ try {
461
+ branch = await github.currentBranch();
462
+ }
463
+ catch (err) {
464
+ return {
465
+ kind: 'error',
466
+ exit: {
467
+ code: 1,
468
+ message: `Cannot detect a PR to take over: ${errMsg(err)}. Pass --pr <N> or switch to a branch with an open PR.`,
469
+ },
470
+ };
471
+ }
472
+ let found;
473
+ try {
474
+ found = await github.getPrForBranch(branch);
475
+ }
476
+ catch (err) {
477
+ return { kind: 'error', exit: { code: 1, message: errMsg(err) } };
478
+ }
479
+ if (found === null) {
480
+ return {
481
+ kind: 'error',
482
+ exit: {
483
+ code: 1,
484
+ message: `No open PR found for branch ${branch}. Pass --pr <N> to specify, or open a PR first.`,
485
+ },
486
+ };
487
+ }
488
+ pr = found.number;
489
+ }
490
+ const now = new Date().toISOString();
491
+ const state = {
492
+ status: 'awaiting-pr',
493
+ prGroups: [],
494
+ currentGroupIndex: 0,
495
+ currentTaskIndex: 0,
496
+ sessionCount: 0,
497
+ currentPr: pr,
498
+ runId: `takeover-${Date.now().toString(36)}`,
499
+ provider: 'openrouter',
500
+ model: resolved.models.generic ?? DEFAULT_MODELS.generic,
501
+ agentConfigFile: 'CLAUDE.md',
502
+ createdAt: now,
503
+ updatedAt: now,
504
+ options: {
505
+ autoMerge: resolved.autoMerge,
506
+ maxPrs: resolved.maxPrs,
507
+ maxSessions: resolved.maxSessions,
508
+ mergeMethod: resolved.mergeMethod,
509
+ stylePath: resolved.stylePath,
510
+ concurrency: resolved.concurrency,
511
+ },
512
+ };
513
+ return { kind: 'ok', state };
514
+ }
515
+ function isFileNotFound(err) {
516
+ return (typeof err === 'object' &&
517
+ err !== null &&
518
+ 'code' in err &&
519
+ err.code === 'ENOENT');
520
+ }
521
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type LanguageModel } from 'ai';
2
+ import type { ModelLimitsLookup } from '../openrouter/model-limits.ts';
3
+ export type CompactionDecision = {
4
+ kind: 'skip';
5
+ } | {
6
+ kind: 'compact';
7
+ keepLastSteps: number;
8
+ };
9
+ export type CompactionInit = {
10
+ summarizer: LanguageModel;
11
+ limits: ModelLimitsLookup;
12
+ threshold?: number;
13
+ keepLastSteps?: number;
14
+ };
15
+ export declare class Compactor {
16
+ private readonly init;
17
+ constructor(init: CompactionInit);
18
+ shouldCompact(modelId: string, liveInputTokens: number): Promise<CompactionDecision>;
19
+ compact(olderMessages: ReadonlyArray<unknown>): Promise<string>;
20
+ }
@@ -0,0 +1,75 @@
1
+ // Drives context compaction for long-running agent loops. Keeps the orchestrator and
2
+ // each subagent coherent on huge PRs by summarizing chat history when usage crosses
3
+ // a fraction of the model's context window.
4
+ //
5
+ // Strategy:
6
+ // 1. Pull contextLength for the active model from ModelLimitsRegistry.
7
+ // 2. Estimate live token usage from the agent's step.usage.inputTokens running total.
8
+ // 3. When usage / contextLength >= threshold (default 0.7), invoke a `fast`-tier
9
+ // summarization step that rewrites the early conversation into a compact note;
10
+ // the next step resumes with the summary + the most recent N steps verbatim.
11
+ //
12
+ // SDK references:
13
+ // docs/vendor/ai-sdk/chunk-09.md §"Subagents" §"Controlling What the Model Sees"
14
+ // (toModelOutput is the per-tool version of the same idea)
15
+ // docs/vendor/ai-sdk/chunk-09.md §"Loop Control" §"Prepare Step"
16
+ // (use prepareStep to swap in compacted messages between steps)
17
+ import { generateText } from 'ai';
18
+ const DEFAULT_THRESHOLD = 0.7;
19
+ const DEFAULT_KEEP_LAST_STEPS = 6;
20
+ const SUMMARY_INSTRUCTIONS = [
21
+ 'You are a context-compaction summarizer for an autonomous coding agent.',
22
+ 'Rewrite the conversation prefix below as a tight bulleted note that preserves:',
23
+ '- the goal and any acceptance criteria',
24
+ '- decisions made, files touched, and commands run',
25
+ '- open questions, blockers, and what to try next',
26
+ 'Drop greetings, restatements, and tool boilerplate. No prose, bullets only.',
27
+ 'Conversation (JSON):',
28
+ ].join('\n');
29
+ export class Compactor {
30
+ init;
31
+ constructor(init) {
32
+ this.init = init;
33
+ }
34
+ async shouldCompact(modelId, liveInputTokens) {
35
+ const { contextLength } = await this.init.limits.forModel(modelId);
36
+ // A non-finite or non-positive window would make ratio NaN/Infinity and force a
37
+ // wrong decision. Treat it as "we don't know enough to compact" — skip.
38
+ if (!Number.isFinite(contextLength) || contextLength <= 0) {
39
+ return { kind: 'skip' };
40
+ }
41
+ if (!Number.isFinite(liveInputTokens) || liveInputTokens < 0) {
42
+ return { kind: 'skip' };
43
+ }
44
+ const ratio = liveInputTokens / contextLength;
45
+ const threshold = this.init.threshold ?? DEFAULT_THRESHOLD;
46
+ if (ratio >= threshold) {
47
+ return { kind: 'compact', keepLastSteps: this.init.keepLastSteps ?? DEFAULT_KEEP_LAST_STEPS };
48
+ }
49
+ return { kind: 'skip' };
50
+ }
51
+ // Produce a compact summary suitable for replacing the older conversation prefix.
52
+ async compact(olderMessages) {
53
+ const { text } = await generateText({
54
+ model: this.init.summarizer,
55
+ prompt: `${SUMMARY_INSTRUCTIONS}\n${safeStringify(olderMessages)}`,
56
+ });
57
+ return text;
58
+ }
59
+ }
60
+ // Cycle-safe JSON.stringify. SDK message objects can transitively reference each other
61
+ // (tool result -> tool call -> step -> message), and a single circular ref would throw a
62
+ // raw TypeError out of compact() and crash the agent loop mid-step. Replace any cycle
63
+ // with the literal "[CYCLE]" so the summarizer still gets a usable transcript.
64
+ function safeStringify(value) {
65
+ const seen = new WeakSet();
66
+ return JSON.stringify(value, (_key, v) => {
67
+ if (v !== null && typeof v === 'object') {
68
+ if (seen.has(v))
69
+ return '[CYCLE]';
70
+ seen.add(v);
71
+ }
72
+ return v;
73
+ });
74
+ }
75
+ //# sourceMappingURL=compactor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compactor.js","sourceRoot":"","sources":["../../src/compaction/compactor.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,oFAAoF;AACpF,4CAA4C;AAC5C,EAAE;AACF,YAAY;AACZ,yEAAyE;AACzE,wFAAwF;AACxF,mFAAmF;AACnF,oFAAoF;AACpF,kFAAkF;AAClF,EAAE;AACF,kBAAkB;AAClB,mFAAmF;AACnF,+DAA+D;AAC/D,mEAAmE;AACnE,oEAAoE;AAEpE,OAAO,EAAE,YAAY,EAAsB,MAAM,IAAI,CAAC;AAetD,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAElC,MAAM,oBAAoB,GAAG;IAC3B,yEAAyE;IACzE,gFAAgF;IAChF,wCAAwC;IACxC,mDAAmD;IACnD,kDAAkD;IAClD,6EAA6E;IAC7E,sBAAsB;CACvB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,IAAoB;QAApB,SAAI,GAAJ,IAAI,CAAgB;IAAG,CAAC;IAErD,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,eAAuB;QAC1D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACnE,gFAAgF;QAChF,wEAAwE;QACxE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;YAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,CAAC;QACD,MAAM,KAAK,GAAG,eAAe,GAAG,aAAa,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,iBAAiB,CAAC;QAC3D,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,uBAAuB,EAAE,CAAC;QAChG,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,OAAO,CAAC,aAAqC;QACjD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;YAClC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,GAAG,oBAAoB,KAAK,aAAa,CAAC,aAAa,CAAC,EAAE;SACnE,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,uFAAuF;AACvF,yFAAyF;AACzF,sFAAsF;AACtF,+EAA+E;AAC/E,SAAS,aAAa,CAAC,KAAc;IACnC,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;IACnC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACvC,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,OAAO,SAAS,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}