@dual-os/sdk 0.0.0-stage → 0.8.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +19 -2
  3. package/dist/Action.d.ts +201 -0
  4. package/dist/Action.d.ts.map +1 -0
  5. package/dist/Action.js +172 -0
  6. package/dist/Action.js.map +1 -0
  7. package/dist/AgentChannel.d.ts +1717 -0
  8. package/dist/AgentChannel.d.ts.map +1 -0
  9. package/dist/AgentChannel.js +708 -0
  10. package/dist/AgentChannel.js.map +1 -0
  11. package/dist/AgentChannelConformance.d.ts +1543 -0
  12. package/dist/AgentChannelConformance.d.ts.map +1 -0
  13. package/dist/AgentChannelConformance.js +163 -0
  14. package/dist/AgentChannelConformance.js.map +1 -0
  15. package/dist/AgentChannelRuntime.d.ts +78 -0
  16. package/dist/AgentChannelRuntime.d.ts.map +1 -0
  17. package/dist/AgentChannelRuntime.js +270 -0
  18. package/dist/AgentChannelRuntime.js.map +1 -0
  19. package/dist/AiProvider.d.ts +132 -0
  20. package/dist/AiProvider.d.ts.map +1 -0
  21. package/dist/AiProvider.js +100 -0
  22. package/dist/AiProvider.js.map +1 -0
  23. package/dist/AuthMethod.d.ts +381 -0
  24. package/dist/AuthMethod.d.ts.map +1 -0
  25. package/dist/AuthMethod.js +225 -0
  26. package/dist/AuthMethod.js.map +1 -0
  27. package/dist/AuthMethodBinding.d.ts +77 -0
  28. package/dist/AuthMethodBinding.d.ts.map +1 -0
  29. package/dist/AuthMethodBinding.js +31 -0
  30. package/dist/AuthMethodBinding.js.map +1 -0
  31. package/dist/AuthMethodExecution.d.ts +223 -0
  32. package/dist/AuthMethodExecution.d.ts.map +1 -0
  33. package/dist/AuthMethodExecution.js +277 -0
  34. package/dist/AuthMethodExecution.js.map +1 -0
  35. package/dist/ConnectionResolver.d.ts +219 -0
  36. package/dist/ConnectionResolver.d.ts.map +1 -0
  37. package/dist/ConnectionResolver.js +153 -0
  38. package/dist/ConnectionResolver.js.map +1 -0
  39. package/dist/DefinitionError.d.ts +67 -0
  40. package/dist/DefinitionError.d.ts.map +1 -0
  41. package/dist/DefinitionError.js +82 -0
  42. package/dist/DefinitionError.js.map +1 -0
  43. package/dist/DualRegistry.d.ts +71 -0
  44. package/dist/DualRegistry.d.ts.map +1 -0
  45. package/dist/DualRegistry.js +96 -0
  46. package/dist/DualRegistry.js.map +1 -0
  47. package/dist/DualRuntime.d.ts +279 -0
  48. package/dist/DualRuntime.d.ts.map +1 -0
  49. package/dist/DualRuntime.js +311 -0
  50. package/dist/DualRuntime.js.map +1 -0
  51. package/dist/Files.d.ts +80 -0
  52. package/dist/Files.d.ts.map +1 -0
  53. package/dist/Files.js +66 -0
  54. package/dist/Files.js.map +1 -0
  55. package/dist/Group.d.ts +106 -0
  56. package/dist/Group.d.ts.map +1 -0
  57. package/dist/Group.js +86 -0
  58. package/dist/Group.js.map +1 -0
  59. package/dist/Http.d.ts +342 -0
  60. package/dist/Http.d.ts.map +1 -0
  61. package/dist/Http.js +677 -0
  62. package/dist/Http.js.map +1 -0
  63. package/dist/Mcp.d.ts +109 -0
  64. package/dist/Mcp.d.ts.map +1 -0
  65. package/dist/Mcp.js +176 -0
  66. package/dist/Mcp.js.map +1 -0
  67. package/dist/OAuth2TokenRefresher.d.ts +18 -0
  68. package/dist/OAuth2TokenRefresher.d.ts.map +1 -0
  69. package/dist/OAuth2TokenRefresher.js +19 -0
  70. package/dist/OAuth2TokenRefresher.js.map +1 -0
  71. package/dist/OAuthFlow.d.ts +71 -0
  72. package/dist/OAuthFlow.d.ts.map +1 -0
  73. package/dist/OAuthFlow.js +488 -0
  74. package/dist/OAuthFlow.js.map +1 -0
  75. package/dist/Plugin.d.ts +383 -0
  76. package/dist/Plugin.d.ts.map +1 -0
  77. package/dist/Plugin.js +249 -0
  78. package/dist/Plugin.js.map +1 -0
  79. package/dist/PluginRuntime.d.ts +3186 -0
  80. package/dist/PluginRuntime.d.ts.map +1 -0
  81. package/dist/PluginRuntime.js +331 -0
  82. package/dist/PluginRuntime.js.map +1 -0
  83. package/dist/Runner.d.ts +1 -0
  84. package/dist/Runner.js +124 -0
  85. package/dist/Runner.js.map +1 -0
  86. package/dist/ToolFile.d.ts +23 -0
  87. package/dist/ToolFile.d.ts.map +1 -0
  88. package/dist/ToolFile.js +33 -0
  89. package/dist/ToolFile.js.map +1 -0
  90. package/dist/Trigger.d.ts +358 -0
  91. package/dist/Trigger.d.ts.map +1 -0
  92. package/dist/Trigger.js +287 -0
  93. package/dist/Trigger.js.map +1 -0
  94. package/dist/_virtual/_rolldown/runtime.js +13 -0
  95. package/dist/index.d.ts +24 -0
  96. package/dist/index.js +24 -0
  97. package/dist/internal/auth-context.d.ts +23 -0
  98. package/dist/internal/auth-context.d.ts.map +1 -0
  99. package/dist/internal/auth-context.js +1 -0
  100. package/dist/internal/auth-execution.d.ts +27 -0
  101. package/dist/internal/auth-execution.d.ts.map +1 -0
  102. package/dist/internal/auth-execution.js +66 -0
  103. package/dist/internal/auth-execution.js.map +1 -0
  104. package/dist/internal/auth-runtime.d.ts +5 -0
  105. package/dist/internal/auth-runtime.d.ts.map +1 -0
  106. package/dist/internal/auth-runtime.js +16 -0
  107. package/dist/internal/auth-runtime.js.map +1 -0
  108. package/dist/internal/capabilities.d.ts +24 -0
  109. package/dist/internal/capabilities.d.ts.map +1 -0
  110. package/dist/internal/capabilities.js +22 -0
  111. package/dist/internal/capabilities.js.map +1 -0
  112. package/dist/internal/children.d.ts +34 -0
  113. package/dist/internal/children.d.ts.map +1 -0
  114. package/dist/internal/children.js +53 -0
  115. package/dist/internal/children.js.map +1 -0
  116. package/dist/internal/collection-utils.d.ts +4 -0
  117. package/dist/internal/collection-utils.d.ts.map +1 -0
  118. package/dist/internal/collection-utils.js +6 -0
  119. package/dist/internal/collection-utils.js.map +1 -0
  120. package/dist/internal/dual/actions.d.ts +33 -0
  121. package/dist/internal/dual/actions.d.ts.map +1 -0
  122. package/dist/internal/dual/actions.js +26 -0
  123. package/dist/internal/dual/actions.js.map +1 -0
  124. package/dist/internal/dual/invoke.d.ts +63 -0
  125. package/dist/internal/dual/invoke.d.ts.map +1 -0
  126. package/dist/internal/dual/invoke.js +75 -0
  127. package/dist/internal/dual/invoke.js.map +1 -0
  128. package/dist/internal/dual/registry.d.ts +125 -0
  129. package/dist/internal/dual/registry.d.ts.map +1 -0
  130. package/dist/internal/dual/registry.js +172 -0
  131. package/dist/internal/dual/registry.js.map +1 -0
  132. package/dist/internal/dual/triggers.d.ts +29 -0
  133. package/dist/internal/dual/triggers.d.ts.map +1 -0
  134. package/dist/internal/dual/triggers.js +26 -0
  135. package/dist/internal/dual/triggers.js.map +1 -0
  136. package/dist/internal/handler-context.d.ts +9 -0
  137. package/dist/internal/handler-context.d.ts.map +1 -0
  138. package/dist/internal/handler-context.js +31 -0
  139. package/dist/internal/handler-context.js.map +1 -0
  140. package/dist/internal/identifier.d.ts +6 -0
  141. package/dist/internal/identifier.d.ts.map +1 -0
  142. package/dist/internal/identifier.js +28 -0
  143. package/dist/internal/identifier.js.map +1 -0
  144. package/dist/internal/plugin-handlers.d.ts +38 -0
  145. package/dist/internal/plugin-handlers.d.ts.map +1 -0
  146. package/dist/internal/plugin-handlers.js +52 -0
  147. package/dist/internal/plugin-handlers.js.map +1 -0
  148. package/dist/internal/proto.d.ts +7 -0
  149. package/dist/internal/proto.d.ts.map +1 -0
  150. package/dist/internal/proto.js +10 -0
  151. package/dist/internal/proto.js.map +1 -0
  152. package/dist/internal/schema-runtime.d.ts +6 -0
  153. package/dist/internal/schema-runtime.d.ts.map +1 -0
  154. package/dist/internal/schema-runtime.js +10 -0
  155. package/dist/internal/schema-runtime.js.map +1 -0
  156. package/dist/internal/trigger-runtime-shared.d.ts +41 -0
  157. package/dist/internal/trigger-runtime-shared.d.ts.map +1 -0
  158. package/dist/internal/trigger-runtime-shared.js +132 -0
  159. package/dist/internal/trigger-runtime-shared.js.map +1 -0
  160. package/dist/internal/trigger-runtime.d.ts +12 -0
  161. package/dist/internal/trigger-runtime.d.ts.map +1 -0
  162. package/dist/internal/trigger-runtime.js +95 -0
  163. package/dist/internal/trigger-runtime.js.map +1 -0
  164. package/dist/internal/types.d.ts +7 -0
  165. package/dist/internal/types.d.ts.map +1 -0
  166. package/dist/internal/types.js +1 -0
  167. package/dist/remote-runtime.d.ts +585 -0
  168. package/dist/remote-runtime.d.ts.map +1 -0
  169. package/dist/remote-runtime.js +367 -0
  170. package/dist/remote-runtime.js.map +1 -0
  171. package/package.json +55 -4
  172. package/src/Action.ts +370 -0
  173. package/src/AgentChannel.ts +860 -0
  174. package/src/AgentChannelConformance.ts +124 -0
  175. package/src/AgentChannelRuntime.ts +616 -0
  176. package/src/AiProvider.ts +255 -0
  177. package/src/AuthMethod.ts +954 -0
  178. package/src/AuthMethodBinding.ts +112 -0
  179. package/src/AuthMethodExecution.ts +542 -0
  180. package/src/ConnectionResolver.ts +265 -0
  181. package/src/DefinitionError.ts +115 -0
  182. package/src/DualRegistry.ts +152 -0
  183. package/src/DualRuntime.ts +1081 -0
  184. package/src/Files.ts +89 -0
  185. package/src/Group.ts +292 -0
  186. package/src/Http.ts +1205 -0
  187. package/src/Mcp.ts +299 -0
  188. package/src/OAuth2TokenRefresher.ts +22 -0
  189. package/src/OAuthFlow.ts +874 -0
  190. package/src/Plugin.ts +912 -0
  191. package/src/PluginRuntime.ts +414 -0
  192. package/src/Runner.ts +248 -0
  193. package/src/ToolFile.ts +28 -0
  194. package/src/Trigger.ts +722 -0
  195. package/src/index.ts +158 -0
  196. package/src/internal/auth-context.ts +27 -0
  197. package/src/internal/auth-execution.ts +241 -0
  198. package/src/internal/auth-runtime.ts +20 -0
  199. package/src/internal/capabilities.ts +55 -0
  200. package/src/internal/children.ts +126 -0
  201. package/src/internal/collection-utils.ts +8 -0
  202. package/src/internal/dual/actions.ts +116 -0
  203. package/src/internal/dual/invoke.ts +307 -0
  204. package/src/internal/dual/registry.ts +340 -0
  205. package/src/internal/dual/triggers.ts +128 -0
  206. package/src/internal/handler-context.ts +57 -0
  207. package/src/internal/identifier.ts +27 -0
  208. package/src/internal/plugin-handlers.ts +146 -0
  209. package/src/internal/proto.ts +8 -0
  210. package/src/internal/schema-runtime.ts +15 -0
  211. package/src/internal/trigger-runtime-shared.ts +449 -0
  212. package/src/internal/trigger-runtime.ts +223 -0
  213. package/src/internal/types.ts +12 -0
  214. package/src/remote-runtime.ts +469 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Http.js","names":["ToolFile.Schema","Files.read","Files.File","Action.ActionHandlerError","Action.fromHttpClientFailure","Files.write","Mcp.connect","Mcp.CallToolResult","Mcp.McpError"],"sources":["../src/Http.ts"],"sourcesContent":["/**\n * The HTTP runtime of generated API plugins: each operation's contract and call, request encoding,\n * response decoding, continuation links, redirects and uploads.\n *\n * @since 0.0.0\n */\nimport {\n Array,\n Boolean,\n DateTime,\n Effect,\n Equal,\n Option,\n Order,\n Predicate,\n Random,\n Record,\n Result,\n Schema,\n SchemaGetter,\n SchemaIssue,\n String,\n flow,\n pipe,\n} from \"effect\";\nimport type { SchemaAST } from \"effect\";\n\nimport { Base64, Base64Url } from \"effect/encoding\";\nimport {\n FetchHttpClient,\n HttpBody,\n HttpClient,\n HttpClientError,\n HttpClientRequest,\n} from \"effect/http\";\nimport type { HttpClientResponse } from \"effect/http\";\n\nimport * as Action from \"./Action.ts\";\nimport type * as AuthMethod from \"./AuthMethod.ts\";\nimport { Files } from \"./Files.ts\";\nimport { Mcp } from \"./Mcp.ts\";\nimport * as ToolFile from \"./ToolFile.ts\";\n\nfunction preserveJsonProperties<A, Input>(value: A, input: Input): A {\n if (Equal.equals(value, input)) return value;\n if (Array.isArray(value) && Array.isArray(input)) {\n for (const entry of Array.zip(value, input)) preserveJsonProperties(entry[0], entry[1]);\n } else if (Predicate.isObject(value) && Predicate.isObject(input)) {\n for (const entry of Record.toEntries(input)) {\n if (Record.has(value, entry[0])) {\n preserveJsonProperties(value[entry[0]], entry[1]);\n } else {\n Object.defineProperty(value, entry[0], {\n configurable: true,\n enumerable: true,\n value: entry[1],\n writable: true,\n });\n }\n }\n }\n return value;\n}\n\nfunction decodeResponse<Output extends Schema.Top>(output: Output) {\n return flow(\n Effect.succeed,\n Effect.flatMap(input =>\n pipe(\n Schema.decodeUnknownEffect(output)(input),\n Effect.map(value => preserveJsonProperties(value, input)),\n ),\n ),\n );\n}\n\n/**\n * An action's input and output schemas.\n *\n * @since 0.0.0\n * @category models\n */\nexport interface Contract {\n readonly input: Schema.Top;\n readonly output: Schema.Top;\n}\n\n/**\n * Runs an action: its input in, its output or a failure out.\n *\n * @since 0.0.0\n * @category models\n */\nexport type Handler<Methods extends readonly AuthMethod.Any[], Input, Output> = (\n input: Input,\n context: Action.HandlerContext<Methods>,\n) => Effect.Effect<Output, Action.ActionHandlerFailure, HttpClient.HttpClient>;\n\n/**\n * A file input: a ToolFile as a download returns it, or just its bytes with a type and name.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport type File = typeof File.Type;\nexport const File = Schema.Struct({\n _tag: Schema.optionalKey(Schema.Literal(\"ToolFile\")),\n contentBase64: Schema.Uint8ArrayFromBase64,\n contentType: Schema.optionalKey(Schema.NullOr(Schema.String)),\n filename: Schema.optionalKey(Schema.NullOr(Schema.String)),\n sizeBytes: Schema.optionalKey(Schema.Natural),\n}).annotate({\n description:\n \"A ToolFile, such as the result of a download, passed unchanged; or its contentBase64 with an optional contentType and filename.\",\n});\n\nconst signatures: [string, [number, number[]][]][] = [\n [\"image/jpeg\", [[0, [0xff, 0xd8, 0xff]]]],\n [\"image/png\", [[0, [0x89, 0x50, 0x4e, 0x47]]]],\n [\"image/gif\", [[0, [0x47, 0x49, 0x46, 0x38]]]],\n [\n \"image/webp\",\n [\n [0, [0x52, 0x49, 0x46, 0x46]],\n [8, [0x57, 0x45, 0x42, 0x50]],\n ],\n ],\n [\"application/pdf\", [[0, [0x25, 0x50, 0x44, 0x46]]]],\n [\"application/zip\", [[0, [0x50, 0x4b, 0x03, 0x04]]]],\n];\n\nconst utf8 = new TextDecoder(\"utf-8\", { fatal: true });\n\nfunction sniff(bytes: Uint8Array) {\n return pipe(\n Array.findFirst(signatures, signature =>\n Array.every(signature[1], part =>\n Array.every(part[1], (byte, index) => bytes[part[0] + index] === byte),\n ),\n ),\n Option.map(signature => signature[0]),\n Option.orElse(() =>\n Option.liftPredicate(\"text/plain\", () =>\n Result.isSuccess(Result.try(() => utf8.decode(bytes))),\n ),\n ),\n Option.getOrNull,\n );\n}\n\nfunction toolFile(bytes: Uint8Array, declared: string | null, filename: string | null) {\n return {\n _tag: \"ToolFile\",\n contentBase64: Base64.encode(bytes),\n contentType:\n declared === null || pipe(declared, String.startsWith(\"application/octet-stream\"))\n ? (sniff(bytes) ?? declared)\n : declared,\n filename,\n sizeBytes: bytes.byteLength,\n } satisfies ToolFile.File;\n}\n\nfunction invalid(expected: string, value: unknown, options: SchemaAST.ParseOptions) {\n return Effect.fail(new SchemaIssue.InvalidValue({ expected }, value, options));\n}\n\nfunction decodeBytes(text: string, options: SchemaAST.ParseOptions) {\n return Result.match(\n Base64Url.decode(pipe(text, String.replaceAll(\"+\", \"-\"), String.replaceAll(\"/\", \"_\"))),\n {\n onFailure: () => invalid(\"a Base64 or Base64Url string\", text, options),\n onSuccess: bytes => Effect.succeed(bytes),\n },\n );\n}\n\ntype Carrier = \"base64\" | \"base64url\" | \"data-uri\";\n\ninterface Content {\n bytes: Uint8Array;\n contentType: string | null;\n}\n\nfunction contentOf(carrier: Carrier) {\n return SchemaGetter.transformEffect<Content, string>((text, options) => {\n if (carrier !== \"data-uri\") {\n return Effect.map(decodeBytes(text, options), bytes => ({ bytes, contentType: null }));\n }\n return Option.match(pipe(text, String.match(/^data:([^;,]*)(?:;[^;,]*)*;base64,(.*)$/su)), {\n onNone: () => invalid(\"a Base64 data URI\", text, options),\n onSome: parts =>\n Effect.map(decodeBytes(Array.getUnsafe(parts, 2), options), bytes => ({\n bytes,\n contentType: pipe(\n Array.getUnsafe(parts, 1),\n Option.liftPredicate(String.isNonEmpty),\n Option.getOrNull,\n ),\n })),\n });\n });\n}\n\nfunction textOf(carrier: Carrier, content: Content) {\n if (carrier === \"base64\") return Base64.encode(content.bytes);\n if (carrier === \"base64url\") return Base64Url.encode(content.bytes);\n const contentType = content.contentType ?? sniff(content.bytes) ?? \"application/octet-stream\";\n return `data:${contentType};base64,${Base64.encode(content.bytes)}`;\n}\n\nfunction fileFrom(carrier: Carrier) {\n return Schema.String.pipe(\n Schema.decodeTo(ToolFile.Schema, {\n decode: SchemaGetter.compose(\n contentOf(carrier),\n SchemaGetter.transform(content => toolFile(content.bytes, content.contentType, null)),\n ),\n encode: SchemaGetter.transformEffect((file: ToolFile.File, options) =>\n Effect.map(decodeBytes(file.contentBase64, options), bytes =>\n textOf(carrier, { bytes, contentType: file.contentType }),\n ),\n ),\n }),\n );\n}\n\nfunction encodedFrom(carrier: Carrier) {\n return File.pipe(\n Schema.decodeTo(Schema.String, {\n decode: SchemaGetter.transform(file =>\n textOf(carrier, { bytes: file.contentBase64, contentType: file.contentType ?? null }),\n ),\n encode: SchemaGetter.compose(\n contentOf(carrier),\n SchemaGetter.transform(content => ({\n contentBase64: content.bytes,\n contentType: content.contentType,\n })),\n ),\n }),\n );\n}\n\n/**\n * A file the API returns as a Base64 string inside JSON, decoded into a ToolFile with its content\n * type recognized from the bytes.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport const FileFromBase64 = fileFrom(\"base64\");\n\n/**\n * {@link FileFromBase64} for an API that writes the file in Base64Url.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport const FileFromBase64Url = fileFrom(\"base64url\");\n\n/**\n * A {@link File} input the API reads as a Base64 string inside JSON.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport const Base64FromFile = encodedFrom(\"base64\");\n\n/**\n * {@link Base64FromFile} for an API that reads the file in Base64Url.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport const Base64UrlFromFile = encodedFrom(\"base64url\");\n\n/**\n * {@link FileFromBase64} for an API that writes the file as a data URI, which also carries its\n * content type.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport const FileFromDataUri = fileFrom(\"data-uri\");\n\n/**\n * {@link Base64FromFile} for an API that reads the file as a data URI, built from the file's\n * content type.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport const DataUriFromFile = encodedFrom(\"data-uri\");\n\ntype DateTimeText = typeof DateTimeText.Type;\nconst DateTimeText = Schema.String.annotate({ format: \"date-time\" });\n\nconst rfc3339 = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2})(?:\\.\\d+)?(?:Z|([+-]\\d{2}:\\d{2}))$/u;\n\n/** The instant of an RFC 3339 date-time with its offset; an impossible date such as February 30 has none. */\nfunction rfc3339Instant(text: string) {\n return pipe(\n Option.fromNullishOr(rfc3339.exec(text)),\n Option.flatMap(match =>\n Option.filter(DateTime.makeZoned(text, { timeZone: match[2] ?? \"+00:00\" }), zoned =>\n String.startsWith(match[1] ?? \"\")(DateTime.formatIsoOffset(zoned)),\n ),\n ),\n Option.map(DateTime.toUtc),\n );\n}\n\nfunction instants<Wire>(\n wire: Schema.Codec<Wire>,\n expected: string,\n read: (value: Wire) => Option.Option<DateTime.Utc>,\n write: (instant: DateTime.Utc) => Wire,\n) {\n const fromWire = SchemaGetter.transformEffect<string, Wire>((value, options) =>\n Option.match(read(value), {\n onNone: () => invalid(expected, value, options),\n onSome: instant => Effect.succeed(DateTime.formatIso(instant)),\n }),\n );\n const toWire = SchemaGetter.transformEffect<Wire, string>((text, options) =>\n Option.match(rfc3339Instant(text), {\n onNone: () => invalid(\"an ISO 8601 date-time\", text, options),\n onSome: instant => Effect.succeed(write(instant)),\n }),\n );\n return {\n input: pipe(DateTimeText, Schema.decodeTo(wire, { decode: toWire, encode: fromWire })),\n output: pipe(wire, Schema.decodeTo(DateTimeText, { decode: fromWire, encode: toWire })),\n };\n}\n\nconst unixSeconds = instants(\n Schema.Int,\n \"Unix seconds\",\n seconds => Option.map(DateTime.make(seconds * 1000), DateTime.toUtc),\n instant => Math.floor(DateTime.toEpochMillis(instant) / 1000),\n);\n\nconst rfc2822 = instants(\n Schema.String,\n \"an RFC 2822 date-time\",\n text => Option.map(DateTime.make(text), DateTime.toUtc),\n instant => DateTime.toDateUtc(instant).toUTCString(),\n);\n\n/**\n * A date-time the API writes as Unix seconds, decoded into an ISO 8601 UTC string.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport const DateTimeFromUnixSeconds = unixSeconds.output;\n\n/**\n * An ISO 8601 date-time input the API reads as Unix seconds.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport const UnixSecondsFromDateTime = unixSeconds.input;\n\n/**\n * A date-time the API writes in RFC 2822 form, decoded into an ISO 8601 UTC string.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport const DateTimeFromRfc2822 = rfc2822.output;\n\n/**\n * An ISO 8601 date-time input the API reads in RFC 2822 form.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport const Rfc2822FromDateTime = rfc2822.input;\n\n/**\n * An action output whose response decodes into a different shape, such as a file the API sends as\n * Base64: the action declares the decoded shape and the call decodes the response with `wire`.\n *\n * @since 0.0.0\n * @category models\n */\nexport interface Decoded<Wire extends Schema.Top> {\n readonly _tag: \"Decoded\";\n readonly wire: Wire;\n}\n\n/**\n * Declares an output by the response schema it decodes from; see {@link Decoded}.\n *\n * @since 0.0.0\n * @category constructors\n */\nexport function decoded<const Wire extends Schema.Top>(wire: Wire): Decoded<Wire> {\n return { _tag: \"Decoded\", wire };\n}\n\ntype Request =\n | HttpClientRequest.HttpClientRequest\n | Effect.Effect<HttpClientRequest.HttpClientRequest, Action.ActionHandlerError>;\n\n/** `binary` returns a released version's base64 `ToolFile`; `file` stores the body as a file. */\ntype Body = \"json\" | \"text\" | \"binary\" | \"file\" | \"void\" | \"unknown\";\n\ntype GraphqlResponse = typeof GraphqlResponse.Type;\nconst GraphqlResponse = Schema.Struct({\n data: Schema.optionalKey(Schema.NullOr(Schema.Record(Schema.String, Schema.Unknown))),\n errors: Schema.optionalKey(\n Schema.Array(\n Schema.StructWithRest(Schema.Struct({ message: Schema.String }), [\n Schema.Record(Schema.String, Schema.Unknown),\n ]),\n ),\n ),\n});\n\n/**\n * A response status, media type and decoding mode advertised by an HTTP action.\n *\n * @since 0.4.1\n * @category models\n */\nexport interface Variant {\n readonly status?: number;\n readonly contentType: string;\n readonly body: Body;\n readonly headers?: readonly string[];\n}\n\ntype Media =\n | { readonly contentBase64: Uint8Array; readonly contentType?: string | null }\n | Files.File;\n\ntype Upload =\n | { readonly mode: \"media\"; readonly media: Media }\n | { readonly mode: \"multipart\"; readonly media: Media; readonly metadata: unknown }\n | {\n readonly mode: \"start\";\n readonly contentType: string;\n readonly metadata?: unknown;\n readonly totalBytes: number;\n }\n | {\n readonly mode: \"chunk\";\n readonly sessionUrl: string;\n readonly totalBytes: number;\n readonly offset: number;\n readonly media: Media;\n }\n | { readonly mode: \"status\"; readonly sessionUrl: string; readonly totalBytes: number };\n\nfunction coerce(value: unknown) {\n return Predicate.isObject(value) ? JSON.stringify(value) : `${value}`;\n}\n\n/**\n * Encodes a path parameter as one segment.\n *\n * @since 0.0.0\n * @category encoding\n */\nexport function path(value: unknown) {\n return encodeURIComponent(coerce(value));\n}\n\n/**\n * Encodes a path parameter written inside single quotes, an OData string literal, doubling its\n * quotes: `O'Brien` in `People('{name}')` is sent as `People('O''Brien')`.\n *\n * @since 0.0.0\n * @category encoding\n */\nexport function literal(value: unknown) {\n return path(pipe(coerce(value), String.replaceAll(\"'\", \"''\")));\n}\n\n/**\n * Encodes a path parameter whose slashes stay path separators.\n *\n * @since 0.0.0\n * @category encoding\n */\nexport function segments(value: unknown) {\n return Array.join(Array.map(String.split(coerce(value), \"/\"), encodeURIComponent), \"/\");\n}\n\nfunction deepObject(name: string, value: unknown): [string, string][] {\n if (Array.isArray(value)) {\n return Array.flatMap(value, (item, index) => deepObject(`${name}[${index}]`, item));\n }\n if (Predicate.isObject(value)) {\n return Array.flatMap(Record.toEntries(value), entry =>\n deepObject(`${name}[${entry[0]}]`, entry[1]),\n );\n }\n return value === undefined ? [] : [[name, coerce(value)]];\n}\n\n/**\n * Query, header or form entries, repeating array values unless their name is joined, and encoding\n * `deep` names as bracketed keys such as `metadata[plan]` and `expand[0]`. A joined name is\n * comma-separated, or separated by the delimiter it is paired with, such as `[\"ids\", \"|\"]`.\n * `exploded` object parameters use their property names as query keys (`role=vet&active=true`).\n *\n * @since 0.0.0\n * @category encoding\n */\nexport function params(\n fields: Record.ReadonlyRecord<string, unknown>,\n joined: readonly (string | readonly [string, string])[] = [],\n deep: readonly string[] = [],\n exploded: readonly string[] = [],\n) {\n return Array.flatMap(Record.toEntries(fields), field => {\n if (field[1] === undefined) return [];\n if (Array.contains(deep, field[0])) return deepObject(field[0], field[1]);\n const values = field[1];\n if (\n Array.contains(exploded, field[0]) &&\n Predicate.isObject(values) &&\n !Array.isArray(values)\n ) {\n return Array.filterMap(Record.toEntries(values), entry =>\n entry[1] === undefined\n ? Result.failVoid\n : Result.succeed([entry[0], coerce(entry[1])] as const),\n );\n }\n if (!Array.isArray(values)) return [[field[0], coerce(values)] as const];\n const separator = Array.findFirst(joined, entry => {\n const pair = Predicate.isString(entry) ? ([entry, \",\"] as const) : entry;\n return pair[0] === field[0] ? Option.some(pair[1]) : Option.none();\n });\n return Option.match(separator, {\n onNone: () => Array.map(values, item => [field[0], coerce(item)] as const),\n onSome: value => [[field[0], Array.join(Array.map(values, coerce), value)] as const],\n });\n });\n}\n\nfunction filePart(bytes: Uint8Array, name: string, contentType: string) {\n return new globalThis.File([new Uint8Array(bytes)], name, { type: contentType });\n}\n\n/**\n * Multipart form fields, sending each {@link File} as a file part.\n *\n * @since 0.0.0\n * @category encoding\n */\nexport function form(payload: Record.ReadonlyRecord<string, unknown>) {\n return Record.map(payload, (value, name) =>\n Array.map(Array.ensure(value), item => {\n if (item === undefined) return undefined;\n if (!Schema.is(File)(item)) return coerce(item);\n return filePart(\n item.contentBase64,\n item.filename ?? name,\n item.contentType ?? \"application/octet-stream\",\n );\n }),\n );\n}\n\nfunction fileFailed(error: Files.FileError) {\n return Action.ActionHandlerError.make({ cause: error, message: error.message });\n}\n\nfunction readFile(file: Files.File) {\n return pipe(Files.read(file), Effect.mapError(fileFailed));\n}\n\n/**\n * Sends a file as the raw request body.\n *\n * @since 0.1.0\n * @category encoding\n */\nexport const withFile = Effect.fnUntraced(function* (\n request: HttpClientRequest.HttpClientRequest,\n file: Files.File,\n) {\n return HttpClientRequest.bodyUint8Array(request, yield* readFile(file), file.contentType);\n});\n\n/**\n * Sends multipart form fields, each {@link Files.File} as a file part.\n *\n * @since 0.1.0\n * @category encoding\n */\nexport const withForm = Effect.fnUntraced(function* (\n request: HttpClientRequest.HttpClientRequest,\n payload: Record.ReadonlyRecord<string, unknown>,\n) {\n return HttpClientRequest.bodyFormDataRecord(\n request,\n Record.fromEntries(\n yield* Effect.forEach(Record.toEntries(payload), field =>\n Effect.map(\n Effect.forEach(\n Array.filter(Array.ensure(field[1]), item => item !== undefined),\n item =>\n Effect.gen(function* () {\n if (!Schema.is(Files.File)(item)) return coerce(item);\n return filePart(yield* readFile(item), item.name, item.contentType);\n }),\n ),\n parts => [field[0], parts] satisfies [string, (string | globalThis.File)[]],\n ),\n ),\n ),\n );\n});\n\nfunction mediaBytes(media: Media) {\n if (Schema.is(Files.File)(media)) {\n return Effect.map(readFile(media), bytes => ({ bytes, contentType: media.contentType }));\n }\n return Effect.succeed({\n bytes: media.contentBase64,\n contentType: Option.getOrNull(Option.fromNullishOr(media.contentType)),\n });\n}\n\nfunction isSafeUrl(value: string, origin?: string) {\n if (!URL.canParse(value)) return false;\n const url = new URL(value);\n return (\n url.protocol === \"https:\" &&\n url.username === \"\" &&\n url.password === \"\" &&\n (origin === undefined || url.origin === origin)\n );\n}\n\nfunction refused(message: string) {\n return Effect.fail(Action.ActionHandlerError.make({ message }));\n}\n\n/**\n * Follows a returned next-page link on the operation's own origin: only its path and query are\n * taken, so the connection's host routing applies and credentials never reach another host.\n *\n * @since 0.0.0\n * @category requests\n */\nexport function continuation(request: HttpClientRequest.HttpClientRequest, nextLink?: string) {\n if (nextLink === undefined) return Effect.succeed(request);\n const declared = new URL(request.url);\n const next = URL.canParse(nextLink) ? new URL(nextLink) : undefined;\n if (next === undefined || !isSafeUrl(nextLink) || next.pathname !== declared.pathname) {\n return refused(\"A continuation URL must be an HTTPS link to the same operation path\");\n }\n return Effect.succeed(\n HttpClientRequest.make(request.method)(`${declared.origin}${next.pathname}${next.search}`, {\n headers: request.headers,\n }),\n );\n}\n\n/**\n * A request to a preauthenticated upload URL, which is sent without the connection's credentials.\n *\n * @since 0.0.0\n * @category requests\n */\nexport function preauthenticated(\n method: (url: string) => HttpClientRequest.HttpClientRequest,\n url: string,\n ...steps: readonly ((\n request: HttpClientRequest.HttpClientRequest,\n ) => HttpClientRequest.HttpClientRequest)[]\n) {\n if (!isSafeUrl(url)) return refused(\"An upload session requires a preauthenticated HTTPS URL\");\n return Effect.succeed(Array.reduce(steps, method(url), (request, step) => step(request)));\n}\n\nfunction failure(\n error:\n | Action.ActionHandlerError\n | Action.HttpClientFailure\n | { readonly cause: unknown; readonly response: HttpClientResponse.HttpClientResponse },\n) {\n return Schema.is(Action.ActionHandlerError)(error) ? error : Action.fromHttpClientFailure(error);\n}\n\n// Like HttpClient.followRedirects, except that a redirect to another origin sends no\n// request header at all: auth methods may set any header, such as GitLab's PRIVATE-TOKEN.\nfunction redirect(response: HttpClientResponse.HttpClientResponse) {\n const location = response.headers[\"location\"];\n if (response.status < 300 || response.status >= 400 || location === undefined) return undefined;\n const sent = response.request;\n const url = new URL(location, sent.url);\n const request =\n (response.status === 303 && sent.method !== \"GET\" && sent.method !== \"HEAD\") ||\n ((response.status === 301 || response.status === 302) && sent.method === \"POST\")\n ? HttpClientRequest.setBody(HttpClientRequest.setMethod(sent, \"GET\"), HttpBody.empty)\n : sent;\n return url.origin === new URL(sent.url).origin\n ? HttpClientRequest.setUrl(request, url)\n : HttpClientRequest.make(request.method)(url, { body: request.body });\n}\n\nfunction follow(\n client: HttpClient.HttpClient,\n response: HttpClientResponse.HttpClientResponse,\n redirects: number,\n): Effect.Effect<HttpClientResponse.HttpClientResponse, HttpClientError.HttpClientError> {\n const next = redirect(response);\n return next === undefined || redirects === 10\n ? Effect.succeed(response)\n : Effect.flatMap(client.execute(next), result => follow(client, result, redirects + 1));\n}\n\n/** The file name a `Content-Disposition` header suggests, preferring its encoded form. */\nfunction dispositionName(header?: string) {\n if (header === undefined) return undefined;\n const encoded = pipe(\n String.match(/(?:^|;)\\s*filename\\*\\s*=\\s*UTF-8'[^']*'([^;]+)/iu)(header),\n Option.flatMap(match => Option.fromUndefinedOr(match[1])),\n );\n const decoded = pipe(\n encoded,\n Option.flatMap(value => Option.liftThrowable(() => decodeURIComponent(String.trim(value)))()),\n );\n return Option.getOrElse(decoded, () =>\n pipe(\n String.match(/(?:^|;)\\s*filename\\s*=\\s*(?:\"((?:\\\\.|[^\"\\\\])*)\"|([^;]*))/iu)(header),\n Option.flatMap(match =>\n Option.orElse(\n Option.map(Option.fromUndefinedOr(match[1]), name =>\n String.replace(/\\\\(.)/gu, \"$1\")(name),\n ),\n () => Option.map(Option.fromUndefinedOr(match[2]), String.trim),\n ),\n ),\n Option.getOrUndefined,\n ),\n );\n}\n\nconst read = Effect.fnUntraced(function* (\n response: HttpClientResponse.HttpClientResponse,\n body: Body,\n) {\n if (body === \"json\") return yield* response.json;\n if (body === \"text\") return yield* response.text;\n if (body === \"void\") return {};\n if (body === \"unknown\") {\n const text = yield* response.text;\n if (String.isEmpty(String.trim(text))) return null;\n return Option.getOrElse(\n Schema.decodeOption(Schema.fromJsonString(Schema.Json))(text),\n () => text,\n );\n }\n const bytes = new Uint8Array(yield* response.arrayBuffer);\n const name = dispositionName(response.headers[\"content-disposition\"]);\n if (body === \"file\") {\n return yield* pipe(\n Files.write({\n bytes,\n contentType: Option.getOrNull(Option.fromUndefinedOr(response.headers[\"content-type\"])),\n name: name ?? \"file\",\n }),\n Effect.mapError(fileFailed),\n );\n }\n return toolFile(bytes, response.headers[\"content-type\"] ?? null, name ?? null);\n});\n\n/**\n * One API operation as {@link make} returns it: its contract and the call that performs it. The\n * `Context` parameter lets a package name its handler context once, so declaration files print\n * `Endpoint<Context, …>` instead of repeating its auth methods in every action.\n *\n * @since 0.0.0\n * @category models\n */\nexport interface Endpoint<Context, Input extends Schema.Top, Output extends Schema.Top> {\n readonly input: Input;\n readonly output: Output;\n readonly run: (\n input: Input[\"Type\"],\n context: Context,\n ) => Effect.Effect<Output[\"Type\"], Action.ActionHandlerFailure, HttpClient.HttpClient>;\n}\n\n/**\n * An {@link Endpoint} whose output is the decoded type of the response schema it keeps as `wire`.\n *\n * @since 0.0.0\n * @category models\n */\nexport interface DecodedEndpoint<Context, Input extends Schema.Top, Wire extends Schema.Top> {\n readonly input: Input;\n readonly output: Schema.toType<Wire>;\n readonly wire: Wire;\n readonly run: (\n input: Input[\"Type\"],\n context: Context,\n ) => Effect.Effect<Wire[\"Type\"], Action.ActionHandlerFailure, HttpClient.HttpClient>;\n}\n\n/**\n * Binds the runtime to a package's auth module: the calls a generated version file makes. Its\n * `authorize` applies a connection's credentials to the client. Its optional `checkResponse` fails\n * a successful response that reports a failed call, such as Slack's `{ ok: false, error }`.\n * `preauthenticatedUploadUrl` restricts credential-free upload requests and every redirect to\n * provider-approved HTTPS URLs, without changing authenticated calls or other providers.\n *\n * @since 0.0.0\n * @category constructors\n */\nexport function make<\n const Methods extends readonly AuthMethod.Any[],\n Context extends Action.HandlerContext<Methods> = Action.HandlerContext<Methods>,\n>(auth: {\n readonly authorize: (\n client: HttpClient.HttpClient,\n context: Action.HandlerContext<Methods>,\n ) => HttpClient.HttpClient;\n readonly checkResponse?: (\n response: HttpClientResponse.HttpClientResponse,\n ) => Effect.Effect<void, Action.ActionHandlerError | HttpClientError.HttpClientError>;\n readonly preauthenticatedUploadUrl?: Schema.Schema<string>;\n}) {\n const { authorize, checkResponse = () => Effect.void } = auth;\n const send = Effect.fnUntraced(function* (context: Context | undefined, request: Request) {\n const base = yield* HttpClient.HttpClient;\n const uploadPolicy = context === undefined ? auth.preauthenticatedUploadUrl : undefined;\n const client =\n uploadPolicy === undefined\n ? base\n : HttpClient.mapRequestEffect(base, outgoing =>\n isSafeUrl(outgoing.url) && Schema.is(uploadPolicy)(outgoing.url)\n ? Effect.succeed(outgoing)\n : Effect.fail(\n new HttpClientError.HttpClientError({\n reason: new HttpClientError.InvalidUrlError({\n description: \"The upload URL is not an approved provider HTTPS destination\",\n request: outgoing,\n }),\n }),\n ),\n );\n const transport = HttpClient.transformResponse(\n client,\n Effect.flatMap(response => follow(client, response, 0)),\n );\n const authorized = context === undefined ? transport : authorize(transport, context);\n const execution = authorized.execute(Effect.isEffect(request) ? yield* request : request);\n const options = yield* Effect.serviceOption(FetchHttpClient.RequestInit);\n const response = yield* Boolean.match(uploadPolicy !== undefined, {\n onFalse: () => execution,\n onTrue: () =>\n Effect.provideService(execution, FetchHttpClient.RequestInit, {\n ...Option.getOrElse(options, () => ({})),\n redirect: \"manual\",\n }),\n });\n if (response.status < 200 || response.status >= 300) {\n return yield* Effect.fail({ cause: yield* response.text, response });\n }\n yield* checkResponse(response);\n return response;\n });\n\n /**\n * One API operation: its action contract and the call that performs it. A {@link Decoded} output\n * declares the decoded shape and hands the call its response schema.\n */\n function endpoint<const Input extends Schema.Top, const Output extends Schema.Top>(\n contract: { readonly input: Input; readonly output: Output },\n run: (\n input: Input[\"Type\"],\n context: Context,\n output: Output,\n ) => Effect.Effect<Output[\"Type\"], Action.ActionHandlerFailure, HttpClient.HttpClient>,\n ): Endpoint<Context, Input, Output>;\n function endpoint<const Input extends Schema.Top, const Wire extends Schema.Top>(\n contract: { readonly input: Input; readonly output: Decoded<Wire> },\n run: (\n input: Input[\"Type\"],\n context: Context,\n output: Wire,\n ) => Effect.Effect<Wire[\"Type\"], Action.ActionHandlerFailure, HttpClient.HttpClient>,\n ): DecodedEndpoint<Context, Input, Wire>;\n function endpoint<const Input extends Schema.Top, const Output extends Schema.Top>(\n contract: { readonly input: Input; readonly output: Output | Decoded<Output> },\n run: (\n input: Input[\"Type\"],\n context: Context,\n output: Output,\n ) => Effect.Effect<Output[\"Type\"], Action.ActionHandlerFailure, HttpClient.HttpClient>,\n ) {\n if (!Schema.isSchema(contract.output)) {\n const wire = contract.output.wire;\n return {\n input: contract.input,\n output: Schema.toType(wire),\n run: (input: Input[\"Type\"], context: Context) => run(input, context, wire),\n wire,\n };\n }\n const output = contract.output;\n return {\n input: contract.input,\n output,\n run: (input: Input[\"Type\"], context: Context) => run(input, context, output),\n };\n }\n\n /** Sends a request and decodes its body as the operation's single response. */\n function execute<Output extends Schema.Top>(\n context: Context | undefined,\n output: Output,\n request: Request,\n body: Body,\n ) {\n return pipe(\n send(context, request),\n Effect.flatMap(response => read(response, body)),\n Effect.flatMap(decodeResponse(output)),\n Effect.mapError(failure),\n );\n }\n\n /** Sends a request and decodes the declared response variant its status and media type select. */\n const variants = Effect.fnUntraced(function* <Output extends Schema.Top>(\n context: Context | undefined,\n output: Output,\n request: Request,\n declared: readonly Variant[],\n media?: boolean,\n ) {\n const response = yield* send(context, request);\n const exact = Array.flatMap(declared, variant =>\n variant.status === undefined ? [] : [variant.status],\n );\n const contentType = pipe(\n response.headers[\"content-type\"] ?? \"\",\n String.split(\";\"),\n Array.headNonEmpty,\n String.trim,\n String.toLowerCase,\n );\n const ordered = Array.sort(\n declared,\n Order.mapInput(Order.Number, (variant: Variant) => {\n if (variant.body === \"void\" || variant.body === \"unknown\") return 3;\n if (variant.contentType === \"*/*\") return 2;\n return pipe(variant.contentType, String.endsWith(\"/*\")) ? 1 : 0;\n }),\n );\n const variant = Array.findFirst(ordered, candidate => {\n const status =\n candidate.status === undefined\n ? !Array.contains(exact, response.status)\n : candidate.status === response.status;\n if (!status) return false;\n if (media !== undefined) {\n return (candidate.body === \"binary\" || candidate.body === \"file\") === media;\n }\n if (\n candidate.body === \"void\" ||\n candidate.body === \"unknown\" ||\n candidate.contentType === \"*/*\"\n ) {\n return true;\n }\n if (pipe(candidate.contentType, String.endsWith(\"/*\"))) {\n return pipe(\n contentType,\n String.startsWith(pipe(candidate.contentType, String.slice(0, -1))),\n );\n }\n return contentType === candidate.contentType;\n });\n if (Option.isNone(variant)) {\n return yield* Effect.fail({\n cause: \"The API returned an undeclared successful response\",\n response,\n });\n }\n const headers = Array.flatMap(variant.value.headers ?? [], name => {\n const value = response.headers[String.toLowerCase(name)];\n return value === undefined ? [] : [[name, value] as const];\n });\n return yield* decodeResponse(output)({\n body: yield* read(response, variant.value.body),\n contentType: variant.value.contentType,\n status: response.status,\n ...(variant.value.headers === undefined ? {} : { headers: Record.fromEntries(headers) }),\n });\n }, Effect.mapError(failure));\n\n /** Google's media, multipart and resumable upload protocols. */\n const googleUpload = Effect.fnUntraced(function* <Output extends Schema.Top>(\n context: Context,\n output: Output,\n request: HttpClientRequest.HttpClientRequest,\n payload: Upload,\n options: { readonly maxSize?: number; readonly resumable?: string },\n ) {\n const client = authorize(yield* HttpClient.HttpClient, context);\n const media = \"media\" in payload ? yield* mediaBytes(payload.media) : undefined;\n const size = \"totalBytes\" in payload ? payload.totalBytes : (media?.bytes.byteLength ?? 0);\n if (size < 0 || (options.maxSize !== undefined && size > options.maxSize)) {\n return yield* refused(\"The upload size is outside the API's declared limit\");\n }\n const origin = new URL(request.url).origin;\n if (payload.mode === \"start\") {\n if (options.resumable === undefined) {\n return yield* refused(\"This API has no resumable upload protocol\");\n }\n const response = yield* client.execute(\n pipe(\n HttpClientRequest.setUrl(request, options.resumable),\n HttpClientRequest.setUrlParam(\"uploadType\", \"resumable\"),\n HttpClientRequest.setHeaders({\n \"x-upload-content-length\": `${size}`,\n \"x-upload-content-type\": payload.contentType,\n }),\n HttpClientRequest.bodyJsonUnsafe(payload.metadata ?? {}),\n ),\n );\n if (response.status < 200 || response.status >= 300) {\n return yield* Effect.fail({ cause: yield* response.text, response });\n }\n const sessionUrl = response.headers[\"location\"];\n if (sessionUrl === undefined || !isSafeUrl(sessionUrl, origin)) {\n return yield* Effect.fail({\n cause: \"The API returned an invalid upload session URL\",\n response,\n });\n }\n return yield* decodeResponse(output)({ nextOffset: 0, sessionUrl, state: \"pending\" });\n }\n if (payload.mode === \"chunk\" || payload.mode === \"status\") {\n if (!isSafeUrl(payload.sessionUrl, origin)) {\n return yield* refused(\"The upload session URL must use the API's HTTPS origin\");\n }\n const bytes = media?.bytes ?? new Uint8Array();\n const end = payload.mode === \"chunk\" ? payload.offset + bytes.byteLength : 0;\n if (\n payload.mode === \"chunk\" &&\n (payload.offset < 0 ||\n bytes.byteLength === 0 ||\n end > size ||\n (end < size && bytes.byteLength % 262_144 !== 0))\n ) {\n return yield* refused(\n \"Upload chunks must fit the total size and use 256 KiB multiples except for the final chunk\",\n );\n }\n const response = yield* client.execute(\n pipe(\n HttpClientRequest.put(payload.sessionUrl),\n HttpClientRequest.bodyUint8Array(bytes, media?.contentType ?? \"application/octet-stream\"),\n HttpClientRequest.setHeader(\n \"content-range\",\n payload.mode === \"status\"\n ? `bytes */${size}`\n : `bytes ${payload.offset}-${end - 1}/${size}`,\n ),\n ),\n );\n if (response.status === 308) {\n const range = response.headers[\"range\"];\n if (range !== undefined && !/^bytes=0-\\d+$/u.test(range)) {\n return yield* Effect.fail({\n cause: \"The API returned an invalid upload range\",\n response,\n });\n }\n const nextOffset = range === undefined ? 0 : Number(pipe(range, String.slice(8))) + 1;\n if (nextOffset > size) {\n return yield* Effect.fail({\n cause: \"The API returned an upload offset beyond the total size\",\n response,\n });\n }\n return yield* decodeResponse(output)({\n nextOffset,\n sessionUrl: payload.sessionUrl,\n state: \"pending\",\n });\n }\n if (response.status < 200 || response.status >= 300) {\n return yield* Effect.fail({ cause: yield* response.text, response });\n }\n return yield* decodeResponse(output)({ resource: yield* response.json, state: \"complete\" });\n }\n const selected = HttpClientRequest.setUrlParam(request, \"uploadType\", payload.mode);\n const bytes = media?.bytes ?? new Uint8Array();\n const contentType = media?.contentType ?? \"application/octet-stream\";\n const boundary = `dual-${yield* Random.nextInt}-${yield* Random.nextInt}`;\n const metadata =\n payload.mode === \"multipart\"\n ? yield* Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown))(payload.metadata)\n : \"\";\n const body =\n payload.mode === \"media\"\n ? HttpClientRequest.bodyUint8Array(selected, bytes, contentType)\n : HttpClientRequest.bodyUint8Array(\n selected,\n new Uint8Array(\n yield* Effect.promise(() =>\n new Blob([\n `--${boundary}\\r\\nContent-Type: application/json; charset=UTF-8\\r\\n\\r\\n${metadata}\\r\\n--${boundary}\\r\\nContent-Type: ${contentType}\\r\\n\\r\\n`,\n new Uint8Array(bytes),\n `\\r\\n--${boundary}--\\r\\n`,\n ]).arrayBuffer(),\n ),\n ),\n `multipart/related; boundary=${boundary}`,\n );\n const response = yield* client.execute(body);\n if (response.status < 200 || response.status >= 300) {\n return yield* Effect.fail({ cause: yield* response.text, response });\n }\n return yield* decodeResponse(output)({ resource: yield* response.json, state: \"complete\" });\n }, Effect.mapError(failure));\n\n /** Sends a GraphQL operation and decodes its root field, failing with the errors it returns. */\n const graphql = Effect.fnUntraced(function* <Output extends Schema.Top>(\n context: Context,\n output: Output,\n request: Request,\n field: string,\n ) {\n const response = yield* send(context, request);\n const body = yield* Schema.decodeUnknownEffect(GraphqlResponse)(yield* response.json);\n if (body.errors !== undefined && Array.isReadonlyArrayNonEmpty(body.errors)) {\n return yield* Action.ActionHandlerError.make({\n details: body.errors,\n message: Array.join(\n Array.map(body.errors, error => error.message),\n \"; \",\n ),\n });\n }\n return yield* decodeResponse(output)(body.data?.[field]);\n }, Effect.mapError(failure));\n\n /**\n * Calls a Model Context Protocol tool in a session with the server. A tool that reports an error\n * fails the action with its text; otherwise the output is its structured content, or its content\n * blocks when it declares no output schema.\n */\n const mcp = Effect.fnUntraced(\n function* <Output extends Schema.Top>(\n context: Context,\n output: Output,\n server: string,\n tool: string,\n args: unknown,\n structured: boolean,\n ) {\n const connection = yield* Mcp.connect(\n authorize(yield* HttpClient.HttpClient, context),\n server,\n {},\n );\n const result = yield* Schema.decodeUnknownEffect(Mcp.CallToolResult)(\n yield* connection.request(\"tools/call\", { arguments: args, name: tool }),\n );\n if (result.isError === true) {\n return yield* Action.ActionHandlerError.make({\n details: result.content,\n message: Array.join(\n Array.flatMap(result.content, block => Array.fromNullishOr(block.text)),\n \"\\n\",\n ),\n });\n }\n return yield* decodeResponse(output)(\n Boolean.match(structured, {\n onFalse: () => ({ content: result.content }),\n onTrue: () => result.structuredContent,\n }),\n );\n },\n Effect.scoped,\n Effect.mapError(error =>\n Schema.is(Mcp.McpError)(error)\n ? Action.ActionHandlerError.make({ message: error.message })\n : failure(error),\n ),\n );\n\n return { endpoint, execute, googleUpload, graphql, mcp, variants };\n}\n\nexport * as Http from \"./Http.ts\";\n"],"mappings":"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"}
