@openrouter/agent 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 (98) hide show
  1. package/README.md +367 -0
  2. package/esm/api-shape-helpers/claude-message.d.ts +218 -0
  3. package/esm/api-shape-helpers/claude-message.d.ts.map +1 -0
  4. package/esm/api-shape-helpers/claude-message.js +6 -0
  5. package/esm/api-shape-helpers/claude-message.js.map +1 -0
  6. package/esm/index.d.ts +22 -0
  7. package/esm/index.d.ts.map +1 -0
  8. package/esm/index.js +27 -0
  9. package/esm/index.js.map +1 -0
  10. package/esm/inner-loop/call-model.d.ts +67 -0
  11. package/esm/inner-loop/call-model.d.ts.map +1 -0
  12. package/esm/inner-loop/call-model.js +116 -0
  13. package/esm/inner-loop/call-model.js.map +1 -0
  14. package/esm/lib/anthropic-compat.d.ts +51 -0
  15. package/esm/lib/anthropic-compat.d.ts.map +1 -0
  16. package/esm/lib/anthropic-compat.js +216 -0
  17. package/esm/lib/anthropic-compat.js.map +1 -0
  18. package/esm/lib/anthropic-compat.test.d.ts +2 -0
  19. package/esm/lib/anthropic-compat.test.d.ts.map +1 -0
  20. package/esm/lib/anthropic-compat.test.js +668 -0
  21. package/esm/lib/anthropic-compat.test.js.map +1 -0
  22. package/esm/lib/async-params.d.ts +107 -0
  23. package/esm/lib/async-params.d.ts.map +1 -0
  24. package/esm/lib/async-params.js +94 -0
  25. package/esm/lib/async-params.js.map +1 -0
  26. package/esm/lib/chat-compat.d.ts +46 -0
  27. package/esm/lib/chat-compat.d.ts.map +1 -0
  28. package/esm/lib/chat-compat.js +111 -0
  29. package/esm/lib/chat-compat.js.map +1 -0
  30. package/esm/lib/chat-compat.test.d.ts +2 -0
  31. package/esm/lib/chat-compat.test.d.ts.map +1 -0
  32. package/esm/lib/chat-compat.test.js +405 -0
  33. package/esm/lib/chat-compat.test.js.map +1 -0
  34. package/esm/lib/claude-constants.d.ts +22 -0
  35. package/esm/lib/claude-constants.d.ts.map +1 -0
  36. package/esm/lib/claude-constants.js +20 -0
  37. package/esm/lib/claude-constants.js.map +1 -0
  38. package/esm/lib/claude-type-guards.d.ts +10 -0
  39. package/esm/lib/claude-type-guards.d.ts.map +1 -0
  40. package/esm/lib/claude-type-guards.js +68 -0
  41. package/esm/lib/claude-type-guards.js.map +1 -0
  42. package/esm/lib/conversation-state.d.ts +61 -0
  43. package/esm/lib/conversation-state.d.ts.map +1 -0
  44. package/esm/lib/conversation-state.js +230 -0
  45. package/esm/lib/conversation-state.js.map +1 -0
  46. package/esm/lib/model-result.d.ts +370 -0
  47. package/esm/lib/model-result.d.ts.map +1 -0
  48. package/esm/lib/model-result.js +1483 -0
  49. package/esm/lib/model-result.js.map +1 -0
  50. package/esm/lib/next-turn-params.d.ts +30 -0
  51. package/esm/lib/next-turn-params.d.ts.map +1 -0
  52. package/esm/lib/next-turn-params.js +129 -0
  53. package/esm/lib/next-turn-params.js.map +1 -0
  54. package/esm/lib/reusable-stream.d.ts +39 -0
  55. package/esm/lib/reusable-stream.d.ts.map +1 -0
  56. package/esm/lib/reusable-stream.js +192 -0
  57. package/esm/lib/reusable-stream.js.map +1 -0
  58. package/esm/lib/stop-conditions.d.ts +80 -0
  59. package/esm/lib/stop-conditions.d.ts.map +1 -0
  60. package/esm/lib/stop-conditions.js +104 -0
  61. package/esm/lib/stop-conditions.js.map +1 -0
  62. package/esm/lib/stream-transformers.d.ts +109 -0
  63. package/esm/lib/stream-transformers.d.ts.map +1 -0
  64. package/esm/lib/stream-transformers.js +856 -0
  65. package/esm/lib/stream-transformers.js.map +1 -0
  66. package/esm/lib/stream-type-guards.d.ts +29 -0
  67. package/esm/lib/stream-type-guards.d.ts.map +1 -0
  68. package/esm/lib/stream-type-guards.js +85 -0
  69. package/esm/lib/stream-type-guards.js.map +1 -0
  70. package/esm/lib/tool-context.d.ts +68 -0
  71. package/esm/lib/tool-context.d.ts.map +1 -0
  72. package/esm/lib/tool-context.js +188 -0
  73. package/esm/lib/tool-context.js.map +1 -0
  74. package/esm/lib/tool-event-broadcaster.d.ts +44 -0
  75. package/esm/lib/tool-event-broadcaster.d.ts.map +1 -0
  76. package/esm/lib/tool-event-broadcaster.js +162 -0
  77. package/esm/lib/tool-event-broadcaster.js.map +1 -0
  78. package/esm/lib/tool-executor.d.ts +73 -0
  79. package/esm/lib/tool-executor.d.ts.map +1 -0
  80. package/esm/lib/tool-executor.js +267 -0
  81. package/esm/lib/tool-executor.js.map +1 -0
  82. package/esm/lib/tool-orchestrator.d.ts +50 -0
  83. package/esm/lib/tool-orchestrator.d.ts.map +1 -0
  84. package/esm/lib/tool-orchestrator.js +180 -0
  85. package/esm/lib/tool-orchestrator.js.map +1 -0
  86. package/esm/lib/tool-types.d.ts +572 -0
  87. package/esm/lib/tool-types.d.ts.map +1 -0
  88. package/esm/lib/tool-types.js +80 -0
  89. package/esm/lib/tool-types.js.map +1 -0
  90. package/esm/lib/tool.d.ts +108 -0
  91. package/esm/lib/tool.d.ts.map +1 -0
  92. package/esm/lib/tool.js +84 -0
  93. package/esm/lib/tool.js.map +1 -0
  94. package/esm/lib/turn-context.d.ts +50 -0
  95. package/esm/lib/turn-context.d.ts.map +1 -0
  96. package/esm/lib/turn-context.js +61 -0
  97. package/esm/lib/turn-context.js.map +1 -0
  98. package/package.json +125 -0
