apps 0.0.1-beta.5 → 0.0.1-beta.54

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 (185) hide show
  1. package/README.md +68 -44
  2. package/framework-reference.json +1 -1
  3. package/js/chunk-5FHWNLCI.js +88 -0
  4. package/js/{chunk-M3B3DE4K.js → chunk-74YVXBKY.js} +463 -218
  5. package/js/chunk-7UUHJR2Q.js +49 -0
  6. package/js/{chunk-CYYBFC2K.js → chunk-AQU56EPI.js} +9 -5
  7. package/js/chunk-CDXQDN7W.js +92 -0
  8. package/js/{chunk-UDDE5KOR.js → chunk-D45JTD6N.js} +148 -34
  9. package/js/{chunk-UK573G7W.js → chunk-EOPQ727L.js} +87 -51
  10. package/js/chunk-GDYPM7RS.js +266 -0
  11. package/js/{chunk-27F7W2LG.js → chunk-H2CJWXA3.js} +2 -2
  12. package/js/{chunk-JU7VHODU.js → chunk-H72MEDMN.js} +65 -10
  13. package/js/{chunk-CDL5PM2Q.js → chunk-IFJU5SYQ.js} +19082 -18402
  14. package/js/{chunk-RJDDBDSN.js → chunk-JM7LOD2W.js} +628 -85
  15. package/js/{chunk-VFZKSM3T.js → chunk-JPEUKEV4.js} +3 -3
  16. package/js/{chunk-DQAZTA4I.js → chunk-JY56GVSV.js} +1324 -209
  17. package/js/{chunk-FWQC6I3C.js → chunk-KGCTYL2S.js} +523 -63
  18. package/js/{chunk-KUMBKVJD.js → chunk-KLYSEHUD.js} +2 -2
  19. package/js/chunk-LTDHQJ2Z.js +171 -0
  20. package/js/chunk-MWKHKOTL.js +240 -0
  21. package/js/chunk-OD3KFKZD.js +1617 -0
  22. package/js/{chunk-57RKNWL2.js → chunk-PD6I2SDG.js} +4 -4
  23. package/js/chunk-PO5NPRFT.js +1885 -0
  24. package/js/chunk-QKHTRD6G.js +42 -0
  25. package/js/chunk-SVHI6AKV.js +729 -0
  26. package/js/{chunk-IJX4CYZO.js → chunk-TUMGL2OC.js} +228 -264
  27. package/js/{chunk-XHO2ZX6W.js → chunk-UM62MBJQ.js} +96 -41
  28. package/js/chunk-X5U5KIWQ.js +221 -0
  29. package/js/{chunk-IPI4MFSN.js → chunk-XBG7HHXC.js} +2 -2
  30. package/js/chunk-YQD2MLFY.js +340 -0
  31. package/js/client.js +142 -94
  32. package/js/contracts.js +123 -33
  33. package/js/effect.js +19 -21
  34. package/js/{es-APDZKREY.js → es-DIULA3ZF.js} +62 -1659
  35. package/js/graphql.js +63 -60
  36. package/js/host.js +83 -60
  37. package/js/index.js +262 -222
  38. package/js/mcp/effect.js +23 -23
  39. package/js/mcp/stdio.js +48 -40
  40. package/js/mcp.js +109 -72
  41. package/js/openapi.js +4129 -1419
  42. package/js/react.js +2 -3
  43. package/js/skills/effect.js +6 -3
  44. package/js/skills.js +208 -82
  45. package/js/storage/facet.js +1 -540
  46. package/js/ui/auth/contracts.js +2 -2
  47. package/js/ui/auth.js +5 -5
  48. package/js/ui/contracts.js +5 -4
  49. package/js/ui/serving.js +8517 -214
  50. package/package.json +2 -3
  51. package/runtime.json +1 -1
  52. package/types/app-cache/src/index.d.ts +10 -1
  53. package/types/apps/src/contracts/api-response-error.d.ts +4 -0
  54. package/types/apps/src/contracts/app.d.ts +9 -8
  55. package/types/apps/src/contracts/cache.d.ts +20 -0
  56. package/types/apps/src/contracts/context.d.ts +19 -11
  57. package/types/apps/src/contracts/elicitation.d.ts +6 -6
  58. package/types/apps/src/contracts/events.d.ts +93 -0
  59. package/types/apps/src/contracts/failure.d.ts +30 -1
  60. package/types/apps/src/contracts/graphql.d.ts +2 -1
  61. package/types/apps/src/contracts/host.d.ts +55 -16
  62. package/types/apps/src/contracts/live.d.ts +2 -0
  63. package/types/apps/src/contracts/mcp.d.ts +96 -10
  64. package/types/apps/src/contracts/network.d.ts +84 -0
  65. package/types/apps/src/contracts/openapi-compile.d.ts +32 -3
  66. package/types/apps/src/contracts/openapi.d.ts +45 -9
  67. package/types/apps/src/contracts/operations.d.ts +8 -9
  68. package/types/apps/src/contracts/protocol-version.d.ts +2 -2
  69. package/types/apps/src/contracts/protocols/1.d.ts +248 -73
  70. package/types/apps/src/contracts/protocols/10.d.ts +1450 -0
  71. package/types/apps/src/contracts/protocols/11.d.ts +1098 -0
  72. package/types/apps/src/contracts/protocols/2.d.ts +65 -23
  73. package/types/apps/src/contracts/protocols/3.d.ts +65 -26
  74. package/types/apps/src/contracts/protocols/4.d.ts +1297 -0
  75. package/types/apps/src/contracts/protocols/5.d.ts +1174 -0
  76. package/types/apps/src/contracts/protocols/6.d.ts +1620 -0
  77. package/types/apps/src/contracts/protocols/7.d.ts +1784 -0
  78. package/types/apps/src/contracts/protocols/8.d.ts +1130 -0
  79. package/types/apps/src/contracts/protocols/9.d.ts +1106 -0
  80. package/types/apps/src/contracts/protocols/oauth.d.ts +89 -0
  81. package/types/apps/src/contracts/provider-error.d.ts +9 -0
  82. package/types/apps/src/contracts/provider.d.ts +115 -10
  83. package/types/apps/src/contracts/router.d.ts +59 -0
  84. package/types/apps/src/contracts/skills.d.ts +50 -13
  85. package/types/apps/src/contracts/sql.d.ts +58 -0
  86. package/types/apps/src/contracts/ui.d.ts +19 -1
  87. package/types/apps/src/contracts/workflows.d.ts +6 -0
  88. package/types/apps/src/facet.d.ts +4 -5
  89. package/types/apps/src/graphql.d.ts +1 -3
  90. package/types/apps/src/host.d.ts +5 -0
  91. package/types/apps/src/implementation/account-router.d.ts +13 -0
  92. package/types/apps/src/implementation/app.d.ts +5 -4
  93. package/types/apps/src/implementation/authoring.d.ts +25 -5
  94. package/types/apps/src/implementation/browser-scripts.gen.d.ts +6 -0
  95. package/types/apps/src/implementation/cache.d.ts +4 -0
  96. package/types/apps/src/implementation/catalog-cache.d.ts +43 -5
  97. package/types/apps/src/implementation/elicitation.d.ts +18 -15
  98. package/types/apps/src/implementation/events.d.ts +59 -0
  99. package/types/apps/src/implementation/failure-detail.d.ts +25 -3
  100. package/types/apps/src/implementation/graphql-catalog.d.ts +4 -7
  101. package/types/apps/src/implementation/graphql.d.ts +4 -3
  102. package/types/apps/src/implementation/input-problems.d.ts +6 -2
  103. package/types/apps/src/implementation/invocation-timing.d.ts +16 -0
  104. package/types/apps/src/implementation/live.d.ts +2 -2
  105. package/types/apps/src/implementation/mcp-call.d.ts +6 -5
  106. package/types/apps/src/implementation/mcp-catalog.d.ts +7 -8
  107. package/types/apps/src/implementation/mcp-client.d.ts +49 -25
  108. package/types/apps/src/implementation/mcp-stdio.d.ts +1 -1
  109. package/types/apps/src/implementation/mcp-tools.d.ts +2 -1
  110. package/types/apps/src/implementation/mcp.d.ts +52 -25
  111. package/types/apps/src/implementation/network.d.ts +16 -0
  112. package/types/apps/src/implementation/openapi-compile.d.ts +27 -6
  113. package/types/apps/src/implementation/openapi-document.d.ts +46 -19
  114. package/types/apps/src/implementation/openapi-names.d.ts +9 -4
  115. package/types/apps/src/implementation/openapi-request.d.ts +10 -2
  116. package/types/apps/src/implementation/openapi-source.d.ts +8 -6
  117. package/types/apps/src/implementation/openapi-upgrade.d.ts +4 -0
  118. package/types/apps/src/implementation/operations.d.ts +43 -5
  119. package/types/apps/src/implementation/optimistic.d.ts +1 -1
  120. package/types/apps/src/implementation/protocol-operations.d.ts +6 -4
  121. package/types/apps/src/implementation/provider-error.d.ts +28 -1
  122. package/types/apps/src/implementation/provider.d.ts +19 -5
  123. package/types/apps/src/implementation/query-commit.d.ts +1 -1
  124. package/types/apps/src/implementation/router-catalog.d.ts +223 -0
  125. package/types/apps/src/implementation/router.d.ts +70 -0
  126. package/types/apps/src/implementation/runtime-yield.d.ts +7 -0
  127. package/types/apps/src/implementation/schema.d.ts +95 -11
  128. package/types/apps/src/implementation/skills.d.ts +18 -24
  129. package/types/apps/src/implementation/sql.d.ts +71 -0
  130. package/types/apps/src/implementation/ui-account-notice.d.ts +9 -0
  131. package/types/apps/src/implementation/ui-auth.d.ts +1 -1
  132. package/types/apps/src/implementation/ui-client.d.ts +2 -2
  133. package/types/apps/src/implementation/ui-document.d.ts +5 -0
  134. package/types/apps/src/implementation/ui-errors.d.ts +1 -1
  135. package/types/apps/src/implementation/ui-serving.d.ts +11 -5
  136. package/types/apps/src/implementation/ui-watch.d.ts +1 -1
  137. package/types/apps/src/implementation/upstream-error.d.ts +7 -0
  138. package/types/apps/src/implementation/workflow-context.d.ts +1 -1
  139. package/types/apps/src/implementation/workflows.d.ts +1 -1
  140. package/types/apps/src/index.d.ts +32 -13
  141. package/types/apps/src/mcp-stdio.d.ts +2 -5
  142. package/types/apps/src/mcp.d.ts +25 -5
  143. package/types/apps/src/openapi.d.ts +6 -6
  144. package/types/apps/src/react.d.ts +1 -1
  145. package/types/apps/src/skills.d.ts +10 -8
  146. package/types/telemetry/src/app-records.d.ts +42 -0
  147. package/types/telemetry/src/browser-operations.d.ts +7 -4
  148. package/types/telemetry/src/browser.d.ts +8 -3
  149. package/types/telemetry/src/config.d.ts +2 -2
  150. package/types/telemetry/src/index.d.ts +1 -0
  151. package/types/telemetry/src/layer.d.ts +2 -2
  152. package/types/telemetry/src/ownership.d.ts +56 -0
  153. package/types/telemetry/src/recorded-failure.d.ts +29 -0
  154. package/types/telemetry/src/relay.d.ts +2 -2
  155. package/types/telemetry/src/transport.d.ts +8 -1
  156. package/types/utils/src/api-error.d.ts +55 -0
  157. package/types/utils/src/connection-failure.d.ts +33 -0
  158. package/types/utils/src/recorded-message.d.ts +18 -0
  159. package/types/utils/src/user-facing-error.d.ts +83 -0
  160. package/js/chunk-3XKZDQLM.js +0 -93
  161. package/js/chunk-4M277YTM.js +0 -136
  162. package/js/chunk-67EVWIGJ.js +0 -224
  163. package/js/chunk-C3VAOK5B.js +0 -215
  164. package/js/chunk-G7T27IWB.js +0 -63
  165. package/js/chunk-LUVSFETN.js +0 -1347
  166. package/js/chunk-N7YDVXYJ.js +0 -186
  167. package/js/chunk-PJJ24GU7.js +0 -877
  168. package/js/chunk-PZB6T6KU.js +0 -19
  169. package/js/chunk-SB3V4YVR.js +0 -18
  170. package/js/chunk-TDNYXSIX.js +0 -29
  171. package/js/chunk-W4DMKWAB.js +0 -35
  172. package/js/chunk-YEPYT6SD.js +0 -85
  173. package/js/chunk-ZQINWV4W.js +0 -630
  174. package/types/app-data/src/implementation/cursor.d.ts +0 -10
  175. package/types/app-data/src/implementation/index-key.d.ts +0 -7
  176. package/types/app-data/src/implementation/promise.d.ts +0 -68
  177. package/types/app-data/src/implementation/range.d.ts +0 -8
  178. package/types/app-data/src/implementation/schema.d.ts +0 -18
  179. package/types/app-data/src/implementation/sqlite.d.ts +0 -11
  180. package/types/app-data/src/index.d.ts +0 -4
  181. package/types/apps/src/contracts/dynamic-tools.d.ts +0 -13
  182. package/types/apps/src/contracts/storage.d.ts +0 -68
  183. package/types/apps/src/implementation/account-operations.d.ts +0 -151
  184. package/types/apps/src/implementation/dynamic-tools.d.ts +0 -8
  185. package/types/apps/src/implementation/storage.d.ts +0 -15
