@finalai/agent-provider 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.

Potentially problematic release.


This version of @finalai/agent-provider might be problematic. Click here for more details.

Files changed (176) hide show
  1. package/README.md +12 -0
  2. package/dist/modules/channel-context.d.mts +102 -0
  3. package/dist/modules/channel-context.mjs +52 -0
  4. package/dist/modules/channel-context.mjs.map +7 -0
  5. package/dist/modules/channel-socket.d.mts +65 -0
  6. package/dist/modules/channel-socket.mjs +188 -0
  7. package/dist/modules/channel-socket.mjs.map +7 -0
  8. package/dist/modules/channel.d.mts +382 -0
  9. package/dist/modules/channel.mjs +146 -0
  10. package/dist/modules/channel.mjs.map +7 -0
  11. package/dist/modules/conformance/agent.d.mts +20 -0
  12. package/dist/modules/conformance/agent.mjs +623 -0
  13. package/dist/modules/conformance/agent.mjs.map +7 -0
  14. package/dist/modules/conformance/fixtures.d.mts +41 -0
  15. package/dist/modules/conformance/fixtures.mjs +190 -0
  16. package/dist/modules/conformance/fixtures.mjs.map +7 -0
  17. package/dist/modules/conformance/harness-kit.d.mts +82 -0
  18. package/dist/modules/conformance/harness-kit.mjs +1303 -0
  19. package/dist/modules/conformance/harness-kit.mjs.map +7 -0
  20. package/dist/modules/conformance/image.d.mts +2 -0
  21. package/dist/modules/conformance/image.mjs +79 -0
  22. package/dist/modules/conformance/image.mjs.map +7 -0
  23. package/dist/modules/conformance/index.d.mts +8 -0
  24. package/dist/modules/conformance/index.mjs +12 -0
  25. package/dist/modules/conformance/index.mjs.map +7 -0
  26. package/dist/modules/conformance/local-harness.d.mts +25 -0
  27. package/dist/modules/conformance/local-harness.mjs +108 -0
  28. package/dist/modules/conformance/local-harness.mjs.map +7 -0
  29. package/dist/modules/conformance/protocol.d.mts +30 -0
  30. package/dist/modules/conformance/protocol.mjs +56 -0
  31. package/dist/modules/conformance/protocol.mjs.map +7 -0
  32. package/dist/modules/conformance/sandbox-kit.d.mts +19 -0
  33. package/dist/modules/conformance/sandbox-kit.mjs +320 -0
  34. package/dist/modules/conformance/sandbox-kit.mjs.map +7 -0
  35. package/dist/modules/conformance/scripted-model/chat-completions.d.mts +30 -0
  36. package/dist/modules/conformance/scripted-model/chat-completions.mjs +125 -0
  37. package/dist/modules/conformance/scripted-model/chat-completions.mjs.map +7 -0
  38. package/dist/modules/conformance/scripted-model/directives.d.mts +84 -0
  39. package/dist/modules/conformance/scripted-model/directives.mjs +304 -0
  40. package/dist/modules/conformance/scripted-model/directives.mjs.map +7 -0
  41. package/dist/modules/conformance/scripted-model/handler.d.mts +14 -0
  42. package/dist/modules/conformance/scripted-model/handler.mjs +133 -0
  43. package/dist/modules/conformance/scripted-model/handler.mjs.map +7 -0
  44. package/dist/modules/conformance/scripted-model/index.d.mts +6 -0
  45. package/dist/modules/conformance/scripted-model/index.mjs +7 -0
  46. package/dist/modules/conformance/scripted-model/index.mjs.map +7 -0
  47. package/dist/modules/conformance/scripted-model/messages.d.mts +39 -0
  48. package/dist/modules/conformance/scripted-model/messages.mjs +139 -0
  49. package/dist/modules/conformance/scripted-model/messages.mjs.map +7 -0
  50. package/dist/modules/conformance/scripted-model/responses.d.mts +62 -0
  51. package/dist/modules/conformance/scripted-model/responses.mjs +273 -0
  52. package/dist/modules/conformance/scripted-model/responses.mjs.map +7 -0
  53. package/dist/modules/conformance/scripted-model/sse.d.mts +15 -0
  54. package/dist/modules/conformance/scripted-model/sse.mjs +75 -0
  55. package/dist/modules/conformance/scripted-model/sse.mjs.map +7 -0
  56. package/dist/modules/conformance/v1-agent.d.mts +24 -0
  57. package/dist/modules/conformance/v1-agent.mjs +40 -0
  58. package/dist/modules/conformance/v1-agent.mjs.map +7 -0
  59. package/dist/modules/credential-routes.d.mts +24 -0
  60. package/dist/modules/credential-routes.mjs +25 -0
  61. package/dist/modules/credential-routes.mjs.map +7 -0
  62. package/dist/modules/credentials.d.mts +206 -0
  63. package/dist/modules/credentials.mjs +207 -0
  64. package/dist/modules/credentials.mjs.map +7 -0
  65. package/dist/modules/dynamic.d.mts +32 -0
  66. package/dist/modules/dynamic.mjs +77 -0
  67. package/dist/modules/dynamic.mjs.map +7 -0
  68. package/dist/modules/harness.d.mts +397 -0
  69. package/dist/modules/harness.mjs +213 -0
  70. package/dist/modules/harness.mjs.map +7 -0
  71. package/dist/modules/index.d.mts +15 -0
  72. package/dist/modules/index.mjs +40 -0
  73. package/dist/modules/index.mjs.map +7 -0
  74. package/dist/modules/json.d.mts +12 -0
  75. package/dist/modules/json.mjs +19 -0
  76. package/dist/modules/json.mjs.map +7 -0
  77. package/dist/modules/local-channel-socket.d.mts +23 -0
  78. package/dist/modules/local-channel-socket.mjs +141 -0
  79. package/dist/modules/local-channel-socket.mjs.map +7 -0
  80. package/dist/modules/manifest.d.mts +558 -0
  81. package/dist/modules/manifest.mjs +266 -0
  82. package/dist/modules/manifest.mjs.map +7 -0
  83. package/dist/modules/mcp-content.d.mts +21 -0
  84. package/dist/modules/mcp-content.mjs +86 -0
  85. package/dist/modules/mcp-content.mjs.map +7 -0
  86. package/dist/modules/provider-ref.d.mts +29 -0
  87. package/dist/modules/provider-ref.mjs +55 -0
  88. package/dist/modules/provider-ref.mjs.map +7 -0
  89. package/dist/modules/sandbox/bytes.d.mts +9 -0
  90. package/dist/modules/sandbox/bytes.mjs +154 -0
  91. package/dist/modules/sandbox/bytes.mjs.map +7 -0
  92. package/dist/modules/sandbox/client.d.mts +51 -0
  93. package/dist/modules/sandbox/client.mjs +500 -0
  94. package/dist/modules/sandbox/client.mjs.map +7 -0
  95. package/dist/modules/sandbox/confined-files.d.mts +22 -0
  96. package/dist/modules/sandbox/confined-files.mjs +142 -0
  97. package/dist/modules/sandbox/confined-files.mjs.map +7 -0
  98. package/dist/modules/sandbox/convenience.d.mts +10 -0
  99. package/dist/modules/sandbox/convenience.mjs +116 -0
  100. package/dist/modules/sandbox/convenience.mjs.map +7 -0
  101. package/dist/modules/sandbox/editor.d.mts +49 -0
  102. package/dist/modules/sandbox/editor.mjs +43 -0
  103. package/dist/modules/sandbox/editor.mjs.map +7 -0
  104. package/dist/modules/sandbox/frame-channel.d.mts +47 -0
  105. package/dist/modules/sandbox/frame-channel.mjs +153 -0
  106. package/dist/modules/sandbox/frame-channel.mjs.map +7 -0
  107. package/dist/modules/sandbox/index.d.mts +18 -0
  108. package/dist/modules/sandbox/index.mjs +70 -0
  109. package/dist/modules/sandbox/index.mjs.map +7 -0
  110. package/dist/modules/sandbox/mcp-channel.d.mts +9 -0
  111. package/dist/modules/sandbox/mcp-channel.mjs +77 -0
  112. package/dist/modules/sandbox/mcp-channel.mjs.map +7 -0
  113. package/dist/modules/sandbox/mcp-hosted.d.mts +46 -0
  114. package/dist/modules/sandbox/mcp-hosted.mjs +221 -0
  115. package/dist/modules/sandbox/mcp-hosted.mjs.map +7 -0
  116. package/dist/modules/sandbox/mcp-search.d.mts +51 -0
  117. package/dist/modules/sandbox/mcp-search.mjs +129 -0
  118. package/dist/modules/sandbox/mcp-search.mjs.map +7 -0
  119. package/dist/modules/sandbox/mcp-shell.d.mts +21 -0
  120. package/dist/modules/sandbox/mcp-shell.mjs +205 -0
  121. package/dist/modules/sandbox/mcp-shell.mjs.map +7 -0
  122. package/dist/modules/sandbox/mcp-testing.d.mts +11 -0
  123. package/dist/modules/sandbox/mcp-testing.mjs +33 -0
  124. package/dist/modules/sandbox/mcp-testing.mjs.map +7 -0
  125. package/dist/modules/sandbox/mcp.d.mts +83 -0
  126. package/dist/modules/sandbox/mcp.mjs +971 -0
  127. package/dist/modules/sandbox/mcp.mjs.map +7 -0
  128. package/dist/modules/sandbox/memory-sandbox.d.mts +32 -0
  129. package/dist/modules/sandbox/memory-sandbox.mjs +416 -0
  130. package/dist/modules/sandbox/memory-sandbox.mjs.map +7 -0
  131. package/dist/modules/sandbox/memory-shell.d.mts +29 -0
  132. package/dist/modules/sandbox/memory-shell.mjs +278 -0
  133. package/dist/modules/sandbox/memory-shell.mjs.map +7 -0
  134. package/dist/modules/sandbox/open-scope-node.d.mts +4 -0
  135. package/dist/modules/sandbox/open-scope-node.mjs +19 -0
  136. package/dist/modules/sandbox/open-scope-node.mjs.map +7 -0
  137. package/dist/modules/sandbox/open-scope.d.mts +16 -0
  138. package/dist/modules/sandbox/open-scope.mjs +66 -0
  139. package/dist/modules/sandbox/open-scope.mjs.map +7 -0
  140. package/dist/modules/sandbox/paths.d.mts +7 -0
  141. package/dist/modules/sandbox/paths.mjs +50 -0
  142. package/dist/modules/sandbox/paths.mjs.map +7 -0
  143. package/dist/modules/sandbox/rpc-peer.d.mts +35 -0
  144. package/dist/modules/sandbox/rpc-peer.mjs +224 -0
  145. package/dist/modules/sandbox/rpc-peer.mjs.map +7 -0
  146. package/dist/modules/sandbox/seeds.d.mts +26 -0
  147. package/dist/modules/sandbox/seeds.mjs +228 -0
  148. package/dist/modules/sandbox/seeds.mjs.map +7 -0
  149. package/dist/modules/sandbox/server.d.mts +66 -0
  150. package/dist/modules/sandbox/server.mjs +567 -0
  151. package/dist/modules/sandbox/server.mjs.map +7 -0
  152. package/dist/modules/sandbox/snapshots.d.mts +49 -0
  153. package/dist/modules/sandbox/snapshots.mjs +55 -0
  154. package/dist/modules/sandbox/snapshots.mjs.map +7 -0
  155. package/dist/modules/sandbox/stream-mux.d.mts +18 -0
  156. package/dist/modules/sandbox/stream-mux.mjs +285 -0
  157. package/dist/modules/sandbox/stream-mux.mjs.map +7 -0
  158. package/dist/modules/sandbox/testing.d.mts +25 -0
  159. package/dist/modules/sandbox/testing.mjs +64 -0
  160. package/dist/modules/sandbox/testing.mjs.map +7 -0
  161. package/dist/modules/sandbox/types.d.mts +352 -0
  162. package/dist/modules/sandbox/types.mjs +86 -0
  163. package/dist/modules/sandbox/types.mjs.map +7 -0
  164. package/dist/modules/sandbox/wire.d.mts +671 -0
  165. package/dist/modules/sandbox/wire.mjs +537 -0
  166. package/dist/modules/sandbox/wire.mjs.map +7 -0
  167. package/dist/modules/sandbox/workspace-root.d.mts +8 -0
  168. package/dist/modules/sandbox/workspace-root.mjs +79 -0
  169. package/dist/modules/sandbox/workspace-root.mjs.map +7 -0
  170. package/dist/modules/schemas.d.mts +121 -0
  171. package/dist/modules/schemas.mjs +146 -0
  172. package/dist/modules/schemas.mjs.map +7 -0
  173. package/dist/modules/semantic-events.d.mts +31 -0
  174. package/dist/modules/semantic-events.mjs +23 -0
  175. package/dist/modules/semantic-events.mjs.map +7 -0
  176. package/package.json +199 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/conformance/scripted-model/index.ts"],
