@qduc/term2 0.2.0 → 0.3.1

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 (163) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +14 -6
  3. package/dist/app.js.map +1 -1
  4. package/dist/components/BottomArea.d.ts +3 -2
  5. package/dist/components/BottomArea.d.ts.map +1 -1
  6. package/dist/components/BottomArea.js.map +1 -1
  7. package/dist/components/Input/PopupManager.d.ts +1 -1
  8. package/dist/components/Input/PopupManager.d.ts.map +1 -1
  9. package/dist/components/Input/PopupManager.js.map +1 -1
  10. package/dist/components/Input/determine-active-menu.d.ts +2 -1
  11. package/dist/components/Input/determine-active-menu.d.ts.map +1 -1
  12. package/dist/components/Input/determine-active-menu.js +41 -28
  13. package/dist/components/Input/determine-active-menu.js.map +1 -1
  14. package/dist/components/InputBox.d.ts +3 -2
  15. package/dist/components/InputBox.d.ts.map +1 -1
  16. package/dist/components/InputBox.js +46 -11
  17. package/dist/components/InputBox.js.map +1 -1
  18. package/dist/components/InputBox.menu-logic.test.js +55 -15
  19. package/dist/components/InputBox.menu-logic.test.js.map +1 -1
  20. package/dist/components/MarkdownRenderer.d.ts.map +1 -1
  21. package/dist/components/MarkdownRenderer.js +36 -24
  22. package/dist/components/MarkdownRenderer.js.map +1 -1
  23. package/dist/components/MessageList.test.js +14 -0
  24. package/dist/components/MessageList.test.js.map +1 -1
  25. package/dist/components/SlashCommandMenu.d.ts +1 -6
  26. package/dist/components/SlashCommandMenu.d.ts.map +1 -1
  27. package/dist/components/SlashCommandMenu.js.map +1 -1
  28. package/dist/hooks/use-app-commands.d.ts +1 -1
  29. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  30. package/dist/hooks/use-app-commands.js +4 -0
  31. package/dist/hooks/use-app-commands.js.map +1 -1
  32. package/dist/hooks/use-conversation.d.ts +2 -1
  33. package/dist/hooks/use-conversation.d.ts.map +1 -1
  34. package/dist/hooks/use-conversation.js +6 -4
  35. package/dist/hooks/use-conversation.js.map +1 -1
  36. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  37. package/dist/hooks/use-model-selection.js +32 -11
  38. package/dist/hooks/use-model-selection.js.map +1 -1
  39. package/dist/hooks/use-model-selection.test.js +107 -10
  40. package/dist/hooks/use-model-selection.test.js.map +1 -1
  41. package/dist/hooks/use-slash-commands.d.ts +1 -1
  42. package/dist/hooks/use-slash-commands.d.ts.map +1 -1
  43. package/dist/hooks/use-trigger-detection.d.ts +3 -1
  44. package/dist/hooks/use-trigger-detection.d.ts.map +1 -1
  45. package/dist/hooks/use-trigger-detection.js +3 -3
  46. package/dist/hooks/use-trigger-detection.js.map +1 -1
  47. package/dist/lib/openai-agent-client.d.ts +2 -1
  48. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  49. package/dist/lib/openai-agent-client.js +2 -4
  50. package/dist/lib/openai-agent-client.js.map +1 -1
  51. package/dist/lib/openai-agent-client.test.js +1 -1
  52. package/dist/lib/openai-agent-client.test.js.map +1 -1
  53. package/dist/lib/retry-executor.d.ts.map +1 -1
  54. package/dist/lib/retry-executor.js +1 -2
  55. package/dist/lib/retry-executor.js.map +1 -1
  56. package/dist/lib/retry-executor.test.js +1 -2
  57. package/dist/lib/retry-executor.test.js.map +1 -1
  58. package/dist/providers/ai-sdk-message-normalizer.d.ts +8 -0
  59. package/dist/providers/ai-sdk-message-normalizer.d.ts.map +1 -0
  60. package/dist/providers/ai-sdk-message-normalizer.js +70 -0
  61. package/dist/providers/ai-sdk-message-normalizer.js.map +1 -0
  62. package/dist/providers/ai-sdk-message-normalizer.test.d.ts +2 -0
  63. package/dist/providers/ai-sdk-message-normalizer.test.d.ts.map +1 -0
  64. package/dist/providers/ai-sdk-message-normalizer.test.js +195 -0
  65. package/dist/providers/ai-sdk-message-normalizer.test.js.map +1 -0
  66. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts +24 -0
  67. package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -0
  68. package/dist/providers/ai-sdk-openai-compatible.provider.js +27 -0
  69. package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -0
  70. package/dist/providers/ai-sdk-openai-compatible.provider.test.d.ts +2 -0
  71. package/dist/providers/ai-sdk-openai-compatible.provider.test.d.ts.map +1 -0
  72. package/dist/providers/ai-sdk-openai-compatible.provider.test.js +68 -0
  73. package/dist/providers/ai-sdk-openai-compatible.provider.test.js.map +1 -0
  74. package/dist/providers/ai-sdk-openrouter.provider.d.ts +16 -0
  75. package/dist/providers/ai-sdk-openrouter.provider.d.ts.map +1 -0
  76. package/dist/providers/ai-sdk-openrouter.provider.js +22 -0
  77. package/dist/providers/ai-sdk-openrouter.provider.js.map +1 -0
  78. package/dist/providers/ai-sdk-openrouter.provider.test.d.ts +2 -0
  79. package/dist/providers/ai-sdk-openrouter.provider.test.d.ts.map +1 -0
  80. package/dist/providers/ai-sdk-openrouter.provider.test.js +70 -0
  81. package/dist/providers/ai-sdk-openrouter.provider.test.js.map +1 -0
  82. package/dist/providers/common/openai-compatible-messages.d.ts +8 -0
  83. package/dist/providers/common/openai-compatible-messages.d.ts.map +1 -0
  84. package/dist/providers/common/openai-compatible-messages.js +356 -0
  85. package/dist/providers/common/openai-compatible-messages.js.map +1 -0
  86. package/dist/providers/common/openai-compatible-messages.test.d.ts +2 -0
  87. package/dist/providers/common/openai-compatible-messages.test.d.ts.map +1 -0
  88. package/dist/providers/common/openai-compatible-messages.test.js +26 -0
  89. package/dist/providers/common/openai-compatible-messages.test.js.map +1 -0
  90. package/dist/providers/common/openai-compatible-utils.d.ts +11 -0
  91. package/dist/providers/common/openai-compatible-utils.d.ts.map +1 -0
  92. package/dist/providers/common/openai-compatible-utils.js +33 -0
  93. package/dist/providers/common/openai-compatible-utils.js.map +1 -0
  94. package/dist/providers/common/provider-errors.d.ts +13 -0
  95. package/dist/providers/common/provider-errors.d.ts.map +1 -0
  96. package/dist/providers/common/provider-errors.js +25 -0
  97. package/dist/providers/common/provider-errors.js.map +1 -0
  98. package/dist/providers/openai-compatible.provider.createRunner.test.d.ts +2 -0
  99. package/dist/providers/openai-compatible.provider.createRunner.test.d.ts.map +1 -0
  100. package/dist/providers/openai-compatible.provider.createRunner.test.js +39 -0
  101. package/dist/providers/openai-compatible.provider.createRunner.test.js.map +1 -0
  102. package/dist/providers/openai-compatible.provider.d.ts.map +1 -1
  103. package/dist/providers/openai-compatible.provider.js +18 -8
  104. package/dist/providers/openai-compatible.provider.js.map +1 -1
  105. package/dist/providers/openrouter.d.ts +1 -1
  106. package/dist/providers/openrouter.d.ts.map +1 -1
  107. package/dist/providers/openrouter.js +1 -3
  108. package/dist/providers/openrouter.js.map +1 -1
  109. package/dist/providers/openrouter.provider.createRunner.test.js +28 -0
  110. package/dist/providers/openrouter.provider.createRunner.test.js.map +1 -1
  111. package/dist/providers/openrouter.provider.js +14 -5
  112. package/dist/providers/openrouter.provider.js.map +1 -1
  113. package/dist/scripts/eval-auto-approval/dataset.d.ts +2 -2
  114. package/dist/services/conversation-session.d.ts +3 -2
  115. package/dist/services/conversation-session.d.ts.map +1 -1
  116. package/dist/services/conversation-session.js +12 -6
  117. package/dist/services/conversation-session.js.map +1 -1
  118. package/dist/services/conversation-store.d.ts +2 -0
  119. package/dist/services/conversation-store.d.ts.map +1 -1
  120. package/dist/services/conversation-store.js +27 -0
  121. package/dist/services/conversation-store.js.map +1 -1
  122. package/dist/services/conversation-store.test.js +34 -0
  123. package/dist/services/conversation-store.test.js.map +1 -1
  124. package/dist/services/logging-contract.d.ts +3 -3
  125. package/dist/services/logging-service.d.ts.map +1 -1
  126. package/dist/services/logging-service.js +5 -1
  127. package/dist/services/logging-service.js.map +1 -1
  128. package/dist/services/model-service.test.js +1 -5
  129. package/dist/services/model-service.test.js.map +1 -1
  130. package/dist/services/settings-schema.d.ts +12 -8
  131. package/dist/services/settings-schema.d.ts.map +1 -1
  132. package/dist/services/settings-schema.js +9 -0
  133. package/dist/services/settings-schema.js.map +1 -1
  134. package/dist/services/stream-event-parsing.js +1 -1
  135. package/dist/services/stream-event-parsing.js.map +1 -1
  136. package/dist/services/stream-event-parsing.test.js +13 -0
  137. package/dist/services/stream-event-parsing.test.js.map +1 -1
  138. package/dist/slash-commands.d.ts +20 -0
  139. package/dist/slash-commands.d.ts.map +1 -0
  140. package/dist/slash-commands.js +2 -0
  141. package/dist/slash-commands.js.map +1 -0
  142. package/dist/types/user-turn.d.ts +16 -0
  143. package/dist/types/user-turn.d.ts.map +1 -0
  144. package/dist/types/user-turn.js +27 -0
  145. package/dist/types/user-turn.js.map +1 -0
  146. package/dist/types/user-turn.test.d.ts +2 -0
  147. package/dist/types/user-turn.test.d.ts.map +1 -0
  148. package/dist/types/user-turn.test.js +32 -0
  149. package/dist/types/user-turn.test.js.map +1 -0
  150. package/dist/utils/log-truncation.d.ts +7 -0
  151. package/dist/utils/log-truncation.d.ts.map +1 -0
  152. package/dist/utils/log-truncation.js +66 -0
  153. package/dist/utils/log-truncation.js.map +1 -0
  154. package/dist/utils/log-truncation.test.d.ts +2 -0
  155. package/dist/utils/log-truncation.test.d.ts.map +1 -0
  156. package/dist/utils/log-truncation.test.js +44 -0
  157. package/dist/utils/log-truncation.test.js.map +1 -0
  158. package/dist/utils/settings-command.d.ts +1 -1
  159. package/dist/utils/settings-command.d.ts.map +1 -1
  160. package/dist/utils/settings-command.js +2 -0
  161. package/dist/utils/settings-command.js.map +1 -1
  162. package/package.json +6 -2
  163. package/readme.md +29 -24