@@ -0,0 +1,49 @@
1
+ import {
2
+ FetchOptionUnsupported,
3
+ NetworkRefusedHeader,
4
+ RestrictedFetchOption,
5
+ networkRefusalHeader,
6
+ networkRefusalStatus,
7
+ supportedFetchOptions
8
+ } from "./chunk-MWKHKOTL.js";
9
+ import {
10
+ invocationFetch
11
+ } from "./chunk-JM7LOD2W.js";
12
+ import {
13
+ Effect_exports,
14
+ Schema_exports
15
+ } from "./chunk-IFJU5SYQ.js";
16
+
17
+ // src/implementation/network.ts
18
+ var refusalHeader = (status, header) => status === networkRefusalStatus && header !== null && header !== void 0 ? header : void 0;
19
+ var failOnNetworkRefusal = (response) => {
20
+ const header = refusalHeader(response.status, response.headers[networkRefusalHeader]);
21
+ return header === void 0 ? Effect_exports.void : Schema_exports.decodeUnknownEffect(NetworkRefusedHeader)(header).pipe(
22
+ Effect_exports.orDie,
23
+ Effect_exports.flatMap(Effect_exports.fail)
24
+ );
25
+ };
26
+ var unsupportedOption = (init) => {
27
+ for (const option of RestrictedFetchOption.literals) {
28
+ const value = init?.[option];
29
+ const supported = supportedFetchOptions[option];
30
+ if (value !== void 0 && !supported.includes(value))
31
+ return new FetchOptionUnsupported({ option, value: String(value), supported });
32
+ }
33
+ return void 0;
34
+ };
35
+ var appFetch = (fetch) => async (input, init) => {
36
+ const unsupported = unsupportedOption(init);
37
+ if (unsupported !== void 0) throw unsupported;
38
+ const response = await fetch(input, init);
39
+ const header = refusalHeader(response.status, response.headers.get(networkRefusalHeader));
40
+ if (header === void 0) return response;
41
+ await response.body?.cancel();
42
+ throw Schema_exports.decodeUnknownSync(NetworkRefusedHeader)(header);
43
+ };
44
+ var appInvocationFetch = (signal) => invocationFetch(signal).pipe(Effect_exports.map(appFetch));
45
+
46
+ export {
47
+ failOnNetworkRefusal,
48
+ appInvocationFetch
49
+ };
@@ -3,14 +3,14 @@ import {
3
3
  CacheEntry,
4
4
  CacheError,
5
5
  cacheLimits
6
- } from "./chunk-YEPYT6SD.js";
6
+ } from "./chunk-MWKHKOTL.js";
7
7
  import {
8
8
  Clock_exports,
9
9
  Duration_exports,
10
10
  Effect_exports,
11
11
  Exit_exports,
12
12
  Schema_exports
13
- } from "./chunk-CDL5PM2Q.js";
13
+ } from "./chunk-IFJU5SYQ.js";
14
14
 