4
+ "sourcesContent": ["// The scripted conformance model (`@finalai/agent-provider/conformance/scripted-model`):\n// a vendor-shaped model endpoint that follows the kit's directives. Web APIs\n// only; it runs in Node and workerd. See handler.ts and directives.ts.\nexport * from \"./chat-completions.mjs\";\nexport * from \"./directives.mjs\";\nexport * from \"./handler.mjs\";\nexport * from \"./messages.mjs\";\nexport * from \"./responses.mjs\";\nexport * from \"./sse.mjs\";\n"],
5
+ "mappings": "AAGA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,39 @@
1
+ import * as z from 'zod';
2
+ import { type ScriptedAction, type ScriptedConversationIface } from "./directives.mjs";
3
+ import { type HeldStreamTimingIface } from "./sse.mjs";
4
+ export declare const messagesRequestSchema: z.ZodObject<{
5
+ model: z.ZodString;
6
+ stream: z.ZodOptional<z.ZodBoolean>;
7
+ messages: z.ZodArray<z.ZodObject<{
8
+ role: z.ZodString;
9
+ content: z.ZodUnion<readonly [z.ZodPipe<z.ZodString, z.ZodTransform<{
10
+ [x: string]: unknown;
11
+ type: string;
12
+ content: string;
13
+ text?: string | undefined;
14
+ is_error?: boolean | undefined;
15
+ }[], string>>, z.ZodArray<z.ZodObject<{
16
+ type: z.ZodString;
17
+ text: z.ZodOptional<z.ZodString>;
18
+ content: z.ZodDefault<z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodArray<z.ZodObject<{
19
+ type: z.ZodString;
20
+ text: z.ZodOptional<z.ZodString>;
21
+ }, z.core.$loose>>, z.ZodTransform<string, {
22
+ [x: string]: unknown;
23
+ type: string;
24
+ text?: string | undefined;
25
+ }[]>>]>>;
26
+ is_error: z.ZodOptional<z.ZodBoolean>;
27
+ }, z.core.$loose>>]>;
28
+ }, z.core.$loose>>;
29
+ tools: z.ZodOptional<z.ZodArray<z.ZodObject<{
30
+ name: z.ZodOptional<z.ZodString>;
31
+ }, z.core.$loose>>>;
32
+ }, z.core.$loose>;
33
+ export type MessagesRequest = z.infer<typeof messagesRequestSchema>;
34
+ export declare const messagesConversation: (request: MessagesRequest) => ScriptedConversationIface;
35
+ export declare const messagesResponse: (args: {
36
+ request: MessagesRequest;
37
+ action: ScriptedAction;
38
+ timing: HeldStreamTimingIface;
39
+ }) => Response;
@@ -0,0 +1,139 @@
1
+ import * as z from "zod";
2
+ import {
3
+ ConversationEntryKind,
4
+ qualifiedToolName,
5
+ replyPlan,
6
+ ScriptedActionKind
7
+ } from "./directives.mjs";
8
+ import {
9
+ heldSseResponse,
10
+ jsonResponse,
11
+ pausedSseResponse,
12
+ sseEvent,
13
+ sseResponse
14
+ } from "./sse.mjs";
15
+ const textBlockSchema = z.looseObject({ type: z.string(), text: z.string().optional() });
16
+ const resultTextSchema = z.union([
17
+ z.string(),
18
+ z.array(textBlockSchema).transform(
19
+ (blocks) => blocks.filter((block) => block.type === "text").map((block) => block.text ?? "").join("\n")
20
+ )
21
+ ]).default("");
22
+ const blockSchema = z.looseObject({
23
+ type: z.string(),
24
+ text: z.string().optional(),
25
+ content: resultTextSchema,
26
+ is_error: z.boolean().optional()
27
+ });
28
+ const messagesRequestSchema = z.looseObject({
29
+ model: z.string(),
30
+ stream: z.boolean().optional(),
31
+ messages: z.array(
32
+ z.looseObject({
33
+ role: z.string(),
34
+ // A string is one text block.
35
+ content: z.union([
36
+ z.string().transform((text) => [blockSchema.parse({ type: "text", text })]),
37
+ z.array(blockSchema)
38
+ ])
39
+ })
40
+ ),
41
+ tools: z.array(z.looseObject({ name: z.string().optional() })).optional()
42
+ });
43
+ const withoutTrailingReminders = (value) => value.replace(
44
+ /(?:\n\n<system-reminder>(?:(?!<\/system-reminder>)[\s\S])*<\/system-reminder>)+\s*$/u,
45
+ ""
46
+ );
47
+ const messagesConversation = (request) => ({
48
+ entries: request.messages.flatMap((message) => {
49
+ if (message.role !== "user") return [];
50
+ return message.content.flatMap((block) => {
51
+ if (block.type === "text") {
52
+ return [{ kind: ConversationEntryKind.User, text: block.text ?? "" }];
53
+ }
54
+ if (block.type === "tool_result") {
55
+ return [
56
+ {
57
+ kind: ConversationEntryKind.ToolResult,
58
+ text: withoutTrailingReminders(block.content),
59
+ isError: block.is_error === true
60
+ }
61
+ ];
62
+ }
63
+ return [];
64
+ });
65
+ }),
66
+ tools: (request.tools ?? []).flatMap(
67
+ (tool) => tool.name == null ? [] : [{ name: tool.name, namespace: null }]
68
+ ),
69
+ toolSearch: false,
70
+ codeMode: null
71
+ });
72
+ const USAGE = { input_tokens: 12, output_tokens: 4 };
73
+ const messagesResponse = (args) => {
74
+ const { request, action } = args;
75
+ if (action.kind === ScriptedActionKind.Error) {
76
+ return jsonResponse(400, {
77
+ type: "error",
78
+ error: { type: "invalid_request_error", message: action.message }
79
+ });
80
+ }
81
+ const id = `msg_${crypto.randomUUID()}`;
82
+ const toolCall = action.kind === ScriptedActionKind.ToolCall ? {
83
+ id: `toolu_${crypto.randomUUID()}`,
84
+ name: qualifiedToolName(action.tool),
85
+ input: action.arguments
86
+ } : null;
87
+ const plan = replyPlan(action) ?? { first: "", second: "", pauseMs: 0, held: false };
88
+ const stopReason = toolCall == null ? "end_turn" : "tool_use";
89
+ const message = (content, stop) => ({
90
+ id,
91
+ type: "message",
92
+ role: "assistant",
93
+ model: request.model,
94
+ content,
95
+ stop_reason: stop,
96
+ stop_sequence: null,
97
+ usage: USAGE
98
+ });
99
+ if (request.stream !== true) {
100
+ const content = toolCall == null ? [{ type: "text", text: `${plan.first}${plan.second}` }] : [{ type: "tool_use", id: toolCall.id, name: toolCall.name, input: toolCall.input }];
101
+ return jsonResponse(200, message(content, stopReason));
102
+ }
103
+ const event = (type, data) => sseEvent(type, { type, ...data });
104
+ const end = [
105
+ event("content_block_stop", { index: 0 }),
106
+ event("message_delta", {
107
+ delta: { stop_reason: stopReason, stop_sequence: null },
108
+ usage: { output_tokens: USAGE.output_tokens }
109
+ }),
110
+ event("message_stop", {})
111
+ ];
112
+ const head = [event("message_start", { message: message([], null) })];
113
+ if (toolCall != null) {
114
+ head.push(
115
+ event("content_block_start", {
116
+ index: 0,
117
+ content_block: { type: "tool_use", id: toolCall.id, name: toolCall.name, input: {} }
118
+ }),
119
+ event("content_block_delta", {
120
+ index: 0,
121
+ delta: { type: "input_json_delta", partial_json: JSON.stringify(toolCall.input) }
122
+ })
123
+ );
124
+ return sseResponse([...head, ...end]);
125
+ }
126
+ const delta = (text) => text === "" ? [] : [event("content_block_delta", { index: 0, delta: { type: "text_delta", text } })];
127
+ head.push(
128
+ event("content_block_start", { index: 0, content_block: { type: "text", text: "" } }),
129
+ ...delta(plan.first)
130
+ );
131
+ if (plan.held) return heldSseResponse(head, args.timing);
132
+ return pausedSseResponse(head, [...delta(plan.second), ...end], plan.pauseMs);
133
+ };
134
+ export {
135
+ messagesConversation,
136
+ messagesRequestSchema,
137
+ messagesResponse
138
+ };
139
+ //# sourceMappingURL=messages.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/conformance/scripted-model/messages.ts"],
4
+ "sourcesContent": ["import * as z from 'zod';\nimport type { JsonObject, JsonValue } from \"../../json.mjs\";\nimport {\n ConversationEntryKind,\n qualifiedToolName,\n replyPlan,\n ScriptedActionKind,\n type ConversationEntry,\n type ScriptedAction,\n type ScriptedConversationIface,\n} from \"./directives.mjs\";\nimport {\n heldSseResponse,\n jsonResponse,\n pausedSseResponse,\n sseEvent,\n sseResponse,\n type HeldStreamTimingIface,\n type SseEventIface,\n} from \"./sse.mjs\";\n\n// Anthropic Messages (`POST \u2026/v1/messages`), as Claude Code (remote-claude-code)\n// and the nanocode Claude engine speak it. Tool results are `tool_result`\n// blocks of a user message.\n\nconst textBlockSchema = z.looseObject({ type: z.string(), text: z.string().optional() });\n\n// A tool result's content as text: a string or its text blocks, one per line.\nconst resultTextSchema = z\n .union([\n z.string(),\n z.array(textBlockSchema).transform((blocks) =>\n blocks\n .filter((block) => block.type === 'text')\n .map((block) => block.text ?? '')\n .join('\\n'),\n ),\n ])\n .default('');\n\nconst blockSchema = z.looseObject({\n type: z.string(),\n text: z.string().optional(),\n content: resultTextSchema,\n is_error: z.boolean().optional(),\n});\n\nexport const messagesRequestSchema = z.looseObject({\n model: z.string(),\n stream: z.boolean().optional(),\n messages: z.array(\n z.looseObject({\n role: z.string(),\n // A string is one text block.\n content: z.union([\n z.string().transform((text) => [blockSchema.parse({ type: 'text', text })]),\n z.array(blockSchema),\n ]),\n }),\n ),\n tools: z.array(z.looseObject({ name: z.string().optional() })).optional(),\n});\n\nexport type MessagesRequest = z.infer<typeof messagesRequestSchema>;\n\n// Claude appends token-budget reminders to tool results; the scripted model ignores\n// that CLI context as a real model would, leaving the fixture's own result intact.\nconst withoutTrailingReminders = (value: string): string =>\n value.replace(\n /(?:\\n\\n<system-reminder>(?:(?!<\\/system-reminder>)[\\s\\S])*<\\/system-reminder>)+\\s*$/u,\n '',\n );\n\nexport const messagesConversation = (request: MessagesRequest): ScriptedConversationIface => ({\n entries: request.messages.flatMap((message): ConversationEntry[] => {\n if (message.role !== 'user') return [];\n return message.content.flatMap((block): ConversationEntry[] => {\n if (block.type === 'text') {\n return [{ kind: ConversationEntryKind.User, text: block.text ?? '' }];\n }\n if (block.type === 'tool_result') {\n return [\n {\n kind: ConversationEntryKind.ToolResult,\n text: withoutTrailingReminders(block.content),\n isError: block.is_error === true,\n },\n ];\n }\n return [];\n });\n }),\n tools: (request.tools ?? []).flatMap((tool) =>\n tool.name == null ? [] : [{ name: tool.name, namespace: null }],\n ),\n toolSearch: false,\n codeMode: null,\n});\n\nconst USAGE = { input_tokens: 12, output_tokens: 4 };\n\nexport const messagesResponse = (args: {\n request: MessagesRequest;\n action: ScriptedAction;\n timing: HeldStreamTimingIface;\n}): Response => {\n const { request, action } = args;\n if (action.kind === ScriptedActionKind.Error) {\n return jsonResponse(400, {\n type: 'error',\n error: { type: 'invalid_request_error', message: action.message },\n });\n }\n const id = `msg_${crypto.randomUUID()}`;\n const toolCall =\n action.kind === ScriptedActionKind.ToolCall\n ? {\n id: `toolu_${crypto.randomUUID()}`,\n name: qualifiedToolName(action.tool),\n input: action.arguments,\n }\n : null;\n // Messages has no tool search; the decision never asks for it here.\n const plan = replyPlan(action) ?? { first: '', second: '', pauseMs: 0, held: false };\n const stopReason = toolCall == null ? 'end_turn' : 'tool_use';\n const message = (content: JsonValue[], stop: string | null): JsonObject => ({\n id,\n type: 'message',\n role: 'assistant',\n model: request.model,\n content,\n stop_reason: stop,\n stop_sequence: null,\n usage: USAGE,\n });\n if (request.stream !== true) {\n const content: JsonValue[] =\n toolCall == null\n ? [{ type: 'text', text: `${plan.first}${plan.second}` }]\n : [{ type: 'tool_use', id: toolCall.id, name: toolCall.name, input: toolCall.input }];\n return jsonResponse(200, message(content, stopReason));\n }\n const event = (type: string, data: JsonObject): SseEventIface =>\n sseEvent(type, { type, ...data });\n const end: SseEventIface[] = [\n event('content_block_stop', { index: 0 }),\n event('message_delta', {\n delta: { stop_reason: stopReason, stop_sequence: null },\n usage: { output_tokens: USAGE.output_tokens },\n }),\n event('message_stop', {}),\n ];\n const head: SseEventIface[] = [event('message_start', { message: message([], null) })];\n if (toolCall != null) {\n head.push(\n event('content_block_start', {\n index: 0,\n content_block: { type: 'tool_use', id: toolCall.id, name: toolCall.name, input: {} },\n }),\n event('content_block_delta', {\n index: 0,\n delta: { type: 'input_json_delta', partial_json: JSON.stringify(toolCall.input) },\n }),\n );\n return sseResponse([...head, ...end]);\n }\n const delta = (text: string): SseEventIface[] =>\n text === ''\n ? []\n : [event('content_block_delta', { index: 0, delta: { type: 'text_delta', text } })];\n head.push(\n event('content_block_start', { index: 0, content_block: { type: 'text', text: '' } }),\n ...delta(plan.first),\n );\n if (plan.held) return heldSseResponse(head, args.timing);\n return pausedSseResponse(head, [...delta(plan.second), ...end], plan.pauseMs);\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,62 @@
1
+ import * as z from 'zod';
2
+ import { type ScriptedAction, type ScriptedConversationIface } from "./directives.mjs";
3
+ import { type HeldStreamTimingIface } from "./sse.mjs";
4
+ export declare const RESPONSES_LITE_HEADER = "x-openai-internal-codex-responses-lite";
5
+ export interface ToolOutputIface {
6
+ text: string;
7
+ isError: boolean;
8
+ }
9
+ export declare const responsesRequestSchema: z.ZodObject<{
10
+ model: z.ZodString;
11
+ stream: z.ZodOptional<z.ZodBoolean>;
12
+ input: z.ZodUnion<readonly [z.ZodPipe<z.ZodString, z.ZodTransform<{
13
+ [x: string]: unknown;
14
+ type: string;
15
+ content: string;
16
+ role?: string | undefined;
17
+ output?: ToolOutputIface | undefined;
18
+ tools?: z.core.util.JSONType[] | undefined;
19
+ }[], string>>, z.ZodArray<z.ZodObject<{
20
+ type: z.ZodDefault<z.ZodString>;
21
+ role: z.ZodOptional<z.ZodString>;
22
+ content: z.ZodDefault<z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodArray<z.ZodObject<{
23
+ type: z.ZodString;
24
+ text: z.ZodOptional<z.ZodString>;
25
+ }, z.core.$loose>>, z.ZodTransform<string, {
26
+ [x: string]: unknown;
27
+ type: string;
28
+ text?: string | undefined;
29
+ }[]>>]>>;
30
+ output: z.ZodOptional<z.ZodUnion<readonly [z.ZodPipe<z.ZodString, z.ZodTransform<ToolOutputIface, string>>, z.ZodUnion<readonly [z.ZodPipe<z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodArray<z.ZodObject<{
31
+ type: z.ZodString;
32
+ text: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$loose>>, z.ZodTransform<string, {
34
+ [x: string]: unknown;
35
+ type: string;
36
+ text?: string | undefined;
37
+ }[]>>]>, z.ZodTransform<ToolOutputIface, string>>, z.ZodPipe<z.ZodObject<{
38
+ content: z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodArray<z.ZodObject<{
39
+ type: z.ZodString;
40
+ text: z.ZodOptional<z.ZodString>;
41
+ }, z.core.$loose>>, z.ZodTransform<string, {
42
+ [x: string]: unknown;
43
+ type: string;
44
+ text?: string | undefined;
45
+ }[]>>]>;
46
+ success: z.ZodOptional<z.ZodBoolean>;
47
+ }, z.core.$loose>, z.ZodTransform<ToolOutputIface, {
48
+ [x: string]: unknown;
49
+ content: string;
50
+ success?: boolean | undefined;
51
+ }>>]>, z.ZodPipe<z.ZodJSONSchema, z.ZodTransform<ToolOutputIface, z.core.util.JSONType>>]>>;
52
+ tools: z.ZodOptional<z.ZodArray<z.ZodJSONSchema>>;
53
+ }, z.core.$loose>>]>;
54
+ tools: z.ZodOptional<z.ZodArray<z.ZodJSONSchema>>;
55
+ }, z.core.$loose>;
56
+ export type ResponsesRequest = z.infer<typeof responsesRequestSchema>;
57
+ export declare const responsesConversation: (request: ResponsesRequest) => ScriptedConversationIface;
58
+ export declare const responsesResponse: (args: {
59
+ request: ResponsesRequest;
60
+ action: ScriptedAction;
61
+ timing: HeldStreamTimingIface;
62
+ }) => Response;
@@ -0,0 +1,273 @@
1
+ import * as z from "zod";
2
+ import {
3
+ ConversationEntryKind,
4
+ replyPlan,
5
+ ScriptedActionKind
6
+ } from "./directives.mjs";
7
+ import {
8
+ heldSseResponse,
9
+ jsonResponse,
10
+ pausedSseResponse,
11
+ sseEvent,
12
+ sseResponse
13
+ } from "./sse.mjs";
14
+ const RESPONSES_LITE_HEADER = "x-openai-internal-codex-responses-lite";
15
+ const partSchema = z.looseObject({ type: z.string(), text: z.string().optional() });
16
+ const contentTextSchema = z.union([
17
+ z.string(),
18
+ z.array(partSchema).transform(
19
+ (parts) => parts.map((part) => part.text ?? "").filter((value) => value !== "").join("\n")
20
+ )
21
+ ]);
22
+ const withoutTimingEnvelope = (text) => /^Wall time: [0-9]+(?:\.[0-9]+)? seconds\nOutput:\n([\s\S]*)$/u.exec(text)?.[1] ?? text;
23
+ const structuredOutputSchema = z.union([
24
+ contentTextSchema.transform(
25
+ (text) => ({ text: withoutTimingEnvelope(text), isError: false })
26
+ ),
27
+ z.looseObject({ content: contentTextSchema, success: z.boolean().optional() }).transform(
28
+ (value) => ({
29
+ text: withoutTimingEnvelope(value.content),
30
+ isError: value.success === false
31
+ })
32
+ )
33
+ ]);
34
+ const decodeTextOutput = (text) => {
35
+ const content = withoutTimingEnvelope(text);
36
+ try {
37
+ const decoded = structuredOutputSchema.safeParse(JSON.parse(content));
38
+ if (decoded.success) return decoded.data;
39
+ } catch {
40
+ }
41
+ return { text: content, isError: false };
42
+ };
43
+ const toolOutputSchema = z.union([
44
+ z.string().transform(decodeTextOutput),
45
+ structuredOutputSchema,
46
+ z.json().transform((value) => ({ text: JSON.stringify(value), isError: false }))
47
+ ]);
48
+ const itemSchema = z.looseObject({
49
+ type: z.string().default("message"),
50
+ role: z.string().optional(),
51
+ content: contentTextSchema.default(""),
52
+ output: toolOutputSchema.optional(),
53
+ tools: z.array(z.json()).optional()
54
+ });
55
+ const responsesRequestSchema = z.looseObject({
56
+ model: z.string(),
57
+ stream: z.boolean().optional(),
58
+ // A bare string is one user message.
59
+ input: z.union([
60
+ z.string().transform((text) => [itemSchema.parse({ role: "user", content: text })]),
61
+ z.array(itemSchema)
62
+ ]),
63
+ tools: z.array(z.json()).optional()
64
+ });
65
+ const toolSchema = z.looseObject({
66
+ type: z.string(),
67
+ name: z.string().optional(),
68
+ description: z.string().optional(),
69
+ tools: z.array(z.json()).optional(),
70
+ parameters: z.looseObject({
71
+ properties: z.looseObject({
72
+ sandbox_permissions: z.looseObject({ enum: z.array(z.string()).optional() }).optional()
73
+ }).optional()
74
+ }).optional()
75
+ });
76
+ const nestedToolsOf = (description) => [...description.matchAll(/declare const tools: \{ ([A-Za-z_$][\w$]*)\(/gu)].flatMap(
77
+ (match) => match[1] == null ? [] : [match[1]]
78
+ );
79
+ const collectTools = (values, namespace, into) => {
80
+ for (const value of values) {
81
+ const parsed = toolSchema.safeParse(value);
82
+ if (!parsed.success) continue;
83
+ const tool = parsed.data;
84
+ if (tool.type === "tool_search") into.toolSearch = true;
85
+ else if (tool.type === "namespace") collectTools(tool.tools ?? [], tool.name ?? null, into);
86
+ else if ((tool.type === "function" || tool.type === "custom") && tool.name != null) {
87
+ const offered = { name: tool.name, namespace };
88
+ if (tool.parameters?.properties?.sandbox_permissions?.enum?.includes("require_escalated") === true)
89
+ offered.supportsEscalation = true;
90
+ into.tools.push(offered);
91
+ const nested = tool.type === "custom" ? nestedToolsOf(tool.description ?? "") : [];
92
+ if (nested.length > 0) into.codeMode ??= { tool: { name: tool.name, namespace }, nested };
93
+ }
94
+ }
95
+ };
96
+ const responsesConversation = (request) => {
97
+ const toolset = { tools: [], toolSearch: false, codeMode: null };
98
+ collectTools(request.tools ?? [], null, toolset);
99
+ const entries = request.input.flatMap((item) => {
100
+ if (item.tools != null) collectTools(item.tools, null, toolset);
101
+ if (item.type === "message" && item.role === "user") {
102
+ return [{ kind: ConversationEntryKind.User, text: item.content }];
103
+ }
104
+ if (item.type === "function_call_output" || item.type === "custom_tool_call_output") {
105
+ return [
106
+ {
107
+ kind: ConversationEntryKind.ToolResult,
108
+ ...item.output ?? { text: "", isError: false }
109
+ }
110
+ ];
111
+ }
112
+ if (item.type === "tool_search_output") {
113
+ return [{ kind: ConversationEntryKind.ToolSearchOutput }];
114
+ }
115
+ return [];
116
+ });
117
+ return { entries, ...toolset };
118
+ };
119
+ const USAGE = {
120
+ input_tokens: 12,
121
+ input_tokens_details: { cached_tokens: 0 },
122
+ output_tokens: 4,
123
+ output_tokens_details: { reasoning_tokens: 0 },
124
+ total_tokens: 16
125
+ };
126
+ const responsesResponse = (args) => {
127
+ const { request, action } = args;
128
+ if (action.kind === ScriptedActionKind.Error) {
129
+ return jsonResponse(400, {
130
+ error: { message: action.message, type: "invalid_request_error", param: null, code: null }
131
+ });
132
+ }
133
+ const responseId = `resp_${crypto.randomUUID()}`;
134
+ const body = (status, output) => ({
135
+ id: responseId,
136
+ object: "response",
137
+ created_at: Math.floor(Date.now() / 1e3),
138
+ model: request.model,
139
+ status,
140
+ output,
141
+ usage: status === "completed" ? USAGE : null
142
+ });
143
+ const messageId = `msg_${crypto.randomUUID()}`;
144
+ const message = (status, content) => ({
145
+ type: "message",
146
+ id: messageId,
147
+ role: "assistant",
148
+ status,
149
+ content
150
+ });
151
+ const part = (value) => ({
152
+ type: "output_text",
153
+ text: value,
154
+ annotations: []
155
+ });
156
+ const callId = `call_${crypto.randomUUID()}`;
157
+ const plan = replyPlan(action);
158
+ const fullText = plan == null ? "" : `${plan.first}${plan.second}`;
159
+ const done = (() => {
160
+ if (action.kind === ScriptedActionKind.CodeCall) {
161
+ const call = {
162
+ type: "custom_tool_call",
163
+ id: `ctc_${crypto.randomUUID()}`,
164
+ call_id: callId,
165
+ name: action.tool.name,
166
+ input: action.source,
167
+ status: "completed"
168
+ };
169
+ if (action.tool.namespace != null) call.namespace = action.tool.namespace;
170
+ return call;
171
+ }
172
+ if (action.kind === ScriptedActionKind.ToolCall) {
173
+ const call = {
174
+ type: "function_call",
175
+ id: `fc_${crypto.randomUUID()}`,
176
+ call_id: callId,
177
+ name: action.tool.name,
178
+ arguments: JSON.stringify(action.arguments),
179
+ status: "completed"
180
+ };
181
+ if (action.tool.namespace != null) call.namespace = action.tool.namespace;
182
+ return call;
183
+ }
184
+ if (action.kind === ScriptedActionKind.ToolSearch) {
185
+ return {
186
+ type: "tool_search_call",
187
+ id: `tsc_${crypto.randomUUID()}`,
188
+ call_id: callId,
189
+ execution: "client",
190
+ status: "completed",
191
+ arguments: { query: action.query }
192
+ };
193
+ }
194
+ return message("completed", [part(fullText)]);
195
+ })();
196
+ if (request.stream !== true) return jsonResponse(200, body("completed", [done]));
197
+ let sequence = 0;
198
+ const event = (type, data) => {
199
+ sequence += 1;
200
+ return sseEvent(type, { type, sequence_number: sequence, ...data });
201
+ };
202
+ const head = [event("response.created", { response: body("in_progress", []) })];
203
+ const end = () => [
204
+ event("response.output_item.done", { output_index: 0, item: done }),
205
+ event("response.completed", { response: body("completed", [done]) })
206
+ ];
207
+ if (action.kind === ScriptedActionKind.CodeCall) {
208
+ head.push(
209
+ event("response.output_item.added", {
210
+ output_index: 0,
211
+ item: { ...done, status: "in_progress", input: "" }
212
+ }),
213
+ event("response.custom_tool_call_input.delta", {
214
+ item_id: done.id ?? null,
215
+ output_index: 0,
216
+ delta: action.source
217
+ }),
218
+ event("response.custom_tool_call_input.done", {
219
+ item_id: done.id ?? null,
220
+ output_index: 0,
221
+ input: action.source
222
+ })
223
+ );
224
+ return sseResponse([...head, ...end()]);
225
+ }
226
+ if (action.kind === ScriptedActionKind.ToolCall) {
227
+ const argumentsText = JSON.stringify(action.arguments);
228
+ head.push(
229
+ event("response.output_item.added", {
230
+ output_index: 0,
231
+ item: { ...done, status: "in_progress", arguments: "" }
232
+ }),
233
+ event("response.function_call_arguments.delta", {
234
+ item_id: done.id ?? null,
235
+ output_index: 0,
236
+ delta: argumentsText
237
+ }),
238
+ event("response.function_call_arguments.done", {
239
+ item_id: done.id ?? null,
240
+ output_index: 0,
241
+ name: action.tool.name,
242
+ arguments: argumentsText
243
+ })
244
+ );
245
+ return sseResponse([...head, ...end()]);
246
+ }
247
+ if (plan == null) {
248
+ head.push(event("response.output_item.added", { output_index: 0, item: done }));
249
+ return sseResponse([...head, ...end()]);
250
+ }
251
+ const at = { item_id: messageId, output_index: 0, content_index: 0 };
252
+ const delta = (text) => text === "" ? [] : [event("response.output_text.delta", { ...at, delta: text })];
253
+ head.push(
254
+ event("response.output_item.added", { output_index: 0, item: message("in_progress", []) }),
255
+ event("response.content_part.added", { ...at, part: part("") }),
256
+ ...delta(plan.first)
257
+ );
258
+ if (plan.held) return heldSseResponse(head, args.timing);
259
+ const tail = [
260
+ ...delta(plan.second),
261
+ event("response.output_text.done", { ...at, text: fullText }),
262
+ event("response.content_part.done", { ...at, part: part(fullText) }),
263
+ ...end()
264
+ ];
265
+ return pausedSseResponse(head, tail, plan.pauseMs);
266
+ };
267
+ export {
268
+ RESPONSES_LITE_HEADER,
269
+ responsesConversation,
270
+ responsesRequestSchema,
271
+ responsesResponse
272
+ };
273
+ //# sourceMappingURL=responses.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/conformance/scripted-model/responses.ts"],
4
+ "sourcesContent": ["import * as z from 'zod';\nimport type { JsonObject, JsonValue } from \"../../json.mjs\";\nimport {\n ConversationEntryKind,\n replyPlan,\n ScriptedActionKind,\n type CodeModeToolIface,\n type ConversationEntry,\n type OfferedToolIface,\n type ScriptedAction,\n type ScriptedConversationIface,\n} from \"./directives.mjs\";\nimport {\n heldSseResponse,\n jsonResponse,\n pausedSseResponse,\n sseEvent,\n sseResponse,\n type HeldStreamTimingIface,\n type SseEventIface,\n} from \"./sse.mjs\";\n\n// OpenAI Responses (`POST \u2026/responses`), as the Codex CLI (remote-codex) and\n// the nanocode Codex engine speak it. Responses Lite (header\n// `x-openai-internal-codex-responses-lite`) carries the tools as an\n// `additional_tools` input item instead of `tools`; deferred tools arrive in a\n// `tool_search_output` item after a client-executed `tool_search_call`.\n\nexport const RESPONSES_LITE_HEADER = 'x-openai-internal-codex-responses-lite';\n\nconst partSchema = z.looseObject({ type: z.string(), text: z.string().optional() });\n// Message content and tool output parts as text, one line per part.\nconst contentTextSchema = z.union([\n z.string(),\n z.array(partSchema).transform((parts) =>\n parts\n .map((part) => part.text ?? '')\n .filter((value) => value !== '')\n .join('\\n'),\n ),\n]);\n\nexport interface ToolOutputIface {\n text: string;\n isError: boolean;\n}\n\n// Codex's native MCP client adds a timing envelope around the original tool content.\nconst withoutTimingEnvelope = (text: string): string =>\n /^Wall time: [0-9]+(?:\\.[0-9]+)? seconds\\nOutput:\\n([\\s\\S]*)$/u.exec(text)?.[1] ?? text;\n\nconst structuredOutputSchema = z.union([\n contentTextSchema.transform(\n (text): ToolOutputIface => ({ text: withoutTimingEnvelope(text), isError: false }),\n ),\n z.looseObject({ content: contentTextSchema, success: z.boolean().optional() }).transform(\n (value): ToolOutputIface => ({\n text: withoutTimingEnvelope(value.content),\n isError: value.success === false,\n }),\n ),\n]);\n\n// Text that is the JSON of a structured output (Codex sends MCP results so)\n// reads as that output; other text is the output itself.\nconst decodeTextOutput = (text: string): ToolOutputIface => {\n const content = withoutTimingEnvelope(text);\n try {\n const decoded = structuredOutputSchema.safeParse(JSON.parse(content));\n if (decoded.success) return decoded.data;\n } catch {\n // Plain text.\n }\n return { text: content, isError: false };\n};\n\n// A tool output: text, content parts, `{content, success}`, or JSON text of those.\nconst toolOutputSchema = z.union([\n z.string().transform(decodeTextOutput),\n structuredOutputSchema,\n z.json().transform((value): ToolOutputIface => ({ text: JSON.stringify(value), isError: false })),\n]);\n\nconst itemSchema = z.looseObject({\n type: z.string().default('message'),\n role: z.string().optional(),\n content: contentTextSchema.default(''),\n output: toolOutputSchema.optional(),\n tools: z.array(z.json()).optional(),\n});\n\nexport const responsesRequestSchema = z.looseObject({\n model: z.string(),\n stream: z.boolean().optional(),\n // A bare string is one user message.\n input: z.union([\n z.string().transform((text) => [itemSchema.parse({ role: 'user', content: text })]),\n z.array(itemSchema),\n ]),\n tools: z.array(z.json()).optional(),\n});\n\nexport type ResponsesRequest = z.infer<typeof responsesRequestSchema>;\n\nconst toolSchema = z.looseObject({\n type: z.string(),\n name: z.string().optional(),\n description: z.string().optional(),\n tools: z.array(z.json()).optional(),\n parameters: z\n .looseObject({\n properties: z\n .looseObject({\n sandbox_permissions: z.looseObject({ enum: z.array(z.string()).optional() }).optional(),\n })\n .optional(),\n })\n .optional(),\n});\n\ninterface ToolsetIface {\n tools: OfferedToolIface[];\n toolSearch: boolean;\n codeMode: CodeModeToolIface | null;\n}\n\n// Codex code mode declares each nested tool in the code tool's description as\n// `declare const tools: { <name>(...`.\nconst nestedToolsOf = (description: string): string[] =>\n [...description.matchAll(/declare const tools: \\{ ([A-Za-z_$][\\w$]*)\\(/gu)].flatMap((match) =>\n match[1] == null ? [] : [match[1]],\n );\n\n// Namespace children keep their namespace for the function call.\nconst collectTools = (values: JsonValue[], namespace: string | null, into: ToolsetIface): void => {\n for (const value of values) {\n const parsed = toolSchema.safeParse(value);\n if (!parsed.success) continue;\n const tool = parsed.data;\n if (tool.type === 'tool_search') into.toolSearch = true;\n else if (tool.type === 'namespace') collectTools(tool.tools ?? [], tool.name ?? null, into);\n else if ((tool.type === 'function' || tool.type === 'custom') && tool.name != null) {\n const offered: OfferedToolIface = { name: tool.name, namespace };\n if (\n tool.parameters?.properties?.sandbox_permissions?.enum?.includes('require_escalated') ===\n true\n )\n offered.supportsEscalation = true;\n into.tools.push(offered);\n const nested = tool.type === 'custom' ? nestedToolsOf(tool.description ?? '') : [];\n if (nested.length > 0) into.codeMode ??= { tool: { name: tool.name, namespace }, nested };\n }\n }\n};\n\nexport const responsesConversation = (request: ResponsesRequest): ScriptedConversationIface => {\n const toolset: ToolsetIface = { tools: [], toolSearch: false, codeMode: null };\n collectTools(request.tools ?? [], null, toolset);\n const entries = request.input.flatMap((item): ConversationEntry[] => {\n if (item.tools != null) collectTools(item.tools, null, toolset);\n if (item.type === 'message' && item.role === 'user') {\n return [{ kind: ConversationEntryKind.User, text: item.content }];\n }\n if (item.type === 'function_call_output' || item.type === 'custom_tool_call_output') {\n return [\n {\n kind: ConversationEntryKind.ToolResult,\n ...(item.output ?? { text: '', isError: false }),\n },\n ];\n }\n if (item.type === 'tool_search_output') {\n return [{ kind: ConversationEntryKind.ToolSearchOutput }];\n }\n return [];\n });\n return { entries, ...toolset };\n};\n\nconst USAGE: JsonObject = {\n input_tokens: 12,\n input_tokens_details: { cached_tokens: 0 },\n output_tokens: 4,\n output_tokens_details: { reasoning_tokens: 0 },\n total_tokens: 16,\n};\n\nexport const responsesResponse = (args: {\n request: ResponsesRequest;\n action: ScriptedAction;\n timing: HeldStreamTimingIface;\n}): Response => {\n const { request, action } = args;\n if (action.kind === ScriptedActionKind.Error) {\n return jsonResponse(400, {\n error: { message: action.message, type: 'invalid_request_error', param: null, code: null },\n });\n }\n const responseId = `resp_${crypto.randomUUID()}`;\n const body = (status: string, output: JsonValue[]): JsonObject => ({\n id: responseId,\n object: 'response',\n created_at: Math.floor(Date.now() / 1000),\n model: request.model,\n status,\n output,\n usage: status === 'completed' ? USAGE : null,\n });\n const messageId = `msg_${crypto.randomUUID()}`;\n const message = (status: string, content: JsonValue[]): JsonObject => ({\n type: 'message',\n id: messageId,\n role: 'assistant',\n status,\n content,\n });\n const part = (value: string): JsonObject => ({\n type: 'output_text',\n text: value,\n annotations: [],\n });\n const callId = `call_${crypto.randomUUID()}`;\n const plan = replyPlan(action);\n const fullText = plan == null ? '' : `${plan.first}${plan.second}`;\n const done = ((): JsonObject => {\n if (action.kind === ScriptedActionKind.CodeCall) {\n const call: JsonObject = {\n type: 'custom_tool_call',\n id: `ctc_${crypto.randomUUID()}`,\n call_id: callId,\n name: action.tool.name,\n input: action.source,\n status: 'completed',\n };\n if (action.tool.namespace != null) call.namespace = action.tool.namespace;\n return call;\n }\n if (action.kind === ScriptedActionKind.ToolCall) {\n const call: JsonObject = {\n type: 'function_call',\n id: `fc_${crypto.randomUUID()}`,\n call_id: callId,\n name: action.tool.name,\n arguments: JSON.stringify(action.arguments),\n status: 'completed',\n };\n if (action.tool.namespace != null) call.namespace = action.tool.namespace;\n return call;\n }\n if (action.kind === ScriptedActionKind.ToolSearch) {\n return {\n type: 'tool_search_call',\n id: `tsc_${crypto.randomUUID()}`,\n call_id: callId,\n execution: 'client',\n status: 'completed',\n arguments: { query: action.query },\n };\n }\n return message('completed', [part(fullText)]);\n })();\n if (request.stream !== true) return jsonResponse(200, body('completed', [done]));\n let sequence = 0;\n const event = (type: string, data: JsonObject): SseEventIface => {\n sequence += 1;\n return sseEvent(type, { type, sequence_number: sequence, ...data });\n };\n const head: SseEventIface[] = [event('response.created', { response: body('in_progress', []) })];\n const end = (): SseEventIface[] => [\n event('response.output_item.done', { output_index: 0, item: done }),\n event('response.completed', { response: body('completed', [done]) }),\n ];\n if (action.kind === ScriptedActionKind.CodeCall) {\n head.push(\n event('response.output_item.added', {\n output_index: 0,\n item: { ...done, status: 'in_progress', input: '' },\n }),\n event('response.custom_tool_call_input.delta', {\n item_id: done.id ?? null,\n output_index: 0,\n delta: action.source,\n }),\n event('response.custom_tool_call_input.done', {\n item_id: done.id ?? null,\n output_index: 0,\n input: action.source,\n }),\n );\n return sseResponse([...head, ...end()]);\n }\n if (action.kind === ScriptedActionKind.ToolCall) {\n const argumentsText = JSON.stringify(action.arguments);\n head.push(\n event('response.output_item.added', {\n output_index: 0,\n item: { ...done, status: 'in_progress', arguments: '' },\n }),\n event('response.function_call_arguments.delta', {\n item_id: done.id ?? null,\n output_index: 0,\n delta: argumentsText,\n }),\n event('response.function_call_arguments.done', {\n item_id: done.id ?? null,\n output_index: 0,\n name: action.tool.name,\n arguments: argumentsText,\n }),\n );\n return sseResponse([...head, ...end()]);\n }\n if (plan == null) {\n head.push(event('response.output_item.added', { output_index: 0, item: done }));\n return sseResponse([...head, ...end()]);\n }\n const at = { item_id: messageId, output_index: 0, content_index: 0 };\n const delta = (text: string): SseEventIface[] =>\n text === '' ? [] : [event('response.output_text.delta', { ...at, delta: text })];\n head.push(\n event('response.output_item.added', { output_index: 0, item: message('in_progress', []) }),\n event('response.content_part.added', { ...at, part: part('') }),\n ...delta(plan.first),\n );\n if (plan.held) return heldSseResponse(head, args.timing);\n // Sequence numbers follow emission order, so the tail is built after the head.\n const tail = [\n ...delta(plan.second),\n event('response.output_text.done', { ...at, text: fullText }),\n event('response.content_part.done', { ...at, part: part(fullText) }),\n ...end(),\n ];\n return pausedSseResponse(head, tail, plan.pauseMs);\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,15 @@
1
+ import type { JsonValue } from "../../json.mjs";
2
+ export interface SseEventIface {
3
+ event: string | null;
4
+ data: string;
5
+ }
6
+ export declare const sseEvent: (event: string | null, data: JsonValue) => SseEventIface;
7
+ export declare const sseResponse: (events: SseEventIface[]) => Response;
8
+ export declare const jsonResponse: (status: number, body: JsonValue) => Response;
9
+ export interface HeldStreamTimingIface {
10
+ holdMs: number;
11
+ keepaliveMs: number;
12
+ }
13
+ export declare const DEFAULT_HELD_STREAM_TIMING: HeldStreamTimingIface;
14
+ export declare const heldSseResponse: (events: SseEventIface[], timing: HeldStreamTimingIface) => Response;
15
+ export declare const pausedSseResponse: (head: SseEventIface[], tail: SseEventIface[], pauseMs: number) => Response;