@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,123 @@
1
+ // Connects to every MCP server declared in `mcpServers` (config) and exposes the
2
+ // union of their tools to subagents. The Vercel AI SDK's @ai-sdk/mcp client gives
3
+ // us tool-conversion; we wire transport per entry and merge the tool maps.
4
+ //
5
+ // docs/vendor/ai-sdk/chunk-15.md §"Initializing an MCP Client"
6
+ // docs/mcp.md
7
+ //
8
+ // Lifecycle: connectAll() at run start, toolsForRole() during agent build, close() on exit
9
+ // (success / blocked / SIGINT). Failures on individual servers are logged + skipped — a
10
+ // broken MCP server should not block the whole run.
11
+ import { experimental_createMCPClient } from '@ai-sdk/mcp';
12
+ import { Experimental_StdioMCPTransport } from '@ai-sdk/mcp/mcp-stdio';
13
+ export class McpClientManager {
14
+ init;
15
+ createClient;
16
+ servers = [];
17
+ constructor(init) {
18
+ this.init = init;
19
+ this.createClient = init.createClient ?? experimental_createMCPClient;
20
+ }
21
+ async connectAll() {
22
+ for (const [name, server] of Object.entries(this.init.servers)) {
23
+ // Track the client outside the try so a failure during tools() can still
24
+ // close the spawned process / socket instead of leaking it.
25
+ let client;
26
+ try {
27
+ const transport = transportKind(server);
28
+ client = await this.createClient(buildClientConfig(name, server));
29
+ const tools = (await client.tools());
30
+ this.servers.push({ name, transport, client, tools });
31
+ }
32
+ catch (err) {
33
+ if (client) {
34
+ try {
35
+ await client.close();
36
+ }
37
+ catch (closeErr) {
38
+ this.init.logger?.warn('mcp server cleanup failed', {
39
+ name,
40
+ error: errorMessage(closeErr),
41
+ });
42
+ }
43
+ }
44
+ this.init.logger?.warn('mcp server connect failed', {
45
+ name,
46
+ error: errorMessage(err),
47
+ });
48
+ }
49
+ }
50
+ }
51
+ toolsForRole(role) {
52
+ const allowed = this.init.roleAllowlist?.[role];
53
+ const merged = {};
54
+ const owner = new Map();
55
+ for (const s of this.servers) {
56
+ if (allowed !== undefined && !allowed.includes(s.name))
57
+ continue;
58
+ for (const [toolName, tool] of Object.entries(s.tools)) {
59
+ const previous = owner.get(toolName);
60
+ if (previous !== undefined) {
61
+ this.init.logger?.warn('duplicate mcp tool name', {
62
+ tool: toolName,
63
+ server: s.name,
64
+ existingServer: previous,
65
+ });
66
+ continue;
67
+ }
68
+ merged[toolName] = tool;
69
+ owner.set(toolName, s.name);
70
+ }
71
+ }
72
+ return merged;
73
+ }
74
+ async close() {
75
+ const toClose = this.servers;
76
+ this.servers = [];
77
+ await Promise.all(toClose.map(async (s) => {
78
+ try {
79
+ await s.client.close();
80
+ }
81
+ catch (err) {
82
+ this.init.logger?.warn('mcp server close failed', {
83
+ name: s.name,
84
+ error: errorMessage(err),
85
+ });
86
+ }
87
+ }));
88
+ }
89
+ connected() {
90
+ return this.servers.map((s) => ({
91
+ name: s.name,
92
+ toolCount: Object.keys(s.tools).length,
93
+ transport: s.transport,
94
+ }));
95
+ }
96
+ }
97
+ function transportKind(server) {
98
+ if ('url' in server)
99
+ return server.type;
100
+ return 'stdio';
101
+ }
102
+ function buildClientConfig(name, server) {
103
+ if ('url' in server) {
104
+ const transport = server.headers
105
+ ? { type: server.type, url: server.url, headers: server.headers }
106
+ : { type: server.type, url: server.url };
107
+ return { transport, clientName: clientNameFor(name) };
108
+ }
109
+ const stdio = new Experimental_StdioMCPTransport({
110
+ command: server.command,
111
+ ...(server.args ? { args: server.args } : {}),
112
+ ...(server.env ? { env: server.env } : {}),
113
+ ...(server.cwd ? { cwd: server.cwd } : {}),
114
+ });
115
+ return { transport: stdio, clientName: clientNameFor(name) };
116
+ }
117
+ function clientNameFor(name) {
118
+ return `aitm-${name}`;
119
+ }
120
+ function errorMessage(err) {
121
+ return err instanceof Error ? err.message : String(err);
122
+ }
123
+ //# sourceMappingURL=mcp-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/mcp/mcp-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { z } from 'zod';
2
+ export declare const McpStdioServerSchema: z.ZodObject<{
3
+ type: z.ZodOptional<z.ZodLiteral<"stdio">>;
4
+ command: z.ZodString;
5
+ args: z.ZodOptional<z.ZodArray<z.ZodString>>;
6
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
7
+ cwd: z.ZodOptional<z.ZodString>;
8
+ }, z.core.$strip>;
9
+ export type McpStdioServer = z.infer<typeof McpStdioServerSchema>;
10
+ export declare const McpSseServerSchema: z.ZodObject<{
11
+ type: z.ZodLiteral<"sse">;
12
+ url: z.ZodString;
13
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
14
+ }, z.core.$strip>;
15
+ export type McpSseServer = z.infer<typeof McpSseServerSchema>;
16
+ export declare const McpHttpServerSchema: z.ZodObject<{
17
+ type: z.ZodLiteral<"http">;
18
+ url: z.ZodString;
19
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
20
+ }, z.core.$strip>;
21
+ export type McpHttpServer = z.infer<typeof McpHttpServerSchema>;
22
+ export declare const McpServerSchema: z.ZodUnion<readonly [z.ZodObject<{
23
+ type: z.ZodOptional<z.ZodLiteral<"stdio">>;
24
+ command: z.ZodString;
25
+ args: z.ZodOptional<z.ZodArray<z.ZodString>>;
26
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
27
+ cwd: z.ZodOptional<z.ZodString>;
28
+ }, z.core.$strip>, z.ZodObject<{
29
+ type: z.ZodLiteral<"sse">;
30
+ url: z.ZodString;
31
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
32
+ }, z.core.$strip>, z.ZodObject<{
33
+ type: z.ZodLiteral<"http">;
34
+ url: z.ZodString;
35
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
36
+ }, z.core.$strip>]>;
37
+ export type McpServer = z.infer<typeof McpServerSchema>;
38
+ export declare const McpServersSchema: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
39
+ type: z.ZodOptional<z.ZodLiteral<"stdio">>;
40
+ command: z.ZodString;
41
+ args: z.ZodOptional<z.ZodArray<z.ZodString>>;
42
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
43
+ cwd: z.ZodOptional<z.ZodString>;
44
+ }, z.core.$strip>, z.ZodObject<{
45
+ type: z.ZodLiteral<"sse">;
46
+ url: z.ZodString;
47
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
48
+ }, z.core.$strip>, z.ZodObject<{
49
+ type: z.ZodLiteral<"http">;
50
+ url: z.ZodString;
51
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
52
+ }, z.core.$strip>]>>;
53
+ export type McpServers = z.infer<typeof McpServersSchema>;
@@ -0,0 +1,39 @@
1
+ // MCP *client* config — aitm consumes external MCP servers as additional tool surfaces
2
+ // for subagents. aitm is NOT exposed as an MCP server (banned by CLAUDE.md §"Out of scope").
3
+ //
4
+ // Shape mirrors Claude Code's `mcpServers` config — three transports, same keys.
5
+ // Refs:
6
+ // https://code.claude.com/docs/en/mcp (Claude Code reference)
7
+ // https://modelcontextprotocol.io/ (spec)
8
+ // docs/vendor/ai-sdk/chunk-15.md §"Model Context Protocol" (Vercel AI SDK client)
9
+ //
10
+ // Transports:
11
+ // stdio — local binary launched as a child process. Default when `type` omitted.
12
+ // sse — HTTP server-sent events. URL + optional headers.
13
+ // http — Streamable HTTP transport. URL + optional headers. Preferred for production.
14
+ import { z } from 'zod';
15
+ export const McpStdioServerSchema = z.object({
16
+ type: z.literal('stdio').optional(),
17
+ command: z.string(),
18
+ args: z.array(z.string()).optional(),
19
+ env: z.record(z.string(), z.string()).optional(),
20
+ // Working directory for the spawned process. Defaults to repo root.
21
+ cwd: z.string().optional(),
22
+ });
23
+ export const McpSseServerSchema = z.object({
24
+ type: z.literal('sse'),
25
+ url: z.string().url(),
26
+ headers: z.record(z.string(), z.string()).optional(),
27
+ });
28
+ export const McpHttpServerSchema = z.object({
29
+ type: z.literal('http'),
30
+ url: z.string().url(),
31
+ headers: z.record(z.string(), z.string()).optional(),
32
+ });
33
+ export const McpServerSchema = z.union([
34
+ McpStdioServerSchema,
35
+ McpSseServerSchema,
36
+ McpHttpServerSchema,
37
+ ]);
38
+ export const McpServersSchema = z.record(z.string(), McpServerSchema);
39
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/mcp/schema.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,6FAA6F;AAC7F,EAAE;AACF,iFAAiF;AACjF,QAAQ;AACR,mFAAmF;AACnF,kEAAkE;AAClE,oFAAoF;AACpF,EAAE;AACF,cAAc;AACd,mFAAmF;AACnF,6DAA6D;AAC7D,yFAAyF;AAEzF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAChD,oEAAoE;IACpE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACtB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrD,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACvB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrD,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC;IACrC,oBAAoB;IACpB,kBAAkB;IAClB,mBAAmB;CACpB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { z } from 'zod';
2
+ export declare const OpenRouterModelSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ name: z.ZodOptional<z.ZodString>;
5
+ context_length: z.ZodNumber;
6
+ pricing: z.ZodOptional<z.ZodObject<{
7
+ prompt: z.ZodOptional<z.ZodString>;
8
+ completion: z.ZodOptional<z.ZodString>;
9
+ }, z.core.$strip>>;
10
+ }, z.core.$loose>;
11
+ export type OpenRouterModel = z.infer<typeof OpenRouterModelSchema>;
12
+ export declare const OpenRouterModelsResponseSchema: z.ZodObject<{
13
+ data: z.ZodArray<z.ZodObject<{
14
+ id: z.ZodString;
15
+ name: z.ZodOptional<z.ZodString>;
16
+ context_length: z.ZodNumber;
17
+ pricing: z.ZodOptional<z.ZodObject<{
18
+ prompt: z.ZodOptional<z.ZodString>;
19
+ completion: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$strip>>;
21
+ }, z.core.$loose>>;
22
+ }, z.core.$strip>;
23
+ export declare class OpenRouterClient {
24
+ private readonly apiKey;
25
+ private readonly baseUrl;
26
+ constructor(apiKey: string, baseUrl?: string);
27
+ listModels(): Promise<OpenRouterModel[]>;
28
+ }
@@ -0,0 +1,40 @@
1
+ // Thin OpenRouter API client. Only the endpoints we actually need:
2
+ // GET /api/v1/models — model catalog including context length / pricing.
3
+ // docs/auth.md §"LLM provider", docs/runtime.md (web fetch, not Bun.fetch).
4
+ import { z } from 'zod';
5
+ export const OpenRouterModelSchema = z
6
+ .object({
7
+ id: z.string(),
8
+ name: z.string().optional(),
9
+ context_length: z.number().int().positive(),
10
+ pricing: z
11
+ .object({
12
+ prompt: z.string().optional(),
13
+ completion: z.string().optional(),
14
+ })
15
+ .optional(),
16
+ })
17
+ .passthrough();
18
+ export const OpenRouterModelsResponseSchema = z.object({
19
+ data: z.array(OpenRouterModelSchema),
20
+ });
21
+ export class OpenRouterClient {
22
+ apiKey;
23
+ baseUrl;
24
+ constructor(apiKey, baseUrl = 'https://openrouter.ai/api/v1') {
25
+ this.apiKey = apiKey;
26
+ this.baseUrl = baseUrl;
27
+ }
28
+ async listModels() {
29
+ const res = await fetch(`${this.baseUrl}/models`, {
30
+ headers: { Authorization: `Bearer ${this.apiKey}` },
31
+ });
32
+ if (!res.ok) {
33
+ const excerpt = (await res.text()).slice(0, 500);
34
+ throw new Error(`OpenRouter /models failed: ${res.status} ${res.statusText} — ${excerpt}`);
35
+ }
36
+ const json = await res.json();
37
+ return OpenRouterModelsResponseSchema.parse(json).data;
38
+ }
39
+ }
40
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/openrouter/client.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,2EAA2E;AAC3E,4EAA4E;AAE5E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC;KACnC,MAAM,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAC3C,OAAO,EAAE,CAAC;SACP,MAAM,CAAC;QACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAClC,CAAC;SACD,QAAQ,EAAE;CACd,CAAC;KACD,WAAW,EAAE,CAAC;AAGjB,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC,MAAM,CAAC;IACrD,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;CACrC,CAAC,CAAC;AAEH,MAAM,OAAO,gBAAgB;IAER;IACA;IAFnB,YACmB,MAAc,EACd,UAAkB,8BAA8B;QADhD,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAAyC;IAChE,CAAC;IAEJ,KAAK,CAAC,UAAU;QACd,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,SAAS,EAAE;YAChD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE;SACpD,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,MAAM,OAAO,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,IAAI,GAAY,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACvC,OAAO,8BAA8B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IACzD,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import type { OpenRouterClient } from './client.ts';
2
+ export type ModelLimits = {
3
+ modelId: string;
4
+ contextLength: number;
5
+ };
6
+ export type ModelLimitsLookup = {
7
+ forModel(modelId: string): Promise<ModelLimits>;
8
+ preload(): Promise<void>;
9
+ };
10
+ export declare class ModelNotFound extends Error {
11
+ readonly modelId: string;
12
+ readonly name = "ModelNotFound";
13
+ constructor(modelId: string);
14
+ }
15
+ export declare class ModelLimitsRegistry implements ModelLimitsLookup {
16
+ private readonly client;
17
+ private cache;
18
+ constructor(client: OpenRouterClient);
19
+ forModel(modelId: string): Promise<ModelLimits>;
20
+ preload(): Promise<void>;
21
+ }
@@ -0,0 +1,39 @@
1
+ // Exposes per-model limits (context window, pricing hints) used by the Compactor.
2
+ // Cached per-run after first fetch — model catalog changes slowly.
3
+ // docs/auth.md, src/compaction/compactor.ts
4
+ export class ModelNotFound extends Error {
5
+ modelId;
6
+ name = 'ModelNotFound';
7
+ constructor(modelId) {
8
+ super(`Model not found in OpenRouter catalog: ${modelId}`);
9
+ this.modelId = modelId;
10
+ }
11
+ }
12
+ export class ModelLimitsRegistry {
13
+ client;
14
+ cache;
15
+ constructor(client) {
16
+ this.client = client;
17
+ }
18
+ async forModel(modelId) {
19
+ if (!this.cache) {
20
+ await this.preload();
21
+ }
22
+ const hit = this.cache?.get(modelId);
23
+ if (!hit) {
24
+ throw new ModelNotFound(modelId);
25
+ }
26
+ return hit;
27
+ }
28
+ async preload() {
29
+ if (this.cache)
30
+ return;
31
+ const models = await this.client.listModels();
32
+ const next = new Map();
33
+ for (const m of models) {
34
+ next.set(m.id, { modelId: m.id, contextLength: m.context_length });
35
+ }
36
+ this.cache = next;
37
+ }
38
+ }
39
+ //# sourceMappingURL=model-limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-limits.js","sourceRoot":"","sources":["../../src/openrouter/model-limits.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,mEAAmE;AACnE,4CAA4C;AAgB5C,MAAM,OAAO,aAAc,SAAQ,KAAK;IAEV;IADV,IAAI,GAAG,eAAe,CAAC;IACzC,YAA4B,OAAe;QACzC,KAAK,CAAC,0CAA0C,OAAO,EAAE,CAAC,CAAC;QADjC,YAAO,GAAP,OAAO,CAAQ;IAE3C,CAAC;CACF;AAED,MAAM,OAAO,mBAAmB;IAGD;IAFrB,KAAK,CAAuC;IAEpD,YAA6B,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;IAAG,CAAC;IAEzD,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ export type WebSearchEngine = 'auto' | 'native' | 'exa' | 'firecrawl' | 'parallel';
2
+ export type WebSearchOptions = {
3
+ engine?: WebSearchEngine;
4
+ max_results?: number;
5
+ max_total_results?: number;
6
+ search_context_size?: 'low' | 'medium' | 'high';
7
+ allowed_domains?: string[];
8
+ excluded_domains?: string[];
9
+ user_location?: {
10
+ type: 'approximate';
11
+ city?: string;
12
+ country?: string;
13
+ };
14
+ };
15
+ export type WebFetchOptions = {
16
+ engine?: 'auto' | 'openrouter' | 'exa' | 'firecrawl' | 'native';
17
+ max_uses?: number;
18
+ max_content_tokens?: number;
19
+ allowed_domains?: string[];
20
+ blocked_domains?: string[];
21
+ };
22
+ export type ServerToolPayload = {
23
+ type: 'openrouter:web_search';
24
+ parameters?: WebSearchOptions;
25
+ } | {
26
+ type: 'openrouter:web_fetch';
27
+ parameters?: WebFetchOptions;
28
+ };
29
+ export declare function webSearchTool(options?: WebSearchOptions): ServerToolPayload;
30
+ export declare function webFetchServerTool(options?: WebFetchOptions): ServerToolPayload;
31
+ export declare function providerOptionsWithServerTools(tools: ReadonlyArray<ServerToolPayload>): {
32
+ openrouter: {
33
+ tools: ServerToolPayload[];
34
+ };
35
+ };
@@ -0,0 +1,25 @@
1
+ // OpenRouter server tools — model-decides tools executed on OpenRouter's side.
2
+ // These are NOT Vercel AI SDK function tools; they ride in `providerOptions.openrouter`
3
+ // (or equivalent extraBody) so OpenRouter sees them in the request `tools[]` array verbatim.
4
+ //
5
+ // Refs:
6
+ // https://openrouter.ai/docs/guides/features/server-tools/web-search
7
+ // https://openrouter.ai/docs/guides/features/server-tools/web-fetch
8
+ //
9
+ // Web search → citations land as annotations[].url_citation on the assistant message,
10
+ // plus usage.server_tool_use.web_search_requests for cost accounting. No round-trip.
11
+ // Web fetch → standard tool_call round-trip with { url, title, content, status, retrieved_at }.
12
+ export function webSearchTool(options = {}) {
13
+ return { type: 'openrouter:web_search', parameters: options };
14
+ }
15
+ // Renamed from webFetchTool — the canonical webFetchTool is now the local variant in
16
+ // src/tools/web-fetch.ts. This one is the explicit "delegate to OpenRouter" opt-in.
17
+ export function webFetchServerTool(options = {}) {
18
+ return { type: 'openrouter:web_fetch', parameters: options };
19
+ }
20
+ // Build the providerOptions.openrouter fragment to be merged into an AI SDK call.
21
+ // Usage at the model handle layer (src/credentials/credentials.ts) — see Credentials.modelFor.
22
+ export function providerOptionsWithServerTools(tools) {
23
+ return { openrouter: { tools: [...tools] } };
24
+ }
25
+ //# sourceMappingURL=server-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-tools.js","sourceRoot":"","sources":["../../src/openrouter/server-tools.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,wFAAwF;AACxF,6FAA6F;AAC7F,EAAE;AACF,QAAQ;AACR,uEAAuE;AACvE,sEAAsE;AACtE,EAAE;AACF,sFAAsF;AACtF,qFAAqF;AACrF,gGAAgG;AA0BhG,MAAM,UAAU,aAAa,CAAC,UAA4B,EAAE;IAC1D,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAChE,CAAC;AAED,qFAAqF;AACrF,oFAAoF;AACpF,MAAM,UAAU,kBAAkB,CAAC,UAA2B,EAAE;IAC9D,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAC/D,CAAC;AAED,kFAAkF;AAClF,+FAA+F;AAC/F,MAAM,UAAU,8BAA8B,CAAC,KAAuC;IAGpF,OAAO,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { ToolLoopAgent } from 'ai';
2
+ import type { AgentConfig } from '../agent-config/agent-config-detector.ts';
3
+ import type { CreatePrInput } from '../github/github-client.ts';
4
+ import type { PullRequest, ReviewThread } from '../github/schema.ts';
5
+ import type { PrGroup } from '../state/schema.ts';
6
+ import type { PlannerTools } from '../subagents/planner.ts';
7
+ import type { ReviewerTools } from '../subagents/reviewer.ts';
8
+ import type { WorkerDelivery, WorkerTools } from '../subagents/worker.ts';
9
+ import { type ModelProvider, makePlannerTool, makeReviewerTool, makeWorkerTool } from './subagent-tools.ts';
10
+ export type GhClient = {
11
+ createPr(input: CreatePrInput): Promise<PullRequest>;
12
+ };
13
+ export type RunCmdOptions = {
14
+ cwd?: string;
15
+ };
16
+ export type RunCmdResult = {
17
+ stdout: string;
18
+ stderr: string;
19
+ exitCode: number;
20
+ };
21
+ export type RunCmd = (file: string, args: readonly string[], options?: RunCmdOptions) => Promise<RunCmdResult>;
22
+ export declare const defaultRunCmd: RunCmd;
23
+ export declare const ORCHESTRATOR_ROLE_PREFIX: string;
24
+ export type OrchestratorInit = {
25
+ credentials: ModelProvider;
26
+ agentConfig: AgentConfig;
27
+ rollingContext: string;
28
+ maxSessions: number | null;
29
+ github: GhClient;
30
+ runCmd?: RunCmd;
31
+ };
32
+ export type OrchestratorBuildContext = {
33
+ plannerTools: PlannerTools;
34
+ workerTools: WorkerTools;
35
+ reviewerTools: ReviewerTools;
36
+ worktreePath: string;
37
+ baseBranch: string;
38
+ group: PrGroup;
39
+ pr: number;
40
+ threads: ReviewThread[];
41
+ };
42
+ export type OrchestratorTools = {
43
+ planner: ReturnType<typeof makePlannerTool>;
44
+ worker: ReturnType<typeof makeWorkerTool>;
45
+ reviewer: ReturnType<typeof makeReviewerTool>;
46
+ };
47
+ export declare const DEFAULT_MAX_STEPS = 50;
48
+ export declare function resolveMaxSteps(maxSessions: number | null): number;
49
+ export declare class Orchestrator {
50
+ private readonly init;
51
+ constructor(init: OrchestratorInit);
52
+ build(context: OrchestratorBuildContext): ToolLoopAgent<never, OrchestratorTools>;
53
+ buildSystemPrompt(): string;
54
+ finalizeCommit(group: PrGroup, delivery: WorkerDelivery, worktreePath: string): Promise<string>;
55
+ openPr(group: PrGroup, delivery: WorkerDelivery, baseBranch: string): Promise<PullRequest>;
56
+ private refineCommitMessage;
57
+ private buildCommitPrompt;
58
+ private composePr;
59
+ private buildPrPrompt;
60
+ }