15
15
  // ../app-cache/src/index.ts
16
16
  var canonical = (value) => {
@@ -111,13 +111,14 @@ var makeCache = (host, background, scope = "shared", deadline) => {
111
111
  yield* Effect_exports.annotateCurrentSpan("cache.result", "fresh");
112
112
  return yield* decode(entry.value);
113
113
  }
114
- if (!refresh && entry !== null && now < entry.staleUntil) {
114
+ const kept = !refresh && entry !== null && now < entry.staleUntil;
115
+ if (kept && options.stale !== "revalidate") {
115
116
  yield* Effect_exports.annotateCurrentSpan("cache.result", "stale");
116
117
  if (lease !== null) yield* background(load(lease).pipe(Effect_exports.asVoid));
117
118
  return yield* decode(entry.value);
118
119
  }
119
120
  if (lease !== null) {
120
- yield* Effect_exports.annotateCurrentSpan("cache.result", "miss");
121
+ yield* Effect_exports.annotateCurrentSpan("cache.result", kept ? "revalidated" : "miss");
121
122
  return yield* load(lease);
122
123
  }
123
124
  if (now >= waitUntil) {
@@ -159,7 +160,10 @@ var makeCache = (host, background, scope = "shared", deadline) => {
159
160
  Effect_exports.flatMap((key2) => transport({ operation: "invalidate", key: key2 })),
160
161
  Effect_exports.asVoid
161
162
  ),
162
- /** Read fresh data, refresh stale data in the background, or wait for the lease owner. */
163
+ /**
164
+ * Read fresh data, refresh stale data in the background (or first, with `stale: "revalidate"`),
165
+ * or wait for the lease owner.
166
+ */
163
167
  get: (options) => get(options, false),
164
168
  /** Force one awaited refresh without removing the retained value. Concurrent refreshes share a load. */
165
169
  revalidate: (options) => get(options, true)
@@ -0,0 +1,92 @@
1
+ import {
2
+ JsonValue
3
+ } from "./chunk-H2CJWXA3.js";
4
+ import {
5
+ HttpApiEndpoint_exports,
6
+ HttpApiGroup_exports,
7
+ HttpApiSchema_exports,
8
+ HttpApi_exports
9
+ } from "./chunk-TUMGL2OC.js";
10
+ import {
11
+ Schema_exports
12
+ } from "./chunk-IFJU5SYQ.js";
13
+
14
+ // src/contracts/ui.ts
15
+ var UiContext = Schema_exports.Struct({
16
+ deployment: Schema_exports.NonEmptyString,
17
+ profile: Schema_exports.optional(Schema_exports.NonEmptyString),
18
+ expectedProfileRevision: Schema_exports.optional(Schema_exports.Int)
19
+ });
20
+ var UiOperation = Schema_exports.Struct({
21
+ ...UiContext.fields,
22
+ name: Schema_exports.NonEmptyString,
23
+ input: JsonValue
24
+ });
25
+ var UiUnauthorized = class extends Schema_exports.TaggedError()(
26
+ "UiUnauthorized",
27
+ {},
28
+ { httpApiStatus: 401 }
29
+ ) {
30
+ };
31
+ var UiForbidden = class extends Schema_exports.TaggedError()(
32
+ "UiForbidden",
33
+ {},
34
+ { httpApiStatus: 403 }
35
+ ) {
36
+ };
37
+ var UiDeploymentChanged = class extends Schema_exports.TaggedError()(
38
+ "UiDeploymentChanged",
39
+ {},
40
+ { httpApiStatus: 409 }
41
+ ) {
42
+ };
43
+ var UiFailed = class extends Schema_exports.TaggedError()(
44
+ "UiFailed",
45
+ {
46
+ reason: Schema_exports.Literals(["unavailable", "operation_failed", "account_required"])
47
+ },
48
+ { httpApiStatus: 422 }
49
+ ) {
50
+ };
51
+ var UiSnapshot = Schema_exports.Union([
52
+ Schema_exports.Struct({
53
+ type: Schema_exports.Literal("snapshot"),
54
+ value: JsonValue,
55
+ trace: Schema_exports.optional(Schema_exports.Unknown)
56
+ }),
57
+ Schema_exports.Struct({ type: Schema_exports.Literal("failure"), error: UiFailed }),
58
+ Schema_exports.Struct({ type: Schema_exports.Literal("heartbeat") })
59
+ ]);
60
+ var errors = [UiUnauthorized, UiForbidden, UiDeploymentChanged, UiFailed];
61
+ var AppUiApi = HttpApi_exports.make("app-ui").add(
62
+ HttpApiGroup_exports.make("ui").add(
63
+ HttpApiEndpoint_exports.post("query", "/_executor/api/query", {
64
+ payload: UiOperation,
65
+ success: JsonValue,
66
+ error: errors
67
+ })
68
+ ).add(
69
+ HttpApiEndpoint_exports.post("mutate", "/_executor/api/mutate", {
70
+ payload: UiOperation,
71
+ success: JsonValue,
72
+ error: errors
73
+ })
74
+ ).add(
75
+ HttpApiEndpoint_exports.post("subscribe", "/_executor/api/subscribe", {
76
+ payload: UiOperation,
77
+ success: HttpApiSchema_exports.StreamSse({ data: UiSnapshot, error: Schema_exports.Union(errors) }),
78
+ error: errors
79
+ })
80
+ )
81
+ );
82
+
83
+ export {
84
+ UiContext,
85
+ UiOperation,
86
+ UiUnauthorized,
87
+ UiForbidden,
88
+ UiDeploymentChanged,
89
+ UiFailed,
90
+ UiSnapshot,
91
+ AppUiApi
92
+ };
@@ -1,26 +1,33 @@
1
1
  import {
2
2
  prepareElicitation
3
- } from "./chunk-LUVSFETN.js";
3
+ } from "./chunk-PO5NPRFT.js";
4
4
  import {
5
+ bodyUpstreamError,
5
6
  fromPromise
6
- } from "./chunk-3XKZDQLM.js";
7
+ } from "./chunk-LTDHQJ2Z.js";
7
8
  import {
8
9
  ElicitationFailed,
9
10
  McpError,
11
+ McpServerHeader,
10
12
  McpToolMetadata,
11
13
  McpToolResult,
14
+ RouterIcon,
12
15
  ToolResultObservation,
13
16
  defaultElicitationLimits,
14
17
  defaultMcpClientLimits,
15
18
  mcpSdkTimerCeilingMs
16
- } from "./chunk-DQAZTA4I.js";
19
+ } from "./chunk-JY56GVSV.js";
17
20
  import {
18
- compileJsonSchemaDecoder,
19
- jsonSchemaDecoder
20
- } from "./chunk-FWQC6I3C.js";
21
+ jsonSchemaDecoder,
22
+ nestJsonSchema,
23
+ preparedJsonSchemaDecoder
24
+ } from "./chunk-KGCTYL2S.js";
25
+ import {
26
+ owned
27
+ } from "./chunk-JM7LOD2W.js";
21
28
  import {
22
29
  JsonObject
23
- } from "./chunk-27F7W2LG.js";
30
+ } from "./chunk-H2CJWXA3.js";
24
31
  import {
25
32
  Clock_exports,
26
33
  Deferred_exports,
@@ -29,29 +36,79 @@ import {
29
36
  Option_exports,
30
37
  Queue_exports,
31
38
  Schema_exports
32
- } from "./chunk-CDL5PM2Q.js";
39
+ } from "./chunk-IFJU5SYQ.js";
33
40
 
