duocode 0.1.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 (220) hide show
  1. package/.env.example +36 -0
  2. package/LICENSE +21 -0
  3. package/README.md +52 -0
  4. package/dist/ast/context.d.ts +16 -0
  5. package/dist/ast/context.js +37 -0
  6. package/dist/ast/context.js.map +1 -0
  7. package/dist/ast/diff.d.ts +27 -0
  8. package/dist/ast/diff.js +44 -0
  9. package/dist/ast/diff.js.map +1 -0
  10. package/dist/ast/locks.d.ts +47 -0
  11. package/dist/ast/locks.js +88 -0
  12. package/dist/ast/locks.js.map +1 -0
  13. package/dist/ast/merge.d.ts +22 -0
  14. package/dist/ast/merge.js +120 -0
  15. package/dist/ast/merge.js.map +1 -0
  16. package/dist/ast/ownership.d.ts +31 -0
  17. package/dist/ast/ownership.js +111 -0
  18. package/dist/ast/ownership.js.map +1 -0
  19. package/dist/ast/parser.d.ts +44 -0
  20. package/dist/ast/parser.js +134 -0
  21. package/dist/ast/parser.js.map +1 -0
  22. package/dist/cli.d.ts +2 -0
  23. package/dist/cli.js +423 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/commands/doctor.d.ts +5 -0
  26. package/dist/commands/doctor.js +63 -0
  27. package/dist/commands/doctor.js.map +1 -0
  28. package/dist/commands/duo.d.ts +9 -0
  29. package/dist/commands/duo.js +285 -0
  30. package/dist/commands/duo.js.map +1 -0
  31. package/dist/commands/github.d.ts +2 -0
  32. package/dist/commands/github.js +85 -0
  33. package/dist/commands/github.js.map +1 -0
  34. package/dist/commands/init.d.ts +2 -0
  35. package/dist/commands/init.js +33 -0
  36. package/dist/commands/init.js.map +1 -0
  37. package/dist/commands/negotiation.d.ts +2 -0
  38. package/dist/commands/negotiation.js +160 -0
  39. package/dist/commands/negotiation.js.map +1 -0
  40. package/dist/commands/repl_commands.d.ts +26 -0
  41. package/dist/commands/repl_commands.js +226 -0
  42. package/dist/commands/repl_commands.js.map +1 -0
  43. package/dist/commands/shell.d.ts +1 -0
  44. package/dist/commands/shell.js +110 -0
  45. package/dist/commands/shell.js.map +1 -0
  46. package/dist/commands/start.d.ts +2 -0
  47. package/dist/commands/start.js +231 -0
  48. package/dist/commands/start.js.map +1 -0
  49. package/dist/commands/task.d.ts +2 -0
  50. package/dist/commands/task.js +215 -0
  51. package/dist/commands/task.js.map +1 -0
  52. package/dist/config/loader.d.ts +193 -0
  53. package/dist/config/loader.js +106 -0
  54. package/dist/config/loader.js.map +1 -0
  55. package/dist/context/project_context.d.ts +79 -0
  56. package/dist/context/project_context.js +292 -0
  57. package/dist/context/project_context.js.map +1 -0
  58. package/dist/context/token_budget.d.ts +35 -0
  59. package/dist/context/token_budget.js +81 -0
  60. package/dist/context/token_budget.js.map +1 -0
  61. package/dist/db/queries.d.ts +121 -0
  62. package/dist/db/queries.js +109 -0
  63. package/dist/db/queries.js.map +1 -0
  64. package/dist/db/schema.d.ts +110 -0
  65. package/dist/db/schema.js +346 -0
  66. package/dist/db/schema.js.map +1 -0
  67. package/dist/duo/duo_orchestrator.d.ts +50 -0
  68. package/dist/duo/duo_orchestrator.js +510 -0
  69. package/dist/duo/duo_orchestrator.js.map +1 -0
  70. package/dist/duo/duo_session.d.ts +47 -0
  71. package/dist/duo/duo_session.js +127 -0
  72. package/dist/duo/duo_session.js.map +1 -0
  73. package/dist/duo/duo_types.d.ts +168 -0
  74. package/dist/duo/duo_types.js +53 -0
  75. package/dist/duo/duo_types.js.map +1 -0
  76. package/dist/duo/session_store.d.ts +71 -0
  77. package/dist/duo/session_store.js +177 -0
  78. package/dist/duo/session_store.js.map +1 -0
  79. package/dist/git/worktree.d.ts +21 -0
  80. package/dist/git/worktree.js +86 -0
  81. package/dist/git/worktree.js.map +1 -0
  82. package/dist/github/cache.d.ts +23 -0
  83. package/dist/github/cache.js +67 -0
  84. package/dist/github/cache.js.map +1 -0
  85. package/dist/github/issues.d.ts +17 -0
  86. package/dist/github/issues.js +93 -0
  87. package/dist/github/issues.js.map +1 -0
  88. package/dist/github/mcp_client.d.ts +57 -0
  89. package/dist/github/mcp_client.js +214 -0
  90. package/dist/github/mcp_client.js.map +1 -0
  91. package/dist/github/sync.d.ts +11 -0
  92. package/dist/github/sync.js +65 -0
  93. package/dist/github/sync.js.map +1 -0
  94. package/dist/github/webhook.d.ts +25 -0
  95. package/dist/github/webhook.js +197 -0
  96. package/dist/github/webhook.js.map +1 -0
  97. package/dist/negotiation/index.d.ts +1 -0
  98. package/dist/negotiation/index.js +2 -0
  99. package/dist/negotiation/index.js.map +1 -0
  100. package/dist/negotiation/protocol.d.ts +62 -0
  101. package/dist/negotiation/protocol.js +188 -0
  102. package/dist/negotiation/protocol.js.map +1 -0
  103. package/dist/orchestrator/complexity_scorer.d.ts +2 -0
  104. package/dist/orchestrator/complexity_scorer.js +79 -0
  105. package/dist/orchestrator/complexity_scorer.js.map +1 -0
  106. package/dist/orchestrator/dependency_graph.d.ts +7 -0
  107. package/dist/orchestrator/dependency_graph.js +73 -0
  108. package/dist/orchestrator/dependency_graph.js.map +1 -0
  109. package/dist/orchestrator/intent_parser.d.ts +11 -0
  110. package/dist/orchestrator/intent_parser.js +116 -0
  111. package/dist/orchestrator/intent_parser.js.map +1 -0
  112. package/dist/orchestrator/task_runner.d.ts +56 -0
  113. package/dist/orchestrator/task_runner.js +181 -0
  114. package/dist/orchestrator/task_runner.js.map +1 -0
  115. package/dist/orchestrator/types.d.ts +44 -0
  116. package/dist/orchestrator/types.js +21 -0
  117. package/dist/orchestrator/types.js.map +1 -0
  118. package/dist/providers/anthropic.d.ts +12 -0
  119. package/dist/providers/anthropic.js +258 -0
  120. package/dist/providers/anthropic.js.map +1 -0
  121. package/dist/providers/auction.d.ts +42 -0
  122. package/dist/providers/auction.js +190 -0
  123. package/dist/providers/auction.js.map +1 -0
  124. package/dist/providers/base.d.ts +103 -0
  125. package/dist/providers/base.js +2 -0
  126. package/dist/providers/base.js.map +1 -0
  127. package/dist/providers/cost_tracker.d.ts +45 -0
  128. package/dist/providers/cost_tracker.js +111 -0
  129. package/dist/providers/cost_tracker.js.map +1 -0
  130. package/dist/providers/duo_pair_router.d.ts +11 -0
  131. package/dist/providers/duo_pair_router.js +67 -0
  132. package/dist/providers/duo_pair_router.js.map +1 -0
  133. package/dist/providers/factory.d.ts +7 -0
  134. package/dist/providers/factory.js +130 -0
  135. package/dist/providers/factory.js.map +1 -0
  136. package/dist/providers/grading_rubric.d.ts +37 -0
  137. package/dist/providers/grading_rubric.js +238 -0
  138. package/dist/providers/grading_rubric.js.map +1 -0
  139. package/dist/providers/openai.d.ts +12 -0
  140. package/dist/providers/openai.js +229 -0
  141. package/dist/providers/openai.js.map +1 -0
  142. package/dist/providers/openrouter.d.ts +14 -0
  143. package/dist/providers/openrouter.js +178 -0
  144. package/dist/providers/openrouter.js.map +1 -0
  145. package/dist/providers/performance_tracker.d.ts +21 -0
  146. package/dist/providers/performance_tracker.js +63 -0
  147. package/dist/providers/performance_tracker.js.map +1 -0
  148. package/dist/providers/registry_loader.d.ts +6 -0
  149. package/dist/providers/registry_loader.js +54 -0
  150. package/dist/providers/registry_loader.js.map +1 -0
  151. package/dist/providers/retry.d.ts +66 -0
  152. package/dist/providers/retry.js +203 -0
  153. package/dist/providers/retry.js.map +1 -0
  154. package/dist/providers/role_scorer.d.ts +16 -0
  155. package/dist/providers/role_scorer.js +16 -0
  156. package/dist/providers/role_scorer.js.map +1 -0
  157. package/dist/providers/router.d.ts +84 -0
  158. package/dist/providers/router.js +542 -0
  159. package/dist/providers/router.js.map +1 -0
  160. package/dist/security/credentials.d.ts +6 -0
  161. package/dist/security/credentials.js +16 -0
  162. package/dist/security/credentials.js.map +1 -0
  163. package/dist/setup/browser.d.ts +1 -0
  164. package/dist/setup/browser.js +12 -0
  165. package/dist/setup/browser.js.map +1 -0
  166. package/dist/setup/global_config.d.ts +14 -0
  167. package/dist/setup/global_config.js +54 -0
  168. package/dist/setup/global_config.js.map +1 -0
  169. package/dist/setup/wizard.d.ts +2 -0
  170. package/dist/setup/wizard.js +206 -0
  171. package/dist/setup/wizard.js.map +1 -0
  172. package/dist/tools/agent_loop.d.ts +38 -0
  173. package/dist/tools/agent_loop.js +72 -0
  174. package/dist/tools/agent_loop.js.map +1 -0
  175. package/dist/tools/approval.d.ts +64 -0
  176. package/dist/tools/approval.js +172 -0
  177. package/dist/tools/approval.js.map +1 -0
  178. package/dist/tools/checkpoint.d.ts +65 -0
  179. package/dist/tools/checkpoint.js +342 -0
  180. package/dist/tools/checkpoint.js.map +1 -0
  181. package/dist/tools/definitions.d.ts +13 -0
  182. package/dist/tools/definitions.js +103 -0
  183. package/dist/tools/definitions.js.map +1 -0
  184. package/dist/tools/diff_display.d.ts +46 -0
  185. package/dist/tools/diff_display.js +298 -0
  186. package/dist/tools/diff_display.js.map +1 -0
  187. package/dist/tools/executor.d.ts +12 -0
  188. package/dist/tools/executor.js +340 -0
  189. package/dist/tools/executor.js.map +1 -0
  190. package/dist/tools/permissions.d.ts +17 -0
  191. package/dist/tools/permissions.js +139 -0
  192. package/dist/tools/permissions.js.map +1 -0
  193. package/dist/tools/tool_types.d.ts +48 -0
  194. package/dist/tools/tool_types.js +7 -0
  195. package/dist/tools/tool_types.js.map +1 -0
  196. package/dist/ui/banner.d.ts +4 -0
  197. package/dist/ui/banner.js +104 -0
  198. package/dist/ui/banner.js.map +1 -0
  199. package/dist/ui/callbacks.d.ts +30 -0
  200. package/dist/ui/callbacks.js +132 -0
  201. package/dist/ui/callbacks.js.map +1 -0
  202. package/dist/ui/colors.d.ts +14 -0
  203. package/dist/ui/colors.js +28 -0
  204. package/dist/ui/colors.js.map +1 -0
  205. package/dist/ui/dashboard.d.ts +51 -0
  206. package/dist/ui/dashboard.js +181 -0
  207. package/dist/ui/dashboard.js.map +1 -0
  208. package/dist/ui/leaderboard.d.ts +16 -0
  209. package/dist/ui/leaderboard.js +43 -0
  210. package/dist/ui/leaderboard.js.map +1 -0
  211. package/dist/ui/logger.d.ts +28 -0
  212. package/dist/ui/logger.js +117 -0
  213. package/dist/ui/logger.js.map +1 -0
  214. package/dist/ui/progress.d.ts +16 -0
  215. package/dist/ui/progress.js +62 -0
  216. package/dist/ui/progress.js.map +1 -0
  217. package/dist/ui/tokenizer.d.ts +5 -0
  218. package/dist/ui/tokenizer.js +54 -0
  219. package/dist/ui/tokenizer.js.map +1 -0
  220. package/package.json +63 -0
