@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.
- package/README.md +12 -0
- package/dist/modules/channel-context.d.mts +102 -0
- package/dist/modules/channel-context.mjs +52 -0
- package/dist/modules/channel-context.mjs.map +7 -0
- package/dist/modules/channel-socket.d.mts +65 -0
- package/dist/modules/channel-socket.mjs +188 -0
- package/dist/modules/channel-socket.mjs.map +7 -0
- package/dist/modules/channel.d.mts +382 -0
- package/dist/modules/channel.mjs +146 -0
- package/dist/modules/channel.mjs.map +7 -0
- package/dist/modules/conformance/agent.d.mts +20 -0
- package/dist/modules/conformance/agent.mjs +623 -0
- package/dist/modules/conformance/agent.mjs.map +7 -0
- package/dist/modules/conformance/fixtures.d.mts +41 -0
- package/dist/modules/conformance/fixtures.mjs +190 -0
- package/dist/modules/conformance/fixtures.mjs.map +7 -0
- package/dist/modules/conformance/harness-kit.d.mts +82 -0
- package/dist/modules/conformance/harness-kit.mjs +1303 -0
- package/dist/modules/conformance/harness-kit.mjs.map +7 -0
- package/dist/modules/conformance/image.d.mts +2 -0
- package/dist/modules/conformance/image.mjs +79 -0
- package/dist/modules/conformance/image.mjs.map +7 -0
- package/dist/modules/conformance/index.d.mts +8 -0
- package/dist/modules/conformance/index.mjs +12 -0
- package/dist/modules/conformance/index.mjs.map +7 -0
- package/dist/modules/conformance/local-harness.d.mts +25 -0
- package/dist/modules/conformance/local-harness.mjs +108 -0
- package/dist/modules/conformance/local-harness.mjs.map +7 -0
- package/dist/modules/conformance/protocol.d.mts +30 -0
- package/dist/modules/conformance/protocol.mjs +56 -0
- package/dist/modules/conformance/protocol.mjs.map +7 -0
- package/dist/modules/conformance/sandbox-kit.d.mts +19 -0
- package/dist/modules/conformance/sandbox-kit.mjs +320 -0
- package/dist/modules/conformance/sandbox-kit.mjs.map +7 -0
- package/dist/modules/conformance/scripted-model/chat-completions.d.mts +30 -0
- package/dist/modules/conformance/scripted-model/chat-completions.mjs +125 -0
- package/dist/modules/conformance/scripted-model/chat-completions.mjs.map +7 -0
- package/dist/modules/conformance/scripted-model/directives.d.mts +84 -0
- package/dist/modules/conformance/scripted-model/directives.mjs +304 -0
- package/dist/modules/conformance/scripted-model/directives.mjs.map +7 -0
- package/dist/modules/conformance/scripted-model/handler.d.mts +14 -0
- package/dist/modules/conformance/scripted-model/handler.mjs +133 -0
- package/dist/modules/conformance/scripted-model/handler.mjs.map +7 -0
- package/dist/modules/conformance/scripted-model/index.d.mts +6 -0
- package/dist/modules/conformance/scripted-model/index.mjs +7 -0
- package/dist/modules/conformance/scripted-model/index.mjs.map +7 -0
- package/dist/modules/conformance/scripted-model/messages.d.mts +39 -0
- package/dist/modules/conformance/scripted-model/messages.mjs +139 -0
- package/dist/modules/conformance/scripted-model/messages.mjs.map +7 -0
- package/dist/modules/conformance/scripted-model/responses.d.mts +62 -0
- package/dist/modules/conformance/scripted-model/responses.mjs +273 -0
- package/dist/modules/conformance/scripted-model/responses.mjs.map +7 -0
- package/dist/modules/conformance/scripted-model/sse.d.mts +15 -0
- package/dist/modules/conformance/scripted-model/sse.mjs +75 -0
- package/dist/modules/conformance/scripted-model/sse.mjs.map +7 -0
- package/dist/modules/conformance/v1-agent.d.mts +24 -0
- package/dist/modules/conformance/v1-agent.mjs +40 -0
- package/dist/modules/conformance/v1-agent.mjs.map +7 -0
- package/dist/modules/credential-routes.d.mts +24 -0
- package/dist/modules/credential-routes.mjs +25 -0
- package/dist/modules/credential-routes.mjs.map +7 -0
- package/dist/modules/credentials.d.mts +206 -0
- package/dist/modules/credentials.mjs +207 -0
- package/dist/modules/credentials.mjs.map +7 -0
- package/dist/modules/dynamic.d.mts +32 -0
- package/dist/modules/dynamic.mjs +77 -0
- package/dist/modules/dynamic.mjs.map +7 -0
- package/dist/modules/harness.d.mts +397 -0
- package/dist/modules/harness.mjs +213 -0
- package/dist/modules/harness.mjs.map +7 -0
- package/dist/modules/index.d.mts +15 -0
- package/dist/modules/index.mjs +40 -0
- package/dist/modules/index.mjs.map +7 -0
- package/dist/modules/json.d.mts +12 -0
- package/dist/modules/json.mjs +19 -0
- package/dist/modules/json.mjs.map +7 -0
- package/dist/modules/local-channel-socket.d.mts +23 -0
- package/dist/modules/local-channel-socket.mjs +141 -0
- package/dist/modules/local-channel-socket.mjs.map +7 -0
- package/dist/modules/manifest.d.mts +558 -0
- package/dist/modules/manifest.mjs +266 -0
- package/dist/modules/manifest.mjs.map +7 -0
- package/dist/modules/mcp-content.d.mts +21 -0
- package/dist/modules/mcp-content.mjs +86 -0
- package/dist/modules/mcp-content.mjs.map +7 -0
- package/dist/modules/provider-ref.d.mts +29 -0
- package/dist/modules/provider-ref.mjs +55 -0
- package/dist/modules/provider-ref.mjs.map +7 -0
- package/dist/modules/sandbox/bytes.d.mts +9 -0
- package/dist/modules/sandbox/bytes.mjs +154 -0
- package/dist/modules/sandbox/bytes.mjs.map +7 -0
- package/dist/modules/sandbox/client.d.mts +51 -0
- package/dist/modules/sandbox/client.mjs +500 -0
- package/dist/modules/sandbox/client.mjs.map +7 -0
- package/dist/modules/sandbox/confined-files.d.mts +22 -0
- package/dist/modules/sandbox/confined-files.mjs +142 -0
- package/dist/modules/sandbox/confined-files.mjs.map +7 -0
- package/dist/modules/sandbox/convenience.d.mts +10 -0
- package/dist/modules/sandbox/convenience.mjs +116 -0
- package/dist/modules/sandbox/convenience.mjs.map +7 -0
- package/dist/modules/sandbox/editor.d.mts +49 -0
- package/dist/modules/sandbox/editor.mjs +43 -0
- package/dist/modules/sandbox/editor.mjs.map +7 -0
- package/dist/modules/sandbox/frame-channel.d.mts +47 -0
- package/dist/modules/sandbox/frame-channel.mjs +153 -0
- package/dist/modules/sandbox/frame-channel.mjs.map +7 -0
- package/dist/modules/sandbox/index.d.mts +18 -0
- package/dist/modules/sandbox/index.mjs +70 -0
- package/dist/modules/sandbox/index.mjs.map +7 -0
- package/dist/modules/sandbox/mcp-channel.d.mts +9 -0
- package/dist/modules/sandbox/mcp-channel.mjs +77 -0
- package/dist/modules/sandbox/mcp-channel.mjs.map +7 -0
- package/dist/modules/sandbox/mcp-hosted.d.mts +46 -0
- package/dist/modules/sandbox/mcp-hosted.mjs +221 -0
- package/dist/modules/sandbox/mcp-hosted.mjs.map +7 -0
- package/dist/modules/sandbox/mcp-search.d.mts +51 -0
- package/dist/modules/sandbox/mcp-search.mjs +129 -0
- package/dist/modules/sandbox/mcp-search.mjs.map +7 -0
- package/dist/modules/sandbox/mcp-shell.d.mts +21 -0
- package/dist/modules/sandbox/mcp-shell.mjs +205 -0
- package/dist/modules/sandbox/mcp-shell.mjs.map +7 -0
- package/dist/modules/sandbox/mcp-testing.d.mts +11 -0
- package/dist/modules/sandbox/mcp-testing.mjs +33 -0
- package/dist/modules/sandbox/mcp-testing.mjs.map +7 -0
- package/dist/modules/sandbox/mcp.d.mts +83 -0
- package/dist/modules/sandbox/mcp.mjs +971 -0
- package/dist/modules/sandbox/mcp.mjs.map +7 -0
- package/dist/modules/sandbox/memory-sandbox.d.mts +32 -0
- package/dist/modules/sandbox/memory-sandbox.mjs +416 -0
- package/dist/modules/sandbox/memory-sandbox.mjs.map +7 -0
- package/dist/modules/sandbox/memory-shell.d.mts +29 -0
- package/dist/modules/sandbox/memory-shell.mjs +278 -0
- package/dist/modules/sandbox/memory-shell.mjs.map +7 -0
- package/dist/modules/sandbox/open-scope-node.d.mts +4 -0
- package/dist/modules/sandbox/open-scope-node.mjs +19 -0
- package/dist/modules/sandbox/open-scope-node.mjs.map +7 -0
- package/dist/modules/sandbox/open-scope.d.mts +16 -0
- package/dist/modules/sandbox/open-scope.mjs +66 -0
- package/dist/modules/sandbox/open-scope.mjs.map +7 -0
- package/dist/modules/sandbox/paths.d.mts +7 -0
- package/dist/modules/sandbox/paths.mjs +50 -0
- package/dist/modules/sandbox/paths.mjs.map +7 -0
- package/dist/modules/sandbox/rpc-peer.d.mts +35 -0
- package/dist/modules/sandbox/rpc-peer.mjs +224 -0
- package/dist/modules/sandbox/rpc-peer.mjs.map +7 -0
- package/dist/modules/sandbox/seeds.d.mts +26 -0
- package/dist/modules/sandbox/seeds.mjs +228 -0
- package/dist/modules/sandbox/seeds.mjs.map +7 -0
- package/dist/modules/sandbox/server.d.mts +66 -0
- package/dist/modules/sandbox/server.mjs +567 -0
- package/dist/modules/sandbox/server.mjs.map +7 -0
- package/dist/modules/sandbox/snapshots.d.mts +49 -0
- package/dist/modules/sandbox/snapshots.mjs +55 -0
- package/dist/modules/sandbox/snapshots.mjs.map +7 -0
- package/dist/modules/sandbox/stream-mux.d.mts +18 -0
- package/dist/modules/sandbox/stream-mux.mjs +285 -0
- package/dist/modules/sandbox/stream-mux.mjs.map +7 -0
- package/dist/modules/sandbox/testing.d.mts +25 -0
- package/dist/modules/sandbox/testing.mjs +64 -0
- package/dist/modules/sandbox/testing.mjs.map +7 -0
- package/dist/modules/sandbox/types.d.mts +352 -0
- package/dist/modules/sandbox/types.mjs +86 -0
- package/dist/modules/sandbox/types.mjs.map +7 -0
- package/dist/modules/sandbox/wire.d.mts +671 -0
- package/dist/modules/sandbox/wire.mjs +537 -0
- package/dist/modules/sandbox/wire.mjs.map +7 -0
- package/dist/modules/sandbox/workspace-root.d.mts +8 -0
- package/dist/modules/sandbox/workspace-root.mjs +79 -0
- package/dist/modules/sandbox/workspace-root.mjs.map +7 -0
- package/dist/modules/schemas.d.mts +121 -0
- package/dist/modules/schemas.mjs +146 -0
- package/dist/modules/schemas.mjs.map +7 -0
- package/dist/modules/semantic-events.d.mts +31 -0
- package/dist/modules/semantic-events.mjs +23 -0
- package/dist/modules/semantic-events.mjs.map +7 -0
- package/package.json +199 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/conformance/agent.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n agent,\n methods,\n PROTOCOL_VERSION,\n RequestError,\n type AgentApp,\n type AgentConnection,\n type AgentContext,\n type AnyBatchMessage,\n type AnyCall,\n type AnyMessage,\n type AnyResponse,\n type AnyWireMessage,\n type ContentBlock,\n type JsonRpcId,\n type McpServer,\n type SessionUpdate,\n type Stream,\n} from '@agentclientprotocol/sdk/experimental/v2';\nimport {\n RESOURCE_LINK_DESCRIPTION_BYTES,\n utf8Prefix,\n type FrameAttachmentStoreIface,\n} from '@finalai/acp-session';\nimport {\n Client,\n StreamableHTTPClientTransport,\n type FetchLike,\n} from '@modelcontextprotocol/client';\nimport * as z from 'zod';\nimport { PromptWhileRunning } from \"../harness.mjs\";\nimport { jsonValueSchema, type JsonObject, type JsonValue } from \"../json.mjs\";\nimport { conformanceImageBase64 } from \"./image.mjs\";\nimport {\n AFTER_SEQ_REPLAY_TYPE,\n ConformanceDirective,\n FINAL_META_KEY,\n OBSERVE_METHOD,\n parseDirective,\n} from \"./protocol.mjs\";\n\n// The reference ACP v2 program for the conformance protocol (protocol.ts).\n// With `extensions: false` it is a plain ACP v2 agent: no\n// `_final/session/observe` and no `_meta[\"final.ai\"]` anywhere.\n\nexport interface ConformanceAgentOptionsIface {\n extensions?: boolean;\n // Fetch used for `http` MCP servers (in-process hosts in tests).\n fetch?: FetchLike;\n // How long `conformance:slow` waits for a cancel before ending by itself.\n slowTurnMs?: number;\n // `_final/*` methods to advertise in `_meta[\"final.ai\"].privateMethods` (with\n // extensions); the agent accepts and ignores them.\n privateMethods?: string[];\n // What a prompt accepted while a turn runs does. Default queue.\n promptWhileRunning?: PromptWhileRunning;\n // Keeps running work and open requests across a dropped connection and\n // re-raises open requests with the same JSON-RPC ids on session/resume. Needs connections made through `connect`. Default false: a\n // dropped connection ends the running turn.\n survivesDisconnect?: boolean;\n // Where `conformance:big` moves content over the frame rule's limits (with\n // extensions; a plain agent leaves frames as they are).\n attachments?: FrameAttachmentStoreIface;\n}\n\nexport interface ConformanceAgentIface {\n app: AgentApp;\n // Serves one connection. Unlike `app.connect`, it lets requests the agent\n // raises outlive the connection (survivesDisconnect).\n connect(stream: Stream): AgentConnection;\n // Session ids this agent knows (for tests).\n sessions(): string[];\n // The native conversation id behind an ACP session (changes on clear).\n nativeId(sessionId: string): string | null;\n}\n\n// A request this agent raised that has not been answered yet.\ninterface OpenRequestIface {\n method: string;\n message: AnyMessage;\n resolve: (result: JsonValue) => void;\n}\n\ninterface LinkIface {\n id: string;\n write: (message: AnyWireMessage) => Promise<void>;\n closed: boolean;\n // Settles when the connection closes.\n gone: Promise<void>;\n}\n\ninterface SessionStateIface {\n id: string;\n nativeId: string;\n cwd: string;\n mcpServers: McpServer[];\n history: SessionUpdate[];\n transcript: string[];\n client: AgentContext;\n link: LinkIface | null;\n turn: AbortController | null;\n queue: Promise<void>;\n // Prompts injected into the running turn, awaited before it ends.\n injected: Promise<void>[];\n // Bumped by session/cancel: queued prompts accepted before it are dropped.\n cancels: number;\n open: Map<string, OpenRequestIface>;\n}\n\nconst observeParamsSchema = z.object({\n sessionId: z.string(),\n content: z.array(z.object({ type: z.string(), text: z.string().optional() }).passthrough()),\n});\n\nconst textOf = (content: readonly ContentBlock[]): string =>\n content.map((block) => textBlockSchema.safeParse(block).data?.text ?? '').join('');\n\nconst authorMetaSchema = z.object({\n _meta: z.object({\n [FINAL_META_KEY]: z.object({ author: z.object({ displayName: z.string().min(1) }) }),\n }),\n});\n\n// Conversations attribute a message to its author: `_meta[\"final.ai\"].author` on the\n// block and, for agents that do not render author meta (this one), a `<name>: ` prefix on its\n// text. The directive is what follows the prefix.\nconst directiveTextOf = (content: readonly ContentBlock[], text: string): string => {\n const author = content\n .map((block) => authorMetaSchema.safeParse(block).data?._meta[FINAL_META_KEY].author)\n .find((entry) => entry != null);\n const trimmed = text.trimStart();\n if (author != null && trimmed.startsWith(`${author.displayName}: `))\n return trimmed.slice(author.displayName.length + 2);\n // A plain agent reads no `_meta`: any one-line `<name>: ` before a directive.\n const prefixed = /^[^\\n]+?: (conformance:[\\s\\S]*)$/u.exec(trimmed);\n return prefixed?.[1] ?? text;\n};\n\nconst randomId = () => crypto.randomUUID();\n\nconst delay = (ms: number, signal: AbortSignal) =>\n new Promise<void>((resolve) => {\n if (signal.aborted) {\n resolve();\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer);\n resolve();\n },\n { once: true },\n );\n });\n\nconst toolResultSchema = z.object({\n content: z.array(z.object({ type: z.string(), text: z.string().optional() })),\n});\n\nconst mcpResultText = (parsed: z.ZodSafeParseResult<z.output<typeof toolResultSchema>>): string =>\n parsed.success\n ? parsed.data.content.map((block) => block.text ?? '').join('')\n : 'unreadable tool result';\n\nconst textBlockSchema = z.object({ type: z.literal('text'), text: z.string() });\nconst acpServerSchema = z.object({\n type: z.literal('acp'),\n name: z.string(),\n serverId: z.string(),\n});\nconst httpServerSchema = z.object({\n type: z.literal('http'),\n name: z.string(),\n url: z.string(),\n headers: z.array(z.object({ name: z.string(), value: z.string() })).optional(),\n});\nconst namedServerSchema = z.object({ name: z.string() });\nconst afterSeqSchema = z.object({ seq: z.number().int().nonnegative() });\nconst permissionResultSchema = z.object({\n outcome: z.union([\n z.object({ outcome: z.literal('selected'), optionId: z.string() }),\n z.object({ outcome: z.literal('cancelled') }),\n ]),\n});\nconst elicitationResultSchema = z.object({\n action: z.string(),\n content: z.record(z.string(), z.unknown()).optional(),\n});\nconst rawRequestSchema = z.object({ id: z.union([z.string(), z.number()]), method: z.string() });\nconst rawResponseSchema = z.object({\n id: z.union([z.string(), z.number()]),\n result: jsonValueSchema,\n});\nconst rawErrorSchema = z.object({ id: z.union([z.string(), z.number()]), error: z.unknown() });\nconst isBatch = (wire: AnyWireMessage): wire is AnyBatchMessage => Array.isArray(wire);\nconst isCall = (message: AnyMessage): message is AnyCall => 'method' in message;\nconst isResponse = (message: AnyMessage): message is AnyResponse => !('method' in message);\nconst messagesOf = (wire: AnyWireMessage): readonly AnyMessage[] => (isBatch(wire) ? wire : [wire]);\n\n// In-memory attachment store for `conformance:big`.\nconst memoryAttachments = (): FrameAttachmentStoreIface => {\n let counter = 0;\n return {\n put: async () => {\n counter += 1;\n return { uri: `memory://conformance-attachments/${counter}` };\n },\n };\n};\n\nconst cancelledAnswer = (method: string): JsonObject =>\n method === methods.client.session.requestPermission\n ? { outcome: { outcome: 'cancelled' } }\n : { action: 'cancel' };\n\n// Requests from a client carry ids that are only unique per connection; the\n// agent prefixes them with the connection so a handler knows which one asked.\nconst LINK_SEPARATOR = '|';\n\nexport const createConformanceAgent = (\n options: ConformanceAgentOptionsIface = {},\n): ConformanceAgentIface => {\n const extensions = options.extensions ?? true;\n const slowTurnMs = options.slowTurnMs ?? 30_000;\n const inject = options.promptWhileRunning === PromptWhileRunning.Inject;\n const survives = options.survivesDisconnect ?? false;\n const attachments = options.attachments ?? memoryAttachments();\n const sessions = new Map<string, SessionStateIface>();\n const links = new Map<string, LinkIface>();\n\n const linkOf = (requestId: JsonRpcId): LinkIface | null => {\n const parsed = z.string().safeParse(requestId);\n if (!parsed.success) return null;\n const separator = parsed.data.indexOf(LINK_SEPARATOR);\n return separator < 0 ? null : (links.get(parsed.data.slice(0, separator)) ?? null);\n };\n\n const getSession = (sessionId: string): SessionStateIface => {\n const session = sessions.get(sessionId);\n if (session == null) throw RequestError.resourceNotFound(sessionId);\n return session;\n };\n\n const attach = (session: SessionStateIface, client: AgentContext, requestId: JsonRpcId) => {\n session.client = client;\n session.link = linkOf(requestId) ?? session.link;\n };\n\n const emit = async (session: SessionStateIface, update: SessionUpdate, record = true) => {\n if (record) session.history.push(update);\n const sending = session.client.notify(methods.client.session.update, {\n sessionId: session.id,\n update,\n });\n // A surviving session keeps going without a client: the history is the\n // buffer the next session/resume replays.\n if (survives) await sending.catch(() => undefined);\n else await sending;\n };\n\n const say = async (session: SessionStateIface, messageId: string, text: string) => {\n // Two chunks when possible, so clients exercise chunk concatenation.\n const middle = Math.ceil(text.length / 2);\n const parts = text.length > 1 ? [text.slice(0, middle), text.slice(middle)] : [text];\n for (const part of parts) {\n await emit(session, {\n sessionUpdate: 'agent_message_chunk',\n messageId,\n content: { type: 'text', text: part },\n });\n }\n };\n\n // A request to the client. A surviving session raises it with its own id\n // over the raw link and re-raises it with that id after session/resume.\n const ask = async <T, R>(\n session: SessionStateIface,\n method: string,\n params: T,\n viaSdk: () => Promise<R>,\n ): Promise<JsonValue> => {\n const current = session.link;\n // Without survivesDisconnect an open request dies with its connection.\n if (!survives || current == null) {\n return current == null\n ? viaSdk().then((result) => jsonValueSchema.parse(result))\n : Promise.race([\n viaSdk().then((result) => jsonValueSchema.parse(result)),\n current.gone.then(() => cancelledAnswer(method)),\n ]);\n }\n const id = `conformance-request-${randomId()}`;\n const message: AnyMessage = { jsonrpc: '2.0', id, method, params };\n const answered = new Promise<JsonValue>((resolve) => {\n session.open.set(id, { method, message, resolve });\n });\n if (!current.closed) await current.write(message).catch(() => undefined);\n try {\n return await answered;\n } finally {\n session.open.delete(id);\n }\n };\n\n const callMcp = async (session: SessionStateIface, rest: string): Promise<string> => {\n const [serverName = '', toolName = '', ...argParts] = rest.split(' ');\n const toolArgs =\n argParts.length === 0\n ? {}\n : z.record(z.string(), z.json()).parse(JSON.parse(argParts.join(' ')));\n const server = session.mcpServers.find(\n (entry) => namedServerSchema.safeParse(entry).data?.name === serverName,\n );\n if (server == null) throw new Error(`no MCP server named ${serverName}`);\n const acp = acpServerSchema.safeParse(server);\n const http = httpServerSchema.safeParse(server);\n if (acp.success) {\n const response = await session.client.request(methods.client.mcp.message, {\n serverId: acp.data.serverId,\n requestId: randomId(),\n method: 'tools/call',\n params: { name: toolName, arguments: toolArgs },\n });\n if ('error' in response) throw new Error(response.error.message);\n return mcpResultText(toolResultSchema.safeParse(response.result));\n }\n if (http.success) {\n const headers: Record<string, string> = {};\n for (const header of http.data.headers ?? []) headers[header.name] = header.value;\n const client = new Client({ name: 'final-conformance-agent', version: '1' });\n await client.connect(\n new StreamableHTTPClientTransport(new URL(http.data.url), {\n fetch: options.fetch,\n requestInit: { headers },\n }),\n );\n try {\n return mcpResultText(\n toolResultSchema.safeParse(\n await client.callTool({ name: toolName, arguments: toolArgs }),\n ),\n );\n } finally {\n await client.close();\n }\n }\n throw new Error(`unsupported MCP server type ${server.type}`);\n };\n\n // A Final program applies the frame rule at the source: content\n // over the limits goes to the attachment store as a `resource_link`.\n const linked = async (args: {\n bytes: Uint8Array;\n mimeType: string;\n name: string;\n text: string | null;\n }): Promise<ContentBlock> => {\n const { uri } = await attachments.put(args);\n const link: ContentBlock = {\n type: 'resource_link',\n uri,\n name: args.name,\n mimeType: args.mimeType,\n size: args.bytes.length,\n };\n if (args.text != null)\n link.description = utf8Prefix(args.text, RESOURCE_LINK_DESCRIPTION_BYTES);\n return link;\n };\n\n const runTurn = async (\n session: SessionStateIface,\n text: string,\n signal: AbortSignal,\n ): Promise<SessionUpdate> => {\n const messageId = randomId();\n const parsed = parseDirective(text);\n const endTurn: SessionUpdate = {\n sessionUpdate: 'state_update',\n state: 'idle',\n stopReason: 'end_turn',\n };\n const cancelled: SessionUpdate = {\n sessionUpdate: 'state_update',\n state: 'idle',\n stopReason: 'cancelled',\n };\n if (parsed == null) {\n await say(session, messageId, `unknown directive: ${text}`);\n return endTurn;\n }\n switch (parsed.name) {\n case ConformanceDirective.Echo:\n await say(session, messageId, parsed.rest);\n return endTurn;\n case ConformanceDirective.Permission: {\n const params = {\n sessionId: session.id,\n title: 'Conformance permission',\n options: [\n { optionId: 'allow', name: 'Allow once', kind: 'allow_once' as const },\n { optionId: 'reject', name: 'Reject', kind: 'reject_once' as const },\n ],\n };\n const response = permissionResultSchema.safeParse(\n await ask(session, methods.client.session.requestPermission, params, () =>\n session.client.request(methods.client.session.requestPermission, params),\n ),\n );\n const outcome = response.success ? response.data.outcome : { outcome: 'cancelled' };\n const kind =\n outcome.outcome === 'selected' && 'optionId' in outcome\n ? outcome.optionId === 'allow'\n ? 'allow_once'\n : 'reject_once'\n : 'cancelled';\n await say(session, messageId, `permission:${kind}`);\n return endTurn;\n }\n case ConformanceDirective.Elicit: {\n const params = {\n mode: 'form' as const,\n sessionId: session.id,\n message: 'Conformance question',\n requestedSchema: {\n type: 'object' as const,\n properties: { answer: { type: 'string' as const, title: 'Answer' } },\n required: ['answer'],\n },\n };\n const response = elicitationResultSchema.safeParse(\n await ask(session, methods.client.elicitation.create, params, () =>\n session.client.request(methods.client.elicitation.create, params),\n ),\n );\n const action = response.success ? response.data.action : 'cancel';\n const answer = z\n .object({ answer: z.union([z.string(), z.number(), z.boolean()]) })\n .safeParse(response.data?.content);\n await say(\n session,\n messageId,\n `elicitation:${action}:${action === 'accept' && answer.success ? String(answer.data.answer) : ''}`,\n );\n return endTurn;\n }\n case ConformanceDirective.Slow:\n await say(session, messageId, 'slow:started');\n await delay(slowTurnMs, signal);\n return signal.aborted ? cancelled : endTurn;\n case ConformanceDirective.Wait: {\n await say(session, messageId, 'wait:started');\n await delay(Number.parseInt(parsed.rest, 10) || 500, signal);\n if (signal.aborted) return cancelled;\n await say(session, messageId, 'wait:done');\n return endTurn;\n }\n case ConformanceDirective.Clear:\n // A fresh native conversation; the ACP session (and its id) stays.\n session.nativeId = randomId();\n session.transcript = [];\n await say(session, messageId, 'cleared');\n return endTurn;\n case ConformanceDirective.Big: {\n const bytes = Number.parseInt(parsed.rest, 10) || 3 * 1024 * 1024;\n const toolCallId = randomId();\n const text = 'x'.repeat(bytes);\n const image = conformanceImageBase64();\n const encoder = new TextEncoder();\n const blocks: ContentBlock[] = extensions\n ? [\n await linked({\n bytes: encoder.encode(text),\n mimeType: 'text/plain',\n name: 'output.txt',\n text,\n }),\n await linked({\n bytes: Uint8Array.from(atob(image), (char) => char.charCodeAt(0)),\n mimeType: 'image/png',\n name: 'image.png',\n text: null,\n }),\n ]\n : [\n { type: 'text', text },\n { type: 'image', mimeType: 'image/png', data: image },\n ];\n await emit(session, {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n title: 'Produce a large result',\n kind: 'read',\n status: 'in_progress',\n });\n await emit(session, {\n sessionUpdate: 'tool_call_update',\n toolCallId,\n status: 'completed',\n content: blocks.map((content) => ({ type: 'content', content })),\n });\n await say(session, messageId, 'big:done');\n return endTurn;\n }\n case ConformanceDirective.Error: {\n const error = { code: -32603, message: 'conformance error' };\n if (!extensions)\n return { sessionUpdate: 'state_update', state: 'idle', stopReason: 'error', error };\n const providerError = {\n code: 'conformance_error',\n message: 'conformance error',\n retryable: false,\n };\n return {\n sessionUpdate: 'state_update',\n state: 'idle',\n stopReason: 'error',\n error,\n _meta: { [FINAL_META_KEY]: { providerError } },\n };\n }\n case ConformanceDirective.Mcp: {\n let reply: string;\n try {\n reply = `mcp:${await callMcp(session, parsed.rest)}`;\n } catch (error) {\n reply = `mcp-error:${error instanceof Error ? error.message : String(error)}`;\n }\n await say(session, messageId, reply);\n return endTurn;\n }\n case ConformanceDirective.History:\n await say(session, messageId, session.transcript.join('\\n'));\n return endTurn;\n }\n };\n\n const echo = (\n session: SessionStateIface,\n prompt: readonly ContentBlock[],\n userMessageId: string,\n ) =>\n emit(session, {\n sessionUpdate: 'user_message',\n messageId: userMessageId,\n content: [...prompt],\n });\n\n // `inject`: the running turn takes the prompt at its next step and ends once\n // for both.\n const injectIntoTurn = (\n session: SessionStateIface,\n turn: AbortController,\n prompt: readonly ContentBlock[],\n userMessageId: string,\n ) => {\n const text = textOf(prompt);\n session.transcript.push(text);\n const work = (async () => {\n await echo(session, prompt, userMessageId);\n await runTurn(session, directiveTextOf(prompt, text), turn.signal);\n })().catch(() => undefined);\n session.injected.push(work);\n };\n\n const startTurn = (\n session: SessionStateIface,\n prompt: readonly ContentBlock[],\n userMessageId: string,\n ) => {\n const text = textOf(prompt);\n const cancels = session.cancels;\n session.queue = session.queue.then(async () => {\n // `queue`: a cancel drops prompts accepted but not started.\n if (session.cancels !== cancels) return;\n session.transcript.push(text);\n const controller = new AbortController();\n session.turn = controller;\n try {\n await echo(session, prompt, userMessageId);\n await emit(session, { sessionUpdate: 'state_update', state: 'running' });\n const end = await runTurn(session, directiveTextOf(prompt, text), controller.signal).catch(\n (cause: unknown): SessionUpdate => ({\n sessionUpdate: 'state_update',\n state: 'idle',\n stopReason: 'error',\n error: {\n code: -32603,\n message: cause instanceof Error ? cause.message : String(cause),\n },\n }),\n );\n while (session.injected.length > 0) await Promise.all(session.injected.splice(0));\n await emit(\n session,\n controller.signal.aborted && end.sessionUpdate === 'state_update'\n ? { sessionUpdate: 'state_update', state: 'idle', stopReason: 'cancelled' }\n : end,\n );\n } catch {\n // The connection went away mid-turn; the history keeps what was sent.\n } finally {\n session.turn = null;\n }\n });\n };\n\n // Answers every open request as cancelled (session/cancel, a lost turn).\n const cancelOpen = (session: SessionStateIface) => {\n for (const request of session.open.values()) request.resolve(cancelledAnswer(request.method));\n };\n\n const app = agent({ name: 'final-conformance-agent' })\n .onRequest(methods.agent.initialize, () => ({\n protocolVersion: PROTOCOL_VERSION,\n info: { name: 'final-conformance-agent', version: '1' },\n capabilities: extensions\n ? {\n session: { mcp: { acp: {}, http: {} } },\n _meta: {\n [FINAL_META_KEY]: {\n supports: { observe: true, authorMeta: false, afterSeqReplay: true },\n privateMethods: options.privateMethods ?? [],\n },\n },\n }\n : { session: { mcp: { acp: {}, http: {} } } },\n }))\n .onRequest(methods.agent.session.new, ({ params, client, requestId }) => {\n const id = randomId();\n sessions.set(id, {\n id,\n nativeId: randomId(),\n cwd: params.cwd,\n mcpServers: params.mcpServers ?? [],\n history: [],\n transcript: [],\n client,\n link: linkOf(requestId),\n turn: null,\n queue: Promise.resolve(),\n injected: [],\n cancels: 0,\n open: new Map(),\n });\n return { sessionId: id };\n })\n .onRequest(methods.agent.session.resume, async ({ params, client, requestId }) => {\n const session = getSession(params.sessionId);\n attach(session, client, requestId);\n session.cwd = params.cwd;\n if (params.mcpServers != null) session.mcpServers = params.mcpServers;\n const replayFrom = params.replayFrom;\n let replay: SessionUpdate[] = [];\n if (replayFrom?.type === 'start') replay = [...session.history];\n else if (extensions && replayFrom?.type === AFTER_SEQ_REPLAY_TYPE) {\n const seq = afterSeqSchema.safeParse(replayFrom).data?.seq ?? 0;\n replay = session.history.slice(Math.max(0, seq));\n }\n for (const update of replay) await emit(session, update, false);\n // Open requests come back with the ids they were raised with.\n const link = session.link;\n if (link != null) {\n for (const request of session.open.values()) {\n await link.write(request.message).catch(() => undefined);\n }\n }\n return {};\n })\n .onRequest(methods.agent.session.prompt, ({ params, client, requestId }) => {\n const session = getSession(params.sessionId);\n attach(session, client, requestId);\n const messageId = randomId();\n // Accept first; the turn starts (or the prompt joins it) after the response.\n setTimeout(() => {\n const running = session.turn;\n if (inject && running != null) injectIntoTurn(session, running, params.prompt, messageId);\n else startTurn(session, params.prompt, messageId);\n }, 0);\n return { messageId };\n })\n .onRequest(methods.agent.session.close, async ({ params }) => {\n const session = sessions.get(params.sessionId);\n if (session != null) {\n // Graceful: the running turn settles (and reports its end) before the\n // session goes away.\n session.cancels += 1;\n session.turn?.abort();\n cancelOpen(session);\n await session.queue;\n }\n sessions.delete(params.sessionId);\n return {};\n })\n .onNotification(methods.agent.session.cancel, ({ params }) => {\n const session = sessions.get(params.sessionId);\n if (session == null) return;\n session.cancels += 1;\n session.turn?.abort();\n cancelOpen(session);\n });\n\n // Advertised private methods are accepted and ignored.\n for (const method of extensions ? (options.privateMethods ?? []) : []) {\n app.onNotification(method, z.unknown(), () => undefined);\n }\n\n if (extensions) {\n app.onNotification(OBSERVE_METHOD, observeParamsSchema, ({ params }) => {\n const session = sessions.get(params.sessionId);\n if (session == null) return;\n session.transcript.push(params.content.map((block) => block.text ?? '').join(''));\n });\n }\n\n const openRequestOf = (id: string | number): OpenRequestIface | null => {\n for (const session of sessions.values()) {\n const request = session.open.get(String(id));\n if (request != null) return request;\n }\n return null;\n };\n\n const connect = (stream: Stream): AgentConnection => {\n const linkId = randomId();\n const originals = new Map<string, JsonRpcId>();\n const writer = stream.writable.getWriter();\n let writing = Promise.resolve();\n const write = (message: AnyWireMessage): Promise<void> => {\n writing = writing.then(() => writer.write(message));\n return writing;\n };\n const gone = Promise.withResolvers<void>();\n const link: LinkIface = { id: linkId, write, closed: false, gone: gone.promise };\n links.set(linkId, link);\n // Responses go back with the id the client used.\n const writable = new WritableStream<AnyWireMessage>({\n write: async (wire) => {\n const restored = messagesOf(wire).map((message): AnyMessage => {\n if ('method' in message) return message;\n const id = z.string().safeParse(message.id);\n if (!id.success) return message;\n const original = originals.get(id.data);\n if (original === undefined) return message;\n originals.delete(id.data);\n return { ...message, id: original };\n });\n const [first, ...rest] = restored;\n await write(\n isBatch(wire) && first != null ? mergeBatch(first, rest, wire) : (first ?? wire),\n );\n },\n close: () => writing.then(() => writer.close()),\n abort: (reason) => writer.abort(reason),\n });\n const readable = stream.readable.pipeThrough(\n new TransformStream<AnyWireMessage, AnyWireMessage>({\n transform: (wire, controller) => {\n const passed: AnyMessage[] = [];\n for (const message of messagesOf(wire)) {\n // Answers to requests raised over the link never reach the SDK.\n const answered = rawResponseSchema.safeParse(message);\n const failed = rawErrorSchema.safeParse(message);\n const id = answered.success ? answered.data.id : failed.success ? failed.data.id : null;\n const open = id == null || 'method' in message ? null : openRequestOf(id);\n if (open != null) {\n open.resolve(answered.success ? answered.data.result : null);\n continue;\n }\n const request = rawRequestSchema.safeParse(message);\n if (request.success && 'method' in message && 'id' in message) {\n const scoped = `${linkId}${LINK_SEPARATOR}${JSON.stringify(request.data.id)}`;\n originals.set(scoped, request.data.id);\n passed.push({ ...message, id: scoped });\n continue;\n }\n passed.push(message);\n }\n const [first, ...rest] = passed;\n if (first == null) return;\n controller.enqueue(isBatch(wire) ? mergeBatch(first, rest, wire) : first);\n },\n // The client hung up: the SDK connection may outlive it while its own\n // requests are open.\n flush: () => {\n link.closed = true;\n gone.resolve();\n },\n }),\n );\n const connection = app.connect({ readable, writable });\n void connection.closed.then(() => {\n link.closed = true;\n links.delete(linkId);\n gone.resolve();\n });\n return connection;\n };\n\n return {\n app,\n connect,\n sessions: () => [...sessions.keys()],\n nativeId: (sessionId) => sessions.get(sessionId)?.nativeId ?? null,\n };\n};\n\n// Rebuilds a batch from rewritten members; a mixed result keeps the original.\nconst mergeBatch = (\n first: AnyMessage,\n rest: AnyMessage[],\n original: AnyWireMessage,\n): AnyWireMessage => {\n const all = [first, ...rest];\n const calls = all.filter(isCall);\n const [firstCall, ...restCalls] = calls;\n if (firstCall != null && calls.length === all.length) return [firstCall, ...restCalls];\n const responses = all.filter(isResponse);\n const [firstResponse, ...restResponses] = responses;\n if (firstResponse != null && responses.length === all.length) {\n return [firstResponse, ...restResponses];\n }\n return original;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["text"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { MessageMcpRequest, MessageMcpResponse, Stream } from '@agentclientprotocol/sdk/experimental/v2';
|
|
2
|
+
import { type CallToolResult } from '@modelcontextprotocol/server';
|
|
3
|
+
import * as z from 'zod';
|
|
4
|
+
export declare const createLinkedStreamPair: () => [Stream, Stream];
|
|
5
|
+
export type FetchHandler = (request: Request) => Promise<Response>;
|
|
6
|
+
export interface InProcessHttpHostIface {
|
|
7
|
+
fetch: (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
8
|
+
serve: (handler: FetchHandler) => Promise<{
|
|
9
|
+
url: string;
|
|
10
|
+
headers: Record<string, string>;
|
|
11
|
+
close: () => Promise<void>;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
export declare const createInProcessHttpHost: (base?: string) => InProcessHttpHostIface;
|
|
15
|
+
export declare const echoArgsSchema: z.ZodObject<{
|
|
16
|
+
text: z.ZodString;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
export declare const largeResultArgsSchema: z.ZodObject<{
|
|
19
|
+
bytes: z.ZodNumber;
|
|
20
|
+
}, z.core.$strip>;
|
|
21
|
+
export declare const conformanceLargeResult: (bytes: number) => CallToolResult;
|
|
22
|
+
export declare const conformanceEchoResult: (nonce: string, text: string) => CallToolResult;
|
|
23
|
+
export declare const conformanceToolDescriptor: {
|
|
24
|
+
name: string;
|
|
25
|
+
description: string;
|
|
26
|
+
inputSchema: {
|
|
27
|
+
type: string;
|
|
28
|
+
properties: {
|
|
29
|
+
text: {
|
|
30
|
+
type: string;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
required: string[];
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export interface ConformanceMcpHttpHandlerIface {
|
|
37
|
+
fetch: FetchHandler;
|
|
38
|
+
close: () => Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
export declare const createConformanceMcpHttpHandler: (nonce: string) => ConformanceMcpHttpHandlerIface;
|
|
41
|
+
export declare const answerConformanceMcpMessage: (nonce: string, message: Pick<MessageMcpRequest, "method" | "params">) => MessageMcpResponse;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import {
|
|
2
|
+
acceptedContent,
|
|
3
|
+
createMcpHandler,
|
|
4
|
+
inputRequired,
|
|
5
|
+
McpServer
|
|
6
|
+
} from "@modelcontextprotocol/server";
|
|
7
|
+
import * as z from "zod";
|
|
8
|
+
import { conformanceImageBase64 } from "./image.mjs";
|
|
9
|
+
import {
|
|
10
|
+
CONFORMANCE_BIG_TOOL,
|
|
11
|
+
CONFORMANCE_ELICIT_TOOL,
|
|
12
|
+
CONFORMANCE_MCP_TOOL,
|
|
13
|
+
conformanceEchoText
|
|
14
|
+
} from "./protocol.mjs";
|
|
15
|
+
const createLinkedStreamPair = () => {
|
|
16
|
+
const forward = new TransformStream();
|
|
17
|
+
const backward = new TransformStream();
|
|
18
|
+
return [
|
|
19
|
+
{ writable: forward.writable, readable: backward.readable },
|
|
20
|
+
{ writable: backward.writable, readable: forward.readable }
|
|
21
|
+
];
|
|
22
|
+
};
|
|
23
|
+
const createInProcessHttpHost = (base = "http://conformance.invalid") => {
|
|
24
|
+
const routes = /* @__PURE__ */ new Map();
|
|
25
|
+
let counter = 0;
|
|
26
|
+
return {
|
|
27
|
+
fetch: async (input, init) => {
|
|
28
|
+
const request = input instanceof Request ? input : new Request(input, init);
|
|
29
|
+
for (const [prefix, handler] of routes) {
|
|
30
|
+
if (request.url.startsWith(prefix)) return handler(request);
|
|
31
|
+
}
|
|
32
|
+
return new Response("not found", { status: 404 });
|
|
33
|
+
},
|
|
34
|
+
serve: async (handler) => {
|
|
35
|
+
counter += 1;
|
|
36
|
+
const url = `${base}/${counter}/mcp`;
|
|
37
|
+
routes.set(url, handler);
|
|
38
|
+
return {
|
|
39
|
+
url,
|
|
40
|
+
headers: {},
|
|
41
|
+
close: async () => {
|
|
42
|
+
routes.delete(url);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
const echoArgsSchema = z.object({ text: z.string() });
|
|
49
|
+
const largeResultArgsSchema = z.object({
|
|
50
|
+
bytes: z.number().int().min(1).max(8 * 1024 * 1024)
|
|
51
|
+
});
|
|
52
|
+
const conformanceLargeResult = (bytes) => ({
|
|
53
|
+
content: [
|
|
54
|
+
{ type: "text", text: "L".repeat(bytes) },
|
|
55
|
+
{ type: "image", mimeType: "image/png", data: conformanceImageBase64() }
|
|
56
|
+
]
|
|
57
|
+
});
|
|
58
|
+
const largeToolDescriptor = {
|
|
59
|
+
name: CONFORMANCE_BIG_TOOL,
|
|
60
|
+
description: "Returns a large text result and an image for frame conformance.",
|
|
61
|
+
inputSchema: {
|
|
62
|
+
type: "object",
|
|
63
|
+
properties: { bytes: { type: "integer", minimum: 1, maximum: 8 * 1024 * 1024 } },
|
|
64
|
+
required: ["bytes"]
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const conformanceEchoResult = (nonce, text) => ({
|
|
68
|
+
content: [{ type: "text", text: conformanceEchoText(nonce, text) }]
|
|
69
|
+
});
|
|
70
|
+
const conformanceToolDescriptor = {
|
|
71
|
+
name: CONFORMANCE_MCP_TOOL,
|
|
72
|
+
description: "Echoes text with the run nonce.",
|
|
73
|
+
inputSchema: { type: "object", properties: { text: { type: "string" } }, required: ["text"] }
|
|
74
|
+
};
|
|
75
|
+
const createConformanceMcpHttpHandler = (nonce) => {
|
|
76
|
+
const answerState = `conformance-answer:${nonce}`;
|
|
77
|
+
const handler = createMcpHandler(() => {
|
|
78
|
+
const server = new McpServer({ name: "final-conformance", version: "1" });
|
|
79
|
+
server.registerTool(
|
|
80
|
+
CONFORMANCE_MCP_TOOL,
|
|
81
|
+
{ description: conformanceToolDescriptor.description, inputSchema: echoArgsSchema },
|
|
82
|
+
async ({ text }) => conformanceEchoResult(nonce, text)
|
|
83
|
+
);
|
|
84
|
+
server.registerTool(
|
|
85
|
+
CONFORMANCE_BIG_TOOL,
|
|
86
|
+
{ description: largeToolDescriptor.description, inputSchema: largeResultArgsSchema },
|
|
87
|
+
async ({ bytes }) => conformanceLargeResult(bytes)
|
|
88
|
+
);
|
|
89
|
+
server.registerTool(
|
|
90
|
+
CONFORMANCE_ELICIT_TOOL,
|
|
91
|
+
{
|
|
92
|
+
description: "Asks the client for a required answer.",
|
|
93
|
+
inputSchema: z.object({})
|
|
94
|
+
},
|
|
95
|
+
async (_args, ctx) => {
|
|
96
|
+
const answer = acceptedContent(ctx.mcpReq.inputResponses, "answer");
|
|
97
|
+
if (answer == null) {
|
|
98
|
+
return inputRequired({
|
|
99
|
+
requestState: answerState,
|
|
100
|
+
inputRequests: {
|
|
101
|
+
answer: inputRequired.elicit({
|
|
102
|
+
message: "Conformance answer?",
|
|
103
|
+
requestedSchema: {
|
|
104
|
+
type: "object",
|
|
105
|
+
properties: { answer: { type: "string" } },
|
|
106
|
+
required: ["answer"]
|
|
107
|
+
}
|
|
108
|
+
})
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
if (ctx.mcpReq.requestState() !== answerState)
|
|
113
|
+
return {
|
|
114
|
+
isError: true,
|
|
115
|
+
content: [{ type: "text", text: "Invalid conformance answer continuation" }]
|
|
116
|
+
};
|
|
117
|
+
return { content: [{ type: "text", text: `elicitation:accept:${answer.answer}` }] };
|
|
118
|
+
}
|
|
119
|
+
);
|
|
120
|
+
return server;
|
|
121
|
+
});
|
|
122
|
+
return { fetch: (request) => handler.fetch(request), close: () => handler.close() };
|
|
123
|
+
};
|
|
124
|
+
const answerConformanceMcpMessage = (nonce, message) => {
|
|
125
|
+
switch (message.method) {
|
|
126
|
+
case "initialize":
|
|
127
|
+
return {
|
|
128
|
+
result: {
|
|
129
|
+
protocolVersion: "2025-06-18",
|
|
130
|
+
capabilities: { tools: {} },
|
|
131
|
+
serverInfo: { name: "final-conformance", version: "1" }
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
case "server/discover":
|
|
135
|
+
return {
|
|
136
|
+
result: {
|
|
137
|
+
resultType: "complete",
|
|
138
|
+
supportedVersions: ["2026-07-28"],
|
|
139
|
+
capabilities: { tools: {} },
|
|
140
|
+
ttlMs: 0,
|
|
141
|
+
cacheScope: "private"
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
case "tools/list":
|
|
145
|
+
return {
|
|
146
|
+
result: {
|
|
147
|
+
resultType: "complete",
|
|
148
|
+
tools: [conformanceToolDescriptor, largeToolDescriptor],
|
|
149
|
+
ttlMs: 0,
|
|
150
|
+
cacheScope: "private"
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
case "tools/call": {
|
|
154
|
+
const large = z.object({ name: z.literal(CONFORMANCE_BIG_TOOL), arguments: largeResultArgsSchema }).safeParse(message.params);
|
|
155
|
+
if (large.success)
|
|
156
|
+
return {
|
|
157
|
+
result: {
|
|
158
|
+
...conformanceLargeResult(large.data.arguments.bytes),
|
|
159
|
+
resultType: "complete",
|
|
160
|
+
ttlMs: 0,
|
|
161
|
+
cacheScope: "private"
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const params = z.object({ name: z.string(), arguments: echoArgsSchema.optional() }).safeParse(message.params ?? {});
|
|
165
|
+
if (!params.success || params.data.name !== CONFORMANCE_MCP_TOOL) {
|
|
166
|
+
return { error: { code: -32602, message: "unknown tool" } };
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
result: {
|
|
170
|
+
...conformanceEchoResult(nonce, params.data.arguments?.text ?? ""),
|
|
171
|
+
resultType: "complete"
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
default:
|
|
176
|
+
return { error: { code: -32601, message: `method not found: ${message.method}` } };
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
export {
|
|
180
|
+
answerConformanceMcpMessage,
|
|
181
|
+
conformanceEchoResult,
|
|
182
|
+
conformanceLargeResult,
|
|
183
|
+
conformanceToolDescriptor,
|
|
184
|
+
createConformanceMcpHttpHandler,
|
|
185
|
+
createInProcessHttpHost,
|
|
186
|
+
createLinkedStreamPair,
|
|
187
|
+
echoArgsSchema,
|
|
188
|
+
largeResultArgsSchema
|
|
189
|
+
};
|
|
190
|
+
//# sourceMappingURL=fixtures.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/conformance/fixtures.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\n AnyWireMessage,\n MessageMcpRequest,\n MessageMcpResponse,\n Stream,\n} from '@agentclientprotocol/sdk/experimental/v2';\nimport {\n acceptedContent,\n createMcpHandler,\n inputRequired,\n McpServer,\n type CallToolResult,\n} from '@modelcontextprotocol/server';\nimport * as z from 'zod';\nimport { conformanceImageBase64 } from \"./image.mjs\";\nimport {\n CONFORMANCE_BIG_TOOL,\n CONFORMANCE_ELICIT_TOOL,\n CONFORMANCE_MCP_TOOL,\n conformanceEchoText,\n} from \"./protocol.mjs\";\n\n// Two ACP v2 streams connected back to back (in-process transport).\nexport const createLinkedStreamPair = (): [Stream, Stream] => {\n const forward = new TransformStream<AnyWireMessage, AnyWireMessage>();\n const backward = new TransformStream<AnyWireMessage, AnyWireMessage>();\n return [\n { writable: forward.writable, readable: backward.readable },\n { writable: backward.writable, readable: forward.readable },\n ];\n};\n\nexport type FetchHandler = (request: Request) => Promise<Response>;\n\n// Routes in-process \"HTTP\" by URL prefix, so an MCP server the kit hosts is\n// reachable from an in-process harness through a fetch seam.\nexport interface InProcessHttpHostIface {\n fetch: (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n serve: (\n handler: FetchHandler,\n ) => Promise<{ url: string; headers: Record<string, string>; close: () => Promise<void> }>;\n}\n\nexport const createInProcessHttpHost = (\n base = 'http://conformance.invalid',\n): InProcessHttpHostIface => {\n const routes = new Map<string, FetchHandler>();\n let counter = 0;\n return {\n fetch: async (input, init) => {\n const request = input instanceof Request ? input : new Request(input, init);\n for (const [prefix, handler] of routes) {\n if (request.url.startsWith(prefix)) return handler(request);\n }\n return new Response('not found', { status: 404 });\n },\n serve: async (handler) => {\n counter += 1;\n const url = `${base}/${counter}/mcp`;\n routes.set(url, handler);\n return {\n url,\n headers: {},\n close: async () => {\n routes.delete(url);\n },\n };\n },\n };\n};\n\nexport const echoArgsSchema = z.object({ text: z.string() });\nexport const largeResultArgsSchema = z.object({\n bytes: z\n .number()\n .int()\n .min(1)\n .max(8 * 1024 * 1024),\n});\nexport const conformanceLargeResult = (bytes: number): CallToolResult => ({\n content: [\n { type: 'text', text: 'L'.repeat(bytes) },\n { type: 'image', mimeType: 'image/png', data: conformanceImageBase64() },\n ],\n});\nconst largeToolDescriptor = {\n name: CONFORMANCE_BIG_TOOL,\n description: 'Returns a large text result and an image for frame conformance.',\n inputSchema: {\n type: 'object',\n properties: { bytes: { type: 'integer', minimum: 1, maximum: 8 * 1024 * 1024 } },\n required: ['bytes'],\n },\n};\n\nexport const conformanceEchoResult = (nonce: string, text: string): CallToolResult => ({\n content: [{ type: 'text', text: conformanceEchoText(nonce, text) }],\n});\n\nexport const conformanceToolDescriptor = {\n name: CONFORMANCE_MCP_TOOL,\n description: 'Echoes text with the run nonce.',\n inputSchema: { type: 'object', properties: { text: { type: 'string' } }, required: ['text'] },\n};\n\n// The MCP server the kit exposes over HTTP: one `echo` tool.\nexport interface ConformanceMcpHttpHandlerIface {\n fetch: FetchHandler;\n close: () => Promise<void>;\n}\n\nexport const createConformanceMcpHttpHandler = (nonce: string): ConformanceMcpHttpHandlerIface => {\n const answerState = `conformance-answer:${nonce}`;\n const handler = createMcpHandler(() => {\n const server = new McpServer({ name: 'final-conformance', version: '1' });\n server.registerTool(\n CONFORMANCE_MCP_TOOL,\n { description: conformanceToolDescriptor.description, inputSchema: echoArgsSchema },\n async ({ text }) => conformanceEchoResult(nonce, text),\n );\n server.registerTool(\n CONFORMANCE_BIG_TOOL,\n { description: largeToolDescriptor.description, inputSchema: largeResultArgsSchema },\n async ({ bytes }) => conformanceLargeResult(bytes),\n );\n server.registerTool(\n CONFORMANCE_ELICIT_TOOL,\n {\n description: 'Asks the client for a required answer.',\n inputSchema: z.object({}),\n },\n async (_args, ctx) => {\n const answer = acceptedContent<{ answer: string }>(ctx.mcpReq.inputResponses, 'answer');\n if (answer == null) {\n return inputRequired({\n requestState: answerState,\n inputRequests: {\n answer: inputRequired.elicit({\n message: 'Conformance answer?',\n requestedSchema: {\n type: 'object',\n properties: { answer: { type: 'string' } },\n required: ['answer'],\n },\n }),\n },\n });\n }\n if (ctx.mcpReq.requestState() !== answerState)\n return {\n isError: true,\n content: [{ type: 'text', text: 'Invalid conformance answer continuation' }],\n };\n return { content: [{ type: 'text', text: `elicitation:accept:${answer.answer}` }] };\n },\n );\n return server;\n });\n return { fetch: (request) => handler.fetch(request), close: () => handler.close() };\n};\n\n// Answers MCP JSON-RPC methods arriving over ACP `mcp/message` for the kit's\n// `acp` server.\nexport const answerConformanceMcpMessage = (\n nonce: string,\n message: Pick<MessageMcpRequest, 'method' | 'params'>,\n): MessageMcpResponse => {\n switch (message.method) {\n case 'initialize':\n return {\n result: {\n protocolVersion: '2025-06-18',\n capabilities: { tools: {} },\n serverInfo: { name: 'final-conformance', version: '1' },\n },\n };\n case 'server/discover':\n return {\n result: {\n resultType: 'complete',\n supportedVersions: ['2026-07-28'],\n capabilities: { tools: {} },\n ttlMs: 0,\n cacheScope: 'private',\n },\n };\n case 'tools/list':\n return {\n result: {\n resultType: 'complete',\n tools: [conformanceToolDescriptor, largeToolDescriptor],\n ttlMs: 0,\n cacheScope: 'private',\n },\n };\n case 'tools/call': {\n const large = z\n .object({ name: z.literal(CONFORMANCE_BIG_TOOL), arguments: largeResultArgsSchema })\n .safeParse(message.params);\n if (large.success)\n return {\n result: {\n ...conformanceLargeResult(large.data.arguments.bytes),\n resultType: 'complete',\n ttlMs: 0,\n cacheScope: 'private',\n },\n };\n const params = z\n .object({ name: z.string(), arguments: echoArgsSchema.optional() })\n .safeParse(message.params ?? {});\n if (!params.success || params.data.name !== CONFORMANCE_MCP_TOOL) {\n return { error: { code: -32602, message: 'unknown tool' } };\n }\n return {\n result: {\n ...conformanceEchoResult(nonce, params.data.arguments?.text ?? ''),\n resultType: 'complete',\n },\n };\n }\n default:\n return { error: { code: -32601, message: `method not found: ${message.method}` } };\n }\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { type Stream } from '@agentclientprotocol/sdk/experimental/v2';
|
|
2
|
+
import { type HarnessDescriptionIface, type HarnessEndpointIface, type HarnessIface, type OpenHarnessSessionArgsIface } from "../harness.mjs";
|
|
3
|
+
import { type InProcessHttpHostIface } from "./fixtures.mjs";
|
|
4
|
+
export declare enum ConformanceProfile {
|
|
5
|
+
Final = "final",
|
|
6
|
+
PlainAcpV2 = "plain-acp-v2"
|
|
7
|
+
}
|
|
8
|
+
export declare enum ConformanceCaseStatus {
|
|
9
|
+
Passed = "passed",
|
|
10
|
+
Failed = "failed",
|
|
11
|
+
Skipped = "skipped"
|
|
12
|
+
}
|
|
13
|
+
export declare enum HarnessConformanceCase {
|
|
14
|
+
Describe = "describe",
|
|
15
|
+
Open = "open",
|
|
16
|
+
Initialize = "initialize",
|
|
17
|
+
NewSession = "session/new",
|
|
18
|
+
Prompt = "prompt",
|
|
19
|
+
Stream = "stream",
|
|
20
|
+
Permission = "permission",
|
|
21
|
+
Elicitation = "elicitation",
|
|
22
|
+
McpAcp = "mcp over acp",
|
|
23
|
+
McpHttp = "mcp over http",
|
|
24
|
+
Observe = "observe",
|
|
25
|
+
ErrorStop = "error stop",
|
|
26
|
+
Cancel = "cancel",
|
|
27
|
+
ResumeReplay = "resume with replay",
|
|
28
|
+
ParkResume = "park/resume",
|
|
29
|
+
PromptWhileRunning = "prompt while running",
|
|
30
|
+
CancelWhileRunning = "cancel reaching a prompt sent while running",
|
|
31
|
+
NoResend = "unanswered prompt across a dropped connection",
|
|
32
|
+
DisconnectMidTurn = "disconnect mid-turn",
|
|
33
|
+
DisconnectMidPermission = "disconnect mid-permission",
|
|
34
|
+
NativeIdPreservation = "native session identity across resume",
|
|
35
|
+
NativeIdChange = "native session id change",
|
|
36
|
+
OversizedFrame = "multi-megabyte tool result and image",
|
|
37
|
+
GracefulClose = "graceful close",
|
|
38
|
+
V1Rejected = "ACP v1 agent rejected",
|
|
39
|
+
Health = "health",
|
|
40
|
+
Close = "close"
|
|
41
|
+
}
|
|
42
|
+
export declare const HARNESS_CONFORMANCE_CASES: readonly HarnessConformanceCase[];
|
|
43
|
+
export interface ConformanceCaseResultIface {
|
|
44
|
+
name: string;
|
|
45
|
+
status: ConformanceCaseStatus;
|
|
46
|
+
durationMs: number;
|
|
47
|
+
error: string | null;
|
|
48
|
+
detail: string | null;
|
|
49
|
+
}
|
|
50
|
+
export interface HarnessConformanceReportIface {
|
|
51
|
+
profile: ConformanceProfile;
|
|
52
|
+
passed: boolean;
|
|
53
|
+
description: HarnessDescriptionIface | null;
|
|
54
|
+
cases: ConformanceCaseResultIface[];
|
|
55
|
+
}
|
|
56
|
+
export interface ConformanceStreamIface extends Stream {
|
|
57
|
+
close?: () => void;
|
|
58
|
+
}
|
|
59
|
+
export interface RunHarnessConformanceArgsIface {
|
|
60
|
+
harness: HarnessIface;
|
|
61
|
+
dial: (endpoint: HarnessEndpointIface) => Promise<ConformanceStreamIface>;
|
|
62
|
+
profile: ConformanceProfile | `${ConformanceProfile}`;
|
|
63
|
+
openArgs: OpenHarnessSessionArgsIface;
|
|
64
|
+
timeoutMs?: number;
|
|
65
|
+
cwd?: string;
|
|
66
|
+
httpMcp?: Pick<InProcessHttpHostIface, 'serve'> | null;
|
|
67
|
+
replayGraceMs?: number;
|
|
68
|
+
nativeSessionId?: (acpSessionId: string) => Promise<string | null>;
|
|
69
|
+
nativeClearPrompt?: string | null;
|
|
70
|
+
parkTimeoutMs?: number;
|
|
71
|
+
surfaceLimits?: Partial<Record<HarnessConformanceCase, string>>;
|
|
72
|
+
}
|
|
73
|
+
export declare const conformanceOpenArgs: (overrides?: Partial<OpenHarnessSessionArgsIface>) => OpenHarnessSessionArgsIface;
|
|
74
|
+
export declare const runHarnessConformance: (args: RunHarnessConformanceArgsIface) => Promise<HarnessConformanceReportIface>;
|
|
75
|
+
export interface ConformanceTestApiIface {
|
|
76
|
+
describe: (name: string, factory: () => void) => void;
|
|
77
|
+
it: (name: string, fn: () => Promise<void>, timeout?: number) => void;
|
|
78
|
+
beforeAll: (fn: () => Promise<void>, timeout?: number) => void;
|
|
79
|
+
}
|
|
80
|
+
export declare const describeHarnessConformance: (api: ConformanceTestApiIface, args: RunHarnessConformanceArgsIface & {
|
|
81
|
+
name?: string;
|
|
82
|
+
}) => void;
|