@@ -0,0 +1,405 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { fromChatMessages, toChatMessage } from './chat-compat.js';
3
+ /**
4
+ * Creates a properly typed mock OpenResponsesResult for testing.
5
+ * This factory provides all required fields with sensible defaults.
6
+ */
7
+ function createMockResponse(overrides) {
8
+ return {
9
+ id: 'resp_test',
10
+ object: 'response',
11
+ createdAt: Date.now(),
12
+ completedAt: Date.now(),
13
+ model: 'openai/gpt-4',
14
+ status: 'completed',
15
+ error: null,
16
+ incompleteDetails: null,
17
+ temperature: null,
18
+ topP: null,
19
+ presencePenalty: null,
20
+ frequencyPenalty: null,
21
+ metadata: null,
22
+ tools: [],
23
+ toolChoice: 'auto',
24
+ parallelToolCalls: false,
25
+ ...overrides,
26
+ };
27
+ }
28
+ describe('fromChatMessages', () => {
29
+ describe('basic message conversion', () => {
30
+ it('converts user message with string content', () => {
31
+ const messages = [
32
+ {
33
+ role: 'user',
34
+ content: 'Hello, how are you?',
35
+ },
36
+ ];
37
+ const result = fromChatMessages(messages);
38
+ expect(result).toEqual([
39
+ {
40
+ role: 'user',
41
+ content: 'Hello, how are you?',
42
+ },
43
+ ]);
44
+ });
45
+ it('converts assistant message with string content', () => {
46
+ const messages = [
47
+ {
48
+ role: 'assistant',
49
+ content: 'I am doing well, thank you!',
50
+ },
51
+ ];
52
+ const result = fromChatMessages(messages);
53
+ expect(result).toEqual([
54
+ {
55
+ role: 'assistant',
56
+ content: 'I am doing well, thank you!',
57
+ },
58
+ ]);
59
+ });
60
+ it('converts system message with string content', () => {
61
+ const messages = [
62
+ {
63
+ role: 'system',
64
+ content: 'You are a helpful assistant.',
65
+ },
66
+ ];
67
+ const result = fromChatMessages(messages);
68
+ expect(result).toEqual([
69
+ {
70
+ role: 'system',
71
+ content: 'You are a helpful assistant.',
72
+ },
73
+ ]);
74
+ });
75
+ it('converts developer message with string content', () => {
76
+ const messages = [
77
+ {
78
+ role: 'developer',
79
+ content: 'Developer instructions here.',
80
+ },
81
+ ];
82
+ const result = fromChatMessages(messages);
83
+ expect(result).toEqual([
84
+ {
85
+ role: 'developer',
86
+ content: 'Developer instructions here.',
87
+ },
88
+ ]);
89
+ });
90
+ it('converts multiple messages in conversation', () => {
91
+ const messages = [
92
+ {
93
+ role: 'system',
94
+ content: 'You are helpful.',
95
+ },
96
+ {
97
+ role: 'user',
98
+ content: 'Hi',
99
+ },
100
+ {
101
+ role: 'assistant',
102
+ content: 'Hello!',
103
+ },
104
+ {
105
+ role: 'user',
106
+ content: 'How are you?',
107
+ },
108
+ ];
109
+ const result = fromChatMessages(messages);
110
+ expect(result).toEqual([
111
+ {
112
+ role: 'system',
113
+ content: 'You are helpful.',
114
+ },
115
+ {
116
+ role: 'user',
117
+ content: 'Hi',
118
+ },
119
+ {
120
+ role: 'assistant',
121
+ content: 'Hello!',
122
+ },
123
+ {
124
+ role: 'user',
125
+ content: 'How are you?',
126
+ },
127
+ ]);
128
+ });
129
+ });
130
+ describe('tool response message conversion', () => {
131
+ it('converts tool message to function_call_output', () => {
132
+ const messages = [
133
+ {
134
+ role: 'tool',
135
+ content: 'The weather is sunny and 72F',
136
+ toolCallId: 'call_abc123',
137
+ },
138
+ ];
139
+ const result = fromChatMessages(messages);
140
+ expect(result).toEqual([
141
+ {
142
+ type: 'function_call_output',
143
+ callId: 'call_abc123',
144
+ output: 'The weather is sunny and 72F',
145
+ },
146
+ ]);
147
+ });
148
+ it('converts tool message with object content by stringifying', () => {
149
+ const messages = [
150
+ {
151
+ role: 'tool',
152
+ content: [
153
+ {
154
+ type: 'text',
155
+ text: 'Structured response',
156
+ },
157
+ ],
158
+ toolCallId: 'call_def456',
159
+ },
160
+ ];
161
+ const result = fromChatMessages(messages);
162
+ expect(result).toEqual([
163
+ {
164
+ type: 'function_call_output',
165
+ callId: 'call_def456',
166
+ output: JSON.stringify([
167
+ {
168
+ type: 'text',
169
+ text: 'Structured response',
170
+ },
171
+ ]),
172
+ },
173
+ ]);
174
+ });
175
+ });
176
+ describe('content array handling', () => {
177
+ it('stringifies array content for user messages', () => {
178
+ const messages = [
179
+ {
180
+ role: 'user',
181
+ content: [
182
+ {
183
+ type: 'text',
184
+ text: 'Hello from array',
185
+ },
186
+ ],
187
+ },
188
+ ];
189
+ const result = fromChatMessages(messages);
190
+ expect(result).toEqual([
191
+ {
192
+ role: 'user',
193
+ content: JSON.stringify([
194
+ {
195
+ type: 'text',
196
+ text: 'Hello from array',
197
+ },
198
+ ]),
199
+ },
200
+ ]);
201
+ });
202
+ it('stringifies array content for assistant messages', () => {
203
+ const messages = [
204
+ {
205
+ role: 'assistant',
206
+ content: [
207
+ {
208
+ type: 'text',
209
+ text: 'Response in array',
210
+ },
211
+ ],
212
+ },
213
+ ];
214
+ const result = fromChatMessages(messages);
215
+ expect(result).toEqual([
216
+ {
217
+ role: 'assistant',
218
+ content: JSON.stringify([
219
+ {
220
+ type: 'text',
221
+ text: 'Response in array',
222
+ },
223
+ ]),
224
+ },
225
+ ]);
226
+ });
227
+ });
228
+ describe('null and empty content handling', () => {
229
+ it('handles null content in assistant message', () => {
230
+ const messages = [
231
+ {
232
+ role: 'assistant',
233
+ content: null,
234
+ },
235
+ ];
236
+ const result = fromChatMessages(messages);
237
+ expect(result).toEqual([
238
+ {
239
+ role: 'assistant',
240
+ content: '',
241
+ },
242
+ ]);
243
+ });
244
+ it('handles empty string content', () => {
245
+ const messages = [
246
+ {
247
+ role: 'user',
248
+ content: '',
249
+ },
250
+ ];
251
+ const result = fromChatMessages(messages);
252
+ expect(result).toEqual([
253
+ {
254
+ role: 'user',
255
+ content: '',
256
+ },
257
+ ]);
258
+ });
259
+ it('handles empty messages array', () => {
260
+ const result = fromChatMessages([]);
261
+ expect(result).toEqual([]);
262
+ });
263
+ });
264
+ });
265
+ describe('toChatMessage', () => {
266
+ describe('basic message conversion', () => {
267
+ it('converts response with text output to ChatAssistantMessage', () => {
268
+ const response = createMockResponse({
269
+ id: 'resp_123',
270
+ output: [
271
+ {
272
+ id: 'msg_1',
273
+ type: 'message',
274
+ role: 'assistant',
275
+ status: 'completed',
276
+ content: [
277
+ {
278
+ type: 'output_text',
279
+ text: 'Hello! How can I help you?',
280
+ annotations: [],
281
+ },
282
+ ],
283
+ },
284
+ ],
285
+ usage: {
286
+ inputTokens: 10,
287
+ outputTokens: 20,
288
+ totalTokens: 30,
289
+ inputTokensDetails: {
290
+ cachedTokens: 0,
291
+ },
292
+ outputTokensDetails: {
293
+ reasoningTokens: 0,
294
+ },
295
+ },
296
+ });
297
+ const result = toChatMessage(response);
298
+ expect(result).toEqual({
299
+ role: 'assistant',
300
+ content: 'Hello! How can I help you?',
301
+ });
302
+ });
303
+ it('combines multiple text parts into single content string', () => {
304
+ const response = createMockResponse({
305
+ id: 'resp_456',
306
+ output: [
307
+ {
308
+ id: 'msg_1',
309
+ type: 'message',
310
+ role: 'assistant',
311
+ status: 'completed',
312
+ content: [
313
+ {
314
+ type: 'output_text',
315
+ text: 'Part 1. ',
316
+ annotations: [],
317
+ },
318
+ {
319
+ type: 'output_text',
320
+ text: 'Part 2.',
321
+ annotations: [],
322
+ },
323
+ ],
324
+ },
325
+ ],
326
+ usage: {
327
+ inputTokens: 5,
328
+ outputTokens: 10,
329
+ totalTokens: 15,
330
+ inputTokensDetails: {
331
+ cachedTokens: 0,
332
+ },
333
+ outputTokensDetails: {
334
+ reasoningTokens: 0,
335
+ },
336
+ },
337
+ });
338
+ const result = toChatMessage(response);
339
+ expect(result).toEqual({
340
+ role: 'assistant',
341
+ content: 'Part 1. Part 2.',
342
+ });
343
+ });
344
+ it('returns null content when message has no text', () => {
345
+ const response = createMockResponse({
346
+ id: 'resp_789',
347
+ output: [
348
+ {
349
+ id: 'msg_1',
350
+ type: 'message',
351
+ role: 'assistant',
352
+ status: 'completed',
353
+ content: [],
354
+ },
355
+ ],
356
+ usage: {
357
+ inputTokens: 5,
358
+ outputTokens: 0,
359
+ totalTokens: 5,
360
+ inputTokensDetails: {
361
+ cachedTokens: 0,
362
+ },
363
+ outputTokensDetails: {
364
+ reasoningTokens: 0,
365
+ },
366
+ },
367
+ });
368
+ const result = toChatMessage(response);
369
+ expect(result).toEqual({
370
+ role: 'assistant',
371
+ content: null,
372
+ });
373
+ });
374
+ });
375
+ describe('error handling', () => {
376
+ it('throws error when no message found in output', () => {
377
+ const response = createMockResponse({
378
+ id: 'resp_err',
379
+ output: [
380
+ {
381
+ type: 'function_call',
382
+ callId: 'call_1',
383
+ name: 'test_tool',
384
+ arguments: '{}',
385
+ id: 'fc_1',
386
+ status: 'completed',
387
+ },
388
+ ],
389
+ usage: {
390
+ inputTokens: 5,
391
+ outputTokens: 10,
392
+ totalTokens: 15,
393
+ inputTokensDetails: {
394
+ cachedTokens: 0,
395
+ },
396
+ outputTokensDetails: {
397
+ reasoningTokens: 0,
398
+ },
399
+ },
400
+ });
401
+ expect(() => toChatMessage(response)).toThrow('No message found in response output');
402
+ });
403
+ });
404
+ });
405
+ //# sourceMappingURL=chat-compat.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-compat.test.js","sourceRoot":"","sources":["../../src/lib/chat-compat.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Claude-specific content block types
3
+ * Used for detecting Claude message format
4
+ */
5
+ export declare const ClaudeContentBlockType: {
6
+ readonly Text: "text";
7
+ readonly Image: "image";
8
+ readonly ToolUse: "tool_use";
9
+ readonly ToolResult: "tool_result";
10
+ };
11
+ export type ClaudeContentBlockType = (typeof ClaudeContentBlockType)[keyof typeof ClaudeContentBlockType];
12
+ /**
13
+ * Message roles that are NOT supported in Claude format
14
+ * Used for distinguishing Claude vs OpenAI format
15
+ */
16
+ export declare const NonClaudeMessageRole: {
17
+ readonly System: "system";
18
+ readonly Developer: "developer";
19
+ readonly Tool: "tool";
20
+ };
21
+ export type NonClaudeMessageRole = (typeof NonClaudeMessageRole)[keyof typeof NonClaudeMessageRole];
22
+ //# sourceMappingURL=claude-constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-constants.d.ts","sourceRoot":"","sources":["../../src/lib/claude-constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;;;CAKzB,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAChC,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,OAAO,sBAAsB,CAAC,CAAC;AAEvE;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;CAIvB,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,OAAO,oBAAoB,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Claude-specific content block types
3
+ * Used for detecting Claude message format
4
+ */
5
+ export const ClaudeContentBlockType = {
6
+ Text: 'text',
7
+ Image: 'image',
8
+ ToolUse: 'tool_use',
9
+ ToolResult: 'tool_result',
10
+ };
11
+ /**
12
+ * Message roles that are NOT supported in Claude format
13
+ * Used for distinguishing Claude vs OpenAI format
14
+ */
15
+ export const NonClaudeMessageRole = {
16
+ System: 'system',
17
+ Developer: 'developer',
18
+ Tool: 'tool',
19
+ };
20
+ //# sourceMappingURL=claude-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-constants.js","sourceRoot":"","sources":["../../src/lib/claude-constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,UAAU;IACnB,UAAU,EAAE,aAAa;CACjB,CAAC;AAKX;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;IACtB,IAAI,EAAE,MAAM;CACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ClaudeMessageParam } from '../api-shape-helpers/claude-message.js';
2
+ /**
3
+ * Check if input is in Claude message format
4
+ * Uses structural analysis to detect Claude-specific patterns
5
+ *
6
+ * @param input - Input to check
7
+ * @returns True if input appears to be Claude format
8
+ */
9
+ export declare function isClaudeStyleMessages(input: unknown): input is ClaudeMessageParam[];
10
+ //# sourceMappingURL=claude-type-guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-type-guards.d.ts","sourceRoot":"","sources":["../../src/lib/claude-type-guards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AA8CjF;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,EAAE,CAuBnF"}
@@ -0,0 +1,68 @@
1
+ import { ClaudeContentBlockType, NonClaudeMessageRole } from './claude-constants.js';
2
+ function isRecord(value) {
3
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
4
+ }
5
+ function isNonClaudeRole(role) {
6
+ return (role === NonClaudeMessageRole.System ||
7
+ role === NonClaudeMessageRole.Developer ||
8
+ role === NonClaudeMessageRole.Tool);
9
+ }
10
+ function isClaudeToolResultBlock(block) {
11
+ if (!isRecord(block))
12
+ return false;
13
+ return block['type'] === ClaudeContentBlockType.ToolResult;
14
+ }
15
+ function isClaudeImageBlockWithSource(block) {
16
+ if (!isRecord(block))
17
+ return false;
18
+ return (block['type'] === ClaudeContentBlockType.Image && 'source' in block && isRecord(block['source']));
19
+ }
20
+ function isClaudeToolUseBlockWithId(block) {
21
+ if (!isRecord(block))
22
+ return false;
23
+ return (block['type'] === ClaudeContentBlockType.ToolUse &&
24
+ 'id' in block &&
25
+ typeof block['id'] === 'string');
26
+ }
27
+ function hasClaudeSpecificBlocks(content) {
28
+ for (const block of content) {
29
+ if (isClaudeToolResultBlock(block))
30
+ return true;
31
+ if (isClaudeImageBlockWithSource(block))
32
+ return true;
33
+ if (isClaudeToolUseBlockWithId(block))
34
+ return true;
35
+ }
36
+ return false;
37
+ }
38
+ /**
39
+ * Check if input is in Claude message format
40
+ * Uses structural analysis to detect Claude-specific patterns
41
+ *
42
+ * @param input - Input to check
43
+ * @returns True if input appears to be Claude format
44
+ */
45
+ export function isClaudeStyleMessages(input) {
46
+ if (!Array.isArray(input) || input.length === 0) {
47
+ return false;
48
+ }
49
+ for (const msg of input) {
50
+ if (!isRecord(msg))
51
+ continue;
52
+ if (!('role' in msg))
53
+ continue;
54
+ if ('type' in msg)
55
+ continue; // Claude messages don't have top-level "type"
56
+ // If we find a non-Claude role, it's not Claude format
57
+ if (isNonClaudeRole(msg['role'])) {
58
+ return false;
59
+ }
60
+ // If we find Claude-specific content blocks, it's Claude format
61
+ const content = msg['content'];
62
+ if (Array.isArray(content) && hasClaudeSpecificBlocks(content)) {
63
+ return true;
64
+ }
65
+ }
66
+ return false;
67
+ }
68
+ //# sourceMappingURL=claude-type-guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-type-guards.js","sourceRoot":"","sources":["../../src/lib/claude-type-guards.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAErF,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,OAAO,CACL,IAAI,KAAK,oBAAoB,CAAC,MAAM;QACpC,IAAI,KAAK,oBAAoB,CAAC,SAAS;QACvC,IAAI,KAAK,oBAAoB,CAAC,IAAI,CACnC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc;IAC7C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,sBAAsB,CAAC,UAAU,CAAC;AAC7D,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAc;IAClD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,CACL,KAAK,CAAC,MAAM,CAAC,KAAK,sBAAsB,CAAC,KAAK,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CACjG,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAc;IAChD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,OAAO,CACL,KAAK,CAAC,MAAM,CAAC,KAAK,sBAAsB,CAAC,OAAO;QAChD,IAAI,IAAI,KAAK;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAkB;IACjD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,uBAAuB,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAChD,IAAI,4BAA4B,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACrD,IAAI,0BAA0B,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC;YAAE,SAAS;QAC/B,IAAI,MAAM,IAAI,GAAG;YAAE,SAAS,CAAC,8CAA8C;QAE3E,uDAAuD;QACvD,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,gEAAgE;QAChE,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,61 @@
1
+ import type * as models from '@openrouter/sdk/models';
2
+ import type { ConversationState, ParsedToolCall, Tool, TurnContext, UnsentToolResult } from './tool-types.js';
3
+ /**
4
+ * Generate a unique ID for a conversation
5
+ * Uses crypto.randomUUID if available, falls back to timestamp + random
6
+ */
7
+ export declare function generateConversationId(): string;
8
+ /**
9
+ * Create an initial conversation state
10
+ * @param id - Optional custom ID, generates one if not provided
11
+ */
12
+ export declare function createInitialState<TTools extends readonly Tool[] = readonly Tool[]>(id?: string): ConversationState<TTools>;
13
+ /**
14
+ * Update a conversation state with new values
15
+ * Automatically updates the updatedAt timestamp
16
+ */
17
+ export declare function updateState<TTools extends readonly Tool[] = readonly Tool[]>(state: ConversationState<TTools>, updates: Partial<Omit<ConversationState<TTools>, 'id' | 'createdAt' | 'updatedAt'>>): ConversationState<TTools>;
18
+ /**
19
+ * Append new items to the message history
20
+ */
21
+ export declare function appendToMessages(current: models.InputsUnion, newItems: models.BaseInputsUnion[]): models.InputsUnion;
22
+ /**
23
+ * Check if a tool call requires approval
24
+ * @param toolCall - The tool call to check
25
+ * @param tools - Available tools
26
+ * @param context - Turn context for the approval check
27
+ * @param callLevelCheck - Optional call-level approval function (overrides tool-level), can be async
28
+ */
29
+ export declare function toolRequiresApproval<TTools extends readonly Tool[]>(toolCall: ParsedToolCall<TTools[number]>, tools: TTools, context: TurnContext, callLevelCheck?: (toolCall: ParsedToolCall<TTools[number]>, context: TurnContext) => boolean | Promise<boolean>): Promise<boolean>;
30
+ /**
31
+ * Partition tool calls into those requiring approval and those that can auto-execute
32
+ * @param toolCalls - Tool calls to partition
33
+ * @param tools - Available tools
34
+ * @param context - Turn context for the approval check
35
+ * @param callLevelCheck - Optional call-level approval function (overrides tool-level), can be async
36
+ */
37
+ export declare function partitionToolCalls<TTools extends readonly Tool[]>(toolCalls: ParsedToolCall<TTools[number]>[], tools: TTools, context: TurnContext, callLevelCheck?: (toolCall: ParsedToolCall<TTools[number]>, context: TurnContext) => boolean | Promise<boolean>): Promise<{
38
+ requiresApproval: ParsedToolCall<TTools[number]>[];
39
+ autoExecute: ParsedToolCall<TTools[number]>[];
40
+ }>;
41
+ /**
42
+ * Create an unsent tool result from a successful execution
43
+ */
44
+ export declare function createUnsentResult<TTools extends readonly Tool[] = readonly Tool[]>(callId: string, name: string, output: unknown): UnsentToolResult<TTools>;
45
+ /**
46
+ * Create an unsent tool result from a rejection
47
+ */
48
+ export declare function createRejectedResult<TTools extends readonly Tool[] = readonly Tool[]>(callId: string, name: string, reason?: string): UnsentToolResult<TTools>;
49
+ /**
50
+ * Convert unsent tool results to API format for sending to the model
51
+ */
52
+ export declare function unsentResultsToAPIFormat(results: UnsentToolResult[]): models.FunctionCallOutputItem[];
53
+ /**
54
+ * Extract text content from a response
55
+ */
56
+ export declare function extractTextFromResponse(response: models.OpenResponsesResult): string;
57
+ /**
58
+ * Extract tool calls from a response
59
+ */
60
+ export declare function extractToolCallsFromResponse<TTools extends readonly Tool[]>(response: models.OpenResponsesResult): ParsedToolCall<TTools[number]>[];
61
+ //# sourceMappingURL=conversation-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-state.d.ts","sourceRoot":"","sources":["../../src/lib/conversation-state.ts"],"names":[],"mappings":"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"}