@@ -0,0 +1,238 @@
1
+ import { extractLogicalProvider } from "./router.js";
2
+ import { GRADING_DIMENSIONS, DIMENSION_WEIGHTS, } from "../duo/duo_types.js";
3
+ const GRADING_SYSTEM_PROMPT = `You are a senior code quality evaluator. Grade the provided code output using the ISO/IEC 25010 software quality model.
4
+
5
+ Score each dimension from 1 (poor) to 5 (excellent) with brief reasoning.
6
+
7
+ Dimensions:
8
+ 1. **Correctness** (weight: 0.30) — Functional accuracy, passes implied tests, meets the spec
9
+ 2. **Security** (weight: 0.15) — No vulnerabilities, no deprecated APIs, proper input validation
10
+ 3. **Efficiency** (weight: 0.15) — Runtime/memory optimization, algorithmic complexity
11
+ 4. **Robustness** (weight: 0.15) — Error handling, edge cases, graceful degradation
12
+ 5. **Maintainability** (weight: 0.15) — Code clarity, modularity, follows conventions
13
+ 6. **Usability** (weight: 0.10) — API clarity, interface design, documentation
14
+
15
+ Output ONLY valid JSON matching this schema (no markdown, no explanation):
16
+ {
17
+ "scores": [
18
+ { "dimension": "correctness", "score": 4, "reasoning": "..." },
19
+ { "dimension": "security", "score": 3, "reasoning": "..." },
20
+ { "dimension": "efficiency", "score": 4, "reasoning": "..." },
21
+ { "dimension": "robustness", "score": 3, "reasoning": "..." },
22
+ { "dimension": "maintainability", "score": 4, "reasoning": "..." },
23
+ { "dimension": "usability", "score": 3, "reasoning": "..." }
24
+ ]
25
+ }`;
26
+ const ARCHITECT_GRADING_SYSTEM_PROMPT = `You are a senior software architect evaluator. Grade the provided architectural plan using the ISO/IEC 25010 software quality model, reinterpreted for plan quality.
27
+
28
+ Score each dimension from 1 (poor) to 5 (excellent) with brief reasoning.
29
+
30
+ Dimensions:
31
+ 1. **Correctness** (weight: 0.30) — Plan addresses the task correctly and completely
32
+ 2. **Security** (weight: 0.15) — Plan accounts for security concerns and threat vectors
33
+ 3. **Efficiency** (weight: 0.15) — Approach is algorithmically sound and resource-conscious
34
+ 4. **Robustness** (weight: 0.15) — Edge cases, failure modes, and error recovery are covered
35
+ 5. **Maintainability** (weight: 0.15) — Plan is clear, structured, and actionable
36
+ 6. **Usability** (weight: 0.10) — Plan is implementable by an executor without ambiguity
37
+
38
+ Output ONLY valid JSON matching this schema (no markdown, no explanation):
39
+ {
40
+ "scores": [
41
+ { "dimension": "correctness", "score": 4, "reasoning": "..." },
42
+ { "dimension": "security", "score": 3, "reasoning": "..." },
43
+ { "dimension": "efficiency", "score": 4, "reasoning": "..." },
44
+ { "dimension": "robustness", "score": 3, "reasoning": "..." },
45
+ { "dimension": "maintainability", "score": 4, "reasoning": "..." },
46
+ { "dimension": "usability", "score": 3, "reasoning": "..." }
47
+ ]
48
+ }`;
49
+ function stripFences(text) {
50
+ let cleaned = text.trim();
51
+ if (cleaned.startsWith("```json")) {
52
+ cleaned = cleaned.slice(7);
53
+ }
54
+ else if (cleaned.startsWith("```")) {
55
+ cleaned = cleaned.slice(3);
56
+ }
57
+ if (cleaned.endsWith("```")) {
58
+ cleaned = cleaned.slice(0, -3);
59
+ }
60
+ return cleaned.trim();
61
+ }
62
+ function parseGradingResponse(text) {
63
+ const cleaned = stripFences(text);
64
+ const parsed = JSON.parse(cleaned);
65
+ if (!parsed || !Array.isArray(parsed.scores)) {
66
+ throw new Error("Grading response missing 'scores' array");
67
+ }
68
+ const validDims = new Set(GRADING_DIMENSIONS);
69
+ return parsed.scores
70
+ .filter((s) => typeof s === "object" &&
71
+ s !== null &&
72
+ "dimension" in s &&
73
+ "score" in s &&
74
+ "reasoning" in s)
75
+ .filter((s) => validDims.has(s.dimension))
76
+ .map((s) => ({
77
+ dimension: s.dimension,
78
+ score: Math.max(1, Math.min(5, Math.round(Number(s.score)))),
79
+ reasoning: String(s.reasoning),
80
+ }));
81
+ }
82
+ function computeComposite(dimensions) {
83
+ let weighted = 0;
84
+ let totalWeight = 0;
85
+ for (const dim of dimensions) {
86
+ const weight = DIMENSION_WEIGHTS[dim.dimension] ?? 0;
87
+ weighted += dim.score * weight;
88
+ totalWeight += weight;
89
+ }
90
+ return totalWeight > 0 ? weighted / totalWeight : 0;
91
+ }
92
+ export class GradingRubric {
93
+ router;
94
+ constructor(router) {
95
+ this.router = router;
96
+ }
97
+ async grade(opts) {
98
+ const subjectLabel = opts.role === "architect" ? "Architectural Plan" : "Code Output";
99
+ const gradeLabel = opts.role === "architect"
100
+ ? "Grade this architectural plan on all 6 ISO/IEC 25010 dimensions."
101
+ : "Grade this code output on all 6 ISO/IEC 25010 dimensions.";
102
+ const userPrompt = `## Task
103
+ ${opts.taskDescription}
104
+
105
+ ## ${subjectLabel} (by ${opts.model}, role: ${opts.role})
106
+ \`\`\`
107
+ ${opts.code}
108
+ \`\`\`
109
+
110
+ ${gradeLabel}`;
111
+ const prompt = opts.systemPrompt ?? GRADING_SYSTEM_PROMPT;
112
+ const messages = [
113
+ { role: "system", content: prompt },
114
+ { role: "user", content: userPrompt },
115
+ ];
116
+ let judgeRationale;
117
+ let result;
118
+ if (opts.judgeModel) {
119
+ // Tier 1: Explicit judge override — use it directly
120
+ result = await this.router.generate({
121
+ model: opts.judgeModel,
122
+ messages,
123
+ temperature: 0.1,
124
+ });
125
+ judgeRationale = `explicit override: ${opts.judgeModel}`;
126
+ }
127
+ else {
128
+ // Tier 2: Cross-provider — exclude the graded model's logical provider
129
+ const logicalProvider = extractLogicalProvider(opts.model);
130
+ try {
131
+ result = await this.router.generate({
132
+ messages,
133
+ route: {
134
+ requiredCapabilities: ["deep_reasoning"],
135
+ requireStreaming: false,
136
+ excludedProviders: [logicalProvider],
137
+ excludedModels: [opts.model],
138
+ },
139
+ temperature: 0.1,
140
+ });
141
+ judgeRationale = `cross-provider: excluded provider "${logicalProvider}" and model "${opts.model}"`;
142
+ }
143
+ catch {
144
+ // Tier 3: Fallback — single provider, just exclude the exact model
145
+ try {
146
+ result = await this.router.generate({
147
+ messages,
148
+ route: {
149
+ requiredCapabilities: ["deep_reasoning"],
150
+ requireStreaming: false,
151
+ excludedModels: [opts.model],
152
+ },
153
+ temperature: 0.1,
154
+ });
155
+ judgeRationale = `same-provider fallback: excluded model "${opts.model}" (cross-provider unavailable)`;
156
+ }
157
+ catch {
158
+ // Last resort: no exclusions
159
+ result = await this.router.generate({
160
+ messages,
161
+ route: {
162
+ requiredCapabilities: ["deep_reasoning"],
163
+ requireStreaming: false,
164
+ },
165
+ temperature: 0.1,
166
+ });
167
+ judgeRationale = `no exclusion available: single model environment`;
168
+ }
169
+ }
170
+ }
171
+ const dimensions = parseGradingResponse(result.response.text);
172
+ // Fill in any missing dimensions with score 3
173
+ const foundDims = new Set(dimensions.map((d) => d.dimension));
174
+ for (const dim of GRADING_DIMENSIONS) {
175
+ if (!foundDims.has(dim)) {
176
+ dimensions.push({
177
+ dimension: dim,
178
+ score: 3,
179
+ reasoning: "Not evaluated — defaulted to neutral score.",
180
+ });
181
+ }
182
+ }
183
+ const compositeScore = computeComposite(dimensions);
184
+ return {
185
+ model: opts.model,
186
+ role: opts.role,
187
+ dimensions,
188
+ compositeScore,
189
+ gradedBy: result.response.model,
190
+ judgeRationale,
191
+ taskId: opts.taskId,
192
+ };
193
+ }
194
+ async gradeArchitectPlan(opts) {
195
+ return this.grade({
196
+ code: opts.plan,
197
+ taskDescription: opts.taskDescription,
198
+ model: opts.model,
199
+ role: "architect",
200
+ taskId: opts.taskId,
201
+ judgeModel: opts.judgeModel,
202
+ systemPrompt: ARCHITECT_GRADING_SYSTEM_PROMPT,
203
+ });
204
+ }
205
+ async compareOutputs(opts) {
206
+ const [gradeA, gradeB] = await Promise.all([
207
+ this.grade({
208
+ code: opts.codeA,
209
+ taskDescription: opts.taskDescription,
210
+ model: opts.modelA,
211
+ role: opts.role,
212
+ taskId: opts.taskId,
213
+ }),
214
+ this.grade({
215
+ code: opts.codeB,
216
+ taskDescription: opts.taskDescription,
217
+ model: opts.modelB,
218
+ role: opts.role,
219
+ taskId: opts.taskId,
220
+ }),
221
+ ]);
222
+ const delta = gradeA.compositeScore - gradeB.compositeScore;
223
+ const isDraw = Math.abs(delta) < 0.15;
224
+ const winner = isDraw
225
+ ? opts.modelA
226
+ : delta > 0
227
+ ? opts.modelA
228
+ : opts.modelB;
229
+ return {
230
+ gradeA,
231
+ gradeB,
232
+ winner,
233
+ isDraw,
234
+ scoreDelta: Math.abs(delta),
235
+ };
236
+ }
237
+ }
238
+ //# sourceMappingURL=grading_rubric.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grading_rubric.js","sourceRoot":"","sources":["../../src/providers/grading_rubric.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { GenerateRequest, ModelProvider, ProviderResponse, ProviderStreamEvent } from "./base.js";
2
+ export declare class OpenAIProvider implements ModelProvider {
3
+ readonly name: "openai";
4
+ private readonly client;
5
+ constructor(params?: {
6
+ apiKey?: string;
7
+ baseURL?: string;
8
+ });
9
+ supportsModel(model: string): boolean;
10
+ generate(request: GenerateRequest): Promise<ProviderResponse>;
11
+ stream(request: GenerateRequest): AsyncIterable<ProviderStreamEvent>;
12
+ }
@@ -0,0 +1,229 @@
1
+ import OpenAI from "openai";
2
+ function toOpenAiMessages(messages) {
3
+ return messages.map((message) => {
4
+ if (message.role === "tool") {
5
+ return {
6
+ role: "tool",
7
+ content: message.content,
8
+ tool_call_id: message.toolCallId ?? "",
9
+ };
10
+ }
11
+ // Assistant message carrying tool calls
12
+ if (message.role === "assistant" &&
13
+ message.toolCalls &&
14
+ message.toolCalls.length > 0) {
15
+ return {
16
+ role: "assistant",
17
+ content: message.content || null,
18
+ tool_calls: message.toolCalls.map((tc) => ({
19
+ id: tc.id,
20
+ type: "function",
21
+ function: {
22
+ name: tc.name,
23
+ arguments: JSON.stringify(tc.input),
24
+ },
25
+ })),
26
+ };
27
+ }
28
+ if (message.role === "system") {
29
+ return {
30
+ role: "system",
31
+ content: message.content,
32
+ name: message.name,
33
+ };
34
+ }
35
+ if (message.role === "assistant") {
36
+ return {
37
+ role: "assistant",
38
+ content: message.content,
39
+ name: message.name,
40
+ };
41
+ }
42
+ return {
43
+ role: "user",
44
+ content: message.content,
45
+ name: message.name,
46
+ };
47
+ });
48
+ }
49
+ function toOpenAiTools(tools) {
50
+ if (!tools || tools.length === 0) {
51
+ return undefined;
52
+ }
53
+ return tools.map((tool) => ({
54
+ type: "function",
55
+ function: {
56
+ name: tool.name,
57
+ description: tool.description,
58
+ parameters: tool.inputSchema,
59
+ },
60
+ }));
61
+ }
62
+ function toOpenAiToolChoice(choice) {
63
+ if (choice === "auto")
64
+ return "auto";
65
+ if (choice === "required")
66
+ return "required";
67
+ if (choice === "none")
68
+ return "none";
69
+ return undefined;
70
+ }
71
+ function parseToolCalls(rawToolCalls) {
72
+ if (!rawToolCalls) {
73
+ return [];
74
+ }
75
+ const calls = [];
76
+ for (const call of rawToolCalls) {
77
+ if (call.type !== "function")
78
+ continue;
79
+ const rawArguments = call.function?.arguments;
80
+ let input = {};
81
+ if (typeof rawArguments === "string" && rawArguments.length > 0) {
82
+ try {
83
+ input = JSON.parse(rawArguments);
84
+ }
85
+ catch {
86
+ input = { __raw: rawArguments };
87
+ }
88
+ }
89
+ calls.push({
90
+ id: String(call.id ?? ""),
91
+ name: String(call.function?.name ?? ""),
92
+ input,
93
+ });
94
+ }
95
+ return calls;
96
+ }
97
+ export class OpenAIProvider {
98
+ name = "openai";
99
+ client;
100
+ constructor(params) {
101
+ this.client = new OpenAI({
102
+ apiKey: params?.apiKey ?? process.env.OPENAI_API_KEY,
103
+ baseURL: params?.baseURL,
104
+ });
105
+ }
106
+ supportsModel(model) {
107
+ // Accept any model when using OpenRouter (base URL override)
108
+ if (this.client.baseURL && !this.client.baseURL.includes("api.openai.com")) {
109
+ return true;
110
+ }
111
+ // Reject Anthropic models on the native OpenAI endpoint
112
+ if (model.startsWith("claude"))
113
+ return false;
114
+ return true;
115
+ }
116
+ async generate(request) {
117
+ const params = {
118
+ model: request.model,
119
+ messages: toOpenAiMessages(request.messages),
120
+ tools: toOpenAiTools(request.tools),
121
+ tool_choice: toOpenAiToolChoice(request.toolChoice),
122
+ temperature: request.temperature,
123
+ max_tokens: request.maxOutputTokens,
124
+ };
125
+ const completion = await this.client.chat.completions.create(params);
126
+ const choice = completion.choices?.[0];
127
+ const message = choice?.message;
128
+ const toolCalls = parseToolCalls(message?.tool_calls);
129
+ return {
130
+ provider: this.name,
131
+ model: completion.model,
132
+ text: typeof message?.content === "string" ? message.content : "",
133
+ toolCalls,
134
+ stopReason: choice?.finish_reason ?? null,
135
+ usage: {
136
+ inputTokens: completion.usage?.prompt_tokens ?? 0,
137
+ outputTokens: completion.usage?.completion_tokens ?? 0,
138
+ },
139
+ raw: completion,
140
+ };
141
+ }
142
+ async *stream(request) {
143
+ const params = {
144
+ model: request.model,
145
+ messages: toOpenAiMessages(request.messages),
146
+ tools: toOpenAiTools(request.tools),
147
+ tool_choice: toOpenAiToolChoice(request.toolChoice),
148
+ temperature: request.temperature,
149
+ max_tokens: request.maxOutputTokens,
150
+ stream: true,
151
+ stream_options: { include_usage: true },
152
+ };
153
+ const stream = await this.client.chat.completions.create(params);
154
+ const textParts = [];
155
+ const toolCallBuffers = new Map();
156
+ let finalUsage = { inputTokens: 0, outputTokens: 0 };
157
+ let model = request.model;
158
+ let stopReason = null;
159
+ try {
160
+ for await (const chunk of stream) {
161
+ model = chunk.model ?? model;
162
+ if (chunk.usage) {
163
+ finalUsage = {
164
+ inputTokens: chunk.usage.prompt_tokens ?? finalUsage.inputTokens,
165
+ outputTokens: chunk.usage.completion_tokens ?? finalUsage.outputTokens,
166
+ };
167
+ yield { type: "usage", usage: finalUsage };
168
+ }
169
+ const delta = chunk.choices?.[0]?.delta;
170
+ const finishReason = chunk.choices?.[0]?.finish_reason;
171
+ if (finishReason) {
172
+ stopReason = finishReason;
173
+ }
174
+ if (typeof delta?.content === "string" && delta.content.length > 0) {
175
+ textParts.push(delta.content);
176
+ yield { type: "text-delta", delta: delta.content };
177
+ }
178
+ const chunkToolCalls = delta?.tool_calls;
179
+ if (chunkToolCalls && chunkToolCalls.length > 0) {
180
+ for (const toolCall of chunkToolCalls) {
181
+ const key = String(toolCall.id ?? toolCall.index ?? "0");
182
+ const existing = toolCallBuffers.get(key) ?? { name: "", args: "" };
183
+ if (typeof toolCall?.function?.name === "string") {
184
+ existing.name = toolCall.function.name;
185
+ }
186
+ if (typeof toolCall?.function?.arguments === "string") {
187
+ existing.args += toolCall.function.arguments;
188
+ }
189
+ toolCallBuffers.set(key, existing);
190
+ }
191
+ }
192
+ }
193
+ const parsedCalls = [...toolCallBuffers.entries()].map(([id, raw]) => {
194
+ let input = {};
195
+ if (raw.args.length > 0) {
196
+ try {
197
+ input = JSON.parse(raw.args);
198
+ }
199
+ catch {
200
+ input = { __raw: raw.args };
201
+ }
202
+ }
203
+ return {
204
+ id,
205
+ name: raw.name,
206
+ input,
207
+ };
208
+ });
209
+ for (const call of parsedCalls) {
210
+ yield { type: "tool-call", call };
211
+ }
212
+ const response = {
213
+ provider: this.name,
214
+ model,
215
+ text: textParts.join(""),
216
+ toolCalls: parsedCalls,
217
+ stopReason,
218
+ usage: finalUsage,
219
+ };
220
+ yield { type: "done", response };
221
+ }
222
+ catch (error) {
223
+ const normalized = error instanceof Error ? error : new Error(String(error));
224
+ yield { type: "error", error: normalized };
225
+ throw normalized;
226
+ }
227
+ }
228
+ }
229
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { GenerateRequest, ModelProvider, ProviderResponse, ProviderStreamEvent } from "./base.js";
2
+ export declare class OpenRouterProvider implements ModelProvider {
3
+ readonly name: "openrouter";
4
+ private readonly client;
5
+ constructor(params?: {
6
+ apiKey?: string;
7
+ baseURL?: string;
8
+ appName?: string;
9
+ siteUrl?: string;
10
+ });
11
+ supportsModel(_model: string): boolean;
12
+ generate(request: GenerateRequest): Promise<ProviderResponse>;
13
+ stream(request: GenerateRequest): AsyncIterable<ProviderStreamEvent>;
14
+ }