mcp-subagents-opencode 1.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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +602 -0
  3. package/build/config/timeouts.d.ts +9 -0
  4. package/build/config/timeouts.d.ts.map +1 -0
  5. package/build/config/timeouts.js +18 -0
  6. package/build/config/timeouts.js.map +1 -0
  7. package/build/helpers.d.ts +6 -0
  8. package/build/helpers.d.ts.map +1 -0
  9. package/build/helpers.js +47 -0
  10. package/build/helpers.js.map +1 -0
  11. package/build/index.d.ts +3 -0
  12. package/build/index.d.ts.map +1 -0
  13. package/build/index.js +245 -0
  14. package/build/index.js.map +1 -0
  15. package/build/models.d.ts +32 -0
  16. package/build/models.d.ts.map +1 -0
  17. package/build/models.js +58 -0
  18. package/build/models.js.map +1 -0
  19. package/build/server/register-notifications.d.ts +3 -0
  20. package/build/server/register-notifications.d.ts.map +1 -0
  21. package/build/server/register-notifications.js +77 -0
  22. package/build/server/register-notifications.js.map +1 -0
  23. package/build/server/register-resources.d.ts +3 -0
  24. package/build/server/register-resources.d.ts.map +1 -0
  25. package/build/server/register-resources.js +210 -0
  26. package/build/server/register-resources.js.map +1 -0
  27. package/build/server/register-retry-execution.d.ts +2 -0
  28. package/build/server/register-retry-execution.d.ts.map +1 -0
  29. package/build/server/register-retry-execution.js +28 -0
  30. package/build/server/register-retry-execution.js.map +1 -0
  31. package/build/server/register-tasks.d.ts +3 -0
  32. package/build/server/register-tasks.d.ts.map +1 -0
  33. package/build/server/register-tasks.js +52 -0
  34. package/build/server/register-tasks.js.map +1 -0
  35. package/build/server/register-tools.d.ts +3 -0
  36. package/build/server/register-tools.d.ts.map +1 -0
  37. package/build/server/register-tools.js +32 -0
  38. package/build/server/register-tools.js.map +1 -0
  39. package/build/server/resource-helpers.d.ts +21 -0
  40. package/build/server/resource-helpers.d.ts.map +1 -0
  41. package/build/server/resource-helpers.js +84 -0
  42. package/build/server/resource-helpers.js.map +1 -0
  43. package/build/services/account-manager.d.ts +88 -0
  44. package/build/services/account-manager.d.ts.map +1 -0
  45. package/build/services/account-manager.js +239 -0
  46. package/build/services/account-manager.js.map +1 -0
  47. package/build/services/claude-code-runner.d.ts +15 -0
  48. package/build/services/claude-code-runner.d.ts.map +1 -0
  49. package/build/services/claude-code-runner.js +475 -0
  50. package/build/services/claude-code-runner.js.map +1 -0
  51. package/build/services/client-context.d.ts +31 -0
  52. package/build/services/client-context.d.ts.map +1 -0
  53. package/build/services/client-context.js +44 -0
  54. package/build/services/client-context.js.map +1 -0
  55. package/build/services/exhaustion-fallback.d.ts +27 -0
  56. package/build/services/exhaustion-fallback.d.ts.map +1 -0
  57. package/build/services/exhaustion-fallback.js +30 -0
  58. package/build/services/exhaustion-fallback.js.map +1 -0
  59. package/build/services/fallback-orchestrator.d.ts +16 -0
  60. package/build/services/fallback-orchestrator.d.ts.map +1 -0
  61. package/build/services/fallback-orchestrator.js +48 -0
  62. package/build/services/fallback-orchestrator.js.map +1 -0
  63. package/build/services/opencode-client.d.ts +40 -0
  64. package/build/services/opencode-client.d.ts.map +1 -0
  65. package/build/services/opencode-client.js +147 -0
  66. package/build/services/opencode-client.js.map +1 -0
  67. package/build/services/opencode-spawner.d.ts +56 -0
  68. package/build/services/opencode-spawner.d.ts.map +1 -0
  69. package/build/services/opencode-spawner.js +426 -0
  70. package/build/services/opencode-spawner.js.map +1 -0
  71. package/build/services/output-file.d.ts +24 -0
  72. package/build/services/output-file.d.ts.map +1 -0
  73. package/build/services/output-file.js +90 -0
  74. package/build/services/output-file.js.map +1 -0
  75. package/build/services/progress-registry.d.ts +12 -0
  76. package/build/services/progress-registry.d.ts.map +1 -0
  77. package/build/services/progress-registry.js +97 -0
  78. package/build/services/progress-registry.js.map +1 -0
  79. package/build/services/question-registry.d.ts +79 -0
  80. package/build/services/question-registry.d.ts.map +1 -0
  81. package/build/services/question-registry.js +249 -0
  82. package/build/services/question-registry.js.map +1 -0
  83. package/build/services/retry-queue.d.ts +41 -0
  84. package/build/services/retry-queue.d.ts.map +1 -0
  85. package/build/services/retry-queue.js +195 -0
  86. package/build/services/retry-queue.js.map +1 -0
  87. package/build/services/sdk-client-manager.d.ts +149 -0
  88. package/build/services/sdk-client-manager.d.ts.map +1 -0
  89. package/build/services/sdk-client-manager.js +632 -0
  90. package/build/services/sdk-client-manager.js.map +1 -0
  91. package/build/services/sdk-session-adapter.d.ts +203 -0
  92. package/build/services/sdk-session-adapter.d.ts.map +1 -0
  93. package/build/services/sdk-session-adapter.js +1088 -0
  94. package/build/services/sdk-session-adapter.js.map +1 -0
  95. package/build/services/sdk-spawner.d.ts +42 -0
  96. package/build/services/sdk-spawner.d.ts.map +1 -0
  97. package/build/services/sdk-spawner.js +488 -0
  98. package/build/services/sdk-spawner.js.map +1 -0
  99. package/build/services/session-hooks.d.ts +24 -0
  100. package/build/services/session-hooks.d.ts.map +1 -0
  101. package/build/services/session-hooks.js +130 -0
  102. package/build/services/session-hooks.js.map +1 -0
  103. package/build/services/session-snapshot.d.ts +19 -0
  104. package/build/services/session-snapshot.d.ts.map +1 -0
  105. package/build/services/session-snapshot.js +203 -0
  106. package/build/services/session-snapshot.js.map +1 -0
  107. package/build/services/subscription-registry.d.ts +12 -0
  108. package/build/services/subscription-registry.d.ts.map +1 -0
  109. package/build/services/subscription-registry.js +27 -0
  110. package/build/services/subscription-registry.js.map +1 -0
  111. package/build/services/task-manager.d.ts +150 -0
  112. package/build/services/task-manager.d.ts.map +1 -0
  113. package/build/services/task-manager.js +765 -0
  114. package/build/services/task-manager.js.map +1 -0
  115. package/build/services/task-persistence.d.ts +29 -0
  116. package/build/services/task-persistence.d.ts.map +1 -0
  117. package/build/services/task-persistence.js +159 -0
  118. package/build/services/task-persistence.js.map +1 -0
  119. package/build/services/task-status-mapper.d.ts +21 -0
  120. package/build/services/task-status-mapper.d.ts.map +1 -0
  121. package/build/services/task-status-mapper.js +171 -0
  122. package/build/services/task-status-mapper.js.map +1 -0
  123. package/build/templates/index.d.ts +22 -0
  124. package/build/templates/index.d.ts.map +1 -0
  125. package/build/templates/index.js +147 -0
  126. package/build/templates/index.js.map +1 -0
  127. package/build/templates/overlays/coder-csharp.mdx +58 -0
  128. package/build/templates/overlays/coder-go.mdx +53 -0
  129. package/build/templates/overlays/coder-java.mdx +54 -0
  130. package/build/templates/overlays/coder-kotlin.mdx +56 -0
  131. package/build/templates/overlays/coder-nextjs.mdx +65 -0
  132. package/build/templates/overlays/coder-python.mdx +53 -0
  133. package/build/templates/overlays/coder-react.mdx +55 -0
  134. package/build/templates/overlays/coder-ruby.mdx +59 -0
  135. package/build/templates/overlays/coder-rust.mdx +48 -0
  136. package/build/templates/overlays/coder-supabase.mdx +268 -0
  137. package/build/templates/overlays/coder-supastarter.mdx +313 -0
  138. package/build/templates/overlays/coder-swift.mdx +56 -0
  139. package/build/templates/overlays/coder-tauri.mdx +566 -0
  140. package/build/templates/overlays/coder-triggerdev.mdx +296 -0
  141. package/build/templates/overlays/coder-typescript.mdx +45 -0
  142. package/build/templates/overlays/coder-vue.mdx +62 -0
  143. package/build/templates/overlays/planner-architecture.mdx +78 -0
  144. package/build/templates/overlays/planner-bugfix.mdx +36 -0
  145. package/build/templates/overlays/planner-feature.mdx +38 -0
  146. package/build/templates/overlays/planner-migration.mdx +50 -0
  147. package/build/templates/overlays/planner-refactor.mdx +57 -0
  148. package/build/templates/overlays/researcher-library.mdx +59 -0
  149. package/build/templates/overlays/researcher-performance.mdx +68 -0
  150. package/build/templates/overlays/researcher-security.mdx +86 -0
  151. package/build/templates/overlays/tester-graphql.mdx +191 -0
  152. package/build/templates/overlays/tester-playwright.mdx +621 -0
  153. package/build/templates/overlays/tester-rest.mdx +101 -0
  154. package/build/templates/overlays/tester-suite.mdx +177 -0
  155. package/build/templates/super-coder.mdx +529 -0
  156. package/build/templates/super-planner.mdx +568 -0
  157. package/build/templates/super-researcher.mdx +406 -0
  158. package/build/templates/super-tester.mdx +243 -0
  159. package/build/tools/answer-question.d.ts +30 -0
  160. package/build/tools/answer-question.d.ts.map +1 -0
  161. package/build/tools/answer-question.js +108 -0
  162. package/build/tools/answer-question.js.map +1 -0
  163. package/build/tools/cancel-task.d.ts +44 -0
  164. package/build/tools/cancel-task.d.ts.map +1 -0
  165. package/build/tools/cancel-task.js +144 -0
  166. package/build/tools/cancel-task.js.map +1 -0
  167. package/build/tools/send-message.d.ts +39 -0
  168. package/build/tools/send-message.d.ts.map +1 -0
  169. package/build/tools/send-message.js +124 -0
  170. package/build/tools/send-message.js.map +1 -0
  171. package/build/tools/shared-spawn.d.ts +56 -0
  172. package/build/tools/shared-spawn.d.ts.map +1 -0
  173. package/build/tools/shared-spawn.js +114 -0
  174. package/build/tools/shared-spawn.js.map +1 -0
  175. package/build/tools/spawn-agent.d.ts +85 -0
  176. package/build/tools/spawn-agent.d.ts.map +1 -0
  177. package/build/tools/spawn-agent.js +133 -0
  178. package/build/tools/spawn-agent.js.map +1 -0
  179. package/build/tools/spawn-coder.d.ts +70 -0
  180. package/build/tools/spawn-coder.d.ts.map +1 -0
  181. package/build/tools/spawn-coder.js +71 -0
  182. package/build/tools/spawn-coder.js.map +1 -0
  183. package/build/tools/spawn-planner.d.ts +70 -0
  184. package/build/tools/spawn-planner.d.ts.map +1 -0
  185. package/build/tools/spawn-planner.js +71 -0
  186. package/build/tools/spawn-planner.js.map +1 -0
  187. package/build/tools/spawn-researcher.d.ts +70 -0
  188. package/build/tools/spawn-researcher.d.ts.map +1 -0
  189. package/build/tools/spawn-researcher.js +70 -0
  190. package/build/tools/spawn-researcher.js.map +1 -0
  191. package/build/tools/spawn-task.d.ts +74 -0
  192. package/build/tools/spawn-task.d.ts.map +1 -0
  193. package/build/tools/spawn-task.js +107 -0
  194. package/build/tools/spawn-task.js.map +1 -0
  195. package/build/tools/spawn-tester.d.ts +70 -0
  196. package/build/tools/spawn-tester.d.ts.map +1 -0
  197. package/build/tools/spawn-tester.js +69 -0
  198. package/build/tools/spawn-tester.js.map +1 -0
  199. package/build/types.d.ts +101 -0
  200. package/build/types.d.ts.map +1 -0
  201. package/build/types.js +28 -0
  202. package/build/types.js.map +1 -0
  203. package/build/utils/brief-validator.d.ts +30 -0
  204. package/build/utils/brief-validator.d.ts.map +1 -0
  205. package/build/utils/brief-validator.js +254 -0
  206. package/build/utils/brief-validator.js.map +1 -0
  207. package/build/utils/format.d.ts +34 -0
  208. package/build/utils/format.d.ts.map +1 -0
  209. package/build/utils/format.js +55 -0
  210. package/build/utils/format.js.map +1 -0
  211. package/build/utils/sanitize.d.ts +240 -0
  212. package/build/utils/sanitize.d.ts.map +1 -0
  213. package/build/utils/sanitize.js +89 -0
  214. package/build/utils/sanitize.js.map +1 -0
  215. package/build/utils/task-id-generator.d.ts +10 -0
  216. package/build/utils/task-id-generator.d.ts.map +1 -0
  217. package/build/utils/task-id-generator.js +22 -0
  218. package/build/utils/task-id-generator.js.map +1 -0
  219. package/package.json +62 -0