package/dist/Mcp.d.ts ADDED
@@ -0,0 +1,109 @@
1
+ import "./Mcp.js";
2
+ import { Effect, Record, Schema } from "effect";
3
+ import { HttpClient } from "effect/http";
4
+ declare namespace Mcp_d_exports {
5
+ export { CallToolResult, Implementation, Mcp_d_exports as Mcp, McpError, Tool, connect, listTools };
6
+ }
7
+ declare const McpError_base: Schema.Class<McpError, Schema.TaggedStruct<"McpError", {
8
+ readonly cause: Schema.optional<Schema.Defect>;
9
+ readonly message: Schema.String;
10
+ }>, import("effect/Cause").YieldableError>;
11
+ /**
12
+ * A JSON-RPC error, SSE parsing error, or request that got no response.
13
+ *
14
+ * @since 0.0.0
15
+ * @category errors
16
+ */
17
+ export declare class McpError extends McpError_base {}
18
+ /**
19
+ * A server's or client's name and version.
20
+ *
21
+ * @since 0.0.0
22
+ * @category schemas
23
+ */
24
+ export type Implementation = typeof Implementation.Type;
25
+ export declare const Implementation: Schema.Struct<{
26
+ readonly name: Schema.String;
27
+ readonly title: Schema.optionalKey<Schema.String>;
28
+ readonly version: Schema.String;
29
+ }>;
30
+ /**
31
+ * A tool a server lists: its name, description and the JSON Schemas of its arguments and, when it
32
+ * declares one, its structured output.
33
+ *
34
+ * @since 0.0.0
35
+ * @category schemas
36
+ */
37
+ export type Tool = typeof Tool.Type;
38
+ export declare const Tool: Schema.Struct<{
39
+ readonly annotations: Schema.optionalKey<Schema.Struct<{
40
+ readonly title: Schema.optionalKey<Schema.String>;
41
+ }>>;
42
+ readonly description: Schema.optionalKey<Schema.String>;
43
+ readonly inputSchema: Schema.$Record<Schema.String, Schema.Unknown>;
44
+ readonly name: Schema.String;
45
+ readonly outputSchema: Schema.optionalKey<Schema.$Record<Schema.String, Schema.Unknown>>;
46
+ readonly title: Schema.optionalKey<Schema.String>;
47
+ }>;
48
+ /**
49
+ * What a tool call returns: its content blocks and, when it declares an output schema, its
50
+ * structured content.
51
+ *
52
+ * @since 0.0.0
53
+ * @category schemas
54
+ */
55
+ export type CallToolResult = typeof CallToolResult.Type;
56
+ export declare const CallToolResult: Schema.Struct<{
57
+ readonly content: Schema.$Array<Schema.StructWithRest<Schema.Struct<{
58
+ readonly text: Schema.optionalKey<Schema.String>;
59
+ readonly type: Schema.String;
60
+ }>, readonly [Schema.$Record<Schema.String, Schema.Unknown>]>>;
61
+ readonly isError: Schema.optionalKey<Schema.Boolean>;
62
+ readonly structuredContent: Schema.optionalKey<Schema.Unknown>;
63
+ }>;
64
+ /**
65
+ * Opens a session with the server at `endpoint`: initializes it and returns its information and a
66
+ * `request` that sends one JSON-RPC request and returns its result. Closing the scope ends the
67
+ * session. `headers` carries the credentials the server asks for.
68
+ *
69
+ * @since 0.0.0
70
+ * @category constructors
71
+ */
72
+ export declare const connect: (client: HttpClient.HttpClient, endpoint: string, headers: Record.ReadonlyRecord<string, string>) => Effect.Effect<{
73
+ request: (method: string, params: Record.ReadonlyRecord<string, unknown>) => Effect.Effect<unknown, import("effect/http/HttpClientError").HttpClientError | McpError, never>;
74
+ server: {
75
+ readonly name: string;
76
+ readonly title?: string;
77
+ readonly version: string;
78
+ };
79
+ }, import("effect/http/HttpClientError").HttpClientError | McpError | Schema.SchemaError, import("effect/Scope").Scope>;
80
+ /**
81
+ * Lists every tool of the server at `endpoint`, following its pages, in a session of its own.
82
+ *
83
+ * @since 0.0.0
84
+ * @category constructors
85
+ */
86
+ export declare const listTools: (client: HttpClient.HttpClient, endpoint: string, headers: Record.ReadonlyRecord<string, string>) => Effect.Effect<{
87
+ server: {
88
+ readonly name: string;
89
+ readonly title?: string;
90
+ readonly version: string;
91
+ };
92
+ tools: {
93
+ readonly annotations?: {
94
+ readonly title?: string;
95
+ };
96
+ readonly description?: string;
97
+ readonly inputSchema: {
98
+ readonly [x: string]: unknown;
99
+ };
100
+ readonly name: string;
101
+ readonly outputSchema?: {
102
+ readonly [x: string]: unknown;
103
+ };
104
+ readonly title?: string;
105
+ }[];
106
+ }, import("effect/http/HttpClientError").HttpClientError | McpError | Schema.SchemaError, never>;
107
+ //#endregion
108
+ export { Mcp_d_exports as Mcp, Mcp_d_exports };
109
+ //# sourceMappingURL=Mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mcp.d.ts","names":[],"sources":["../src/Mcp.ts"],"mappings":";;;;;;;;;;;;;;;;qBAgCa,iBAAiB;;;;;;;YAalB,wBAAwB,eAAe;qBACtC,gBAAc,OAAA;;;;;;;;;;;;YAaf,cAAc,KAAK;qBAClB,MAAI,OAAA;;;;;;;;;;;;;;;;;YA4BL,wBAAwB,eAAe;qBACtC,gBAAc,OAAA;;;;;;;;;;;;;;;;qBAgFd,UAAO,QAAA,WAAA,YAAA,kBAAA,SAAA,OAAA,mCAAA,OAAA;;;;;;;yCAkGlB,kBAAA,WAAA,OAAA,oCAAA;;;;;;;qBAQW,YAAS,QAAA,WAAA,YAAA,kBAAA,SAAA,OAAA,mCAAA,OAAA;;;;;;;;;;;;;;;;;;;;yCAqBL,kBAAA,WAAA,OAAA"}
package/dist/Mcp.js ADDED
@@ -0,0 +1,176 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
+ import "./Mcp.js";
3
+ import { Array, Boolean, Effect, MutableRef, Number, Option, Ref, Result, Schema, Stream, String, pipe } from "effect";
4
+ import { HttpClient, HttpClientRequest } from "effect/http";
5
+ import * as Sse from "effect/encoding/Sse";
6
+ //#region src/Mcp.ts
7
+ /**
8
+ * A Model Context Protocol client over Streamable HTTP: the session generated plugins call tools
9
+ * through and the CLI lists them with.
10
+ *
11
+ * @since 0.0.0
12
+ */
13
+ var Mcp_exports = /* @__PURE__ */ __exportAll({
14
+ CallToolResult: () => CallToolResult,
15
+ Implementation: () => Implementation,
16
+ Mcp: () => Mcp_exports,
17
+ McpError: () => McpError,
18
+ Tool: () => Tool,
19
+ connect: () => connect,
20
+ listTools: () => listTools
21
+ });
22
+ /**
23
+ * A JSON-RPC error, SSE parsing error, or request that got no response.
24
+ *
25
+ * @since 0.0.0
26
+ * @category errors
27
+ */
28
+ var McpError = class extends Schema.TaggedError()("McpError", {
29
+ cause: Schema.optional(Schema.Defect()),
30
+ message: Schema.String
31
+ }) {};
32
+ const protocolVersion = "2025-06-18";
33
+ const Implementation = Schema.Struct({
34
+ name: Schema.String,
35
+ title: Schema.optionalKey(Schema.String),
36
+ version: Schema.String
37
+ });
38
+ const Tool = Schema.Struct({
39
+ annotations: Schema.optionalKey(Schema.Struct({ title: Schema.optionalKey(Schema.String) })),
40
+ description: Schema.optionalKey(Schema.String),
41
+ inputSchema: Schema.Record(Schema.String, Schema.Unknown),
42
+ name: Schema.String,
43
+ outputSchema: Schema.optionalKey(Schema.Record(Schema.String, Schema.Unknown)),
44
+ title: Schema.optionalKey(Schema.String)
45
+ });
46
+ const ListToolsResult = Schema.Struct({
47
+ nextCursor: Schema.optionalKey(Schema.String),
48
+ tools: Schema.Array(Tool)
49
+ });
50
+ const ContentBlock = Schema.StructWithRest(Schema.Struct({
51
+ text: Schema.optionalKey(Schema.String),
52
+ type: Schema.String
53
+ }), [Schema.Record(Schema.String, Schema.Unknown)]);
54
+ const CallToolResult = Schema.Struct({
55
+ content: Schema.Array(ContentBlock),
56
+ isError: Schema.optionalKey(Schema.Boolean),
57
+ structuredContent: Schema.optionalKey(Schema.Unknown)
58
+ });
59
+ const InitializeResult = Schema.Struct({
60
+ protocolVersion: Schema.String,
61
+ serverInfo: Implementation
62
+ });
63
+ const Message = Schema.Struct({
64
+ error: Schema.optionalKey(Schema.Struct({ message: Schema.String })),
65
+ id: Schema.optionalKey(Schema.Unknown),
66
+ result: Schema.optionalKey(Schema.Unknown)
67
+ });
68
+ const responseTo = Effect.fnUntraced(function* (id, method, response) {
69
+ const payloads = Boolean.match(pipe(response.headers["content-type"] ?? "", String.startsWith("text/event-stream")), {
70
+ onFalse: () => Stream.fromEffect(response.text),
71
+ onTrue: () => Stream.unwrap(Effect.sync(() => {
72
+ const events = MutableRef.make(Array.empty());
73
+ const parser = Sse.makeParser((event) => {
74
+ if (event._tag === "Event") MutableRef.update(events, Array.append(event.data));
75
+ });
76
+ return pipe(response.stream, Stream.decodeText(), Stream.mapEffect((chunk) => {
77
+ const error = parser.feed(chunk);
78
+ if (error !== void 0) return Effect.fail(McpError.make({
79
+ cause: error,
80
+ message: error.message
81
+ }));
82
+ const ready = MutableRef.get(events);
83
+ MutableRef.set(events, Array.empty());
84
+ return Effect.succeed(ready);
85
+ }), Stream.flatMap(Stream.fromIterable));
86
+ }))
87
+ });
88
+ const found = yield* pipe(payloads, Stream.filterMap((payload) => Result.fromOption(Option.filter(Schema.decodeOption(Schema.fromJsonString(Message))(payload), (message) => message.id === id && (message.result !== void 0 || message.error !== void 0)), () => payload)), Stream.runHead);
89
+ return yield* Effect.fromOption(found, () => McpError.make({ message: `${method} got no response` }));
90
+ });
91
+ /**
92
+ * Opens a session with the server at `endpoint`: initializes it and returns its information and a
93
+ * `request` that sends one JSON-RPC request and returns its result. Closing the scope ends the
94
+ * session. `headers` carries the credentials the server asks for.
95
+ *
96
+ * @since 0.0.0
97
+ * @category constructors
98
+ */
99
+ const connect = Effect.fn("Mcp.connect")(function* (client, endpoint, headers) {
100
+ const checked = HttpClient.filterStatusOk(client);
101
+ const post = Effect.fnUntraced(function* (version, session, body) {
102
+ return yield* checked.execute(pipe(HttpClientRequest.post(endpoint), HttpClientRequest.setHeaders({
103
+ ...headers,
104
+ accept: "application/json, text/event-stream",
105
+ "mcp-protocol-version": version,
106
+ ...Option.match(session, {
107
+ onNone: () => ({}),
108
+ onSome: (id) => ({ "mcp-session-id": id })
109
+ })
110
+ }), HttpClientRequest.bodyJsonUnsafe({
111
+ jsonrpc: "2.0",
112
+ ...body
113
+ })));
114
+ });
115
+ const call = Effect.fnUntraced(function* (version, session, id, method, params) {
116
+ const response = yield* post(version, session, {
117
+ id,
118
+ method,
119
+ params
120
+ });
121
+ const message = yield* responseTo(id, method, response);
122
+ if (message.error !== void 0) return yield* McpError.make({ message: `${method}: ${message.error.message}` });
123
+ return {
124
+ result: message.result,
125
+ session: Option.orElse(Option.fromNullishOr(response.headers["mcp-session-id"]), () => session)
126
+ };
127
+ });
128
+ const negotiatedVersion = yield* Ref.make(protocolVersion);
129
+ const initialized = yield* Effect.acquireRelease(call(protocolVersion, Option.none(), 0, "initialize", {
130
+ capabilities: {},
131
+ clientInfo: {
132
+ name: "dual",
133
+ version: "1"
134
+ },
135
+ protocolVersion
136
+ }), (opened) => Option.match(opened.session, {
137
+ onNone: () => Effect.void,
138
+ onSome: (id) => Effect.flatMap(Ref.get(negotiatedVersion), (version) => Effect.ignore(client.execute(pipe(HttpClientRequest.delete(endpoint), HttpClientRequest.setHeaders({
139
+ ...headers,
140
+ "mcp-protocol-version": version,
141
+ "mcp-session-id": id
142
+ })))))
143
+ }));
144
+ const server = yield* Schema.decodeUnknownEffect(InitializeResult)(initialized.result);
145
+ if (server.protocolVersion !== protocolVersion && server.protocolVersion !== "2025-03-26") return yield* McpError.make({ message: `Unsupported MCP protocol version ${server.protocolVersion}` });
146
+ yield* Ref.set(negotiatedVersion, server.protocolVersion);
147
+ yield* post(server.protocolVersion, initialized.session, { method: "notifications/initialized" });
148
+ const ids = yield* Ref.make(1);
149
+ return {
150
+ request: Effect.fn("Mcp.request")(function* (method, params) {
151
+ return (yield* call(server.protocolVersion, initialized.session, yield* Ref.getAndUpdate(ids, Number.increment), method, params)).result;
152
+ }),
153
+ server: server.serverInfo
154
+ };
155
+ });
156
+ /**
157
+ * Lists every tool of the server at `endpoint`, following its pages, in a session of its own.
158
+ *
159
+ * @since 0.0.0
160
+ * @category constructors
161
+ */
162
+ const listTools = Effect.fn("Mcp.listTools")(function* (client, endpoint, headers) {
163
+ const session = yield* connect(client, endpoint, headers);
164
+ const tools = yield* Stream.runCollect(Stream.paginate({}, Effect.fnUntraced(function* (params) {
165
+ const page = yield* Schema.decodeUnknownEffect(ListToolsResult)(yield* session.request("tools/list", params));
166
+ return [page.tools, Option.map(Option.fromUndefinedOr(page.nextCursor), (cursor) => ({ cursor }))];
167
+ })));
168
+ return {
169
+ server: session.server,
170
+ tools
171
+ };
172
+ }, Effect.scoped);
173
+ //#endregion
174
+ export { CallToolResult, Implementation, Mcp_exports as Mcp, McpError, Mcp_exports, Tool, connect, listTools };
175
+
176
+ //# sourceMappingURL=Mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mcp.js","names":[],"sources":["../src/Mcp.ts"],"sourcesContent":["/**\n * A Model Context Protocol client over Streamable HTTP: the session generated plugins call tools\n * through and the CLI lists them with.\n *\n * @since 0.0.0\n */\nimport {\n Array,\n Boolean,\n Effect,\n MutableRef,\n Number,\n Option,\n Ref,\n Result,\n Schema,\n Stream,\n String,\n pipe,\n} from \"effect\";\nimport type { Record } from \"effect\";\n\nimport * as Sse from \"effect/encoding/Sse\";\nimport { HttpClient, HttpClientRequest } from \"effect/http\";\nimport type { HttpClientResponse } from \"effect/http\";\n\n/**\n * A JSON-RPC error, SSE parsing error, or request that got no response.\n *\n * @since 0.0.0\n * @category errors\n */\nexport class McpError extends Schema.TaggedError<McpError>()(\"McpError\", {\n cause: Schema.optional(Schema.Defect()),\n message: Schema.String,\n}) {}\n\nconst protocolVersion = \"2025-06-18\";\n\n/**\n * A server's or client's name and version.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport type Implementation = typeof Implementation.Type;\nexport const Implementation = Schema.Struct({\n name: Schema.String,\n title: Schema.optionalKey(Schema.String),\n version: Schema.String,\n});\n\n/**\n * A tool a server lists: its name, description and the JSON Schemas of its arguments and, when it\n * declares one, its structured output.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport type Tool = typeof Tool.Type;\nexport const Tool = Schema.Struct({\n annotations: Schema.optionalKey(Schema.Struct({ title: Schema.optionalKey(Schema.String) })),\n description: Schema.optionalKey(Schema.String),\n inputSchema: Schema.Record(Schema.String, Schema.Unknown),\n name: Schema.String,\n outputSchema: Schema.optionalKey(Schema.Record(Schema.String, Schema.Unknown)),\n title: Schema.optionalKey(Schema.String),\n});\n\ntype ListToolsResult = typeof ListToolsResult.Type;\nconst ListToolsResult = Schema.Struct({\n nextCursor: Schema.optionalKey(Schema.String),\n tools: Schema.Array(Tool),\n});\n\ntype ContentBlock = typeof ContentBlock.Type;\nconst ContentBlock = Schema.StructWithRest(\n Schema.Struct({ text: Schema.optionalKey(Schema.String), type: Schema.String }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n);\n\n/**\n * What a tool call returns: its content blocks and, when it declares an output schema, its\n * structured content.\n *\n * @since 0.0.0\n * @category schemas\n */\nexport type CallToolResult = typeof CallToolResult.Type;\nexport const CallToolResult = Schema.Struct({\n content: Schema.Array(ContentBlock),\n isError: Schema.optionalKey(Schema.Boolean),\n structuredContent: Schema.optionalKey(Schema.Unknown),\n});\n\ntype InitializeResult = typeof InitializeResult.Type;\nconst InitializeResult = Schema.Struct({\n protocolVersion: Schema.String,\n serverInfo: Implementation,\n});\n\ntype Message = typeof Message.Type;\nconst Message = Schema.Struct({\n error: Schema.optionalKey(Schema.Struct({ message: Schema.String })),\n id: Schema.optionalKey(Schema.Unknown),\n result: Schema.optionalKey(Schema.Unknown),\n});\n\nconst responseTo = Effect.fnUntraced(function* (\n id: number,\n method: string,\n response: HttpClientResponse.HttpClientResponse,\n) {\n const payloads = Boolean.match(\n pipe(response.headers[\"content-type\"] ?? \"\", String.startsWith(\"text/event-stream\")),\n {\n onFalse: () => Stream.fromEffect(response.text),\n onTrue: () =>\n Stream.unwrap(\n Effect.sync(() => {\n const events = MutableRef.make(Array.empty<string>());\n const parser = Sse.makeParser(event => {\n if (event._tag === \"Event\") MutableRef.update(events, Array.append(event.data));\n });\n return pipe(\n response.stream,\n Stream.decodeText(),\n Stream.mapEffect(chunk => {\n const error = parser.feed(chunk);\n if (error !== undefined) {\n return Effect.fail(McpError.make({ cause: error, message: error.message }));\n }\n const ready = MutableRef.get(events);\n MutableRef.set(events, Array.empty());\n return Effect.succeed(ready);\n }),\n Stream.flatMap(Stream.fromIterable),\n );\n }),\n ),\n },\n );\n const found = yield* pipe(\n payloads,\n Stream.filterMap(payload =>\n Result.fromOption(\n Option.filter(\n Schema.decodeOption(Schema.fromJsonString(Message))(payload),\n message =>\n message.id === id && (message.result !== undefined || message.error !== undefined),\n ),\n () => payload,\n ),\n ),\n Stream.runHead,\n );\n return yield* Effect.fromOption(found, () =>\n McpError.make({ message: `${method} got no response` }),\n );\n});\n\n/**\n * Opens a session with the server at `endpoint`: initializes it and returns its information and a\n * `request` that sends one JSON-RPC request and returns its result. Closing the scope ends the\n * session. `headers` carries the credentials the server asks for.\n *\n * @since 0.0.0\n * @category constructors\n */\nexport const connect = Effect.fn(\"Mcp.connect\")(function* (\n client: HttpClient.HttpClient,\n endpoint: string,\n headers: Record.ReadonlyRecord<string, string>,\n) {\n const checked = HttpClient.filterStatusOk(client);\n const post = Effect.fnUntraced(function* (\n version: string,\n session: Option.Option<string>,\n body: Record.ReadonlyRecord<string, unknown>,\n ) {\n return yield* checked.execute(\n pipe(\n HttpClientRequest.post(endpoint),\n HttpClientRequest.setHeaders({\n ...headers,\n accept: \"application/json, text/event-stream\",\n \"mcp-protocol-version\": version,\n ...Option.match(session, {\n onNone: () => ({}),\n onSome: id => ({ \"mcp-session-id\": id }),\n }),\n }),\n HttpClientRequest.bodyJsonUnsafe({ jsonrpc: \"2.0\", ...body }),\n ),\n );\n });\n const call = Effect.fnUntraced(function* (\n version: string,\n session: Option.Option<string>,\n id: number,\n method: string,\n params: Record.ReadonlyRecord<string, unknown>,\n ) {\n const response = yield* post(version, session, { id, method, params });\n const message = yield* responseTo(id, method, response);\n if (message.error !== undefined) {\n return yield* McpError.make({ message: `${method}: ${message.error.message}` });\n }\n return {\n result: message.result,\n session: Option.orElse(\n Option.fromNullishOr(response.headers[\"mcp-session-id\"]),\n () => session,\n ),\n };\n });\n\n const negotiatedVersion = yield* Ref.make(protocolVersion);\n const initialized = yield* Effect.acquireRelease(\n call(protocolVersion, Option.none(), 0, \"initialize\", {\n capabilities: {},\n clientInfo: { name: \"dual\", version: \"1\" },\n protocolVersion,\n }),\n opened =>\n Option.match(opened.session, {\n onNone: () => Effect.void,\n onSome: id =>\n Effect.flatMap(Ref.get(negotiatedVersion), version =>\n Effect.ignore(\n client.execute(\n pipe(\n HttpClientRequest.delete(endpoint),\n HttpClientRequest.setHeaders({\n ...headers,\n \"mcp-protocol-version\": version,\n \"mcp-session-id\": id,\n }),\n ),\n ),\n ),\n ),\n }),\n );\n const server = yield* Schema.decodeUnknownEffect(InitializeResult)(initialized.result);\n if (server.protocolVersion !== protocolVersion && server.protocolVersion !== \"2025-03-26\") {\n return yield* McpError.make({\n message: `Unsupported MCP protocol version ${server.protocolVersion}`,\n });\n }\n yield* Ref.set(negotiatedVersion, server.protocolVersion);\n yield* post(server.protocolVersion, initialized.session, { method: \"notifications/initialized\" });\n const ids = yield* Ref.make(1);\n const request = Effect.fn(\"Mcp.request\")(function* (\n method: string,\n params: Record.ReadonlyRecord<string, unknown>,\n ) {\n const called = yield* call(\n server.protocolVersion,\n initialized.session,\n yield* Ref.getAndUpdate(ids, Number.increment),\n method,\n params,\n );\n return called.result;\n });\n return { request, server: server.serverInfo };\n});\n\n/**\n * Lists every tool of the server at `endpoint`, following its pages, in a session of its own.\n *\n * @since 0.0.0\n * @category constructors\n */\nexport const listTools = Effect.fn(\"Mcp.listTools\")(function* (\n client: HttpClient.HttpClient,\n endpoint: string,\n headers: Record.ReadonlyRecord<string, string>,\n) {\n const session = yield* connect(client, endpoint, headers);\n const tools = yield* Stream.runCollect(\n Stream.paginate(\n {},\n Effect.fnUntraced(function* (params: { cursor?: string }) {\n const page = yield* Schema.decodeUnknownEffect(ListToolsResult)(\n yield* session.request(\"tools/list\", params),\n );\n return [\n page.tools,\n Option.map(Option.fromUndefinedOr(page.nextCursor), cursor => ({ cursor })),\n ] as const;\n }),\n ),\n );\n return { server: session.server, tools };\n}, Effect.scoped);\n\nexport * as Mcp from \"./Mcp.ts\";\n"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import "./OAuth2TokenRefresher.js";
2
+ import { Any, OAuth2TokenResponse } from "./AuthMethod.js";
3
+ import { Context, Effect } from "effect";
4
+ declare namespace OAuth2TokenRefresher_d_exports {
5
+ export { OAuth2TokenRefresher_d_exports as OAuth2TokenRefresher, Service };
6
+ }
7
+ declare const Service_base: Context.ServiceClass<Service, "@dual-os/sdk/AuthMethod/OAuth2TokenRefresher", {
8
+ readonly refresh: (input: {
9
+ readonly method: Any;
10
+ readonly setup: unknown;
11
+ readonly refreshToken: string;
12
+ }) => Effect.Effect<OAuth2TokenResponse, unknown>;
13
+ }>;
14
+ /** @since 0.0.0 @category services */
15
+ export declare class Service extends Service_base {}
16
+ //#endregion
17
+ export { OAuth2TokenRefresher_d_exports as OAuth2TokenRefresher, OAuth2TokenRefresher_d_exports };
18
+ //# sourceMappingURL=OAuth2TokenRefresher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuth2TokenRefresher.d.ts","names":["AuthMethod.Any","AuthMethod.OAuth2TokenResponse"],"sources":["../src/OAuth2TokenRefresher.ts"],"mappings":";;;;;;;WAasB,UAAC;aACR,QAAQA;aACR;aACA;QACL,OAAO,OAAOC;;;qBAPX,gBAAgB"}
@@ -0,0 +1,19 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
+ import "./OAuth2TokenRefresher.js";
3
+ import { Context } from "effect";
4
+ //#region src/OAuth2TokenRefresher.ts
5
+ /**
6
+ * Host service that refreshes OAuth2 tokens for SDK auth execution.
7
+ *
8
+ * @since 0.0.0
9
+ */
10
+ var OAuth2TokenRefresher_exports = /* @__PURE__ */ __exportAll({
11
+ OAuth2TokenRefresher: () => OAuth2TokenRefresher_exports,
12
+ Service: () => Service
13
+ });
14
+ /** @since 0.0.0 @category services */
15
+ var Service = class extends Context.Service()("@dual-os/sdk/AuthMethod/OAuth2TokenRefresher") {};
16
+ //#endregion
17
+ export { OAuth2TokenRefresher_exports as OAuth2TokenRefresher, OAuth2TokenRefresher_exports, Service };
18
+
19
+ //# sourceMappingURL=OAuth2TokenRefresher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuth2TokenRefresher.js","names":[],"sources":["../src/OAuth2TokenRefresher.ts"],"sourcesContent":["/**\n * Host service that refreshes OAuth2 tokens for SDK auth execution.\n *\n * @since 0.0.0\n */\nimport { Context, type Effect } from \"effect\";\n\nimport type * as AuthMethod from \"./AuthMethod.ts\";\n\n/** @since 0.0.0 @category services */\nexport class Service extends Context.Service<\n Service,\n {\n readonly refresh: (input: {\n readonly method: AuthMethod.Any;\n readonly setup: unknown;\n readonly refreshToken: string;\n }) => Effect.Effect<AuthMethod.OAuth2TokenResponse, unknown>;\n }\n>()(\"@dual-os/sdk/AuthMethod/OAuth2TokenRefresher\") {}\n\nexport * as OAuth2TokenRefresher from \"./OAuth2TokenRefresher.ts\";\n"],"mappings":";;;;;;;;;;;;;;AAUA,IAAa,UAAb,cAA6B,QAAQ,QASnC,CAAC,CAAC,8CAA8C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { Service as Service$1 } from "./OAuth2TokenRefresher.js";
2
+ import { Any, OAuth2TokenResponse, Setup } from "./AuthMethod.js";
3
+ import "./OAuthFlow.js";
4
+ import { Context, Effect, Layer, Schema } from "effect";
5
+ declare namespace OAuthFlow_d_exports {
6
+ export { OAuthConnectionValidationFailed, OAuthFlow_d_exports as OAuthFlow, OAuthFlowCompleted, OAuthFlowContinuation, OAuthFlowError, OAuthFlowStarted, OAuthGrantRejected, OAuthProviderRejected, Service, layer, oauth2TokenRefresherLayer, testing };
7
+ }
8
+ declare const OAuthConnectionValidationFailed_base: Schema.Class<OAuthConnectionValidationFailed, Schema.TaggedStruct<"OAuthConnectionValidationFailed", {
9
+ readonly cause: Schema.optionalKey<Schema.Redacted<Schema.Defect>>;
10
+ readonly message: Schema.String;
11
+ }>, import("effect/Cause").YieldableError>;
12
+ export declare class OAuthConnectionValidationFailed extends OAuthConnectionValidationFailed_base {}
13
+ declare const OAuthProviderRejected_base: Schema.Class<OAuthProviderRejected, Schema.TaggedStruct<"OAuthProviderRejected", {
14
+ readonly error: Schema.String;
15
+ readonly errorDescription: Schema.optional<Schema.String>;
16
+ }>, import("effect/Cause").YieldableError>;
17
+ export declare class OAuthProviderRejected extends OAuthProviderRejected_base {}
18
+ declare const OAuthGrantRejected_base: Schema.Class<OAuthGrantRejected, Schema.TaggedStruct<"OAuthGrantRejected", {
19
+ readonly errorSubtype: Schema.optionalKey<Schema.String>;
20
+ readonly message: Schema.String;
21
+ }>, import("effect/Cause").YieldableError>;
22
+ export declare class OAuthGrantRejected extends OAuthGrantRejected_base {}
23
+ export type OAuthFlowError = OAuthConnectionValidationFailed | OAuthProviderRejected;
24
+ export interface OAuthFlowContinuation {
25
+ readonly state: string;
26
+ readonly redirectUri: string;
27
+ readonly pkceVerifier: string | null;
28
+ readonly expiresAt: Date;
29
+ }
30
+ export interface OAuthFlowStarted {
31
+ readonly authorizationUrl: string;
32
+ readonly continuation: OAuthFlowContinuation;
33
+ }
34
+ export interface OAuthFlowCompleted<Material> {
35
+ readonly tokens: OAuth2TokenResponse;
36
+ readonly material: Material;
37
+ }
38
+ declare const Service_base: Context.ServiceClass<Service, "@dual-os/sdk/OAuthFlow", {
39
+ readonly start: <Method extends Any>(input: {
40
+ readonly method: Method;
41
+ readonly setup: Setup<Method>;
42
+ readonly redirectUri: string;
43
+ readonly ttlMs?: number;
44
+ }) => Effect.Effect<OAuthFlowStarted, OAuthFlowError>;
45
+ readonly complete: <Method extends Any>(input: {
46
+ readonly method: Method;
47
+ readonly setup: Setup<Method>;
48
+ readonly continuation: OAuthFlowContinuation;
49
+ readonly query: Readonly<Record<string, string | undefined>>;
50
+ }) => Effect.Effect<OAuthFlowCompleted<OAuth2TokenResponse>, OAuthFlowError>;
51
+ readonly refresh: <Method extends Any>(input: {
52
+ readonly method: Method;
53
+ readonly setup: Setup<Method>;
54
+ readonly refreshToken: string;
55
+ }) => Effect.Effect<OAuthFlowCompleted<OAuth2TokenResponse>, OAuthFlowError | OAuthGrantRejected>;
56
+ }>;
57
+ export declare class Service extends Service_base {}
58
+ /** Deterministic OAuthFlow test layer that avoids external provider traffic. */
59
+ export declare const testing: (options?: {
60
+ readonly accessToken?: string;
61
+ readonly refreshToken?: string;
62
+ readonly refreshedAccessToken?: string;
63
+ readonly tokenType?: string;
64
+ readonly expiresIn?: number;
65
+ }) => Layer.Layer<Service, never, never>;
66
+ /** Live protocol layer that reads OAuth client config from Effect ConfigProvider. */
67
+ export declare const layer: Layer.Layer<Service, never, never>;
68
+ export declare const oauth2TokenRefresherLayer: Layer.Layer<Service$1, never, Service>;
69
+ //#endregion
70
+ export { OAuthFlow_d_exports as OAuthFlow, OAuthFlow_d_exports };
71
+ //# sourceMappingURL=OAuthFlow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuthFlow.d.ts","names":["AuthMethod.OAuth2TokenResponse","AuthMethod.Any","AuthMethod.Setup","AuthMethod.Service"],"sources":["../src/OAuthFlow.ts"],"mappings":";;;;;;;;;;;qBAiCa,wCAAwC;;;;;qBAIxC,8BAA8B;;;;;qBAI9B,2BAA2B;YAygB5B,iBAAiB,kCAAkC;iBAE9C;WACN;WACA;WACA;WACA,WAAW;;iBAGL;WACN;WACA,cAAc;;iBAGR,mBAAmB;WACzB,QAAQA;WACR,UAAU;;;WAMD,QAAC,eAAeC,KAAgB;aACrC,QAAQ;aACR,OAAOC,MAAiB;aACxB;aACA;QACL,OAAO,OAAO,kBAAkB;WACnB,WAAC,eAAeD,KAAgB;aACxC,QAAQ;aACR,OAAOC,MAAiB;aACxB,cAAc;aACd,OAAO,SAAS;QACrB,OAAO,OAAO,mBAAmBF,sBAAiC;WACtD,UAAC,eAAeC,KAAgB;aACvC,QAAQ;aACR,OAAOC,MAAiB;aACxB;QACL,OAAO,OACX,mBAAmBF,sBACnB,iBAAiB;;qBArBV,gBAAgB;;qBA2BhB,UAAO;WAEP;WACA;WACA;WACA;WACA;MACV,MAAA,MAAA;;qBA2GU,OAAK,MAAA,MAAA;qBA0IL,2BAAyB,MAAA,MAAAG,kBAAA"}