34
41
  // src/implementation/mcp-tools.ts
42
+ var resultFields = {
43
+ content: { type: "array", items: { type: "object" } },
44
+ structuredContent: { type: "object" },
45
+ isError: { type: "boolean" },
46
+ _meta: { type: "object" }
47
+ };
48
+ var definitionReference = /^#\/(?:\$defs|definitions)\/[^/]+$/;
49
+ var locating = /* @__PURE__ */ new Set(["$id", "$anchor", "$dynamicAnchor", "$recursiveAnchor"]);
50
+ var onlyDefinitionReferences = (value) => Array.isArray(value) ? value.every(onlyDefinitionReferences) : value === null || typeof value !== "object" ? true : Object.entries(value).every(
51
+ ([key, item]) => locating.has(key) || key === "$dynamicRef" || key === "$recursiveRef" ? false : key === "$ref" ? typeof item === "string" && definitionReference.test(item) : onlyDefinitionReferences(item)
52
+ );
53
+ var placed = (structuredContent, pointer) => {
54
+ if (onlyDefinitionReferences(structuredContent)) {
55
+ const { $defs, definitions, $schema: _draft, ...schema } = structuredContent;
56
+ return {
57
+ schema,
58
+ root: {
59
+ ...$defs === void 0 ? {} : { $defs },
60
+ ...definitions === void 0 ? {} : { definitions }
61
+ }
62
+ };
63
+ }
64
+ try {
65
+ return { schema: nestJsonSchema(structuredContent, pointer), root: {} };
66
+ } catch {
67
+ return { schema: structuredContent, root: {} };
68
+ }
69
+ };
70
+ var resultSchema = (structuredContent) => {
71
+ if (structuredContent === void 0)
72
+ return { type: "object", properties: resultFields, required: ["content"] };
73
+ const { schema, root } = placed(structuredContent, "#/anyOf/0/properties/structuredContent");
74
+ return {
75
+ // The envelope's keywords mean the same in every draft, so the server's draft applies.
76
+ ...structuredContent.$schema === void 0 ? {} : { $schema: structuredContent.$schema },
77
+ ...root,
78
+ anyOf: [
79
+ {
80
+ type: "object",
81
+ properties: { ...resultFields, structuredContent: schema, isError: { const: false } },
82
+ required: ["content", "structuredContent"]
83
+ },
84
+ {
85
+ type: "object",
86
+ properties: { ...resultFields, isError: { const: true } },
87
+ required: ["content", "isError"]
88
+ }
89
+ ]
90
+ };
91
+ };
35
92
  var adaptMcpTool = (client, tool) => Effect_exports.gen(function* () {
36
93
  const decoder = yield* jsonSchemaDecoder(tool.inputSchema).pipe(
37
94
  Effect_exports.mapError(() => new McpError({ phase: "schema", reason: "invalid_response" }))
38
95
  );
39
- const output = tool.outputSchema === void 0 ? void 0 : yield* Effect_exports.cached(
40
- compileJsonSchemaDecoder(tool.outputSchema).pipe(
41
- Effect_exports.mapError(() => new McpError({ phase: "schema", reason: "invalid_response" }))
42
- )
43
- );
96
+ const output = preparedJsonSchemaDecoder(resultSchema(tool.outputSchema));
97
+ const { outputSchema: _upstream, ...metadata } = tool;
44
98
  const adapted = {
45
- ...tool,
99
+ ...metadata,
46
100
  description: tool.description ?? tool.title ?? tool.name,
47
101
  input: decoder,
102
+ output: output.decoder,
48
103
  ...tool.annotations?.readOnlyHint === void 0 ? {} : { readOnly: tool.annotations.readOnlyHint },
49
104
  run: (context, input) => Effect_exports.gen(function* () {
50
105
  const arguments_ = yield* Schema_exports.decodeUnknownEffect(decoder)(input).pipe(
51
106
  Effect_exports.flatMap(Schema_exports.decodeUnknownEffect(JsonObject)),
52
107
  Effect_exports.mapError(() => new McpError({ phase: "call", reason: "invalid_input" }))
53
108
  );
54
- const outputDecoder = output === void 0 ? void 0 : yield* output;
109
+ yield* output.compile.pipe(
110
+ Effect_exports.mapError(() => new McpError({ phase: "schema", reason: "invalid_response" }))
111
+ );
55
112
  const result = yield* client.call(tool.name, arguments_, context);
56
113
  if (result.isError === true) {
57
114
  (yield* ToolResultObservation).failed();
@@ -60,17 +117,13 @@ var adaptMcpTool = (client, tool) => Effect_exports.gen(function* () {
60
117
  "error.type": "McpToolError"
61
118
  });
62
119
  }
63
- if (outputDecoder !== void 0 && !result.isError)
64
- yield* Schema_exports.decodeUnknownEffect(outputDecoder)(result.structuredContent).pipe(
65
- Effect_exports.mapError(() => new McpError({ phase: "call", reason: "invalid_response" }))
66
- );
67
120
  return result;
68
121
  })
69
122
  };
70
123
  return adapted;
71
124
  });