@@ -0,0 +1,475 @@
1
+ /**
2
+ * Claude Code Fallback Runner (ai-sdk-provider-claude-code)
3
+ *
4
+ * Executes fallback tasks through the ben-vargas provider, which wraps
5
+ * @anthropic-ai/claude-agent-sdk with richer streaming, metadata, and errors.
6
+ */
7
+ import { claudeCode, isAuthenticationError, isTimeoutError } from 'ai-sdk-provider-claude-code';
8
+ import { taskManager } from './task-manager.js';
9
+ import { TaskStatus, isTerminalStatus } from '../types.js';
10
+ const DEFAULT_TIMEOUT_MS = 1_800_000;
11
+ const DEFAULT_MODEL = 'sonnet';
12
+ const DEFAULT_PERMISSION_MODE = process.env.CLAUDE_FALLBACK_PERMISSION_MODE || 'bypassPermissions';
13
+ const TOOL_POLICY_MODE = process.env.CLAUDE_FALLBACK_TOOL_POLICY || 'allow_all';
14
+ const DEBUG = process.env.DEBUG_CLAUDE_FALLBACK === 'true';
15
+ const activeFallbackControllers = new Map();
16
+ function normalizeClaudeModel(model) {
17
+ if (!model)
18
+ return DEFAULT_MODEL;
19
+ const normalized = model.toLowerCase();
20
+ if (normalized.includes('opus') || normalized === 'claude-opus-4.6')
21
+ return 'opus';
22
+ if (normalized.includes('haiku') || normalized === 'claude-haiku-4.5')
23
+ return 'haiku';
24
+ if (normalized.includes('sonnet') || normalized === 'claude-sonnet-4.5')
25
+ return 'sonnet';
26
+ return model;
27
+ }
28
+ function resolveFallbackModel(preferredModel) {
29
+ const envOverride = process.env.CLAUDE_FALLBACK_MODEL?.trim();
30
+ if (envOverride)
31
+ return normalizeClaudeModel(envOverride);
32
+ return normalizeClaudeModel(preferredModel);
33
+ }
34
+ function parseCsvEnv(name) {
35
+ const value = process.env[name]?.trim();
36
+ if (!value)
37
+ return undefined;
38
+ const parsed = value
39
+ .split(',')
40
+ .map((v) => v.trim())
41
+ .filter(Boolean);
42
+ return parsed.length > 0 ? parsed : undefined;
43
+ }
44
+ function parseBudget() {
45
+ const raw = process.env.CLAUDE_FALLBACK_MAX_BUDGET_USD;
46
+ if (!raw)
47
+ return undefined;
48
+ const parsed = Number(raw);
49
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
50
+ }
51
+ function extractToolCommand(input) {
52
+ const candidates = ['command', 'cmd', 'input', 'value'];
53
+ for (const key of candidates) {
54
+ const value = input[key];
55
+ if (typeof value === 'string' && value.trim()) {
56
+ return value;
57
+ }
58
+ }
59
+ return '';
60
+ }
61
+ async function canUseToolSafePolicy(toolName, input, toolUseID) {
62
+ if (TOOL_POLICY_MODE !== 'safe') {
63
+ return { behavior: 'allow', toolUseID };
64
+ }
65
+ if (toolName === 'Bash') {
66
+ const cmd = extractToolCommand(input).toLowerCase();
67
+ const dangerousPatterns = [
68
+ /\brm\s+-rf\s+\//,
69
+ /\bmkfs\b/,
70
+ /\bdd\s+if=/,
71
+ /\bshutdown\b/,
72
+ /\breboot\b/,
73
+ /\bchown\s+-r\s+root\b/,
74
+ ];
75
+ if (dangerousPatterns.some((re) => re.test(cmd))) {
76
+ return {
77
+ behavior: 'deny',
78
+ message: `Denied by safe policy: dangerous command (${cmd})`,
79
+ toolUseID,
80
+ };
81
+ }
82
+ }
83
+ return { behavior: 'allow', toolUseID };
84
+ }
85
+ function createModelSettings(cwd, options) {
86
+ const allowedTools = parseCsvEnv('CLAUDE_FALLBACK_ALLOWED_TOOLS') ?? ['*'];
87
+ const disallowedTools = parseCsvEnv('CLAUDE_FALLBACK_DISALLOWED_TOOLS');
88
+ const maxBudgetUsd = parseBudget();
89
+ const settings = {
90
+ cwd,
91
+ permissionMode: DEFAULT_PERMISSION_MODE,
92
+ allowedTools: disallowedTools ? undefined : allowedTools,
93
+ disallowedTools,
94
+ maxBudgetUsd,
95
+ streamingInput: 'always',
96
+ canUseTool: async (toolName, input, ctx) => {
97
+ return canUseToolSafePolicy(toolName, input, ctx.toolUseID);
98
+ },
99
+ resume: options.resumeSessionId,
100
+ verbose: process.env.DEBUG_CLAUDE_FALLBACK === 'true',
101
+ };
102
+ return settings;
103
+ }
104
+ function createPrompt(prompt) {
105
+ return [
106
+ {
107
+ role: 'user',
108
+ content: [{ type: 'text', text: prompt }],
109
+ },
110
+ ];
111
+ }
112
+ function nowIso() {
113
+ return new Date().toISOString();
114
+ }
115
+ function parseRunOptions(optionsOrResume) {
116
+ if (typeof optionsOrResume === 'string') {
117
+ return { resumeSessionId: optionsOrResume };
118
+ }
119
+ return optionsOrResume ?? {};
120
+ }
121
+ export function abortClaudeCodeSession(taskId, reason = 'Task cancelled by user') {
122
+ const controller = activeFallbackControllers.get(taskId);
123
+ if (!controller) {
124
+ return false;
125
+ }
126
+ controller.abort(new Error(reason));
127
+ return true;
128
+ }
129
+ export async function runClaudeCodeSession(taskId, prompt, cwd, timeout, optionsOrResume) {
130
+ const options = parseRunOptions(optionsOrResume);
131
+ const task = taskManager.getTask(taskId);
132
+ if (!task) {
133
+ console.error(`[claude-code-runner] Task ${taskId} not found`);
134
+ return;
135
+ }
136
+ if (isTerminalStatus(task.status)) {
137
+ console.error(`[claude-code-runner] Task ${taskId} already terminal (${task.status}), skipping`);
138
+ return;
139
+ }
140
+ if (activeFallbackControllers.has(taskId)) {
141
+ console.error(`[claude-code-runner] Task ${taskId} already has an active fallback run, skipping duplicate start`);
142
+ return;
143
+ }
144
+ const effectiveTimeout = timeout > 0 ? timeout : DEFAULT_TIMEOUT_MS;
145
+ const fallbackReason = options.fallbackReason ?? 'copilot_accounts_exhausted';
146
+ const modelId = resolveFallbackModel(options.preferredModel ?? task.model);
147
+ taskManager.updateTask(taskId, {
148
+ status: TaskStatus.RUNNING,
149
+ provider: 'claude-cli',
150
+ sessionMetrics: {
151
+ ...task.sessionMetrics,
152
+ quotas: task.sessionMetrics?.quotas || {},
153
+ toolMetrics: task.sessionMetrics?.toolMetrics || {},
154
+ activeSubagents: [],
155
+ completedSubagents: [],
156
+ turnCount: 0,
157
+ totalTokens: { input: 0, output: 0 },
158
+ provider: 'claude-cli',
159
+ fallbackActivated: true,
160
+ fallbackReason,
161
+ },
162
+ });
163
+ const abortController = new AbortController();
164
+ activeFallbackControllers.set(taskId, abortController);
165
+ const timeoutHandle = setTimeout(() => {
166
+ abortController.abort(new Error(`Claude fallback timed out after ${effectiveTimeout}ms`));
167
+ }, effectiveTimeout);
168
+ const toolMetrics = {};
169
+ const toolStartTimes = new Map();
170
+ let turnCount = 0;
171
+ let sessionId = options.resumeSessionId;
172
+ let totalInputTokens = 0;
173
+ let totalOutputTokens = 0;
174
+ let providerCostUsd;
175
+ let providerDurationMs;
176
+ let resultError;
177
+ let inTextBlock = false; // Track whether we're inside a text content block
178
+ const settings = createModelSettings(cwd, options);
179
+ try {
180
+ const model = claudeCode(modelId, settings);
181
+ const callOptions = {
182
+ prompt: createPrompt(prompt),
183
+ abortSignal: abortController.signal,
184
+ providerOptions: {},
185
+ responseFormat: { type: 'text' },
186
+ };
187
+ const streamResult = await model.doStream(callOptions);
188
+ const reader = streamResult.stream.getReader();
189
+ while (true) {
190
+ const { done, value } = await reader.read();
191
+ if (done)
192
+ break;
193
+ const part = value;
194
+ if (DEBUG) {
195
+ console.error(`[claude-code-runner] Stream part: ${part.type}`);
196
+ }
197
+ switch (part.type) {
198
+ case 'text-start':
199
+ // text-start is a content block boundary, not a turn boundary.
200
+ // Only emit a turn marker if this is the first text block or
201
+ // a new text block after a tool execution (i.e., a new agent turn).
202
+ if (!inTextBlock) {
203
+ turnCount += 1;
204
+ taskManager.appendOutput(taskId, `\n[Assistant Turn ${turnCount}]\n`);
205
+ }
206
+ inTextBlock = true;
207
+ break;
208
+ case 'text-delta':
209
+ taskManager.appendOutput(taskId, part.delta);
210
+ break;
211
+ case 'text-end':
212
+ inTextBlock = false;
213
+ break;
214
+ case 'reasoning-start':
215
+ break;
216
+ case 'reasoning-delta':
217
+ // Reasoning → file only (saves tokens for caller)
218
+ taskManager.appendOutputFileOnly(taskId, `[reasoning] ${part.delta}`);
219
+ break;
220
+ case 'reasoning-end':
221
+ break;
222
+ // V3 tool-input-* events: emitted by ai-sdk-provider-claude-code BEFORE tool-call
223
+ case 'tool-input-start': {
224
+ inTextBlock = false; // Tool execution ends the current text block
225
+ const inputToolName = part.toolName || 'unknown';
226
+ const inputToolId = part.id || '';
227
+ if (!toolMetrics[inputToolName]) {
228
+ toolMetrics[inputToolName] = {
229
+ toolName: inputToolName,
230
+ executionCount: 0,
231
+ successCount: 0,
232
+ failureCount: 0,
233
+ totalDurationMs: 0,
234
+ };
235
+ }
236
+ toolMetrics[inputToolName].executionCount += 1;
237
+ toolStartTimes.set(inputToolId, Date.now());
238
+ taskManager.appendOutput(taskId, `[tool] Starting: ${inputToolName}`);
239
+ break;
240
+ }
241
+ case 'tool-input-delta':
242
+ // Tool input streaming — log in debug mode only to avoid noise
243
+ if (DEBUG) {
244
+ const delta = part.delta || '';
245
+ if (delta.length > 0) {
246
+ taskManager.appendOutput(taskId, `[tool-input] ${delta.slice(0, 200)}`);
247
+ }
248
+ }
249
+ break;
250
+ case 'tool-input-end':
251
+ break;
252
+ case 'tool-call': {
253
+ const toolName = part.toolName || 'unknown';
254
+ // Only create metrics if tool-input-start didn't already (backward compat)
255
+ if (!toolMetrics[toolName]) {
256
+ toolMetrics[toolName] = {
257
+ toolName,
258
+ executionCount: 0,
259
+ successCount: 0,
260
+ failureCount: 0,
261
+ totalDurationMs: 0,
262
+ };
263
+ }
264
+ // Only increment if tool-input-start didn't already track this call
265
+ if (!toolStartTimes.has(part.toolCallId)) {
266
+ toolMetrics[toolName].executionCount += 1;
267
+ toolStartTimes.set(part.toolCallId, Date.now());
268
+ taskManager.appendOutput(taskId, `[tool] Starting: ${toolName}`);
269
+ }
270
+ break;
271
+ }
272
+ case 'tool-result': {
273
+ const toolName = part.toolName || 'unknown';
274
+ const start = toolStartTimes.get(part.toolCallId);
275
+ const duration = start ? Date.now() - start : 0;
276
+ toolStartTimes.delete(part.toolCallId);
277
+ const metrics = toolMetrics[toolName] || {
278
+ toolName,
279
+ executionCount: 0,
280
+ successCount: 0,
281
+ failureCount: 0,
282
+ totalDurationMs: 0,
283
+ };
284
+ metrics.totalDurationMs += duration;
285
+ metrics.lastExecutedAt = nowIso();
286
+ if (part.isError) {
287
+ metrics.failureCount += 1;
288
+ taskManager.appendOutput(taskId, `[tool] Failed: ${toolName}`);
289
+ }
290
+ else {
291
+ metrics.successCount += 1;
292
+ taskManager.appendOutput(taskId, `[tool] Completed: ${toolName} (${duration}ms)`);
293
+ }
294
+ toolMetrics[toolName] = metrics;
295
+ break;
296
+ }
297
+ case 'finish': {
298
+ totalInputTokens = part.usage?.inputTokens?.total ?? totalInputTokens;
299
+ totalOutputTokens = part.usage?.outputTokens?.total ?? totalOutputTokens;
300
+ const ccMeta = part.providerMetadata?.['claude-code'];
301
+ if (ccMeta) {
302
+ const maybeSession = ccMeta['sessionId'];
303
+ const maybeCost = ccMeta['costUsd'];
304
+ const maybeDuration = ccMeta['durationMs'];
305
+ if (typeof maybeSession === 'string')
306
+ sessionId = maybeSession;
307
+ if (typeof maybeCost === 'number')
308
+ providerCostUsd = maybeCost;
309
+ if (typeof maybeDuration === 'number')
310
+ providerDurationMs = maybeDuration;
311
+ }
312
+ if (part.finishReason.unified === 'error') {
313
+ resultError = `Claude stream ended with error (${part.finishReason.raw ?? 'unknown'})`;
314
+ }
315
+ break;
316
+ }
317
+ case 'error':
318
+ resultError = String(part.error ?? 'unknown stream error');
319
+ taskManager.appendOutput(taskId, `[error] ${resultError}`);
320
+ break;
321
+ case 'stream-start':
322
+ if (part.warnings.length > 0) {
323
+ taskManager.appendOutput(taskId, `[system] Claude warnings: ${part.warnings.map((w) => w.type).join(', ')}`);
324
+ }
325
+ break;
326
+ case 'source':
327
+ if (DEBUG) {
328
+ taskManager.appendOutput(taskId, `[source] ${JSON.stringify(part.source ?? '')}`);
329
+ }
330
+ break;
331
+ case 'file':
332
+ if (DEBUG) {
333
+ const filePart = part;
334
+ taskManager.appendOutput(taskId, `[file] ${filePart.mimeType ?? 'unknown'}`);
335
+ }
336
+ break;
337
+ default:
338
+ if (part.type === 'tool-error') {
339
+ const toolName = String(part.toolName ?? 'unknown');
340
+ const toolCallId = String(part.toolCallId ?? '');
341
+ const err = String(part.error ?? 'Tool error');
342
+ const start = toolCallId ? toolStartTimes.get(toolCallId) : undefined;
343
+ const duration = start ? Date.now() - start : 0;
344
+ const metrics = toolMetrics[toolName] || {
345
+ toolName,
346
+ executionCount: 0,
347
+ successCount: 0,
348
+ failureCount: 0,
349
+ totalDurationMs: 0,
350
+ };
351
+ metrics.failureCount += 1;
352
+ metrics.totalDurationMs += duration;
353
+ metrics.lastExecutedAt = nowIso();
354
+ toolMetrics[toolName] = metrics;
355
+ taskManager.appendOutput(taskId, `[tool] Failed: ${toolName} - ${err}`);
356
+ }
357
+ else if (DEBUG) {
358
+ console.error(`[claude-code-runner] Unhandled stream part type: ${part.type}`);
359
+ }
360
+ break;
361
+ }
362
+ }
363
+ const freshTask = taskManager.getTask(taskId);
364
+ if (!freshTask || isTerminalStatus(freshTask.status)) {
365
+ return;
366
+ }
367
+ const sessionMetrics = {
368
+ quotas: {},
369
+ toolMetrics,
370
+ activeSubagents: [],
371
+ completedSubagents: [],
372
+ turnCount,
373
+ totalTokens: {
374
+ input: totalInputTokens,
375
+ output: totalOutputTokens,
376
+ },
377
+ provider: 'claude-cli',
378
+ fallbackActivated: true,
379
+ fallbackReason,
380
+ sdkMetrics: {
381
+ totalPremiumRequests: 0,
382
+ totalApiDurationMs: providerDurationMs ?? 0,
383
+ },
384
+ };
385
+ if (providerCostUsd !== undefined) {
386
+ taskManager.appendOutput(taskId, `[metrics] Claude fallback cost: $${providerCostUsd.toFixed(4)}`);
387
+ }
388
+ if (resultError) {
389
+ taskManager.updateTask(taskId, {
390
+ status: TaskStatus.FAILED,
391
+ endTime: nowIso(),
392
+ exitCode: 1,
393
+ error: resultError,
394
+ failureContext: {
395
+ errorType: 'claude_provider_error',
396
+ message: resultError,
397
+ recoverable: false,
398
+ },
399
+ sessionMetrics,
400
+ sessionId,
401
+ session: undefined,
402
+ });
403
+ return;
404
+ }
405
+ // Emit compact summary before marking completed
406
+ const elapsedMs = Date.now() - (task?.startTime ? new Date(task.startTime).getTime() : Date.now());
407
+ const toolCallCount = Object.values(toolMetrics).reduce((s, m) => s + (m.executionCount || 0), 0);
408
+ const totalTokens = totalInputTokens + totalOutputTokens;
409
+ taskManager.appendOutput(taskId, `[summary] ${turnCount} turns | ${toolCallCount} tool calls | ${Math.round(totalTokens / 1000)}K tokens | ${Math.round(elapsedMs / 1000)}s`);
410
+ taskManager.updateTask(taskId, {
411
+ status: TaskStatus.COMPLETED,
412
+ endTime: nowIso(),
413
+ exitCode: 0,
414
+ sessionMetrics,
415
+ sessionId,
416
+ session: undefined,
417
+ });
418
+ }
419
+ catch (error) {
420
+ const freshTask = taskManager.getTask(taskId);
421
+ if (!freshTask || isTerminalStatus(freshTask.status)) {
422
+ return;
423
+ }
424
+ if (abortController.signal.aborted) {
425
+ const reason = String(abortController.signal.reason ?? '');
426
+ if (reason.toLowerCase().includes('cancel')) {
427
+ taskManager.updateTask(taskId, {
428
+ status: TaskStatus.CANCELLED,
429
+ endTime: nowIso(),
430
+ error: reason || 'Task cancelled',
431
+ exitCode: 130,
432
+ session: undefined,
433
+ });
434
+ }
435
+ else {
436
+ taskManager.updateTask(taskId, {
437
+ status: TaskStatus.TIMED_OUT,
438
+ endTime: nowIso(),
439
+ error: `Task timed out after ${effectiveTimeout}ms`,
440
+ timeoutReason: 'hard_timeout',
441
+ exitCode: 124,
442
+ session: undefined,
443
+ });
444
+ }
445
+ return;
446
+ }
447
+ let errorMessage = error instanceof Error ? error.message : String(error);
448
+ if (isAuthenticationError(error)) {
449
+ errorMessage = `Claude Code authentication failed: ${errorMessage}`;
450
+ }
451
+ else if (isTimeoutError(error)) {
452
+ errorMessage = `Claude Code timed out: ${errorMessage}`;
453
+ }
454
+ taskManager.updateTask(taskId, {
455
+ status: TaskStatus.FAILED,
456
+ endTime: nowIso(),
457
+ error: errorMessage,
458
+ exitCode: 1,
459
+ failureContext: {
460
+ errorType: error instanceof Error ? error.name : 'unknown',
461
+ message: errorMessage,
462
+ stack: error instanceof Error ? error.stack : undefined,
463
+ recoverable: false,
464
+ },
465
+ session: undefined,
466
+ });
467
+ }
468
+ finally {
469
+ clearTimeout(timeoutHandle);
470
+ if (activeFallbackControllers.get(taskId) === abortController) {
471
+ activeFallbackControllers.delete(taskId);
472
+ }
473
+ }
474
+ }
475
+ //# sourceMappingURL=claude-code-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-runner.js","sourceRoot":"","sources":["../../src/services/claude-code-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Stores client context including workspace roots from MCP initialization.
3
+ * The first root is used as default CWD for spawned processes.
4
+ */
5
+ declare class ClientContext {
6
+ private _roots;
7
+ private _defaultCwd;
8
+ /**
9
+ * Set roots from client's roots/list response
10
+ */
11
+ setRoots(roots: Array<{
12
+ uri: string;
13
+ name?: string;
14
+ }>): void;
15
+ /**
16
+ * Get the default CWD for spawning processes.
17
+ * Returns first client root if available, otherwise server's cwd.
18
+ */
19
+ getDefaultCwd(): string;
20
+ /**
21
+ * Get all client roots
22
+ */
23
+ getRoots(): string[];
24
+ /**
25
+ * Check if roots were provided by client
26
+ */
27
+ hasRoots(): boolean;
28
+ }
29
+ export declare const clientContext: ClientContext;
30
+ export {};
31
+ //# sourceMappingURL=client-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-context.d.ts","sourceRoot":"","sources":["../../src/services/client-context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAM,aAAa;IACjB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,WAAW,CAAyB;IAE5C;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAc5D;;;OAGG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,QAAQ,IAAI,MAAM,EAAE;IAIpB;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGpB;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Stores client context including workspace roots from MCP initialization.
3
+ * The first root is used as default CWD for spawned processes.
4
+ */
5
+ class ClientContext {
6
+ _roots = [];
7
+ _defaultCwd = process.cwd();
8
+ /**
9
+ * Set roots from client's roots/list response
10
+ */
11
+ setRoots(roots) {
12
+ this._roots = roots.map(r => {
13
+ // Convert file:// URI to filesystem path
14
+ if (r.uri.startsWith('file://')) {
15
+ return decodeURIComponent(r.uri.replace('file://', ''));
16
+ }
17
+ return r.uri;
18
+ });
19
+ if (this._roots.length > 0) {
20
+ this._defaultCwd = this._roots[0];
21
+ }
22
+ }
23
+ /**
24
+ * Get the default CWD for spawning processes.
25
+ * Returns first client root if available, otherwise server's cwd.
26
+ */
27
+ getDefaultCwd() {
28
+ return this._defaultCwd;
29
+ }
30
+ /**
31
+ * Get all client roots
32
+ */
33
+ getRoots() {
34
+ return [...this._roots];
35
+ }
36
+ /**
37
+ * Check if roots were provided by client
38
+ */
39
+ hasRoots() {
40
+ return this._roots.length > 0;
41
+ }
42
+ }
43
+ export const clientContext = new ClientContext();
44
+ //# sourceMappingURL=client-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-context.js","sourceRoot":"","sources":["../../src/services/client-context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,aAAa;IACT,MAAM,GAAa,EAAE,CAAC;IACtB,WAAW,GAAW,OAAO,CAAC,GAAG,EAAE,CAAC;IAE5C;;OAEG;IACH,QAAQ,CAAC,KAA4C;QACnD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC1B,yCAAyC;YACzC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,OAAO,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,CAAC,CAAC,GAAG,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAChC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Exhaustion Fallback Policy
3
+ *
4
+ * Encapsulates the decision logic for when to fallback to Claude Agent SDK.
5
+ * ONLY activates when allExhausted=true (all Copilot accounts are in cooldown).
6
+ *
7
+ * Does NOT trigger for:
8
+ * - Auth errors (401/403)
9
+ * - Timeouts
10
+ * - Single-account failures
11
+ * - Network errors
12
+ */
13
+ export interface RotationResult {
14
+ success: boolean;
15
+ allExhausted?: boolean;
16
+ error?: string;
17
+ }
18
+ /**
19
+ * Determine if we should fallback to Claude Agent SDK.
20
+ * Only returns true when ALL Copilot accounts are exhausted.
21
+ */
22
+ export declare function shouldFallbackToClaudeCode(rotationResult: RotationResult): boolean;
23
+ /**
24
+ * Check if fallback is enabled via environment variable.
25
+ */
26
+ export declare function isFallbackEnabled(): boolean;
27
+ //# sourceMappingURL=exhaustion-fallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exhaustion-fallback.d.ts","sourceRoot":"","sources":["../../src/services/exhaustion-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAKlF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Exhaustion Fallback Policy
3
+ *
4
+ * Encapsulates the decision logic for when to fallback to Claude Agent SDK.
5
+ * ONLY activates when allExhausted=true (all Copilot accounts are in cooldown).
6
+ *
7
+ * Does NOT trigger for:
8
+ * - Auth errors (401/403)
9
+ * - Timeouts
10
+ * - Single-account failures
11
+ * - Network errors
12
+ */
13
+ const FALLBACK_ENABLED = process.env.DISABLE_CLAUDE_CODE_FALLBACK !== 'true';
14
+ /**
15
+ * Determine if we should fallback to Claude Agent SDK.
16
+ * Only returns true when ALL Copilot accounts are exhausted.
17
+ */
18
+ export function shouldFallbackToClaudeCode(rotationResult) {
19
+ if (!FALLBACK_ENABLED) {
20
+ return false;
21
+ }
22
+ return rotationResult.allExhausted === true;
23
+ }
24
+ /**
25
+ * Check if fallback is enabled via environment variable.
26
+ */
27
+ export function isFallbackEnabled() {
28
+ return FALLBACK_ENABLED;
29
+ }
30
+ //# sourceMappingURL=exhaustion-fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exhaustion-fallback.js","sourceRoot":"","sources":["../../src/services/exhaustion-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,MAAM,CAAC;AAQ7E;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,cAA8B;IACvE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,cAAc,CAAC,YAAY,KAAK,IAAI,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { CopilotSession } from '@github/copilot-sdk';
2
+ import { type FallbackReason } from '../types.js';
3
+ export interface FallbackRequest {
4
+ reason: FallbackReason;
5
+ errorMessage?: string;
6
+ session?: CopilotSession;
7
+ cwd?: string;
8
+ promptOverride?: string;
9
+ awaitCompletion?: boolean;
10
+ }
11
+ /**
12
+ * Start Claude fallback exactly once per task.
13
+ * Uses task.fallbackAttempted as the single-flight guard.
14
+ */
15
+ export declare function triggerClaudeFallback(taskId: string, request: FallbackRequest): Promise<boolean>;
16
+ //# sourceMappingURL=fallback-orchestrator.d.ts.map