@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/harness-kit.ts"],
4
+ "sourcesContent": ["interface PromptResponseDropIface {\n armed: boolean;\n id: string | null;\n dropped: boolean;\n}\n\nimport {\n client,\n methods,\n PROTOCOL_VERSION,\n type AnyBatchMessage,\n type AnyWireMessage,\n type ClientConnection,\n type InitializeResponse,\n type JsonRpcId,\n type McpServer,\n type ReplayFrom,\n type SessionUpdate,\n type Stream,\n} from '@agentclientprotocol/sdk/experimental/v2';\nimport {\n accumulateAgentMessages,\n acpSchemas,\n advertisedFinalExtensions,\n isUnsupportedProtocolVersionError,\n jsonValueSchema,\n MAX_ACP_FRAME_BYTES,\n MAX_INLINE_MEDIA_BYTES,\n requireProtocolV2,\n RESOURCE_LINK_DESCRIPTION_BYTES,\n resumeReplayFor,\n serializedFrameBytes,\n watchInitializeVersion,\n type AdvertisedFinalExtensionsIface,\n type JsonValue,\n} from '@finalai/acp-session';\nimport * as z from 'zod';\nimport {\n harnessDescriptionSchema,\n McpTransportKind,\n PromptWhileRunning,\n type HarnessDescriptionIface,\n type HarnessEndpointIface,\n type HarnessIface,\n type OpenHarnessSessionArgsIface,\n} from \"../harness.mjs\";\nimport { emptyManifest } from \"../manifest.mjs\";\nimport {\n answerConformanceMcpMessage,\n createConformanceMcpHttpHandler,\n type InProcessHttpHostIface,\n} from \"./fixtures.mjs\";\nimport {\n CONFORMANCE_ACP_SERVER_ID,\n CONFORMANCE_ACP_SERVER_NAME,\n CONFORMANCE_ELICITATION_ANSWER,\n CONFORMANCE_HTTP_SERVER_NAME,\n CONFORMANCE_MCP_TOOL,\n ConformanceDirective,\n conformanceEchoText,\n directive,\n FINAL_META_KEY,\n OBSERVE_METHOD,\n} from \"./protocol.mjs\";\nimport { createLegacyProtocolAgent } from \"./v1-agent.mjs\";\n\n// The harness conformance kit. It plays the session\n// service and follows the harness contract as the session service does: it\n// describes the binding, opens a harness session, dials it, and drives the\n// scripted protocol in protocol.ts over ACP v2. On resume it re-seeds with\n// session/new when the harness moved the generation or does not declare\n// supports.resumeReplay, and it sends a `_final/*` cursor only to an agent that\n// advertised it in `initialize`. The plain-acp-v2 profile never sends a Final\n// extension and checks nothing under _meta[\"final.ai\"], while still attaching\n// _meta[\"final.ai\"] to prompts (which a plain agent must ignore).\n\nexport enum ConformanceProfile {\n Final = 'final',\n PlainAcpV2 = 'plain-acp-v2',\n}\n\nexport enum ConformanceCaseStatus {\n Passed = 'passed',\n Failed = 'failed',\n Skipped = 'skipped',\n}\n\nexport enum HarnessConformanceCase {\n Describe = 'describe',\n Open = 'open',\n Initialize = 'initialize',\n NewSession = 'session/new',\n Prompt = 'prompt',\n Stream = 'stream',\n Permission = 'permission',\n Elicitation = 'elicitation',\n McpAcp = 'mcp over acp',\n McpHttp = 'mcp over http',\n Observe = 'observe',\n ErrorStop = 'error stop',\n Cancel = 'cancel',\n ResumeReplay = 'resume with replay',\n ParkResume = 'park/resume',\n // Accepted, never refused, and handled as declared.\n PromptWhileRunning = 'prompt while running',\n CancelWhileRunning = 'cancel reaching a prompt sent while running',\n // An unanswered prompt is never resent blind; the replay decides.\n NoResend = 'unanswered prompt across a dropped connection',\n DisconnectMidTurn = 'disconnect mid-turn',\n DisconnectMidPermission = 'disconnect mid-permission',\n // The ACP session id is stable while the native id may change.\n NativeIdPreservation = 'native session identity across resume',\n NativeIdChange = 'native session id change',\n OversizedFrame = 'multi-megabyte tool result and image',\n GracefulClose = 'graceful close',\n // The client side of initialize refuses any version but 2.\n V1Rejected = 'ACP v1 agent rejected',\n Health = 'health',\n Close = 'close',\n}\n\nexport const HARNESS_CONFORMANCE_CASES: readonly HarnessConformanceCase[] =\n Object.values(HarnessConformanceCase);\n\nexport interface ConformanceCaseResultIface {\n name: string;\n status: ConformanceCaseStatus;\n durationMs: number;\n error: string | null;\n detail: string | null;\n}\n\nexport interface HarnessConformanceReportIface {\n profile: ConformanceProfile;\n passed: boolean;\n description: HarnessDescriptionIface | null;\n cases: ConformanceCaseResultIface[];\n}\n\n// A dialed stream; `close` (when the dialer has one) releases what the dial\n// holds, such as a spawned stdio agent process.\nexport interface ConformanceStreamIface extends Stream {\n close?: () => void;\n}\n\nexport interface RunHarnessConformanceArgsIface {\n harness: HarnessIface;\n // Turns an endpoint the harness returned into an ACP v2 stream (the session\n // service's dialer, or the local harness's `dial`). The kit closes every\n // stream it dialed.\n dial: (endpoint: HarnessEndpointIface) => Promise<ConformanceStreamIface>;\n profile: ConformanceProfile | `${ConformanceProfile}`;\n openArgs: OpenHarnessSessionArgsIface;\n // Per case.\n timeoutMs?: number;\n cwd?: string;\n // Hosts the kit's HTTP MCP server somewhere the harness can reach; without\n // it the `mcp over http` case is skipped.\n httpMcp?: Pick<InProcessHttpHostIface, 'serve'> | null;\n // How long to keep collecting replayed updates after session/resume answers.\n replayGraceMs?: number;\n // Read the harness's native state independently of model output. ACP has no\n // native-id method; a driver without this evidence cannot pass that case.\n nativeSessionId?: (acpSessionId: string) => Promise<string | null>;\n // A native command accepted through ordinary session/prompt (for example Claude's\n // `/clear`). Otherwise the reference fixture handles `conformance:clear` itself.\n // null: the harness has no public native-reset action; preservation is still required.\n nativeClearPrompt?: string | null;\n // Public session planes park on the real idle deadline rather than a forced park.\n parkTimeoutMs?: number;\n // Cases the driver's surface cannot carry to the harness, each with why (a\n // public session plane does not forward client-hosted MCP servers, for\n // example). They are reported skipped with that reason and never run; whether\n // such a skip is acceptable is for the caller's coverage to decide.\n surfaceLimits?: Partial<Record<HarnessConformanceCase, string>>;\n}\n\ninterface UpdateLogIface {\n items: SessionUpdate[];\n listeners: Set<() => void>;\n}\n\ninterface TurnIface {\n messageId: string;\n updates: SessionUpdate[];\n stopReason: string | null;\n idle: SessionUpdate;\n text: string;\n}\n\nconst failure = (message: string): Error => new Error(message);\n\nconst check = (condition: boolean, message: string) => {\n if (!condition) throw failure(message);\n};\n\nconst withTimeout = async <T>(promise: Promise<T>, ms: number, what: string): Promise<T> => {\n let timer: ReturnType<typeof setTimeout> | null = null;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(failure(`${what} timed out after ${ms} ms`)), ms);\n }),\n ]);\n } finally {\n if (timer != null) clearTimeout(timer);\n }\n};\n\nconst sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\nconst textOfUpdates = (updates: SessionUpdate[]): string =>\n accumulateAgentMessages(updates)\n .map((message) => message.text)\n .join('');\n\nconst isIdle = (update: SessionUpdate): boolean =>\n update.sessionUpdate === 'state_update' && 'state' in update && update.state === 'idle';\n\nconst stopReasonSchema = z.object({ stopReason: z.string() });\n\nconst stopReasonOf = (update: SessionUpdate): string | null =>\n stopReasonSchema.safeParse(update).data?.stopReason ?? null;\n\nconst echoSchema = z.object({\n sessionUpdate: z.union([z.literal('user_message'), z.literal('user_message_chunk')]),\n messageId: z.string(),\n content: z.unknown().optional(),\n});\n\n// A prompt echo (ACP v2: agents echo every inserted user message).\nconst echoOf = (update: SessionUpdate): { messageId: string; content: string } | null => {\n const parsed = echoSchema.safeParse(update);\n return parsed.success\n ? { messageId: parsed.data.messageId, content: JSON.stringify(parsed.data.content ?? null) }\n : null;\n};\n\nconst isRunning = (update: SessionUpdate): boolean =>\n update.sessionUpdate === 'state_update' && 'state' in update && update.state === 'running';\n\nconst toolContentSchema = z.object({\n sessionUpdate: z.literal('tool_call_update'),\n content: z.array(\n z.object({ type: z.literal('content'), content: z.looseObject({ type: z.string() }) }),\n ),\n});\nconst resourceLinkSchema = z.object({\n type: z.literal('resource_link'),\n uri: z.string().min(1),\n mimeType: z.string().nullish(),\n size: z.number().nullish(),\n description: z.string().nullish(),\n});\nconst inlineTextSchema = z.object({ type: z.literal('text'), text: z.string() });\n\ntype McpContentBlock = z.infer<typeof acpSchemas.zContentBlock>;\n\nconst rawMcpBlocks = (value: JsonValue, depth = 0): McpContentBlock[] => {\n if (depth > 4) return [];\n const wrapper = z.object({ result: jsonValueSchema }).safeParse(value);\n if (wrapper.success) return rawMcpBlocks(wrapper.data.result, depth + 1);\n const result = z.object({ content: z.array(jsonValueSchema) }).safeParse(value);\n if (!result.success) return [];\n return result.data.content.flatMap((block) => {\n const text = z.object({ type: z.literal('text'), text: z.string() }).safeParse(block);\n if (text.success) {\n try {\n const nested = rawMcpBlocks(jsonValueSchema.parse(JSON.parse(text.data.text)), depth + 1);\n if (nested.length > 0) return nested;\n } catch {\n /* Ordinary text is not a serialized MCP result. */\n }\n }\n const content = acpSchemas.zContentBlock.safeParse(block);\n return content.success ? [content.data] : [];\n });\n};\n\nconst toolBlocksOf = (updates: SessionUpdate[]) =>\n updates.flatMap((update) => {\n const content = (toolContentSchema.safeParse(update).data?.content ?? []).map(\n (entry) => entry.content,\n );\n const raw = z\n .object({ sessionUpdate: z.literal('tool_call_update'), rawOutput: jsonValueSchema })\n .safeParse(update);\n return [...content, ...(raw.success ? rawMcpBlocks(raw.data.rawOutput) : [])];\n });\n\nconst requestIdSchema = z.object({ id: z.union([z.string(), z.number()]), method: z.string() });\nconst responseIdSchema = z.object({ id: z.union([z.string(), z.number(), z.null()]) });\nconst isBatch = (wire: AnyWireMessage): wire is AnyBatchMessage => Array.isArray(wire);\n\n// What conformance:big produces: a 3 MiB tool result.\nconst BIG_RESULT_BYTES = 3 * 1024 * 1024;\n\nconst providerErrorSchema = z.object({\n [FINAL_META_KEY]: z.object({\n providerError: z.object({ code: z.string(), message: z.string(), retryable: z.boolean() }),\n }),\n});\n\n// Minimal open arguments for harnesses that need nothing from the session\n// service (the local harness, stdio programs).\nexport const conformanceOpenArgs = (\n overrides: Partial<OpenHarnessSessionArgsIface> = {},\n): OpenHarnessSessionArgsIface => {\n const manifest = emptyManifest('Conformance');\n return {\n session: {\n sessionId: crypto.randomUUID(),\n organizationId: crypto.randomUUID(),\n definitionId: crypto.randomUUID(),\n revisionId: crypto.randomUUID(),\n sessionServiceUrl: 'http://conformance.invalid',\n },\n harnessSessionId: crypto.randomUUID(),\n config: {},\n manifest: {\n ...manifest,\n harness: { harness: manifest.harness.harness, config: {} },\n mcpServers: [],\n sandboxes: {},\n },\n mcpServers: [],\n baseTools: {},\n sandboxes: {},\n credentials: {\n brokerUrl: 'http://conformance.invalid/broker',\n grants: [],\n atOpen: null,\n refresh: null,\n },\n secrets: { get: async () => null },\n trace: { traceparent: null, tracestate: null },\n ...overrides,\n };\n};\n\nexport const runHarnessConformance = async (\n args: RunHarnessConformanceArgsIface,\n): Promise<HarnessConformanceReportIface> => {\n const profile =\n args.profile === ConformanceProfile.Final\n ? ConformanceProfile.Final\n : ConformanceProfile.PlainAcpV2;\n const final = profile === ConformanceProfile.Final;\n const timeoutMs = args.timeoutMs ?? 15_000;\n const replayGraceMs = args.replayGraceMs ?? 300;\n const cwd = args.cwd ?? '/workspace';\n const nonce = crypto.randomUUID().slice(0, 8);\n const cases: ConformanceCaseResultIface[] = [];\n const passed = new Set<HarnessConformanceCase>();\n const cleanups: (() => Promise<void>)[] = [];\n\n const logs = new Map<string, UpdateLogIface>();\n const logFor = (sessionId: string): UpdateLogIface => {\n let log = logs.get(sessionId);\n if (log == null) {\n log = { items: [], listeners: new Set() };\n logs.set(sessionId, log);\n }\n return log;\n };\n const permissionRequests: { optionKinds: string[] }[] = [];\n const elicitations: { mode: string }[] = [];\n const mcpMessages: { serverId: string; method: string }[] = [];\n // Permission requests by JSON-RPC id and the connection that carried them.\n const permissionIds: { requestId: JsonRpcId; epoch: number }[] = [];\n let epoch = 0;\n // While set, permission requests are left unanswered (the connection drops first).\n let holdPermissions = false;\n const releaseHeld: (() => void)[] = [];\n // Serialized size of every frame from the harness, in order.\n const inboundFrameBytes: number[] = [];\n // Drops the response to the next session/prompt and the connection with it.\n const promptDrop: PromptResponseDropIface = {\n armed: false,\n id: null,\n dropped: false,\n };\n const knownSessions = new Set<string>();\n const foreignUpdates: string[] = [];\n\n const kitClient = client({ name: 'final-conformance-kit' })\n .onRequest(methods.client.session.requestPermission, ({ params, requestId }) => {\n permissionRequests.push({ optionKinds: params.options.map((option) => option.kind) });\n permissionIds.push({ requestId, epoch });\n if (holdPermissions) {\n return new Promise((resolve) => {\n releaseHeld.push(() => resolve({ outcome: { outcome: 'cancelled' } }));\n });\n }\n const option =\n params.options.find((entry) => entry.kind === 'allow_once') ?? params.options[0];\n return option == null\n ? { outcome: { outcome: 'cancelled' } }\n : { outcome: { outcome: 'selected', optionId: option.optionId } };\n })\n .onRequest(methods.client.elicitation.create, ({ params }) => {\n elicitations.push({ mode: params.mode });\n return { action: 'accept', content: { answer: CONFORMANCE_ELICITATION_ANSWER } };\n })\n .onRequest(methods.client.mcp.message, ({ params }) => {\n mcpMessages.push({ serverId: params.serverId, method: params.method });\n return answerConformanceMcpMessage(nonce, params);\n })\n .onNotification(methods.client.session.update, ({ params }) => {\n if (!knownSessions.has(params.sessionId)) foreignUpdates.push(params.sessionId);\n const log = logFor(params.sessionId);\n log.items.push(params.update);\n for (const listener of [...log.listeners]) listener();\n });\n\n const waitFor = (\n sessionId: string,\n predicate: (items: SessionUpdate[]) => boolean,\n what: string,\n ) => {\n const log = logFor(sessionId);\n return withTimeout(\n new Promise<void>((resolve) => {\n const listener = () => {\n if (!predicate(log.items)) return;\n log.listeners.delete(listener);\n resolve();\n };\n log.listeners.add(listener);\n listener();\n }),\n timeoutMs,\n what,\n );\n };\n\n let description: HarnessDescriptionIface | null = null;\n // Read through a function: TypeScript would otherwise keep the `null`\n // narrowing from the declaration across the closures that assign it.\n const described = (): HarnessDescriptionIface | null => description;\n let endpoint: HarnessEndpointIface | null = null;\n let connection: ClientConnection | null = null;\n let stream: ConformanceStreamIface | null = null;\n let advertised: AdvertisedFinalExtensionsIface = advertisedFinalExtensions({});\n let sessionId: string | null = null;\n let mcpServers: McpServer[] = [];\n let firstPrompt: Promise<{ messageId: string; from: number }> | null = null;\n let echoText = '';\n\n const step = async (\n name: HarnessConformanceCase,\n options: { requires?: HarnessConformanceCase[]; skip?: string | null },\n run: () => Promise<string | void>,\n ) => {\n const started = Date.now();\n const missing = (options.requires ?? []).filter((required) => !passed.has(required));\n const skip = args.surfaceLimits?.[name] ?? options.skip ?? null;\n if (skip != null || missing.length > 0) {\n cases.push({\n name,\n status: ConformanceCaseStatus.Skipped,\n durationMs: 0,\n error: null,\n detail: skip ?? `requires ${missing.join(', ')}`,\n });\n return;\n }\n try {\n const detail = await withTimeout(\n run(),\n name === HarnessConformanceCase.ParkResume ? (args.parkTimeoutMs ?? timeoutMs) : timeoutMs,\n name,\n );\n passed.add(name);\n cases.push({\n name,\n status: ConformanceCaseStatus.Passed,\n durationMs: Date.now() - started,\n error: null,\n detail: detail ?? null,\n });\n } catch (cause) {\n cases.push({\n name,\n status: ConformanceCaseStatus.Failed,\n durationMs: Date.now() - started,\n error: cause instanceof Error ? cause.message : String(cause),\n detail: null,\n });\n }\n };\n\n const requireConnection = (): ClientConnection => {\n if (connection == null) throw failure('no connection');\n return connection;\n };\n const requireSession = (): string => {\n if (sessionId == null) throw failure('no session');\n return sessionId;\n };\n\n const promptMeta = {\n [FINAL_META_KEY]: {\n author: { participantId: 'conformance-user', kind: 'user', displayName: 'Conformance' },\n replyExpected: true,\n },\n };\n\n const sendPrompt = async (text: string): Promise<{ messageId: string; from: number }> => {\n const id = requireSession();\n const from = logFor(id).items.length;\n const response = await requireConnection().agent.request(methods.agent.session.prompt, {\n sessionId: id,\n prompt: [{ type: 'text', text }],\n _meta: promptMeta,\n });\n return { messageId: response.messageId, from };\n };\n\n const awaitTurn = async (sent: { messageId: string; from: number }): Promise<TurnIface> => {\n const id = requireSession();\n const hasIdle = (items: SessionUpdate[]) => items.slice(sent.from).some(isIdle);\n await waitFor(id, hasIdle, 'turn end');\n const items = logFor(id).items;\n const updates: SessionUpdate[] = [];\n let idle: SessionUpdate | null = null;\n for (const update of items.slice(sent.from)) {\n updates.push(update);\n if (isIdle(update)) {\n idle = update;\n break;\n }\n }\n if (idle == null) throw failure('turn did not end');\n return {\n messageId: sent.messageId,\n updates,\n idle,\n stopReason: stopReasonOf(idle),\n text: textOfUpdates(updates),\n };\n };\n\n const turn = async (text: string) => awaitTurn(await sendPrompt(text));\n\n // Measures every frame from the harness, and loses the response to an armed\n // session/prompt (the connection drops with the prompt unanswered).\n const tap = (inner: ConformanceStreamIface): Stream => {\n const writer = inner.writable.getWriter();\n const writable = new WritableStream<AnyWireMessage>({\n write: async (wire) => {\n for (const message of isBatch(wire) ? wire : [wire]) {\n const request = requestIdSchema.safeParse(message);\n if (\n promptDrop.armed &&\n promptDrop.id == null &&\n request.success &&\n request.data.method === methods.agent.session.prompt\n ) {\n promptDrop.id = JSON.stringify(request.data.id);\n }\n }\n await writer.write(wire);\n },\n close: () => writer.close(),\n abort: (reason) => writer.abort(reason),\n });\n const readable = inner.readable.pipeThrough(\n new TransformStream<AnyWireMessage, AnyWireMessage>({\n transform: (wire, controller) => {\n inboundFrameBytes.push(serializedFrameBytes(wire));\n const response = responseIdSchema.safeParse(wire);\n if (\n promptDrop.id != null &&\n !isBatch(wire) &&\n !('method' in wire) &&\n response.success &&\n JSON.stringify(response.data.id) === promptDrop.id\n ) {\n promptDrop.id = null;\n promptDrop.armed = false;\n promptDrop.dropped = true;\n return;\n }\n controller.enqueue(wire);\n },\n }),\n );\n return { readable, writable };\n };\n\n let initialized: InitializeResponse | null = null;\n // Read through a function, as `described`.\n const initializeResponse = (): InitializeResponse | null => initialized;\n const initializeOver = (\n target: ClientConnection,\n watch: ReturnType<typeof watchInitializeVersion>,\n ) =>\n // The session service's check: any version but 2 is refused.\n requireProtocolV2({\n watch,\n initialize: target.agent.request(methods.agent.initialize, {\n protocolVersion: PROTOCOL_VERSION,\n info: { name: 'final-conformance-kit', version: '1' },\n capabilities: { elicitation: { form: {} } },\n }),\n });\n\n const connect = async (target: HarnessEndpointIface) => {\n stream = await args.dial(target);\n const watch = watchInitializeVersion(tap(stream));\n connection = kitClient.connect(watch.stream);\n epoch += 1;\n const response = await initializeOver(requireConnection(), watch);\n initialized = response;\n advertised = advertisedFinalExtensions(response);\n return response;\n };\n\n const disconnect = async () => {\n const current = connection;\n const dialed = stream;\n connection = null;\n stream = null;\n // Held answers go first: a connection waits for its handlers to settle.\n for (const release of releaseHeld.splice(0)) release();\n if (current != null) {\n current.close();\n await withTimeout(current.closed, timeoutMs, 'connection close').catch(() => undefined);\n }\n dialed?.close?.();\n };\n\n // Reconnects after harness.resume() as the session service does: the same\n // ACP session through session/resume while the generation holds and the\n // harness declares resumeReplay, otherwise a new session (the state is gone).\n const reconnect = async (next: {\n resumed: HarnessEndpointIface;\n previous: HarnessEndpointIface;\n replayFrom: ReplayFrom | null;\n }): Promise<'resumed' | 'recreated'> => {\n endpoint = next.resumed;\n await connect(next.resumed);\n const keeps =\n next.resumed.ref.generation === next.previous.ref.generation &&\n described()?.supports.resumeReplay === true;\n if (keeps) {\n await requireConnection().agent.request(methods.agent.session.resume, {\n sessionId: requireSession(),\n cwd,\n mcpServers,\n // Null: resume without replay.\n replayFrom: next.replayFrom,\n });\n return 'resumed';\n }\n const created = await requireConnection().agent.request(methods.agent.session.new, {\n cwd,\n mcpServers,\n });\n sessionId = created.sessionId;\n knownSessions.add(created.sessionId);\n return 'recreated';\n };\n\n // Drops the connection without telling the harness (a session-service\n // deploy), resumes, and reconnects as the session service does. `from` is\n // where the post-reconnect updates start in the (possibly new) session's log.\n const dropAndResume = async (\n replayFrom: ReplayFrom | null,\n ): Promise<{ how: 'resumed' | 'recreated'; from: number }> => {\n if (endpoint == null) throw failure('no endpoint');\n const previous = endpoint;\n const before = requireSession();\n await disconnect();\n const resumed = await args.harness.resume({\n ...args.openArgs,\n ref: previous.ref,\n lastSeq: logFor(before).items.length,\n });\n const from = logFor(before).items.length;\n const how = await reconnect({ resumed, previous, replayFrom });\n return { how, from: how === 'resumed' ? from : 0 };\n };\n\n const waitForText = (id: string, from: number, needle: string, what: string) =>\n waitFor(id, (items) => textOfUpdates(items.slice(from)).includes(needle), what);\n\n // Updates after the echo of the prompt with `messageId`, or null before it.\n const afterEcho = (id: string, from: number, messageId: string): SessionUpdate[] | null => {\n const items = logFor(id).items.slice(from);\n const index = items.findIndex((update) => echoOf(update)?.messageId === messageId);\n return index < 0 ? null : items.slice(index + 1);\n };\n\n // The turn of one prompt: from its echo to the next idle, whatever else the\n // session was still doing when it was sent.\n const ownTurn = async (sent: { messageId: string; from: number }): Promise<TurnIface> => {\n const id = requireSession();\n await waitFor(\n id,\n () => afterEcho(id, sent.from, sent.messageId)?.some(isIdle) === true,\n 'the prompt to be answered',\n );\n const after = afterEcho(id, sent.from, sent.messageId) ?? [];\n const end = after.findIndex(isIdle);\n const updates = after.slice(0, end + 1);\n const idle = updates.at(-1);\n if (idle == null) throw failure('turn did not end');\n return {\n messageId: sent.messageId,\n updates,\n idle,\n stopReason: stopReasonOf(idle),\n text: textOfUpdates(updates),\n };\n };\n\n const refused = (cause: unknown): Error =>\n failure(\n `a session/prompt sent while the session was running was refused (${cause instanceof Error ? cause.message : String(cause)}); it must be accepted`,\n );\n\n try {\n await step(HarnessConformanceCase.Describe, {}, async () => {\n // The binding's description, as the session service asks for it.\n description = harnessDescriptionSchema.parse(\n await args.harness.describe({\n config: args.openArgs.config,\n secrets: args.openArgs.secrets,\n }),\n );\n return `transports ${description.acp.transports.join(', ')}; mcp ${description.acp.mcp.join(', ') || 'none'}`;\n });\n\n await step(\n HarnessConformanceCase.Open,\n { requires: [HarnessConformanceCase.Describe] },\n async () => {\n endpoint = await args.harness.open(args.openArgs);\n check(endpoint.ref.harnessSessionRef.length > 0, 'endpoint has no harnessSessionRef');\n return `transport ${endpoint.transport}`;\n },\n );\n\n await step(\n HarnessConformanceCase.Initialize,\n { requires: [HarnessConformanceCase.Open] },\n async () => {\n if (endpoint == null) throw failure('no endpoint');\n const response = await connect(endpoint);\n check(\n response.protocolVersion === PROTOCOL_VERSION,\n `protocolVersion ${response.protocolVersion}, expected ${PROTOCOL_VERSION}`,\n );\n return `${response.info.name} ${response.info.version}`;\n },\n );\n\n const httpFixture =\n args.httpMcp == null\n ? null\n : await (async () => {\n const fixture = createConformanceMcpHttpHandler(nonce);\n const served = await args.httpMcp?.serve(fixture.fetch);\n cleanups.push(async () => {\n await served?.close();\n await fixture.close();\n });\n return served ?? null;\n })();\n\n await step(\n HarnessConformanceCase.NewSession,\n { requires: [HarnessConformanceCase.Initialize] },\n async () => {\n const mcp = described()?.acp.mcp ?? [];\n mcpServers = [...args.openArgs.mcpServers];\n if (mcp.includes(McpTransportKind.Acp)) {\n mcpServers.push({\n type: 'acp',\n name: CONFORMANCE_ACP_SERVER_NAME,\n serverId: CONFORMANCE_ACP_SERVER_ID,\n });\n }\n if (mcp.includes(McpTransportKind.Http) && httpFixture != null) {\n mcpServers.push({\n type: 'http',\n name: CONFORMANCE_HTTP_SERVER_NAME,\n url: httpFixture.url,\n headers: Object.entries(httpFixture.headers).map(([headerName, value]) => ({\n name: headerName,\n value,\n })),\n });\n }\n const response = await requireConnection().agent.request(methods.agent.session.new, {\n cwd,\n mcpServers,\n });\n check(response.sessionId.length > 0, 'empty sessionId');\n sessionId = response.sessionId;\n knownSessions.add(response.sessionId);\n return `session ${response.sessionId}`;\n },\n );\n\n const sessionCases = [HarnessConformanceCase.NewSession];\n\n await step(HarnessConformanceCase.Prompt, { requires: sessionCases }, async () => {\n echoText = `hello conformance ${nonce}`;\n firstPrompt = sendPrompt(directive(ConformanceDirective.Echo, echoText));\n const sent = await firstPrompt;\n check(sent.messageId.length > 0, 'session/prompt returned no messageId');\n return `messageId ${sent.messageId}`;\n });\n\n await step(\n HarnessConformanceCase.Stream,\n { requires: [HarnessConformanceCase.Prompt] },\n async () => {\n if (firstPrompt == null) throw failure('no prompt');\n const result = await awaitTurn(await firstPrompt);\n check(\n result.updates.some((update) => update.sessionUpdate === 'agent_message_chunk'),\n 'no agent_message_chunk before idle',\n );\n check(\n result.text === echoText,\n `streamed text ${JSON.stringify(result.text)}, expected ${JSON.stringify(echoText)}`,\n );\n check(\n result.stopReason === 'end_turn',\n `stopReason ${result.stopReason}, expected end_turn`,\n );\n return `${result.updates.length} updates`;\n },\n );\n\n await step(HarnessConformanceCase.Permission, { requires: sessionCases }, async () => {\n const before = permissionRequests.length;\n const result = await turn(directive(ConformanceDirective.Permission));\n check(permissionRequests.length > before, 'no session/request_permission was sent');\n check(\n permissionRequests[permissionRequests.length - 1]?.optionKinds.includes('allow_once') ===\n true,\n 'the permission request had no allow_once option',\n );\n check(result.text === 'permission:allow_once', `reply ${JSON.stringify(result.text)}`);\n check(result.stopReason === 'end_turn', `stopReason ${result.stopReason}`);\n });\n\n await step(\n HarnessConformanceCase.Elicitation,\n {\n requires: sessionCases,\n skip: mcpServers.length === 0 ? 'no client MCP fixture can be attached' : null,\n },\n async () => {\n const before = elicitations.length;\n const result = await turn(directive(ConformanceDirective.Elicit));\n check(elicitations.length > before, 'no elicitation/create was sent');\n check(\n result.text === `elicitation:accept:${CONFORMANCE_ELICITATION_ANSWER}`,\n `reply ${JSON.stringify(result.text)}`,\n );\n },\n );\n\n await step(\n HarnessConformanceCase.McpAcp,\n {\n requires: sessionCases,\n skip:\n described()?.acp.mcp.includes(McpTransportKind.Acp) === true\n ? null\n : 'harness does not accept acp MCP servers',\n },\n async () => {\n const before = mcpMessages.length;\n const result = await turn(\n directive(\n ConformanceDirective.Mcp,\n `${CONFORMANCE_ACP_SERVER_NAME} ${CONFORMANCE_MCP_TOOL} {\"text\":\"via-acp\"}`,\n ),\n );\n check(\n mcpMessages\n .slice(before)\n .some((message) => message.serverId === CONFORMANCE_ACP_SERVER_ID),\n 'no mcp/message reached the client',\n );\n const expected = `mcp:${conformanceEchoText(nonce, 'via-acp')}`;\n check(\n result.text === expected,\n `reply ${JSON.stringify(result.text)}, expected ${JSON.stringify(expected)}`,\n );\n },\n );\n\n await step(\n HarnessConformanceCase.McpHttp,\n {\n requires: sessionCases,\n skip:\n described()?.acp.mcp.includes(McpTransportKind.Http) !== true\n ? 'harness does not accept http MCP servers'\n : httpFixture == null\n ? 'no httpMcp host given'\n : null,\n },\n async () => {\n const result = await turn(\n directive(\n ConformanceDirective.Mcp,\n `${CONFORMANCE_HTTP_SERVER_NAME} ${CONFORMANCE_MCP_TOOL} {\"text\":\"via-http\"}`,\n ),\n );\n const expected = `mcp:${conformanceEchoText(nonce, 'via-http')}`;\n check(\n result.text === expected,\n `reply ${JSON.stringify(result.text)}, expected ${JSON.stringify(expected)}`,\n );\n },\n );\n\n await step(\n HarnessConformanceCase.Observe,\n {\n requires: sessionCases,\n skip: !final\n ? 'not part of the plain ACP v2 profile'\n : described()?.supports.observe !== true\n ? 'harness does not declare supports.observe'\n : null,\n },\n async () => {\n const id = requireSession();\n const observed = `observed-${nonce}`;\n const before = logFor(id).items.length;\n await requireConnection().agent.notify(OBSERVE_METHOD, {\n sessionId: id,\n content: [{ type: 'text', text: observed }],\n });\n await sleep(200);\n check(\n !logFor(id)\n .items.slice(before)\n .some((update) => update.sessionUpdate === 'state_update'),\n '_final/session/observe started a turn',\n );\n const result = await turn(directive(ConformanceDirective.History));\n check(\n result.text.split('\\n').includes(observed),\n 'observed content is missing from the history',\n );\n },\n );\n\n await step(HarnessConformanceCase.ErrorStop, { requires: sessionCases }, async () => {\n const result = await turn(directive(ConformanceDirective.Error));\n check(result.stopReason === 'error', `stopReason ${result.stopReason}, expected error`);\n if (final) {\n const meta = providerErrorSchema.safeParse(\n '_meta' in result.idle ? result.idle._meta : null,\n );\n check(\n meta.success,\n '_meta[\"final.ai\"].providerError {code, message, retryable} is missing on the error stop',\n );\n }\n });\n\n await step(HarnessConformanceCase.Cancel, { requires: sessionCases }, async () => {\n const id = requireSession();\n const sent = await sendPrompt(directive(ConformanceDirective.Slow));\n await waitFor(\n id,\n (items) =>\n items.slice(sent.from).some((update) => update.sessionUpdate === 'agent_message_chunk'),\n 'slow turn start',\n );\n await requireConnection().agent.notify(methods.agent.session.cancel, { sessionId: id });\n const result = await awaitTurn(sent);\n check(\n result.stopReason === 'cancelled',\n `stopReason ${result.stopReason}, expected cancelled`,\n );\n });\n\n await step(\n HarnessConformanceCase.ResumeReplay,\n {\n requires: [HarnessConformanceCase.Stream],\n skip:\n described()?.supports.resumeReplay === true\n ? null\n : 'harness does not declare supports.resumeReplay (resume re-seeds with session/new)',\n },\n async () => {\n const id = requireSession();\n if (endpoint == null) throw failure('no endpoint');\n const previous = endpoint;\n const original = [...logFor(id).items];\n await disconnect();\n const resumed = await args.harness.resume({\n ...args.openArgs,\n ref: previous.ref,\n lastSeq: original.length,\n });\n check(\n resumed.ref.generation === previous.ref.generation,\n `resume() moved the generation (${previous.ref.generation} to ${resumed.ref.generation}) although the harness declares supports.resumeReplay`,\n );\n const from = logFor(id).items.length;\n await reconnect({ resumed, previous, replayFrom: { type: 'start' } });\n await sleep(replayGraceMs);\n const replayed = logFor(id).items.slice(from);\n check(\n textOfUpdates(replayed).includes(echoText),\n 'replay from start did not include the first turn',\n );\n if (!final) return `${replayed.length} updates replayed`;\n // The opt-in cursor goes only to an agent that advertised it.\n if (!advertised.afterSeqReplay) {\n return `${replayed.length} updates replayed; _final/after_seq not advertised`;\n }\n const tail = 2;\n const fromSeq = logFor(id).items.length;\n const cursor = resumeReplayFor({ advertised, held: original.length - tail });\n await requireConnection().agent.request(methods.agent.session.resume, {\n sessionId: id,\n cwd,\n mcpServers,\n replayFrom: cursor.replayFrom,\n });\n await sleep(replayGraceMs);\n const afterSeq = logFor(id).items.slice(fromSeq);\n check(\n afterSeq.length === tail &&\n afterSeq.every(\n (update, index) =>\n update.sessionUpdate === original[original.length - tail + index]?.sessionUpdate,\n ),\n `replay after seq returned ${afterSeq.length} updates, expected the last ${tail}`,\n );\n return `${replayed.length} updates replayed; after_seq ok`;\n },\n );\n\n await step(HarnessConformanceCase.ParkResume, { requires: sessionCases }, async () => {\n const id = requireSession();\n if (endpoint == null) throw failure('no endpoint');\n const previous = endpoint;\n await args.harness.park(previous.ref);\n await disconnect();\n const resumed = await args.harness.resume({\n ...args.openArgs,\n ref: previous.ref,\n lastSeq: logFor(id).items.length,\n });\n const how = await reconnect({ resumed, previous, replayFrom: null });\n const text = `after park ${nonce}`;\n const result = await turn(directive(ConformanceDirective.Echo, text));\n check(result.text === text, `reply after resume ${JSON.stringify(result.text)}`);\n check(result.stopReason === 'end_turn', `stopReason ${result.stopReason}`);\n return how === 'resumed' ? 'session resumed' : 'session recreated (state did not survive)';\n });\n\n const declaredSteer = (): PromptWhileRunning =>\n described()?.promptWhileRunning ?? PromptWhileRunning.Queue;\n const survives = (): boolean => described()?.sessionSurvivesDisconnect === true;\n\n await step(HarnessConformanceCase.PromptWhileRunning, { requires: sessionCases }, async () => {\n const id = requireSession();\n const declared = declaredSteer();\n const first = await sendPrompt(directive(ConformanceDirective.Wait, '800'));\n await waitForText(id, first.from, 'wait:started', 'the running turn');\n const steer = `steer-${nonce}`;\n const second = await sendPrompt(directive(ConformanceDirective.Echo, steer)).catch(\n (cause: unknown) => {\n throw refused(cause);\n },\n );\n await waitFor(\n id,\n (items) => {\n const after = afterEcho(id, first.from, second.messageId);\n return (\n after != null &&\n textOfUpdates(items.slice(first.from)).includes(steer) &&\n textOfUpdates(items.slice(first.from)).includes('wait:done') &&\n items.slice(first.from).filter(isIdle).length >=\n (declared === PromptWhileRunning.Queue ? 2 : 1) &&\n after.some(isIdle)\n );\n },\n 'both prompts to settle',\n );\n const items = logFor(id).items.slice(first.from);\n const secondEcho = items.findIndex(\n (update) => echoOf(update)?.messageId === second.messageId,\n );\n const firstIdle = items.findIndex(isIdle);\n // Turn accounting: an idle ends every open turn whose echo\n // preceded it. Inject: one idle after both echoes; queue: the second echo\n // follows the first turn's idle.\n const observed =\n secondEcho < firstIdle ? PromptWhileRunning.Inject : PromptWhileRunning.Queue;\n check(\n observed === declared,\n `declares promptWhileRunning: ${declared}, but the second prompt's echo came ${observed === PromptWhileRunning.Inject ? 'before' : 'after'} the running turn's idle (${observed})`,\n );\n for (const idle of items.filter(isIdle)) {\n check(\n stopReasonOf(idle) === 'end_turn',\n `a turn ended ${stopReasonOf(idle) ?? 'without a stopReason'}`,\n );\n }\n if (observed === PromptWhileRunning.Inject) {\n check(\n textOfUpdates(items.slice(0, firstIdle)).includes(steer),\n 'the injected prompt was not handled before the running turn ended',\n );\n return 'inject: one idle ended both turns';\n }\n const nextIdle = items.slice(secondEcho).findIndex(isIdle);\n check(\n textOfUpdates(items.slice(secondEcho, secondEcho + nextIdle)).includes(steer),\n 'the queued prompt was not answered in its own turn',\n );\n return 'queue: running, idle, running, idle';\n });\n\n await step(HarnessConformanceCase.CancelWhileRunning, { requires: sessionCases }, async () => {\n const id = requireSession();\n const declared = declaredSteer();\n const first = await sendPrompt(directive(ConformanceDirective.Slow));\n await waitForText(id, first.from, 'slow:started', 'the slow turn');\n const dropped = `cancelled-${nonce}`;\n await sendPrompt(directive(ConformanceDirective.Echo, dropped)).catch((cause: unknown) => {\n throw refused(cause);\n });\n // An injected prompt joins the running work at its next step.\n await sleep(100);\n await requireConnection().agent.notify(methods.agent.session.cancel, { sessionId: id });\n await waitFor(id, (items) => items.slice(first.from).some(isIdle), 'the cancelled turn');\n await sleep(replayGraceMs);\n const items = logFor(id).items.slice(first.from);\n const idleAt = items.findIndex(isIdle);\n check(\n stopReasonOf(items[idleAt] ?? items[0] ?? { sessionUpdate: 'state_update' }) ===\n 'cancelled',\n `the turn ended ${stopReasonOf(items[idleAt] ?? { sessionUpdate: 'state_update' }) ?? 'without a stopReason'}, expected cancelled`,\n );\n const after = items.slice(idleAt + 1);\n check(\n !after.some(isRunning) && textOfUpdates(after) === '',\n 'work went on after session/cancel: it must reach every accepted prompt',\n );\n if (declared === PromptWhileRunning.Queue) {\n check(\n !textOfUpdates(items).includes(dropped),\n 'a queued prompt ran although session/cancel arrived before it started',\n );\n }\n return `${declared}: one cancelled idle, nothing after it`;\n });\n\n await step(HarnessConformanceCase.NoResend, { requires: sessionCases }, async () => {\n const token = `once-${nonce}`;\n promptDrop.armed = true;\n promptDrop.dropped = false;\n const outcome = sendPrompt(directive(ConformanceDirective.Echo, token)).then(\n () => 'answered',\n () => 'unanswered',\n );\n const deadline = Date.now() + timeoutMs;\n while (!promptDrop.dropped && Date.now() < deadline) await sleep(5);\n promptDrop.armed = false;\n check(promptDrop.dropped, 'the harness never answered the session/prompt');\n const { how, from } = await dropAndResume({ type: 'start' });\n check((await outcome) === 'unanswered', 'the prompt response reached the client');\n const id = requireSession();\n await sleep(replayGraceMs);\n // Snapshots and chunks of one ACP message can repeat during replay.\n // A blind resend inserts a second message identity, not another snapshot.\n const echoes = (items: SessionUpdate[]) =>\n accumulateAgentMessages(\n items.flatMap<object>((update) => {\n if (update.sessionUpdate === 'user_message')\n return [{ ...update, sessionUpdate: 'agent_message' }];\n if (update.sessionUpdate === 'user_message_chunk')\n return [{ ...update, sessionUpdate: 'agent_message_chunk' }];\n return [];\n }),\n ).filter((message) => message.text.includes(token)).length;\n // The replay decides: inserted prompts are never resent.\n const inserted = echoes(logFor(id).items.slice(from)) > 0;\n if (!inserted) await turn(directive(ConformanceDirective.Echo, token));\n else if (survives()) await waitForText(id, from, token, 'the inserted prompt to be answered');\n await sleep(replayGraceMs);\n const count = echoes(logFor(id).items.slice(from));\n check(count === 1, `the prompt was echoed ${count} times after the reconnect, expected once`);\n return inserted\n ? `inserted before the drop (${how}); the replay showed it, so it was not resent`\n : `not inserted (${how}); sent once more`;\n });\n\n await step(HarnessConformanceCase.DisconnectMidTurn, { requires: sessionCases }, async () => {\n const sent = await sendPrompt(directive(ConformanceDirective.Wait, '600'));\n await waitForText(requireSession(), sent.from, 'wait:started', 'the running turn');\n const { how, from } = await dropAndResume({ type: 'start' });\n const id = requireSession();\n if (survives()) {\n check(\n how === 'resumed',\n 'declares sessionSurvivesDisconnect but the session could not be resumed with replay',\n );\n await waitFor(\n id,\n () => {\n const after = afterEcho(id, from, sent.messageId);\n return (\n after != null && textOfUpdates(after).includes('wait:done') && after.some(isIdle)\n );\n },\n 'the running turn to finish across the dropped connection',\n );\n const after = afterEcho(id, from, sent.messageId) ?? [];\n const idle = after.find(isIdle);\n check(\n idle != null && stopReasonOf(idle) === 'end_turn',\n `the turn ended ${idle == null ? 'never' : stopReasonOf(idle)} after the reconnect`,\n );\n return 'the turn kept running and was replayed';\n }\n // State lost: the session service ends the open turn harness_state_lost;\n // the session must stay usable.\n const text = `after-drop-${nonce}`;\n const result = await ownTurn(await sendPrompt(directive(ConformanceDirective.Echo, text)));\n check(result.text.includes(text), `reply after the reconnect ${JSON.stringify(result.text)}`);\n return `state not kept (${how}): the client ends the turn harness_state_lost`;\n });\n\n await step(\n HarnessConformanceCase.DisconnectMidPermission,\n { requires: [HarnessConformanceCase.Permission] },\n async () => {\n holdPermissions = true;\n const before = permissionIds.length;\n const sent = await sendPrompt(directive(ConformanceDirective.Permission));\n const deadline = Date.now() + timeoutMs;\n while (permissionIds.length === before && Date.now() < deadline) await sleep(5);\n holdPermissions = false;\n const held = permissionIds[before];\n check(held != null, 'no session/request_permission was sent');\n const { how, from } = await dropAndResume({ type: 'start' });\n const id = requireSession();\n if (survives()) {\n check(\n how === 'resumed',\n 'declares sessionSurvivesDisconnect but the session could not be resumed with replay',\n );\n const reraised = Date.now() + timeoutMs;\n while (\n !permissionIds.some(\n (entry) => entry.epoch === epoch && entry.requestId === held?.requestId,\n ) &&\n Date.now() < reraised\n ) {\n await sleep(5);\n }\n check(\n permissionIds.some(\n (entry) => entry.epoch === epoch && entry.requestId === held?.requestId,\n ),\n `the open permission request (id ${JSON.stringify(held?.requestId)}) was not re-raised with the same id after session/resume`,\n );\n await waitFor(\n id,\n () => {\n const after = afterEcho(id, from, sent.messageId);\n return after != null && after.some(isIdle);\n },\n 'the turn to finish after the re-raised request was answered',\n );\n check(\n textOfUpdates(afterEcho(id, from, sent.messageId) ?? []).includes(\n 'permission:allow_once',\n ),\n 'the answer to the re-raised request did not reach the turn',\n );\n return 're-raised with the same id and answered';\n }\n const text = `after-permission-drop-${nonce}`;\n const result = await ownTurn(await sendPrompt(directive(ConformanceDirective.Echo, text)));\n check(\n result.text.includes(text),\n `reply after the reconnect ${JSON.stringify(result.text)}`,\n );\n return `state not kept (${how}): the request resolves cancelled, the turn harness_state_lost`;\n },\n );\n\n await step(\n HarnessConformanceCase.NativeIdPreservation,\n {\n requires: sessionCases,\n skip:\n args.nativeSessionId == null\n ? 'driver has no independent native session identity probe'\n : described()?.supports.resumeReplay !== true\n ? 'harness does not declare supports.resumeReplay'\n : null,\n },\n async () => {\n const id = requireSession();\n const before = await args.nativeSessionId?.(id);\n check(\n before != null && before.length > 0,\n 'native session identity was unavailable before resume',\n );\n const marker = `native-resume-${nonce}`;\n await turn(directive(ConformanceDirective.Echo, marker));\n const { how } = await dropAndResume(null);\n check(\n how === 'resumed' && requireSession() === id,\n 'ACP session identity changed across resume',\n );\n const history = await turn(directive(ConformanceDirective.History));\n check(history.text.includes(marker), 'native history was lost across resume');\n check(\n (await args.nativeSessionId?.(id)) === before,\n 'native session identity changed across resume',\n );\n return 'independent native identity and conversation history retained across resume';\n },\n );\n\n await step(\n HarnessConformanceCase.NativeIdChange,\n {\n requires: sessionCases,\n skip:\n args.nativeSessionId == null\n ? 'driver has no independent native session identity probe'\n : args.nativeClearPrompt === null\n ? 'harness has no public native session reset action'\n : null,\n },\n async () => {\n const id = requireSession();\n const before = await args.nativeSessionId?.(id);\n check(\n before != null && before.length > 0,\n 'native session identity was unavailable before clear',\n );\n const foreign = foreignUpdates.length;\n const cleared = await turn(args.nativeClearPrompt ?? directive(ConformanceDirective.Clear));\n check(cleared.stopReason === 'end_turn', `clear ended ${cleared.stopReason}`);\n const after = await args.nativeSessionId?.(id);\n check(\n after != null && after.length > 0,\n 'native session identity was unavailable after clear',\n );\n check(after !== before, 'clear did not change the native session identity');\n const text = `after-clear-${nonce}`;\n const result = await turn(directive(ConformanceDirective.Echo, text));\n check(result.text === text, `reply after clear ${JSON.stringify(result.text)}`);\n let detail = 'one ACP session id across the native change';\n if (described()?.supports.resumeReplay === true) {\n const { how } = await dropAndResume(null);\n check(\n how === 'resumed' && requireSession() === id,\n 'session/resume with the ACP session id failed after the native id changed',\n );\n const resumedText = `after-clear-resume-${nonce}`;\n const resumed = await turn(directive(ConformanceDirective.Echo, resumedText));\n check(resumed.text === resumedText, `reply after resume ${JSON.stringify(resumed.text)}`);\n check(\n (await args.nativeSessionId?.(id)) === after,\n 'resume did not retain the changed native session identity',\n );\n detail += ', and session/resume by it';\n }\n check(\n foreignUpdates.length === foreign,\n `updates arrived under ACP session ids the client never opened: ${foreignUpdates.slice(foreign).join(', ')}`,\n );\n return detail;\n },\n );\n\n await step(\n HarnessConformanceCase.OversizedFrame,\n {\n requires: sessionCases,\n skip: mcpServers.length === 0 ? 'no client MCP fixture can be attached' : null,\n },\n async () => {\n const frames = inboundFrameBytes.length;\n const result = await turn(directive(ConformanceDirective.Big, String(BIG_RESULT_BYTES)));\n check(result.stopReason === 'end_turn', `stopReason ${result.stopReason}`);\n check(\n result.text.includes('big:done'),\n `reply ${JSON.stringify(result.text.slice(0, 200))}`,\n );\n const largest = Math.max(0, ...inboundFrameBytes.slice(frames));\n const blocks = toolBlocksOf(result.updates);\n const links = blocks.flatMap((block) => {\n const link = resourceLinkSchema.safeParse(block);\n return link.success ? [link.data] : [];\n });\n const textLink = links.find((link) => link.size === BIG_RESULT_BYTES);\n const imageLink = links.find((link) => link.mimeType?.startsWith('image/') === true);\n if (!final) {\n // A plain agent need not apply the rule; the session service's backstop\n // rewrites its frames. The content must arrive whole either way.\n const inline = blocks.some(\n (block) => inlineTextSchema.safeParse(block).data?.text.length === BIG_RESULT_BYTES,\n );\n check(textLink != null || inline, 'the tool result did not arrive whole');\n return `largest frame ${largest} bytes${largest > MAX_ACP_FRAME_BYTES ? ' (the session service backstop rewrites it)' : ''}`;\n }\n check(\n largest <= MAX_ACP_FRAME_BYTES,\n `a ${largest}-byte frame exceeded the ${MAX_ACP_FRAME_BYTES}-byte frame rule`,\n );\n check(\n textLink != null,\n 'the multi-megabyte tool result was not moved to a resource_link carrying its full size',\n );\n const description = textLink?.description ?? '';\n check(\n new TextEncoder().encode(description).length <= RESOURCE_LINK_DESCRIPTION_BYTES &&\n description.length > 0,\n 'the resource_link description must be the first 4 KiB of the text',\n );\n check(\n imageLink != null && (imageLink.size ?? 0) > MAX_INLINE_MEDIA_BYTES,\n 'the image above 256 KiB was not moved to a resource_link',\n );\n return `largest frame ${largest} bytes; text and image linked`;\n },\n );\n\n await step(\n HarnessConformanceCase.GracefulClose,\n {\n requires: [HarnessConformanceCase.Initialize],\n skip:\n initializeResponse()?.capabilities?.session == null\n ? 'the agent advertises no session capabilities (no session/close)'\n : null,\n },\n async () => {\n const opened = await args.harness.open({\n ...args.openArgs,\n harnessSessionId: crypto.randomUUID(),\n });\n const dialed = await args.dial(opened);\n const closeIds = new Map<string, string>();\n const idleSeen = new Set<string>();\n const settledBeforeReply = new Set<string>();\n const outgoing = dialed.writable.getWriter();\n const watch = watchInitializeVersion({\n writable: new WritableStream<AnyWireMessage>({\n write: async (wire) => {\n for (const message of isBatch(wire) ? wire : [wire]) {\n const close = z\n .object({\n id: z.union([z.string(), z.number()]),\n method: z.literal('session/close'),\n params: z.object({ sessionId: z.string() }),\n })\n .safeParse(message);\n if (close.success)\n closeIds.set(JSON.stringify(close.data.id), close.data.params.sessionId);\n }\n await outgoing.write(wire);\n },\n close: () => outgoing.close(),\n abort: (reason) => outgoing.abort(reason),\n }),\n readable: dialed.readable.pipeThrough(\n new TransformStream<AnyWireMessage, AnyWireMessage>({\n transform: (wire, controller) => {\n for (const message of isBatch(wire) ? wire : [wire]) {\n const state = z\n .object({\n method: z.literal('session/update'),\n params: z.object({\n sessionId: z.string(),\n update: z.object({\n sessionUpdate: z.literal('state_update'),\n state: z.string(),\n }),\n }),\n })\n .safeParse(message);\n if (state.success) {\n if (state.data.params.update.state === 'idle')\n idleSeen.add(state.data.params.sessionId);\n else idleSeen.delete(state.data.params.sessionId);\n }\n const reply = z\n .object({ id: z.union([z.string(), z.number()]), result: z.unknown() })\n .safeParse(message);\n const sessionId = reply.success\n ? closeIds.get(JSON.stringify(reply.data.id))\n : null;\n if (sessionId != null && idleSeen.has(sessionId))\n settledBeforeReply.add(sessionId);\n }\n controller.enqueue(wire);\n },\n }),\n ),\n });\n const second = kitClient.connect(watch.stream);\n try {\n await initializeOver(second, watch);\n const created = await second.agent.request(methods.agent.session.new, {\n cwd,\n mcpServers: [],\n });\n const id = created.sessionId;\n knownSessions.add(id);\n await second.agent.request(methods.agent.session.prompt, {\n sessionId: id,\n prompt: [{ type: 'text', text: directive(ConformanceDirective.Wait, '2000') }],\n _meta: promptMeta,\n });\n await waitForText(id, 0, 'wait:started', 'the running turn');\n await second.agent.request(methods.agent.session.close, { sessionId: id });\n // Graceful: the program settles its state (and says so) before the\n // close is answered, so nothing it was doing is lost.\n check(\n settledBeforeReply.has(id),\n 'session/close was answered while the turn was still running: close must settle the program state first',\n );\n await args.harness.close(opened.ref);\n await args.harness.close(opened.ref, { force: true });\n return 'the turn settled before session/close answered; close then force close';\n } finally {\n second.close();\n dialed.close?.();\n }\n },\n );\n\n await step(HarnessConformanceCase.V1Rejected, {}, async () => {\n // The same check the session service runs at open (requireProtocolV2):\n // an agent answering initialize as ACP v1 is refused, never converted.\n const v1 = createLegacyProtocolAgent();\n const watch = watchInitializeVersion(v1.stream);\n const probe = kitClient.connect(watch.stream);\n try {\n const cause = await initializeOver(probe, watch).then(\n () => null,\n (cause: unknown) => cause,\n );\n check(\n isUnsupportedProtocolVersionError(cause),\n `a v1 initialize reply was not refused with unsupported_protocol_version (${String(cause)})`,\n );\n check(\n v1.received.join(',') === 'initialize',\n `the client sent ${v1.received.join(', ')} to a v1 agent`,\n );\n return 'refused with unsupported_protocol_version';\n } finally {\n probe.close();\n }\n });\n\n await step(\n HarnessConformanceCase.Health,\n { requires: [HarnessConformanceCase.Open] },\n async () => {\n if (endpoint == null) throw failure('no endpoint');\n const health = await args.harness.health(endpoint.ref, {\n config: args.openArgs.config,\n secrets: args.openArgs.secrets,\n });\n check(health.ok, `health not ok: ${health.detail ?? ''}`);\n },\n );\n\n await step(\n HarnessConformanceCase.Close,\n { requires: [HarnessConformanceCase.Open] },\n async () => {\n if (endpoint == null) throw failure('no endpoint');\n if (connection != null && sessionId != null) {\n await requireConnection()\n .agent.request(methods.agent.session.close, { sessionId })\n .catch(() => undefined);\n }\n await disconnect();\n await args.harness.close(endpoint.ref);\n },\n );\n } finally {\n await disconnect().catch(() => undefined);\n for (const cleanup of cleanups) await cleanup().catch(() => undefined);\n }\n\n return {\n profile,\n passed: cases.every((entry) => entry.status !== ConformanceCaseStatus.Failed),\n description,\n cases,\n };\n};\n\n// Registers one test per case with any vitest-compatible API, running the kit\n// once in beforeAll: describeHarnessConformance({ describe, it, beforeAll }, args).\nexport interface ConformanceTestApiIface {\n describe: (name: string, factory: () => void) => void;\n it: (name: string, fn: () => Promise<void>, timeout?: number) => void;\n beforeAll: (fn: () => Promise<void>, timeout?: number) => void;\n}\n\nexport const describeHarnessConformance = (\n api: ConformanceTestApiIface,\n args: RunHarnessConformanceArgsIface & { name?: string },\n): void => {\n api.describe(args.name ?? `harness conformance (${args.profile})`, () => {\n let report: HarnessConformanceReportIface | null = null;\n const budget = (args.timeoutMs ?? 15_000) * HARNESS_CONFORMANCE_CASES.length;\n api.beforeAll(async () => {\n report = await runHarnessConformance(args);\n }, budget);\n for (const name of HARNESS_CONFORMANCE_CASES) {\n api.it(name, async () => {\n const result = report?.cases.find((entry) => entry.name === name);\n if (result == null) throw new Error(`case ${name} did not run`);\n if (result.status === ConformanceCaseStatus.Failed)\n throw new Error(result.error ?? 'failed');\n });\n }\n });\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["ConformanceProfile", "ConformanceCaseStatus", "HarnessConformanceCase", "sessionId", "option", "items", "after", "description", "cause"]
7
+ }
@@ -0,0 +1,2 @@
1
+ export declare const CONFORMANCE_BIG_IMAGE_BYTES: number;
2
+ export declare const conformanceImageBase64: () => string;
@@ -0,0 +1,79 @@
1
+ const WIDTH = 384;
2
+ const HEIGHT = 272;
3
+ const rawBytes = HEIGHT * (1 + WIDTH * 3);
4
+ const CONFORMANCE_BIG_IMAGE_BYTES = 57 + 6 + rawBytes + Math.ceil(rawBytes / 65535) * 5;
5
+ const crcTable = Array.from({ length: 256 }, (_, index) => {
6
+ let value = index;
7
+ for (let bit = 0; bit < 8; bit += 1) value = value >>> 1 ^ ((value & 1) === 0 ? 0 : 3988292384);
8
+ return value >>> 0;
9
+ });
10
+ const crc32 = (bytes) => {
11
+ let value = 4294967295;
12
+ for (const byte of bytes) value = value >>> 8 ^ (crcTable[(value ^ byte) & 255] ?? 0);
13
+ return (value ^ 4294967295) >>> 0;
14
+ };
15
+ const chunk = (type, data) => {
16
+ const bytes = new Uint8Array(data.length + 12);
17
+ const view = new DataView(bytes.buffer);
18
+ view.setUint32(0, data.length);
19
+ bytes.set(new TextEncoder().encode(type), 4);
20
+ bytes.set(data, 8);
21
+ view.setUint32(bytes.length - 4, crc32(bytes.subarray(4, bytes.length - 4)));
22
+ return bytes;
23
+ };
24
+ let cached = null;
25
+ const conformanceImageBase64 = () => {
26
+ if (cached != null) return cached;
27
+ const raw = new Uint8Array(rawBytes);
28
+ const stride = 1 + WIDTH * 3;
29
+ for (let y = 0; y < HEIGHT; y += 1) {
30
+ for (let x = 0; x < WIDTH; x += 1) {
31
+ const offset2 = y * stride + 1 + x * 3;
32
+ raw[offset2] = x % 256;
33
+ raw[offset2 + 1] = y % 256;
34
+ raw[offset2 + 2] = (x + y) % 256;
35
+ }
36
+ }
37
+ const blocks = Math.ceil(raw.length / 65535);
38
+ const deflate = new Uint8Array(6 + raw.length + blocks * 5);
39
+ deflate.set([120, 1]);
40
+ const deflateView = new DataView(deflate.buffer);
41
+ let offset = 2;
42
+ for (let start = 0; start < raw.length; start += 65535) {
43
+ const length = Math.min(65535, raw.length - start);
44
+ deflate[offset] = start + length === raw.length ? 1 : 0;
45
+ deflateView.setUint16(offset + 1, length, true);
46
+ deflateView.setUint16(offset + 3, length ^ 65535, true);
47
+ deflate.set(raw.subarray(start, start + length), offset + 5);
48
+ offset += length + 5;
49
+ }
50
+ let a = 1;
51
+ let b = 0;
52
+ for (const byte of raw) {
53
+ a = (a + byte) % 65521;
54
+ b = (b + a) % 65521;
55
+ }
56
+ deflateView.setUint32(offset, (b << 16 | a) >>> 0);
57
+ const header = new Uint8Array(13);
58
+ const headerView = new DataView(header.buffer);
59
+ headerView.setUint32(0, WIDTH);
60
+ headerView.setUint32(4, HEIGHT);
61
+ header.set([8, 2, 0, 0, 0], 8);
62
+ const parts = [
63
+ new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10]),
64
+ chunk("IHDR", header),
65
+ chunk("IDAT", deflate),
66
+ chunk("IEND", new Uint8Array())
67
+ ];
68
+ let binary = "";
69
+ for (const part of parts)
70
+ for (let start = 0; start < part.length; start += 8192)
71
+ binary += String.fromCharCode(...part.subarray(start, start + 8192));
72
+ cached = btoa(binary);
73
+ return cached;
74
+ };
75
+ export {
76
+ CONFORMANCE_BIG_IMAGE_BYTES,
77
+ conformanceImageBase64
78
+ };
79
+ //# sourceMappingURL=image.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/conformance/image.ts"],
4
+ "sourcesContent": ["// A real RGB PNG with stored DEFLATE blocks, usable in Node and Workers without\n// a codec dependency. Pixel data, rather than padding, exceeds the inline limit.\nconst WIDTH = 384;\nconst HEIGHT = 272;\nconst rawBytes = HEIGHT * (1 + WIDTH * 3);\nexport const CONFORMANCE_BIG_IMAGE_BYTES = 57 + 6 + rawBytes + Math.ceil(rawBytes / 65535) * 5;\n\nconst crcTable = Array.from({ length: 256 }, (_, index) => {\n let value = index;\n for (let bit = 0; bit < 8; bit += 1) value = (value >>> 1) ^ ((value & 1) === 0 ? 0 : 0xedb88320);\n return value >>> 0;\n});\n\nconst crc32 = (bytes: Uint8Array): number => {\n let value = 0xffffffff;\n for (const byte of bytes) value = (value >>> 8) ^ (crcTable[(value ^ byte) & 255] ?? 0);\n return (value ^ 0xffffffff) >>> 0;\n};\n\nconst chunk = (type: string, data: Uint8Array): Uint8Array => {\n const bytes = new Uint8Array(data.length + 12);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, data.length);\n bytes.set(new TextEncoder().encode(type), 4);\n bytes.set(data, 8);\n view.setUint32(bytes.length - 4, crc32(bytes.subarray(4, bytes.length - 4)));\n return bytes;\n};\n\nlet cached: string | null = null;\nexport const conformanceImageBase64 = (): string => {\n if (cached != null) return cached;\n const raw = new Uint8Array(rawBytes);\n const stride = 1 + WIDTH * 3;\n for (let y = 0; y < HEIGHT; y += 1) {\n for (let x = 0; x < WIDTH; x += 1) {\n const offset = y * stride + 1 + x * 3;\n raw[offset] = x % 256;\n raw[offset + 1] = y % 256;\n raw[offset + 2] = (x + y) % 256;\n }\n }\n const blocks = Math.ceil(raw.length / 65535);\n const deflate = new Uint8Array(6 + raw.length + blocks * 5);\n deflate.set([0x78, 0x01]);\n const deflateView = new DataView(deflate.buffer);\n let offset = 2;\n for (let start = 0; start < raw.length; start += 65535) {\n const length = Math.min(65535, raw.length - start);\n deflate[offset] = start + length === raw.length ? 1 : 0;\n deflateView.setUint16(offset + 1, length, true);\n deflateView.setUint16(offset + 3, length ^ 65535, true);\n deflate.set(raw.subarray(start, start + length), offset + 5);\n offset += length + 5;\n }\n let a = 1;\n let b = 0;\n for (const byte of raw) {\n a = (a + byte) % 65521;\n b = (b + a) % 65521;\n }\n deflateView.setUint32(offset, ((b << 16) | a) >>> 0);\n const header = new Uint8Array(13);\n const headerView = new DataView(header.buffer);\n headerView.setUint32(0, WIDTH);\n headerView.setUint32(4, HEIGHT);\n header.set([8, 2, 0, 0, 0], 8);\n const parts = [\n new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10]),\n chunk('IHDR', header),\n chunk('IDAT', deflate),\n chunk('IEND', new Uint8Array()),\n ];\n let binary = '';\n for (const part of parts)\n for (let start = 0; start < part.length; start += 8192)\n binary += String.fromCharCode(...part.subarray(start, start + 8192));\n cached = btoa(binary);\n return cached;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["offset"]
7
+ }
@@ -0,0 +1,8 @@
1
+ export * from "./agent.mjs";
2
+ export * from "./fixtures.mjs";
3
+ export * from "./harness-kit.mjs";
4
+ export { conformanceImageBase64 } from "./image.mjs";
5
+ export * from "./local-harness.mjs";
6
+ export * from "./protocol.mjs";
7
+ export * from "./sandbox-kit.mjs";
8
+ export * from "./v1-agent.mjs";
@@ -0,0 +1,12 @@
1
+ export * from "./agent.mjs";
2
+ export * from "./fixtures.mjs";
3
+ export * from "./harness-kit.mjs";
4
+ import { conformanceImageBase64 } from "./image.mjs";
5
+ export * from "./local-harness.mjs";
6
+ export * from "./protocol.mjs";
7
+ export * from "./sandbox-kit.mjs";
8
+ export * from "./v1-agent.mjs";
9
+ export {
10
+ conformanceImageBase64
11
+ };
12
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/conformance/index.ts"],
4
+ "sourcesContent": ["export * from \"./agent.mjs\";\nexport * from \"./fixtures.mjs\";\nexport * from \"./harness-kit.mjs\";\nexport { conformanceImageBase64 } from \"./image.mjs\";\nexport * from \"./local-harness.mjs\";\nexport * from \"./protocol.mjs\";\nexport * from \"./sandbox-kit.mjs\";\nexport * from \"./v1-agent.mjs\";\n"],
5
+ "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,8BAA8B;AACvC,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,25 @@
1
+ import type { Stream } from '@agentclientprotocol/sdk/experimental/v2';
2
+ import type { FetchLike } from '@modelcontextprotocol/client';
3
+ import { PromptWhileRunning, type HarnessEndpointIface, type HarnessIface } from "../harness.mjs";
4
+ import { type ConformanceAgentIface } from "./agent.mjs";
5
+ export declare const LOCAL_CONFORMANCE_HARNESS_REF: {
6
+ kind: import("../index.mjs").ProviderRefKind.Package;
7
+ specifier: string;
8
+ };
9
+ export interface LocalConformanceStreamIface extends Stream {
10
+ close: () => void;
11
+ }
12
+ export interface LocalConformanceHarnessIface {
13
+ harness: HarnessIface;
14
+ dial: (endpoint: HarnessEndpointIface) => Promise<LocalConformanceStreamIface>;
15
+ agent: ConformanceAgentIface;
16
+ nativeSessionId: (acpSessionId: string) => Promise<string | null>;
17
+ }
18
+ export declare const localConformanceHarness: (options?: {
19
+ extensions?: boolean;
20
+ fetch?: FetchLike;
21
+ slowTurnMs?: number;
22
+ privateMethods?: string[];
23
+ promptWhileRunning?: PromptWhileRunning;
24
+ sessionSurvivesDisconnect?: boolean;
25
+ }) => LocalConformanceHarnessIface;
@@ -0,0 +1,108 @@
1
+ import { CredentialDelivery, InferenceCredentialKind } from "../credentials.mjs";
2
+ import {
3
+ AcpTransport,
4
+ McpTransportKind,
5
+ PromptWhileRunning
6
+ } from "../harness.mjs";
7
+ import { packageRef } from "../provider-ref.mjs";
8
+ import { SCHEMA_IDS } from "../schemas.mjs";
9
+ import { createConformanceAgent } from "./agent.mjs";
10
+ import { createLinkedStreamPair } from "./fixtures.mjs";
11
+ const LOCAL_CONFORMANCE_HARNESS_REF = packageRef(
12
+ "@finalai/agent-provider/conformance/local"
13
+ );
14
+ const MEMORY_URL_PREFIX = "memory://conformance/";
15
+ const localConformanceHarness = (options = {}) => {
16
+ const extensions = options.extensions ?? true;
17
+ const promptWhileRunning = options.promptWhileRunning ?? PromptWhileRunning.Queue;
18
+ const sessionSurvivesDisconnect = options.sessionSurvivesDisconnect ?? false;
19
+ const agent = createConformanceAgent({
20
+ extensions,
21
+ fetch: options.fetch,
22
+ slowTurnMs: options.slowTurnMs,
23
+ privateMethods: options.privateMethods,
24
+ promptWhileRunning,
25
+ survivesDisconnect: sessionSurvivesDisconnect
26
+ });
27
+ const connections = /* @__PURE__ */ new Map();
28
+ const parked = /* @__PURE__ */ new Set();
29
+ const closed = /* @__PURE__ */ new Set();
30
+ const description = {
31
+ configSchema: {
32
+ type: "object",
33
+ properties: { credentials: { $ref: SCHEMA_IDS.credentialPolicy } },
34
+ additionalProperties: false
35
+ },
36
+ acp: { transports: [AcpTransport.Ws], mcp: [McpTransportKind.Acp, McpTransportKind.Http] },
37
+ baseTools: {},
38
+ consumes: [],
39
+ inference: {
40
+ vendors: [],
41
+ kinds: [InferenceCredentialKind.HarnessOwned],
42
+ delivery: CredentialDelivery.PerRequest
43
+ },
44
+ supports: { observe: extensions, resumeReplay: true, fork: false, authorMeta: false },
45
+ promptWhileRunning,
46
+ sessionSurvivesDisconnect
47
+ };
48
+ const endpointFor = (ref) => ({
49
+ ref,
50
+ transport: AcpTransport.Ws,
51
+ url: `${MEMORY_URL_PREFIX}${ref.harnessSessionRef}`,
52
+ headers: {}
53
+ });
54
+ const dropConnections = (ref) => {
55
+ for (const connection of connections.get(ref.harnessSessionRef) ?? []) connection.close();
56
+ connections.delete(ref.harnessSessionRef);
57
+ };
58
+ const harness = {
59
+ describe: async () => description,
60
+ open: async () => {
61
+ const ref = {
62
+ harness: LOCAL_CONFORMANCE_HARNESS_REF,
63
+ harnessSessionRef: crypto.randomUUID(),
64
+ generation: 0
65
+ };
66
+ return endpointFor(ref);
67
+ },
68
+ resume: async (args) => {
69
+ if (closed.has(args.ref.harnessSessionRef)) throw new Error("harness session was closed");
70
+ parked.delete(args.ref.harnessSessionRef);
71
+ return endpointFor(args.ref);
72
+ },
73
+ park: async (ref) => {
74
+ parked.add(ref.harnessSessionRef);
75
+ dropConnections(ref);
76
+ },
77
+ close: async (ref) => {
78
+ closed.add(ref.harnessSessionRef);
79
+ dropConnections(ref);
80
+ },
81
+ health: async (ref) => ({
82
+ ok: !closed.has(ref.harnessSessionRef),
83
+ detail: parked.has(ref.harnessSessionRef) ? "parked" : void 0,
84
+ checkedAt: (/* @__PURE__ */ new Date()).toISOString()
85
+ })
86
+ };
87
+ const dial = async (endpoint) => {
88
+ if (endpoint.transport !== AcpTransport.Ws || !endpoint.url.startsWith(MEMORY_URL_PREFIX)) {
89
+ throw new Error("the local conformance harness only dials its own memory:// endpoints");
90
+ }
91
+ const key = endpoint.url.slice(MEMORY_URL_PREFIX.length);
92
+ if (closed.has(key)) throw new Error("harness session was closed");
93
+ if (parked.has(key)) throw new Error("harness session is parked; resume it first");
94
+ const [agentSide, clientSide] = createLinkedStreamPair();
95
+ const connection = agent.connect(agentSide);
96
+ const set = connections.get(key) ?? /* @__PURE__ */ new Set();
97
+ set.add(connection);
98
+ connections.set(key, set);
99
+ void connection.closed.then(() => set.delete(connection));
100
+ return { ...clientSide, close: () => connection.close() };
101
+ };
102
+ return { harness, dial, agent, nativeSessionId: async (id) => agent.nativeId(id) };
103
+ };
104
+ export {
105
+ LOCAL_CONFORMANCE_HARNESS_REF,
106
+ localConformanceHarness
107
+ };
108
+ //# sourceMappingURL=local-harness.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/conformance/local-harness.ts"],
4
+ "sourcesContent": ["import type { AgentConnection, Stream } from '@agentclientprotocol/sdk/experimental/v2';\nimport type { FetchLike } from '@modelcontextprotocol/client';\nimport { CredentialDelivery, InferenceCredentialKind } from \"../credentials.mjs\";\nimport {\n AcpTransport,\n McpTransportKind,\n PromptWhileRunning,\n type HarnessDescriptionIface,\n type HarnessEndpointIface,\n type HarnessIface,\n type HarnessSessionRefIface,\n} from \"../harness.mjs\";\nimport { packageRef } from \"../provider-ref.mjs\";\nimport { SCHEMA_IDS } from \"../schemas.mjs\";\nimport { createConformanceAgent, type ConformanceAgentIface } from \"./agent.mjs\";\nimport { createLinkedStreamPair } from \"./fixtures.mjs\";\n\n// A HarnessIface that runs the reference conformance agent in-process over a\n// linked stream pair, so the kit tests itself in CI. Endpoints are\n// `memory://conformance/<harnessSessionRef>` WebSocket endpoints that only the\n// returned `dial` understands.\n\nexport const LOCAL_CONFORMANCE_HARNESS_REF = packageRef(\n '@finalai/agent-provider/conformance/local',\n);\nconst MEMORY_URL_PREFIX = 'memory://conformance/';\n\nexport interface LocalConformanceStreamIface extends Stream {\n close: () => void;\n}\n\nexport interface LocalConformanceHarnessIface {\n harness: HarnessIface;\n dial: (endpoint: HarnessEndpointIface) => Promise<LocalConformanceStreamIface>;\n agent: ConformanceAgentIface;\n nativeSessionId: (acpSessionId: string) => Promise<string | null>;\n}\n\nexport const localConformanceHarness = (\n options: {\n extensions?: boolean;\n fetch?: FetchLike;\n slowTurnMs?: number;\n privateMethods?: string[];\n // The hosting profile the reference program follows and the harness declares.\n promptWhileRunning?: PromptWhileRunning;\n sessionSurvivesDisconnect?: boolean;\n } = {},\n): LocalConformanceHarnessIface => {\n const extensions = options.extensions ?? true;\n const promptWhileRunning = options.promptWhileRunning ?? PromptWhileRunning.Queue;\n const sessionSurvivesDisconnect = options.sessionSurvivesDisconnect ?? false;\n const agent = createConformanceAgent({\n extensions,\n fetch: options.fetch,\n slowTurnMs: options.slowTurnMs,\n privateMethods: options.privateMethods,\n promptWhileRunning,\n survivesDisconnect: sessionSurvivesDisconnect,\n });\n const connections = new Map<string, Set<AgentConnection>>();\n const parked = new Set<string>();\n const closed = new Set<string>();\n\n const description: HarnessDescriptionIface = {\n configSchema: {\n type: 'object',\n properties: { credentials: { $ref: SCHEMA_IDS.credentialPolicy } },\n additionalProperties: false,\n },\n acp: { transports: [AcpTransport.Ws], mcp: [McpTransportKind.Acp, McpTransportKind.Http] },\n baseTools: {},\n consumes: [],\n inference: {\n vendors: [],\n kinds: [InferenceCredentialKind.HarnessOwned],\n delivery: CredentialDelivery.PerRequest,\n },\n supports: { observe: extensions, resumeReplay: true, fork: false, authorMeta: false },\n promptWhileRunning,\n sessionSurvivesDisconnect,\n };\n\n const endpointFor = (ref: HarnessSessionRefIface): HarnessEndpointIface => ({\n ref,\n transport: AcpTransport.Ws,\n url: `${MEMORY_URL_PREFIX}${ref.harnessSessionRef}`,\n headers: {},\n });\n\n const dropConnections = (ref: HarnessSessionRefIface) => {\n for (const connection of connections.get(ref.harnessSessionRef) ?? []) connection.close();\n connections.delete(ref.harnessSessionRef);\n };\n\n const harness: HarnessIface = {\n describe: async () => description,\n open: async () => {\n const ref: HarnessSessionRefIface = {\n harness: LOCAL_CONFORMANCE_HARNESS_REF,\n harnessSessionRef: crypto.randomUUID(),\n generation: 0,\n };\n return endpointFor(ref);\n },\n resume: async (args) => {\n if (closed.has(args.ref.harnessSessionRef)) throw new Error('harness session was closed');\n parked.delete(args.ref.harnessSessionRef);\n return endpointFor(args.ref);\n },\n park: async (ref) => {\n parked.add(ref.harnessSessionRef);\n dropConnections(ref);\n },\n close: async (ref) => {\n closed.add(ref.harnessSessionRef);\n dropConnections(ref);\n },\n health: async (ref) => ({\n ok: !closed.has(ref.harnessSessionRef),\n detail: parked.has(ref.harnessSessionRef) ? 'parked' : undefined,\n checkedAt: new Date().toISOString(),\n }),\n };\n\n const dial = async (endpoint: HarnessEndpointIface): Promise<LocalConformanceStreamIface> => {\n if (endpoint.transport !== AcpTransport.Ws || !endpoint.url.startsWith(MEMORY_URL_PREFIX)) {\n throw new Error('the local conformance harness only dials its own memory:// endpoints');\n }\n const key = endpoint.url.slice(MEMORY_URL_PREFIX.length);\n if (closed.has(key)) throw new Error('harness session was closed');\n if (parked.has(key)) throw new Error('harness session is parked; resume it first');\n const [agentSide, clientSide] = createLinkedStreamPair();\n const connection = agent.connect(agentSide);\n const set = connections.get(key) ?? new Set<AgentConnection>();\n set.add(connection);\n connections.set(key, set);\n void connection.closed.then(() => set.delete(connection));\n // Hanging up reaches the agent, as closing a WebSocket would.\n return { ...clientSide, close: () => connection.close() };\n };\n\n return { harness, dial, agent, nativeSessionId: async (id) => agent.nativeId(id) };\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,30 @@
1
+ export declare const CONFORMANCE_DIRECTIVE_PREFIX = "conformance:";
2
+ export declare enum ConformanceDirective {
3
+ Echo = "echo",
4
+ Permission = "permission",
5
+ Elicit = "elicit",
6
+ Slow = "slow",
7
+ Error = "error",
8
+ Mcp = "mcp",
9
+ History = "history",
10
+ Wait = "wait",
11
+ Clear = "clear",
12
+ Big = "big"
13
+ }
14
+ export declare const directive: (name: ConformanceDirective, rest?: string) => string;
15
+ export declare const parseDirective: (text: string) => {
16
+ name: ConformanceDirective;
17
+ rest: string;
18
+ } | null;
19
+ export declare const CONFORMANCE_ELICITATION_ANSWER = "conformance-answer";
20
+ export declare const CONFORMANCE_MCP_TOOL = "echo";
21
+ export declare const CONFORMANCE_BIG_TOOL = "large_result";
22
+ export declare const CONFORMANCE_ELICIT_TOOL = "ask_answer";
23
+ export declare const CONFORMANCE_ACP_SERVER_NAME = "conformance_acp";
24
+ export declare const CONFORMANCE_HTTP_SERVER_NAME = "conformance_http";
25
+ export declare const CONFORMANCE_ACP_SERVER_ID = "conformance-acp";
26
+ export declare const AFTER_SEQ_REPLAY_TYPE = "_final/after_seq";
27
+ export declare const OBSERVE_METHOD = "_final/session/observe";
28
+ export declare const FINAL_META_KEY = "final.ai";
29
+ export { CONFORMANCE_BIG_IMAGE_BYTES } from "./image.mjs";
30
+ export declare const conformanceEchoText: (nonce: string, text: string) => string;
@@ -0,0 +1,56 @@
1
+ const CONFORMANCE_DIRECTIVE_PREFIX = "conformance:";
2
+ var ConformanceDirective = /* @__PURE__ */ ((ConformanceDirective2) => {
3
+ ConformanceDirective2["Echo"] = "echo";
4
+ ConformanceDirective2["Permission"] = "permission";
5
+ ConformanceDirective2["Elicit"] = "elicit";
6
+ ConformanceDirective2["Slow"] = "slow";
7
+ ConformanceDirective2["Error"] = "error";
8
+ ConformanceDirective2["Mcp"] = "mcp";
9
+ ConformanceDirective2["History"] = "history";
10
+ ConformanceDirective2["Wait"] = "wait";
11
+ ConformanceDirective2["Clear"] = "clear";
12
+ ConformanceDirective2["Big"] = "big";
13
+ return ConformanceDirective2;
14
+ })(ConformanceDirective || {});
15
+ const directive = (name, rest = "") => `${CONFORMANCE_DIRECTIVE_PREFIX}${name}${rest === "" ? "" : ` ${rest}`}`;
16
+ const parseDirective = (text) => {
17
+ const trimmed = text.trim();
18
+ if (!trimmed.startsWith(CONFORMANCE_DIRECTIVE_PREFIX)) return null;
19
+ const body = trimmed.slice(CONFORMANCE_DIRECTIVE_PREFIX.length);
20
+ const space = body.indexOf(" ");
21
+ const head = space < 0 ? body : body.slice(0, space);
22
+ const rest = space < 0 ? "" : body.slice(space + 1);
23
+ const name = Object.values(ConformanceDirective).find((value) => value === head);
24
+ return name == null ? null : { name, rest };
25
+ };
26
+ const CONFORMANCE_ELICITATION_ANSWER = "conformance-answer";
27
+ const CONFORMANCE_MCP_TOOL = "echo";
28
+ const CONFORMANCE_BIG_TOOL = "large_result";
29
+ const CONFORMANCE_ELICIT_TOOL = "ask_answer";
30
+ const CONFORMANCE_ACP_SERVER_NAME = "conformance_acp";
31
+ const CONFORMANCE_HTTP_SERVER_NAME = "conformance_http";
32
+ const CONFORMANCE_ACP_SERVER_ID = "conformance-acp";
33
+ const AFTER_SEQ_REPLAY_TYPE = "_final/after_seq";
34
+ const OBSERVE_METHOD = "_final/session/observe";
35
+ const FINAL_META_KEY = "final.ai";
36
+ import { CONFORMANCE_BIG_IMAGE_BYTES } from "./image.mjs";
37
+ const conformanceEchoText = (nonce, text) => `mcp-echo:${nonce}:${text}`;
38
+ export {
39
+ AFTER_SEQ_REPLAY_TYPE,
40
+ CONFORMANCE_ACP_SERVER_ID,
41
+ CONFORMANCE_ACP_SERVER_NAME,
42
+ CONFORMANCE_BIG_IMAGE_BYTES,
43
+ CONFORMANCE_BIG_TOOL,
44
+ CONFORMANCE_DIRECTIVE_PREFIX,
45
+ CONFORMANCE_ELICITATION_ANSWER,
46
+ CONFORMANCE_ELICIT_TOOL,
47
+ CONFORMANCE_HTTP_SERVER_NAME,
48
+ CONFORMANCE_MCP_TOOL,
49
+ ConformanceDirective,
50
+ FINAL_META_KEY,
51
+ OBSERVE_METHOD,
52
+ conformanceEchoText,
53
+ directive,
54
+ parseDirective
55
+ };
56
+ //# sourceMappingURL=protocol.mjs.map