72
125
  var adaptMcpTools = (client) => Effect_exports.gen(function* () {
73
- const metadata = yield* client.list;
126
+ const { tools: metadata } = yield* client.list;
74
127
  const entries = yield* Effect_exports.forEach(
75
128
  metadata,
76
129
  (tool) => adaptMcpTool(client, tool).pipe(Effect_exports.map((adapted) => [tool.name, adapted]))
@@ -79,7 +132,11 @@ var adaptMcpTools = (client) => Effect_exports.gen(function* () {
79
132
  });
80
133
 
81
134
  // src/implementation/mcp-client.ts
82
- import { ListToolsResultSchema } from "@modelcontextprotocol/sdk/types.js";
135
+ import {
136
+ ErrorCode as ErrorCode2,
137
+ ListToolsResultSchema,
138
+ McpError as ProtocolError2
139
+ } from "@modelcontextprotocol/sdk/types.js";
83
140
 
84
141
  // src/implementation/mcp-call.ts
85
142
  import {
@@ -131,11 +188,14 @@ var mcpCall = (client, name, input, context, timeoutMs, failure) => Effect_expor
131
188
  const callbacks = /* @__PURE__ */ new Set();
132
189
  const lifetime = yield* Effect_exports.acquireRelease(
133
190
  Effect_exports.sync(() => new AbortController()),
134
- (controller) => Effect_exports.promise(async () => {
135
- controller.abort();
136
- client.removeRequestHandler("elicitation/create");
137
- await Promise.allSettled(callbacks);
138
- })
191
+ (controller) => (
192
+ // oxlint-disable-next-line executor/authored-code-through-adapter -- the MCP SDK's elicitation callbacks
193
+ Effect_exports.promise(async () => {
194
+ controller.abort();
195
+ client.removeRequestHandler("elicitation/create");
196
+ await Promise.allSettled(callbacks);
197
+ })
198
+ )
139
199
  );
140
200
  client.setRequestHandler(ElicitRequestSchema, (request, extra) => {
141
201
  const signal = AbortSignal.any([lifetime.signal, extra.signal]);
@@ -147,7 +207,10 @@ var mcpCall = (client, name, input, context, timeoutMs, failure) => Effect_expor
147
207
  const deliver = context.elicit;
148
208
  if (deliver === void 0) return yield* new ElicitationFailed({ reason: "unavailable" });
149
209
  const answer = yield* budget.waitForInput(
150
- fromPromise(deliver)(form.request).pipe(
210
+ fromPromise(
211
+ deliver,
212
+ "elicitation"
213
+ )(form.request).pipe(
151
214
  Effect_exports.mapError(
152
215
  (error) => Option_exports.getOrElse(
153
216
  Schema_exports.decodeUnknownOption(ElicitationFailed)(error),
@@ -197,7 +260,7 @@ var mcpCall = (client, name, input, context, timeoutMs, failure) => Effect_expor
197
260
  );
198
261
  })
199
262
  ).pipe(
200
- Effect_exports.withSpan("provider.mcp.request", {
263
+ owned("upstream", "provider.mcp.request", {
201
264
  kind: "client",
202
265
  attributes: {
203
266
  "rpc.system.name": "jsonrpc",
@@ -208,6 +271,20 @@ var mcpCall = (client, name, input, context, timeoutMs, failure) => Effect_expor
208
271
  );
209
272
 
210
273
  // src/implementation/mcp-client.ts
274
+ var clientCodes = /* @__PURE__ */ new Set([
275
+ ErrorCode2.RequestTimeout,
276
+ ErrorCode2.ConnectionClosed
277
+ ]);
278
+ var answeredError = (error) => {
279
+ if (!(error instanceof ProtocolError2) || clientCodes.has(error.code)) return void 0;
280
+ const prefix = `MCP error ${error.code}: `;
281
+ return bodyUpstreamError({
282
+ error: {
283
+ code: error.code,
284
+ message: error.message.startsWith(prefix) ? error.message.slice(prefix.length) : error.message
285
+ }
286
+ });
287
+ };
211
288
  var mcpJsonSchemaValidator = {
212
289
  getValidator(document) {
213
290
  const decoder = Effect_exports.runSync(jsonSchemaDecoder(document));
@@ -233,7 +310,7 @@ function mcpClient(withClient, timeoutMs, failure) {
233
310
  do {
234
311
  const page = yield* Effect_exports.tryPromise({
235
312
  // This session only reads metadata. listTools() also eagerly compiles
236
- // every output validator; mcpOperations validates the selected tool on call.
313
+ // every output validator; mcpRouter validates the selected tool on call.
237
314
  try: (signal) => client.request(
238
315
  { method: "tools/list", params: cursor === void 0 ? {} : { cursor } },
239
316
  ListToolsResultSchema,
@@ -241,7 +318,7 @@ function mcpClient(withClient, timeoutMs, failure) {
241
318
  ),
242
319
  catch: (error) => failure("discover", error)
243
320
  }).pipe(
244
- Effect_exports.withSpan("provider.mcp.request", {
321
+ owned("upstream", "provider.mcp.request", {
245
322
  kind: "client",
246
323
  attributes: { "rpc.system.name": "jsonrpc", "rpc.method": "tools/list" }
247
324
  })
@@ -263,18 +340,55 @@ function mcpClient(withClient, timeoutMs, failure) {
263
340
  cursors.add(cursor);
264
341
  }
265
342
  } while (cursor !== void 0);
266
- return [...tools.values()];
343
+ const info = client.getServerVersion();
344
+ const instructions = client.getInstructions();
345
+ const icons = info?.icons?.flatMap(
346
+ (icon) => Option_exports.toArray(Schema_exports.decodeUnknownOption(RouterIcon)(icon))
347
+ );
348
+ const server = Schema_exports.decodeUnknownOption(McpServerHeader)({
349
+ ...info?.name === void 0 ? {} : { name: info.name },
350
+ ...info?.title === void 0 ? {} : { title: info.title },
351
+ ...info?.version === void 0 ? {} : { version: info.version },
352
+ ...info?.description === void 0 ? {} : { description: info.description },
353
+ ...info?.websiteUrl === void 0 ? {} : { websiteUrl: info.websiteUrl },
354
+ ...icons === void 0 ? {} : { icons },
355
+ ...instructions === void 0 ? {} : { instructions }
356
+ });
357
+ return {
358
+ tools: [...tools.values()],
359
+ server: Option_exports.getOrElse(server, () => ({}))
360
+ };
267
361
  })
268
- ).pipe(Effect_exports.withSpan("provider.mcp.discover"));
362
+ ).pipe(owned("upstream", "provider.mcp.discover"));
363
+ const check = withClient(
364
+ "discover",
365
+ (client) => (
366
+ // oxlint-disable-next-line executor/authored-code-through-adapter -- MCP SDK
367
+ Effect_exports.tryPromise({
368
+ try: (signal) => client.request({ method: "tools/list", params: {} }, ListToolsResultSchema, {
369
+ signal,
370
+ timeout: timeoutMs
371
+ }),
372
+ catch: (error) => failure("discover", error)
373
+ }).pipe(
374
+ Effect_exports.asVoid,
375
+ owned("upstream", "provider.mcp.request", {
376
+ kind: "client",
377
+ attributes: { "rpc.system.name": "jsonrpc", "rpc.method": "tools/list" }
378
+ })
379
+ )
380
+ )
381
+ ).pipe(owned("upstream", "provider.mcp.check"));
269
382
  const call = (name, input, context) => withClient("call", (client) => mcpCall(client, name, input, context, timeoutMs, failure)).pipe(
270
- Effect_exports.withSpan("provider.mcp.call", { attributes: { "mcp.tool.name": name } })
383
+ owned("upstream", "provider.mcp.call", { attributes: { "mcp.tool.name": name } })
271
384
  );
272
- return { list, call };
385
+ return { list, check, call };
273
386
  }
274
387
 
275
388
  export {
276
389
  adaptMcpTool,
277
390
  adaptMcpTools,
391
+ answeredError,
278
392
  mcpJsonSchemaValidator,
279
393
  mcpClient
280
394
  };