@@ -0,0 +1,70 @@
1
+ function isAssistantReasoningOnlyMessage(message) {
2
+ const content = message?.content;
3
+ if (message?.role === 'assistant' &&
4
+ Array.isArray(content) &&
5
+ content.length > 0 &&
6
+ content.every((part) => part?.type === 'reasoning') &&
7
+ !Array.isArray(message.tool_calls)) {
8
+ return true;
9
+ }
10
+ return (message?.role === 'assistant' &&
11
+ typeof message.reasoning_content === 'string' &&
12
+ (message.content === '' || message.content === null || message.content === undefined) &&
13
+ !Array.isArray(message.tool_calls));
14
+ }
15
+ function isAssistantToolCallMessage(message) {
16
+ const content = message?.content;
17
+ if (message?.role === 'assistant' &&
18
+ Array.isArray(content) &&
19
+ content.some((part) => part?.type === 'tool-call') &&
20
+ message.reasoning_content === undefined) {
21
+ return true;
22
+ }
23
+ return message?.role === 'assistant' && Array.isArray(message.tool_calls) && message.reasoning_content === undefined;
24
+ }
25
+ export function mergeAssistantReasoningIntoToolCalls(messages) {
26
+ const merged = [];
27
+ for (const message of messages) {
28
+ const previous = merged[merged.length - 1];
29
+ if (isAssistantReasoningOnlyMessage(previous) && isAssistantToolCallMessage(message)) {
30
+ if (Array.isArray(previous.content) && Array.isArray(message.content)) {
31
+ merged[merged.length - 1] = {
32
+ ...message,
33
+ content: [...previous.content, ...message.content],
34
+ };
35
+ continue;
36
+ }
37
+ merged[merged.length - 1] = {
38
+ ...message,
39
+ reasoning_content: previous.reasoning_content,
40
+ };
41
+ continue;
42
+ }
43
+ merged.push(message);
44
+ }
45
+ return merged;
46
+ }
47
+ function normalizeOptions(options) {
48
+ if (!Array.isArray(options?.prompt) && !Array.isArray(options?.messages)) {
49
+ return options;
50
+ }
51
+ return {
52
+ ...options,
53
+ ...(Array.isArray(options.prompt) ? { prompt: mergeAssistantReasoningIntoToolCalls(options.prompt) } : {}),
54
+ ...(Array.isArray(options.messages) ? { messages: mergeAssistantReasoningIntoToolCalls(options.messages) } : {}),
55
+ };
56
+ }
57
+ export function withMergedAssistantReasoning(model) {
58
+ return new Proxy(model, {
59
+ get(target, property) {
60
+ if (property === 'doGenerate') {
61
+ return (options) => target.doGenerate(normalizeOptions(options));
62
+ }
63
+ if (property === 'doStream') {
64
+ return (options) => target.doStream(normalizeOptions(options));
65
+ }
66
+ return Reflect.get(target, property, target);
67
+ },
68
+ });
69
+ }
70
+ //# sourceMappingURL=ai-sdk-message-normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-message-normalizer.js","sourceRoot":"","sources":["../../source/providers/ai-sdk-message-normalizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ai-sdk-message-normalizer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-message-normalizer.test.d.ts","sourceRoot":"","sources":["../../source/providers/ai-sdk-message-normalizer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,195 @@
1
+ import test from 'ava';
2
+ import { mergeAssistantReasoningIntoToolCalls, withMergedAssistantReasoning } from './ai-sdk-message-normalizer.js';
3
+ test('mergeAssistantReasoningIntoToolCalls folds assistant reasoning into following assistant tool call', (t) => {
4
+ const messages = [
5
+ { role: 'user', content: 'what time is it?' },
6
+ {
7
+ role: 'assistant',
8
+ content: '',
9
+ reasoning_content: 'Need to use the shell for the exact time.',
10
+ },
11
+ {
12
+ role: 'assistant',
13
+ content: null,
14
+ tool_calls: [
15
+ {
16
+ id: 'shell:0',
17
+ type: 'function',
18
+ function: {
19
+ name: 'shell',
20
+ arguments: '{"command":"date"}',
21
+ },
22
+ },
23
+ ],
24
+ },
25
+ ];
26
+ t.deepEqual(mergeAssistantReasoningIntoToolCalls(messages), [
27
+ { role: 'user', content: 'what time is it?' },
28
+ {
29
+ role: 'assistant',
30
+ content: null,
31
+ reasoning_content: 'Need to use the shell for the exact time.',
32
+ tool_calls: [
33
+ {
34
+ id: 'shell:0',
35
+ type: 'function',
36
+ function: {
37
+ name: 'shell',
38
+ arguments: '{"command":"date"}',
39
+ },
40
+ },
41
+ ],
42
+ },
43
+ ]);
44
+ });
45
+ test('mergeAssistantReasoningIntoToolCalls folds AI SDK reasoning content part into following assistant tool call', (t) => {
46
+ const messages = [
47
+ {
48
+ role: 'assistant',
49
+ content: [
50
+ {
51
+ type: 'reasoning',
52
+ text: 'Need to use the shell for the exact time.',
53
+ providerOptions: {},
54
+ },
55
+ ],
56
+ providerOptions: {},
57
+ },
58
+ {
59
+ role: 'assistant',
60
+ content: [
61
+ {
62
+ type: 'tool-call',
63
+ toolCallId: 'shell:0',
64
+ toolName: 'shell',
65
+ input: {
66
+ command: 'date',
67
+ },
68
+ providerOptions: {},
69
+ },
70
+ ],
71
+ providerOptions: {},
72
+ },
73
+ ];
74
+ t.deepEqual(mergeAssistantReasoningIntoToolCalls(messages), [
75
+ {
76
+ role: 'assistant',
77
+ content: [
78
+ {
79
+ type: 'reasoning',
80
+ text: 'Need to use the shell for the exact time.',
81
+ providerOptions: {},
82
+ },
83
+ {
84
+ type: 'tool-call',
85
+ toolCallId: 'shell:0',
86
+ toolName: 'shell',
87
+ input: {
88
+ command: 'date',
89
+ },
90
+ providerOptions: {},
91
+ },
92
+ ],
93
+ providerOptions: {},
94
+ },
95
+ ]);
96
+ });
97
+ test('mergeAssistantReasoningIntoToolCalls preserves messages that are not split reasoning and tool calls', (t) => {
98
+ const messages = [
99
+ {
100
+ role: 'assistant',
101
+ content: 'visible text',
102
+ reasoning_content: 'internal reasoning',
103
+ },
104
+ {
105
+ role: 'assistant',
106
+ content: null,
107
+ tool_calls: [{ id: 'call:0' }],
108
+ },
109
+ {
110
+ role: 'assistant',
111
+ content: '',
112
+ reasoning_content: 'already has a tool call',
113
+ tool_calls: [{ id: 'call:1' }],
114
+ },
115
+ ];
116
+ t.deepEqual(mergeAssistantReasoningIntoToolCalls(messages), messages);
117
+ });
118
+ test('withMergedAssistantReasoning normalizes doGenerate messages before delegating', async (t) => {
119
+ let delegatedOptions;
120
+ const model = withMergedAssistantReasoning({
121
+ provider: 'example',
122
+ modelId: 'model',
123
+ specificationVersion: 'v3',
124
+ supportedUrls: {},
125
+ doGenerate: async (options) => {
126
+ delegatedOptions = options;
127
+ return { text: 'ok' };
128
+ },
129
+ doStream: async () => ({ stream: [] }),
130
+ });
131
+ await model.doGenerate({
132
+ temperature: 0,
133
+ messages: [
134
+ { role: 'assistant', content: '', reasoning_content: 'reasoning' },
135
+ { role: 'assistant', content: null, tool_calls: [{ id: 'call:0' }] },
136
+ ],
137
+ });
138
+ t.deepEqual(delegatedOptions, {
139
+ temperature: 0,
140
+ messages: [{ role: 'assistant', content: null, reasoning_content: 'reasoning', tool_calls: [{ id: 'call:0' }] }],
141
+ });
142
+ });
143
+ test('withMergedAssistantReasoning normalizes doStream messages before delegating', async (t) => {
144
+ let delegatedOptions;
145
+ const model = withMergedAssistantReasoning({
146
+ provider: 'example',
147
+ modelId: 'model',
148
+ specificationVersion: 'v3',
149
+ supportedUrls: {},
150
+ doGenerate: async () => ({ text: 'ok' }),
151
+ doStream: async (options) => {
152
+ delegatedOptions = options;
153
+ return { stream: [] };
154
+ },
155
+ });
156
+ await model.doStream({
157
+ messages: [
158
+ { role: 'assistant', content: '', reasoning_content: 'reasoning' },
159
+ { role: 'assistant', content: null, tool_calls: [{ id: 'call:0' }] },
160
+ ],
161
+ });
162
+ t.deepEqual(delegatedOptions.messages, [
163
+ { role: 'assistant', content: null, reasoning_content: 'reasoning', tool_calls: [{ id: 'call:0' }] },
164
+ ]);
165
+ });
166
+ test('withMergedAssistantReasoning preserves model properties exposed by getters', (t) => {
167
+ class GetterBackedModel {
168
+ #provider = 'example.chat';
169
+ #modelId = 'selected-model';
170
+ get provider() {
171
+ return this.#provider;
172
+ }
173
+ get modelId() {
174
+ return this.#modelId;
175
+ }
176
+ get specificationVersion() {
177
+ return 'v3';
178
+ }
179
+ get supportedUrls() {
180
+ return {};
181
+ }
182
+ async doGenerate() {
183
+ return { text: 'ok' };
184
+ }
185
+ async doStream() {
186
+ return { stream: [] };
187
+ }
188
+ }
189
+ const model = withMergedAssistantReasoning(new GetterBackedModel());
190
+ t.is(model.provider, 'example.chat');
191
+ t.is(model.modelId, 'selected-model');
192
+ t.is(model.specificationVersion, 'v3');
193
+ t.deepEqual(model.supportedUrls, {});
194
+ });
195
+ //# sourceMappingURL=ai-sdk-message-normalizer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-message-normalizer.test.js","sourceRoot":"","sources":["../../source/providers/ai-sdk-message-normalizer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type ModelProvider, type Model } from '@openai/agents-core';
2
+ export type AiSdkOpenAICompatibleConfig = {
3
+ baseURL: string;
4
+ apiKey?: string;
5
+ headers?: Record<string, string>;
6
+ };
7
+ export type AiSdkOpenAICompatibleProviderFactory = (options: {
8
+ name: string;
9
+ baseURL: string;
10
+ apiKey?: string;
11
+ headers?: Record<string, string>;
12
+ includeUsage?: boolean;
13
+ }) => (modelId: string) => any;
14
+ export declare class AiSdkOpenAICompatibleProvider implements ModelProvider {
15
+ #private;
16
+ constructor(deps: {
17
+ label: string;
18
+ defaultModel: string;
19
+ resolveConfig: () => AiSdkOpenAICompatibleConfig;
20
+ createProvider?: AiSdkOpenAICompatibleProviderFactory;
21
+ });
22
+ getModel(modelName?: string): Promise<Model> | Model;
23
+ }
24
+ //# sourceMappingURL=ai-sdk-openai-compatible.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-openai-compatible.provider.d.ts","sourceRoot":"","sources":["../../source/providers/ai-sdk-openai-compatible.provider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAGrE,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG,CAAC,OAAO,EAAE;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,GAAG,CAAC;AAE/B,qBAAa,6BAA8B,YAAW,aAAa;;gBAMrD,IAAI,EAAE;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,2BAA2B,CAAC;QACjD,cAAc,CAAC,EAAE,oCAAoC,CAAC;KACvD;IAOD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;CAYrD"}
@@ -0,0 +1,27 @@
1
+ import { aisdk } from '@openai/agents-extensions/ai-sdk';
2
+ import { createOpenAICompatible } from '@ai-sdk/openai-compatible';
3
+ import { withMergedAssistantReasoning } from './ai-sdk-message-normalizer.js';
4
+ export class AiSdkOpenAICompatibleProvider {
5
+ #label;
6
+ #defaultModel;
7
+ #resolveConfig;
8
+ #createProvider;
9
+ constructor(deps) {
10
+ this.#label = deps.label;
11
+ this.#defaultModel = deps.defaultModel;
12
+ this.#resolveConfig = deps.resolveConfig;
13
+ this.#createProvider = deps.createProvider ?? createOpenAICompatible;
14
+ }
15
+ getModel(modelName) {
16
+ const config = this.#resolveConfig();
17
+ const provider = this.#createProvider({
18
+ name: this.#label,
19
+ baseURL: config.baseURL,
20
+ apiKey: config.apiKey,
21
+ headers: config.headers,
22
+ includeUsage: true,
23
+ });
24
+ return aisdk(withMergedAssistantReasoning(provider(modelName || this.#defaultModel)));
25
+ }
26
+ }
27
+ //# sourceMappingURL=ai-sdk-openai-compatible.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-openai-compatible.provider.js","sourceRoot":"","sources":["../../source/providers/ai-sdk-openai-compatible.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAgB9E,MAAM,OAAO,6BAA6B;IACxC,MAAM,CAAS;IACf,aAAa,CAAS;IACtB,cAAc,CAAoC;IAClD,eAAe,CAAuC;IAEtD,YAAY,IAKX;QACC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,IAAK,sBAA+D,CAAC;IACjH,CAAC;IAED,QAAQ,CAAC,SAAkB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC;YACpC,IAAI,EAAE,IAAI,CAAC,MAAM;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,4BAA4B,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAqB,CAAC;IAC5G,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ai-sdk-openai-compatible.provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-openai-compatible.provider.test.d.ts","sourceRoot":"","sources":["../../source/providers/ai-sdk-openai-compatible.provider.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import test from 'ava';
2
+ import { AiSdkOpenAICompatibleProvider } from './ai-sdk-openai-compatible.provider.js';
3
+ test('AiSdkOpenAICompatibleProvider creates an AI SDK model with resolved settings', (t) => {
4
+ const calls = [];
5
+ let requestedModel;
6
+ const provider = new AiSdkOpenAICompatibleProvider({
7
+ label: 'Example',
8
+ defaultModel: 'fallback-model',
9
+ resolveConfig: () => ({
10
+ baseURL: 'https://example.test/v1',
11
+ apiKey: 'test-key',
12
+ headers: {
13
+ 'X-Test': 'yes',
14
+ },
15
+ }),
16
+ createProvider: (options) => {
17
+ calls.push(options);
18
+ return (modelId) => {
19
+ requestedModel = modelId;
20
+ return {
21
+ specificationVersion: 'v3',
22
+ provider: 'example.chat',
23
+ modelId,
24
+ supportedUrls: {},
25
+ doGenerate: async () => ({}),
26
+ doStream: async () => ({ stream: [] }),
27
+ };
28
+ };
29
+ },
30
+ });
31
+ const model = provider.getModel('selected-model');
32
+ t.is(calls.length, 1);
33
+ t.like(calls[0], {
34
+ name: 'Example',
35
+ baseURL: 'https://example.test/v1',
36
+ apiKey: 'test-key',
37
+ headers: {
38
+ 'X-Test': 'yes',
39
+ },
40
+ });
41
+ t.is(requestedModel, 'selected-model');
42
+ t.is(typeof model.getResponse, 'function');
43
+ t.is(typeof model.getStreamedResponse, 'function');
44
+ });
45
+ test('AiSdkOpenAICompatibleProvider uses the default model when none is requested', (t) => {
46
+ let requestedModel;
47
+ const provider = new AiSdkOpenAICompatibleProvider({
48
+ label: 'Example',
49
+ defaultModel: 'fallback-model',
50
+ resolveConfig: () => ({
51
+ baseURL: 'https://example.test/v1',
52
+ }),
53
+ createProvider: () => (modelId) => {
54
+ requestedModel = modelId;
55
+ return {
56
+ specificationVersion: 'v3',
57
+ provider: 'example.chat',
58
+ modelId,
59
+ supportedUrls: {},
60
+ doGenerate: async () => ({}),
61
+ doStream: async () => ({ stream: [] }),
62
+ };
63
+ },
64
+ });
65
+ provider.getModel();
66
+ t.is(requestedModel, 'fallback-model');
67
+ });
68
+ //# sourceMappingURL=ai-sdk-openai-compatible.provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-openai-compatible.provider.test.js","sourceRoot":"","sources":["../../source/providers/ai-sdk-openai-compatible.provider.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AAEvF,IAAI,CAAC,8EAA8E,EAAE,CAAC,CAAC,EAAE,EAAE;IACzF,MAAM,KAAK,GAAU,EAAE,CAAC;IACxB,IAAI,cAAkC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,6BAA6B,CAAC;QACjD,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,gBAAgB;QAC9B,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;YACpB,OAAO,EAAE,yBAAyB;YAClC,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE;gBACP,QAAQ,EAAE,KAAK;aAChB;SACF,CAAC;QACF,cAAc,EAAE,CAAC,OAAY,EAAE,EAAE;YAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO,CAAC,OAAe,EAAE,EAAE;gBACzB,cAAc,GAAG,OAAO,CAAC;gBACzB,OAAO;oBACL,oBAAoB,EAAE,IAAI;oBAC1B,QAAQ,EAAE,cAAc;oBACxB,OAAO;oBACP,aAAa,EAAE,EAAE;oBACjB,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;oBAC5B,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;iBAChC,CAAC;YACX,CAAC,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAElD,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QACf,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,yBAAyB;QAClC,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE;YACP,QAAQ,EAAE,KAAK;SAChB;KACF,CAAC,CAAC;IACH,CAAC,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;IACvC,CAAC,CAAC,EAAE,CAAC,OAAQ,KAAa,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACpD,CAAC,CAAC,EAAE,CAAC,OAAQ,KAAa,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6EAA6E,EAAE,CAAC,CAAC,EAAE,EAAE;IACxF,IAAI,cAAkC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,6BAA6B,CAAC;QACjD,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,gBAAgB;QAC9B,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;YACpB,OAAO,EAAE,yBAAyB;SACnC,CAAC;QACF,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,OAAe,EAAE,EAAE;YACxC,cAAc,GAAG,OAAO,CAAC;YACzB,OAAO;gBACL,oBAAoB,EAAE,IAAI;gBAC1B,QAAQ,EAAE,cAAc;gBACxB,OAAO;gBACP,aAAa,EAAE,EAAE;gBACjB,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC5B,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aAChC,CAAC;QACX,CAAC;KACF,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAEpB,CAAC,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type OpenRouterProviderSettings } from '@openrouter/ai-sdk-provider';
2
+ import { type ModelProvider, type Model } from '@openai/agents-core';
3
+ export type AiSdkOpenRouterConfig = Pick<OpenRouterProviderSettings, 'baseURL' | 'apiKey' | 'headers' | 'appName' | 'appUrl'>;
4
+ export type AiSdkOpenRouterProviderFactory = (options: AiSdkOpenRouterConfig & {
5
+ compatibility?: 'strict' | 'compatible';
6
+ }) => (modelId: string) => any;
7
+ export declare class AiSdkOpenRouterProvider implements ModelProvider {
8
+ #private;
9
+ constructor(deps: {
10
+ defaultModel: string;
11
+ resolveConfig: () => AiSdkOpenRouterConfig;
12
+ createProvider?: AiSdkOpenRouterProviderFactory;
13
+ });
14
+ getModel(modelName?: string): Promise<Model> | Model;
15
+ }
16
+ //# sourceMappingURL=ai-sdk-openrouter.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-openrouter.provider.d.ts","sourceRoot":"","sources":["../../source/providers/ai-sdk-openrouter.provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAGrE,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,0BAA0B,EAC1B,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CACxD,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,CAC3C,OAAO,EAAE,qBAAqB,GAAG;IAAE,aAAa,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAA;CAAE,KACzE,CAAC,OAAO,EAAE,MAAM,KAAK,GAAG,CAAC;AAE9B,qBAAa,uBAAwB,YAAW,aAAa;;gBAK/C,IAAI,EAAE;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,qBAAqB,CAAC;QAC3C,cAAc,CAAC,EAAE,8BAA8B,CAAC;KACjD;IAMD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;CASrD"}
@@ -0,0 +1,22 @@
1
+ import { aisdk } from '@openai/agents-extensions/ai-sdk';
2
+ import { createOpenRouter } from '@openrouter/ai-sdk-provider';
3
+ import { withMergedAssistantReasoning } from './ai-sdk-message-normalizer.js';
4
+ export class AiSdkOpenRouterProvider {
5
+ #defaultModel;
6
+ #resolveConfig;
7
+ #createProvider;
8
+ constructor(deps) {
9
+ this.#defaultModel = deps.defaultModel;
10
+ this.#resolveConfig = deps.resolveConfig;
11
+ this.#createProvider = deps.createProvider ?? createOpenRouter;
12
+ }
13
+ getModel(modelName) {
14
+ const config = this.#resolveConfig();
15
+ const provider = this.#createProvider({
16
+ ...config,
17
+ compatibility: 'strict',
18
+ });
19
+ return aisdk(withMergedAssistantReasoning(provider(modelName || this.#defaultModel)));
20
+ }
21
+ }
22
+ //# sourceMappingURL=ai-sdk-openrouter.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-openrouter.provider.js","sourceRoot":"","sources":["../../source/providers/ai-sdk-openrouter.provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAmC,MAAM,6BAA6B,CAAC;AAEhG,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAW9E,MAAM,OAAO,uBAAuB;IAClC,aAAa,CAAS;IACtB,cAAc,CAA8B;IAC5C,eAAe,CAAiC;IAEhD,YAAY,IAIX;QACC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,IAAK,gBAAmD,CAAC;IACrG,CAAC;IAED,QAAQ,CAAC,SAAkB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC;YACpC,GAAG,MAAM;YACT,aAAa,EAAE,QAAQ;SACxB,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,4BAA4B,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAqB,CAAC;IAC5G,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ai-sdk-openrouter.provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-openrouter.provider.test.d.ts","sourceRoot":"","sources":["../../source/providers/ai-sdk-openrouter.provider.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,70 @@
1
+ import test from 'ava';
2
+ import { AiSdkOpenRouterProvider } from './ai-sdk-openrouter.provider.js';
3
+ test('AiSdkOpenRouterProvider creates an AI SDK model with OpenRouter settings', (t) => {
4
+ const calls = [];
5
+ let requestedModel;
6
+ const provider = new AiSdkOpenRouterProvider({
7
+ defaultModel: 'openrouter/auto',
8
+ resolveConfig: () => ({
9
+ baseURL: 'https://openrouter.test/api/v1',
10
+ apiKey: 'sk-test',
11
+ headers: {
12
+ 'HTTP-Referer': 'https://term2.test',
13
+ 'X-Title': 'term2',
14
+ },
15
+ appName: 'term2',
16
+ appUrl: 'https://term2.test',
17
+ }),
18
+ createProvider: (options) => {
19
+ calls.push(options);
20
+ return (modelId) => {
21
+ requestedModel = modelId;
22
+ return {
23
+ specificationVersion: 'v3',
24
+ provider: 'openrouter.chat',
25
+ modelId,
26
+ supportedUrls: {},
27
+ doGenerate: async () => ({}),
28
+ doStream: async () => ({ stream: [] }),
29
+ };
30
+ };
31
+ },
32
+ });
33
+ const model = provider.getModel('anthropic/claude-sonnet-4.5');
34
+ t.is(calls.length, 1);
35
+ t.like(calls[0], {
36
+ baseURL: 'https://openrouter.test/api/v1',
37
+ apiKey: 'sk-test',
38
+ headers: {
39
+ 'HTTP-Referer': 'https://term2.test',
40
+ 'X-Title': 'term2',
41
+ },
42
+ appName: 'term2',
43
+ appUrl: 'https://term2.test',
44
+ compatibility: 'strict',
45
+ });
46
+ t.is(requestedModel, 'anthropic/claude-sonnet-4.5');
47
+ t.is(typeof model.getResponse, 'function');
48
+ t.is(typeof model.getStreamedResponse, 'function');
49
+ });
50
+ test('AiSdkOpenRouterProvider uses the default model when none is requested', (t) => {
51
+ let requestedModel;
52
+ const provider = new AiSdkOpenRouterProvider({
53
+ defaultModel: 'openrouter/auto',
54
+ resolveConfig: () => ({}),
55
+ createProvider: () => (modelId) => {
56
+ requestedModel = modelId;
57
+ return {
58
+ specificationVersion: 'v3',
59
+ provider: 'openrouter.chat',
60
+ modelId,
61
+ supportedUrls: {},
62
+ doGenerate: async () => ({}),
63
+ doStream: async () => ({ stream: [] }),
64
+ };
65
+ },
66
+ });
67
+ provider.getModel();
68
+ t.is(requestedModel, 'openrouter/auto');
69
+ });
70
+ //# sourceMappingURL=ai-sdk-openrouter.provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-sdk-openrouter.provider.test.js","sourceRoot":"","sources":["../../source/providers/ai-sdk-openrouter.provider.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type ModelRequest } from '@openai/agents-core';
2
+ import type { ILoggingService } from '../../services/service-interfaces.js';
3
+ export declare function addCacheControlToLastUserMessage(messages: any[]): void;
4
+ export declare function addCacheControlToLastToolMessage(messages: any[]): void;
5
+ export declare function buildMessagesFromRequest(req: ModelRequest, modelId?: string, loggingService?: ILoggingService): any[];
6
+ export declare function extractFunctionToolsFromRequest(req: ModelRequest): any[];
7
+ export declare function extractModelSettingsForRequest(settings: any): any;
8
+ //# sourceMappingURL=openai-compatible-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible-messages.d.ts","sourceRoot":"","sources":["../../../source/providers/common/openai-compatible-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAwI5E,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CAwBtE;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CAwBtE;AAuBD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,eAAe,GAAG,GAAG,EAAE,CAmIrH;AAED,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,YAAY,GAAG,GAAG,EAAE,CAsBxE;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CAiCjE"}