apps 0.0.1-beta.10 → 0.0.1-beta.100

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 (195) hide show
  1. package/README.md +60 -42
  2. package/framework-reference.json +1 -1
  3. package/js/{chunk-Z5M2LQOZ.js → chunk-2CURR5Y7.js} +113 -58
  4. package/js/{chunk-72JNVHPK.js → chunk-2LSGC7XY.js} +4 -3
  5. package/js/{chunk-JU7VHODU.js → chunk-4PIQKACY.js} +65 -10
  6. package/js/chunk-4UPC36ZL.js +5185 -0
  7. package/js/{chunk-VFZKSM3T.js → chunk-4X2UI4R2.js} +3 -3
  8. package/js/chunk-5C6RAGAS.js +335 -0
  9. package/js/{chunk-KUMBKVJD.js → chunk-62NVUKED.js} +2 -2
  10. package/js/chunk-74H25C4X.js +95 -0
  11. package/js/chunk-7HG422GB.js +90 -0
  12. package/js/chunk-7STIP5CS.js +171 -0
  13. package/js/{chunk-UK573G7W.js → chunk-ACQXVKVQ.js} +87 -51
  14. package/js/{chunk-IJX4CYZO.js → chunk-DILSCQPJ.js} +228 -264
  15. package/js/chunk-ILYCJ3HV.js +449 -0
  16. package/js/chunk-K6TSCYAO.js +712 -0
  17. package/js/{chunk-M3B3DE4K.js → chunk-KLSEU35Y.js} +463 -218
  18. package/js/chunk-OD3KFKZD.js +1617 -0
  19. package/js/chunk-OWN3DP2W.js +88 -0
  20. package/js/{chunk-IPI4MFSN.js → chunk-PBGPES67.js} +2 -2
  21. package/js/{chunk-FL2QR3XW.js → chunk-QI66R4FP.js} +355 -76
  22. package/js/{chunk-V5KNQVCT.js → chunk-RN4YB4JT.js} +931 -289
  23. package/js/{chunk-ODEIDRGW.js → chunk-URKOTNDA.js} +795 -176
  24. package/js/{chunk-5T57N25Q.js → chunk-VAI3EVCS.js} +643 -69
  25. package/js/chunk-VCYWAA4N.js +49 -0
  26. package/js/{chunk-57RKNWL2.js → chunk-YDW7DX3A.js} +4 -4
  27. package/js/{chunk-RFVIONFX.js → chunk-YWVISRZD.js} +123 -44
  28. package/js/{chunk-CDL5PM2Q.js → chunk-ZKDXML77.js} +19239 -18404
  29. package/js/client.js +148 -84
  30. package/js/contracts.js +150 -21
  31. package/js/effect.js +18 -19
  32. package/js/{es-APDZKREY.js → es-DIULA3ZF.js} +62 -1659
  33. package/js/graphql.js +49 -40
  34. package/js/host.js +85 -62
  35. package/js/index.js +212 -98
  36. package/js/mcp/effect.js +21 -21
  37. package/js/mcp.js +84 -57
  38. package/js/openapi.js +4189 -1411
  39. package/js/react.js +2 -3
  40. package/js/skills/effect.js +6 -3
  41. package/js/skills.js +208 -81
  42. package/js/storage/facet.js +1 -540
  43. package/js/ui/auth/contracts.js +2 -2
  44. package/js/ui/auth.js +5 -5
  45. package/js/ui/contracts.js +9 -8
  46. package/js/ui/serving.js +8609 -228
  47. package/package.json +3 -8
  48. package/runtime.json +1 -1
  49. package/types/app-cache/src/contracts/cache.d.ts +18 -0
  50. package/types/app-cache/src/index.d.ts +34 -2
  51. package/types/apps/src/contracts/api-response-error.d.ts +4 -0
  52. package/types/apps/src/contracts/app.d.ts +56 -11
  53. package/types/apps/src/contracts/cache.d.ts +20 -0
  54. package/types/apps/src/contracts/context.d.ts +60 -17
  55. package/types/apps/src/contracts/elicitation.d.ts +23 -7
  56. package/types/apps/src/contracts/events.d.ts +94 -0
  57. package/types/apps/src/contracts/failure.d.ts +30 -1
  58. package/types/apps/src/contracts/graphql.d.ts +2 -1
  59. package/types/apps/src/contracts/host.d.ts +1456 -20
  60. package/types/apps/src/contracts/icons.d.ts +28 -0
  61. package/types/apps/src/contracts/live.d.ts +2 -0
  62. package/types/apps/src/contracts/mcp.d.ts +81 -20
  63. package/types/apps/src/contracts/network.d.ts +120 -0
  64. package/types/apps/src/contracts/openapi-compile.d.ts +82 -3
  65. package/types/apps/src/contracts/openapi-document.d.ts +1 -1
  66. package/types/apps/src/contracts/openapi.d.ts +41 -9
  67. package/types/apps/src/contracts/operations.d.ts +14 -7
  68. package/types/apps/src/contracts/placement.d.ts +102 -0
  69. package/types/apps/src/contracts/protocol-version.d.ts +2 -2
  70. package/types/apps/src/contracts/protocols/1.d.ts +733 -81
  71. package/types/apps/src/contracts/protocols/10.d.ts +1450 -0
  72. package/types/apps/src/contracts/protocols/11.d.ts +1149 -0
  73. package/types/apps/src/contracts/protocols/12.d.ts +3310 -0
  74. package/types/apps/src/contracts/protocols/2.d.ts +69 -26
  75. package/types/apps/src/contracts/protocols/3.d.ts +133 -33
  76. package/types/apps/src/contracts/protocols/4.d.ts +122 -45
  77. package/types/apps/src/contracts/protocols/5.d.ts +157 -47
  78. package/types/apps/src/contracts/protocols/6.d.ts +1629 -0
  79. package/types/apps/src/contracts/protocols/7.d.ts +1785 -0
  80. package/types/apps/src/contracts/protocols/8.d.ts +1182 -0
  81. package/types/apps/src/contracts/protocols/9.d.ts +1104 -0
  82. package/types/apps/src/contracts/protocols/current.d.ts +6857 -0
  83. package/types/apps/src/contracts/protocols/oauth-6.d.ts +74 -0
  84. package/types/apps/src/contracts/protocols/oauth.d.ts +134 -0
  85. package/types/apps/src/contracts/provider-error.d.ts +9 -0
  86. package/types/apps/src/contracts/provider.d.ts +90 -6
  87. package/types/apps/src/contracts/schedules.d.ts +7 -1
  88. package/types/apps/src/contracts/schema.d.ts +21 -0
  89. package/types/apps/src/contracts/shared-catalog.d.ts +11 -0
  90. package/types/apps/src/contracts/skills.d.ts +50 -13
  91. package/types/apps/src/contracts/sql.d.ts +63 -0
  92. package/types/apps/src/contracts/ui.d.ts +70 -30
  93. package/types/apps/src/contracts/webhooks.d.ts +24 -7
  94. package/types/apps/src/contracts/workflows.d.ts +56 -34
  95. package/types/apps/src/facet.d.ts +4 -5
  96. package/types/apps/src/host.d.ts +5 -0
  97. package/types/apps/src/implementation/account-router.d.ts +4 -3
  98. package/types/apps/src/implementation/app.d.ts +41 -14
  99. package/types/apps/src/implementation/authoring.d.ts +25 -5
  100. package/types/apps/src/implementation/browser-scripts.gen.d.ts +6 -0
  101. package/types/apps/src/implementation/cache.d.ts +29 -2
  102. package/types/apps/src/implementation/catalog-cache.d.ts +35 -4
  103. package/types/apps/src/implementation/elicitation.d.ts +18 -15
  104. package/types/apps/src/implementation/events.d.ts +64 -0
  105. package/types/apps/src/implementation/failure-detail.d.ts +28 -5
  106. package/types/apps/src/implementation/graphql-catalog.d.ts +3 -3
  107. package/types/apps/src/implementation/graphql.d.ts +4 -3
  108. package/types/apps/src/implementation/input-problems.d.ts +6 -2
  109. package/types/apps/src/implementation/invocation-timing.d.ts +18 -0
  110. package/types/apps/src/implementation/live.d.ts +2 -2
  111. package/types/apps/src/implementation/mcp-call.d.ts +6 -5
  112. package/types/apps/src/implementation/mcp-catalog.d.ts +6 -4
  113. package/types/apps/src/implementation/mcp-client.d.ts +17 -9
  114. package/types/apps/src/implementation/mcp-tools.d.ts +2 -1
  115. package/types/apps/src/implementation/mcp.d.ts +20 -9
  116. package/types/apps/src/implementation/network.d.ts +16 -0
  117. package/types/apps/src/implementation/openapi-compile.d.ts +28 -7
  118. package/types/apps/src/implementation/openapi-document.d.ts +46 -19
  119. package/types/apps/src/implementation/openapi-names.d.ts +9 -4
  120. package/types/apps/src/implementation/openapi-request.d.ts +10 -2
  121. package/types/apps/src/implementation/openapi-source.d.ts +23 -1
  122. package/types/apps/src/implementation/openapi-upgrade.d.ts +4 -0
  123. package/types/apps/src/implementation/operations.d.ts +58 -7
  124. package/types/apps/src/implementation/optimistic.d.ts +1 -1
  125. package/types/apps/src/implementation/placement.d.ts +60 -0
  126. package/types/apps/src/implementation/protocol-operations.d.ts +3 -0
  127. package/types/apps/src/implementation/provider-error.d.ts +28 -1
  128. package/types/apps/src/implementation/provider.d.ts +19 -4
  129. package/types/apps/src/implementation/query-commit.d.ts +1 -1
  130. package/types/apps/src/implementation/router-catalog.d.ts +20 -18
  131. package/types/apps/src/implementation/router.d.ts +24 -5
  132. package/types/apps/src/implementation/runtime-yield.d.ts +7 -0
  133. package/types/apps/src/implementation/schedules.d.ts +39 -8
  134. package/types/apps/src/implementation/schema.d.ts +108 -11
  135. package/types/apps/src/implementation/skills.d.ts +18 -24
  136. package/types/apps/src/implementation/sql.d.ts +71 -0
  137. package/types/apps/src/implementation/ui-account-notice.d.ts +9 -0
  138. package/types/apps/src/implementation/ui-auth.d.ts +1 -1
  139. package/types/apps/src/implementation/ui-client.d.ts +3 -3
  140. package/types/apps/src/implementation/ui-document.d.ts +5 -0
  141. package/types/apps/src/implementation/ui-errors.d.ts +1 -1
  142. package/types/apps/src/implementation/ui-serving.d.ts +28 -11
  143. package/types/apps/src/implementation/ui-watch.d.ts +1 -1
  144. package/types/apps/src/implementation/upstream-error.d.ts +7 -0
  145. package/types/apps/src/implementation/webhooks.d.ts +15 -6
  146. package/types/apps/src/implementation/workflow-context.d.ts +6 -2
  147. package/types/apps/src/implementation/workflows.d.ts +11 -4
  148. package/types/apps/src/index.d.ts +68 -19
  149. package/types/apps/src/mcp.d.ts +20 -1
  150. package/types/apps/src/openapi.d.ts +6 -1
  151. package/types/apps/src/react.d.ts +1 -1
  152. package/types/apps/src/skills.d.ts +10 -8
  153. package/types/apps/src/ui-serving.d.ts +1 -1
  154. package/types/telemetry/src/app-records.d.ts +42 -0
  155. package/types/telemetry/src/browser-operations.d.ts +2 -2
  156. package/types/telemetry/src/browser.d.ts +8 -3
  157. package/types/telemetry/src/config.d.ts +2 -2
  158. package/types/telemetry/src/index.d.ts +2 -1
  159. package/types/telemetry/src/layer.d.ts +10 -4
  160. package/types/telemetry/src/measurements.d.ts +1 -1
  161. package/types/telemetry/src/ownership.d.ts +60 -0
  162. package/types/telemetry/src/recorded-failure.d.ts +29 -0
  163. package/types/telemetry/src/relay.d.ts +16 -6
  164. package/types/telemetry/src/span-attributes.d.ts +17 -1
  165. package/types/telemetry/src/transport.d.ts +8 -1
  166. package/types/utils/src/api-error.d.ts +55 -0
  167. package/types/utils/src/connection-failure.d.ts +33 -0
  168. package/types/utils/src/legacy-keys.d.ts +20 -0
  169. package/types/utils/src/recorded-message.d.ts +18 -0
  170. package/types/utils/src/schema-definitions.d.ts +13 -0
  171. package/types/utils/src/user-facing-error.d.ts +83 -0
  172. package/js/chunk-27F7W2LG.js +0 -34
  173. package/js/chunk-CRDWFA74.js +0 -299
  174. package/js/chunk-EPT3ZP52.js +0 -224
  175. package/js/chunk-MKWZPDR6.js +0 -63
  176. package/js/chunk-N7YDVXYJ.js +0 -186
  177. package/js/chunk-NKLWZJLE.js +0 -172
  178. package/js/chunk-PJJ24GU7.js +0 -877
  179. package/js/chunk-PZB6T6KU.js +0 -19
  180. package/js/chunk-R3EV5FTO.js +0 -97
  181. package/js/chunk-WLE7WX2U.js +0 -2645
  182. package/js/chunk-YXQHV65J.js +0 -242
  183. package/js/chunk-ZQINWV4W.js +0 -630
  184. package/js/mcp/stdio.js +0 -128
  185. package/types/app-data/src/implementation/cursor.d.ts +0 -10
  186. package/types/app-data/src/implementation/index-key.d.ts +0 -7
  187. package/types/app-data/src/implementation/promise.d.ts +0 -68
  188. package/types/app-data/src/implementation/range.d.ts +0 -8
  189. package/types/app-data/src/implementation/schema.d.ts +0 -18
  190. package/types/app-data/src/implementation/sqlite.d.ts +0 -11
  191. package/types/app-data/src/index.d.ts +0 -4
  192. package/types/apps/src/contracts/storage.d.ts +0 -68
  193. package/types/apps/src/implementation/mcp-stdio.d.ts +0 -4
  194. package/types/apps/src/implementation/storage.d.ts +0 -15
  195. package/types/apps/src/mcp-stdio.d.ts +0 -5
@@ -1,299 +0,0 @@
1
- import {
2
- prepareElicitation
3
- } from "./chunk-V5KNQVCT.js";
4
- import {
5
- fromPromise
6
- } from "./chunk-Z5M2LQOZ.js";
7
- import {
8
- ElicitationFailed,
9
- McpError,
10
- McpServerHeader,
11
- McpToolMetadata,
12
- McpToolResult,
13
- RouterIcon,
14
- ToolResultObservation,
15
- defaultElicitationLimits,
16
- defaultMcpClientLimits,
17
- mcpSdkTimerCeilingMs
18
- } from "./chunk-WLE7WX2U.js";
19
- import {
20
- compileJsonSchemaDecoder,
21
- jsonSchemaDecoder
22
- } from "./chunk-5T57N25Q.js";
23
- import {
24
- JsonObject
25
- } from "./chunk-27F7W2LG.js";
26
- import {
27
- Clock_exports,
28
- Deferred_exports,
29
- Effect_exports,
30
- Exit_exports,
31
- Option_exports,
32
- Queue_exports,
33
- Schema_exports
34
- } from "./chunk-CDL5PM2Q.js";
35
-
36
- // src/implementation/mcp-tools.ts
37
- var adaptMcpTool = (client, tool) => Effect_exports.gen(function* () {
38
- const decoder = yield* jsonSchemaDecoder(tool.inputSchema).pipe(
39
- Effect_exports.mapError(() => new McpError({ phase: "schema", reason: "invalid_response" }))
40
- );
41
- const output = tool.outputSchema === void 0 ? void 0 : yield* Effect_exports.cached(
42
- compileJsonSchemaDecoder(tool.outputSchema).pipe(
43
- Effect_exports.mapError(() => new McpError({ phase: "schema", reason: "invalid_response" }))
44
- )
45
- );
46
- const adapted = {
47
- ...tool,
48
- description: tool.description ?? tool.title ?? tool.name,
49
- input: decoder,
50
- ...tool.annotations?.readOnlyHint === void 0 ? {} : { readOnly: tool.annotations.readOnlyHint },
51
- run: (context, input) => Effect_exports.gen(function* () {
52
- const arguments_ = yield* Schema_exports.decodeUnknownEffect(decoder)(input).pipe(
53
- Effect_exports.flatMap(Schema_exports.decodeUnknownEffect(JsonObject)),
54
- Effect_exports.mapError(() => new McpError({ phase: "call", reason: "invalid_input" }))
55
- );
56
- const outputDecoder = output === void 0 ? void 0 : yield* output;
57
- const result = yield* client.call(tool.name, arguments_, context);
58
- if (result.isError === true) {
59
- (yield* ToolResultObservation).failed();
60
- yield* Effect_exports.annotateCurrentSpan({
61
- "executor.outcome": "failed",
62
- "error.type": "McpToolError"
63
- });
64
- }
65
- if (outputDecoder !== void 0 && !result.isError)
66
- yield* Schema_exports.decodeUnknownEffect(outputDecoder)(result.structuredContent).pipe(
67
- Effect_exports.mapError(() => new McpError({ phase: "call", reason: "invalid_response" }))
68
- );
69
- return result;
70
- })
71
- };
72
- return adapted;
73
- });
74
- var adaptMcpTools = (client) => Effect_exports.gen(function* () {
75
- const { tools: metadata } = yield* client.list;
76
- const entries = yield* Effect_exports.forEach(
77
- metadata,
78
- (tool) => adaptMcpTool(client, tool).pipe(Effect_exports.map((adapted) => [tool.name, adapted]))
79
- );
80
- return Object.fromEntries(entries);
81
- });
82
-
83
- // src/implementation/mcp-client.ts
84
- import { ListToolsResultSchema } from "@modelcontextprotocol/sdk/types.js";
85
-
86
- // src/implementation/mcp-call.ts
87
- import {
88
- ElicitRequestSchema,
89
- ElicitResultSchema,
90
- ErrorCode,
91
- McpError as ProtocolError
92
- } from "@modelcontextprotocol/sdk/types.js";
93
- function callBudget(timeoutMs) {
94
- return Effect_exports.gen(function* () {
95
- const clock = yield* Clock_exports.Clock;
96
- const changes = yield* Queue_exports.unbounded();
97
- let remaining = timeoutMs, updated = clock.currentTimeMillisUnsafe(), waiting = 0;
98
- const account = () => {
99
- const now = clock.currentTimeMillisUnsafe();
100
- if (waiting === 0) remaining -= Math.max(0, now - updated);
101
- updated = now;
102
- return remaining;
103
- };
104
- return {
105
- waitForInput: (input) => Effect_exports.acquireUseRelease(
106
- Effect_exports.sync(() => {
107
- account();
108
- waiting++;
109
- }).pipe(Effect_exports.andThen(Queue_exports.offer(changes, void 0))),
110
- () => input,
111
- () => Effect_exports.sync(() => {
112
- account();
113
- waiting--;
114
- }).pipe(Effect_exports.andThen(Queue_exports.offer(changes, void 0)))
115
- ),
116
- expired: Effect_exports.gen(function* () {
117
- while (true) {
118
- const left = account();
119
- if (waiting === 0 && left <= 0)
120
- return yield* new McpError({ phase: "call", reason: "timeout" });
121
- if (waiting > 0) yield* Queue_exports.take(changes);
122
- else yield* Queue_exports.take(changes).pipe(Effect_exports.raceFirst(Effect_exports.sleep(Math.max(1, left))));
123
- }
124
- })
125
- };
126
- });
127
- }
128
- var mcpCall = (client, name, input, context, timeoutMs, failure) => Effect_exports.scoped(
129
- Effect_exports.gen(function* () {
130
- const budget = yield* callBudget(timeoutMs);
131
- const failed = yield* Deferred_exports.make();
132
- const runtime = yield* Effect_exports.context();
133
- const callbacks = /* @__PURE__ */ new Set();
134
- const lifetime = yield* Effect_exports.acquireRelease(
135
- Effect_exports.sync(() => new AbortController()),
136
- (controller) => Effect_exports.promise(async () => {
137
- controller.abort();
138
- client.removeRequestHandler("elicitation/create");
139
- await Promise.allSettled(callbacks);
140
- })
141
- );
142
- client.setRequestHandler(ElicitRequestSchema, (request, extra) => {
143
- const signal = AbortSignal.any([lifetime.signal, extra.signal]);
144
- const interaction = Effect_exports.gen(function* () {
145
- const form = yield* prepareElicitation({
146
- ...request.params,
147
- mode: request.params.mode ?? "form"
148
- });
149
- const deliver = context.elicit;
150
- if (deliver === void 0) return yield* new ElicitationFailed({ reason: "unavailable" });
151
- const answer = yield* budget.waitForInput(
152
- fromPromise(deliver)(form.request).pipe(
153
- Effect_exports.mapError(
154
- (error) => Option_exports.getOrElse(
155
- Schema_exports.decodeUnknownOption(ElicitationFailed)(error),
156
- () => new ElicitationFailed({ reason: "transport" })
157
- )
158
- ),
159
- Effect_exports.timeoutOrElse({
160
- duration: defaultElicitationLimits.timeoutMs,
161
- orElse: () => Effect_exports.fail(new ElicitationFailed({ reason: "expired" }))
162
- })
163
- )
164
- ).pipe(Effect_exports.withSpan("provider.mcp.elicitation"));
165
- return yield* form.respond(answer).pipe(
166
- Effect_exports.flatMap(
167
- (response) => Effect_exports.try({
168
- try: () => ElicitResultSchema.parse(response),
169
- catch: () => new ElicitationFailed({ reason: "invalid-response" })
170
- })
171
- )
172
- );
173
- }).pipe(Effect_exports.tapError((error) => Deferred_exports.fail(failed, error)));
174
- const callback = Effect_exports.runPromiseWith(runtime)(interaction, { signal }).catch(() => {
175
- if (!lifetime.signal.aborted)
176
- Effect_exports.runSync(Deferred_exports.fail(failed, new ElicitationFailed({ reason: "transport" })));
177
- throw new ProtocolError(ErrorCode.InternalError, "User input could not be delivered");
178
- });
179
- callbacks.add(callback);
180
- return callback.finally(() => callbacks.delete(callback));
181
- });
182
- return yield* Effect_exports.tryPromise({
183
- try: (signal) => client.callTool({ name, arguments: input }, void 0, {
184
- signal: AbortSignal.any([signal, lifetime.signal]),
185
- timeout: mcpSdkTimerCeilingMs
186
- }),
187
- catch: (error) => failure("call", error)
188
- }).pipe(
189
- Effect_exports.raceFirst(Deferred_exports.await(failed)),
190
- Effect_exports.raceFirst(budget.expired),
191
- Effect_exports.flatMap(
192
- (result) => Schema_exports.decodeUnknownEffect(McpToolResult)(result).pipe(
193
- Effect_exports.mapError(() => new McpError({ phase: "call", reason: "invalid_response" }))
194
- )
195
- ),
196
- Effect_exports.tap(
197
- (result) => Effect_exports.annotateCurrentSpan("mcp.tool.is_error", result.isError === true)
198
- )
199
- );
200
- })
201
- ).pipe(
202
- Effect_exports.withSpan("provider.mcp.request", {
203
- kind: "client",
204
- attributes: {
205
- "rpc.system.name": "jsonrpc",
206
- "rpc.method": "tools/call",
207
- "mcp.tool.name": name
208
- }
209
- })
210
- );
211
-
212
- // src/implementation/mcp-client.ts
213
- var mcpJsonSchemaValidator = {
214
- getValidator(document) {
215
- const decoder = Effect_exports.runSync(jsonSchemaDecoder(document));
216
- return (input) => {
217
- const result = Effect_exports.runSyncExit(Schema_exports.decodeUnknownEffect(decoder)(input));
218
- if (Exit_exports.isFailure(result))
219
- return {
220
- valid: false,
221
- data: void 0,
222
- errorMessage: "Value does not match the supported JSON Schema"
223
- };
224
- return { valid: true, data: result.value, errorMessage: void 0 };
225
- };
226
- }
227
- };
228
- function mcpClient(withClient, timeoutMs, failure) {
229
- const list = withClient(
230
- "discover",
231
- (client) => Effect_exports.gen(function* () {
232
- const tools = /* @__PURE__ */ new Map();
233
- const cursors = /* @__PURE__ */ new Set();
234
- let cursor;
235
- do {
236
- const page = yield* Effect_exports.tryPromise({
237
- // This session only reads metadata. listTools() also eagerly compiles
238
- // every output validator; mcpRouter validates the selected tool on call.
239
- try: (signal) => client.request(
240
- { method: "tools/list", params: cursor === void 0 ? {} : { cursor } },
241
- ListToolsResultSchema,
242
- { signal, timeout: timeoutMs }
243
- ),
244
- catch: (error) => failure("discover", error)
245
- }).pipe(
246
- Effect_exports.withSpan("provider.mcp.request", {
247
- kind: "client",
248
- attributes: { "rpc.system.name": "jsonrpc", "rpc.method": "tools/list" }
249
- })
250
- );
251
- const metadata = yield* Schema_exports.decodeUnknownEffect(Schema_exports.Array(McpToolMetadata))(
252
- page.tools
253
- ).pipe(
254
- Effect_exports.mapError(() => new McpError({ phase: "discover", reason: "invalid_response" }))
255
- );
256
- for (const tool of metadata) {
257
- if (!tool.name || tools.has(tool.name) || tools.size >= defaultMcpClientLimits.maxTools)
258
- return yield* new McpError({ phase: "discover", reason: "invalid_response" });
259
- tools.set(tool.name, tool);
260
- }
261
- cursor = page.nextCursor;
262
- if (cursor !== void 0) {
263
- if (cursors.has(cursor) || cursors.size >= defaultMcpClientLimits.maxPaginationCursors)
264
- return yield* new McpError({ phase: "discover", reason: "invalid_response" });
265
- cursors.add(cursor);
266
- }
267
- } while (cursor !== void 0);
268
- const info = client.getServerVersion();
269
- const instructions = client.getInstructions();
270
- const icons = info?.icons?.flatMap(
271
- (icon) => Option_exports.toArray(Schema_exports.decodeUnknownOption(RouterIcon)(icon))
272
- );
273
- const server = Schema_exports.decodeUnknownOption(McpServerHeader)({
274
- ...info?.name === void 0 ? {} : { name: info.name },
275
- ...info?.title === void 0 ? {} : { title: info.title },
276
- ...info?.version === void 0 ? {} : { version: info.version },
277
- ...info?.description === void 0 ? {} : { description: info.description },
278
- ...info?.websiteUrl === void 0 ? {} : { websiteUrl: info.websiteUrl },
279
- ...icons === void 0 ? {} : { icons },
280
- ...instructions === void 0 ? {} : { instructions }
281
- });
282
- return {
283
- tools: [...tools.values()],
284
- server: Option_exports.getOrElse(server, () => ({}))
285
- };
286
- })
287
- ).pipe(Effect_exports.withSpan("provider.mcp.discover"));
288
- const call = (name, input, context) => withClient("call", (client) => mcpCall(client, name, input, context, timeoutMs, failure)).pipe(
289
- Effect_exports.withSpan("provider.mcp.call", { attributes: { "mcp.tool.name": name } })
290
- );
291
- return { list, call };
292
- }
293
-
294
- export {
295
- adaptMcpTool,
296
- adaptMcpTools,
297
- mcpJsonSchemaValidator,
298
- mcpClient
299
- };
@@ -1,224 +0,0 @@
1
- import {
2
- adaptMcpTools,
3
- mcpClient,
4
- mcpJsonSchemaValidator
5
- } from "./chunk-CRDWFA74.js";
6
- import {
7
- accountProviderError,
8
- httpProviderError
9
- } from "./chunk-MKWZPDR6.js";
10
- import {
11
- McpError,
12
- McpToolsOptions,
13
- defaultMcpClientLimits
14
- } from "./chunk-WLE7WX2U.js";
15
- import {
16
- ProviderError
17
- } from "./chunk-R3EV5FTO.js";
18
- import {
19
- captureTelemetry
20
- } from "./chunk-ODEIDRGW.js";
21
- import {
22
- FetchHttpClient_exports
23
- } from "./chunk-57RKNWL2.js";
24
- import {
25
- HttpClientRequest_exports,
26
- HttpClient_exports
27
- } from "./chunk-UK573G7W.js";
28
- import {
29
- Deferred_exports,
30
- Effect_exports,
31
- Redacted_exports,
32
- Schema_exports,
33
- Stream_exports
34
- } from "./chunk-CDL5PM2Q.js";
35
-
36
- // src/implementation/mcp.ts
37
- import { UnauthorizedError } from "@modelcontextprotocol/sdk/client/auth.js";
38
- import { Client } from "@modelcontextprotocol/sdk/client/index.js";
39
- import {
40
- ErrorCode,
41
- McpError as ProtocolError,
42
- ToolListChangedNotificationSchema
43
- } from "@modelcontextprotocol/sdk/types.js";
44
- import { SSEClientTransport, SseError } from "@modelcontextprotocol/sdk/client/sse.js";
45
- import {
46
- StreamableHTTPClientTransport,
47
- StreamableHTTPError
48
- } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
49
- var failure = (phase, error) => {
50
- if (Schema_exports.is(ProviderError)(error) || Schema_exports.is(McpError)(error)) return error;
51
- const status = error instanceof UnauthorizedError ? 401 : error instanceof StreamableHTTPError || error instanceof SseError ? error.code : void 0;
52
- const provider = status === void 0 ? void 0 : httpProviderError(status);
53
- if (provider !== void 0) return provider;
54
- return new McpError({
55
- phase,
56
- reason: error instanceof ProtocolError && error.code === ErrorCode.RequestTimeout ? "timeout" : "request",
57
- ...status === void 0 ? {} : { status }
58
- });
59
- };
60
- var transportFetch = (connection, telemetry, rejected) => (url, init) => Effect_exports.runPromiseWith(telemetry.context)(
61
- Effect_exports.gen(function* () {
62
- const target = yield* Effect_exports.try({
63
- try: () => new URL(url),
64
- catch: () => new McpError({ phase: "transport", reason: "invalid_response" })
65
- });
66
- if (connection.url.username || connection.url.password)
67
- return yield* new McpError({ phase: "transport", reason: "invalid_input" });
68
- if (target.origin !== connection.url.origin || target.username || target.password)
69
- return yield* new McpError({ phase: "transport", reason: "invalid_response" });
70
- const headers = new Headers(Redacted_exports.value(connection.headers));
71
- new Headers(init?.headers).forEach((value, name) => headers.set(name, value));
72
- const request = yield* Effect_exports.try({
73
- try: () => HttpClientRequest_exports.fromWeb(new Request(target, { ...init, headers })),
74
- catch: () => failure("transport", void 0)
75
- });
76
- const client = yield* HttpClient_exports.HttpClient;
77
- const response = yield* client.execute(request);
78
- const provider = httpProviderError(response.status, response.headers);
79
- if (provider !== void 0) {
80
- yield* Deferred_exports.fail(rejected, provider);
81
- return yield* provider;
82
- }
83
- return new Response(
84
- [204, 205, 304].includes(response.status) ? null : Stream_exports.toReadableStream(response.stream),
85
- {
86
- status: response.status,
87
- headers: response.headers
88
- }
89
- );
90
- }).pipe(
91
- Effect_exports.provide(FetchHttpClient_exports.layer),
92
- Effect_exports.provideService(FetchHttpClient_exports.RequestInit, { redirect: "manual" }),
93
- Effect_exports.provideService(
94
- FetchHttpClient_exports.Fetch,
95
- (url2, options) => globalThis.fetch(url2, {
96
- ...options,
97
- signal: AbortSignal.any([
98
- ...options?.signal ? [options.signal] : [],
99
- ...init?.signal ? [init.signal] : []
100
- ])
101
- })
102
- ),
103
- Effect_exports.mapError((error) => failure("transport", error))
104
- ),
105
- init?.signal ? { signal: init.signal } : {}
106
- );
107
- function withClient(connection, mode, use, changed) {
108
- const attempt = (kind) => Effect_exports.scoped(
109
- Effect_exports.gen(function* () {
110
- const telemetry = yield* captureTelemetry;
111
- const rejected = yield* Deferred_exports.make();
112
- const pending = /* @__PURE__ */ new Set();
113
- const { client, transport } = yield* Effect_exports.acquireRelease(
114
- Effect_exports.sync(() => {
115
- const fetch = transportFetch(connection, telemetry, rejected);
116
- const client2 = new Client(
117
- { name: "executor-apps", version: "0.1.0" },
118
- {
119
- jsonSchemaValidator: mcpJsonSchemaValidator,
120
- capabilities: mode === "call" ? { elicitation: { form: {} } } : {}
121
- }
122
- );
123
- if (changed !== void 0) {
124
- client2.setNotificationHandler(ToolListChangedNotificationSchema, () => {
125
- const task = Effect_exports.runPromiseWith(telemetry.context)(
126
- changed.pipe(
127
- Effect_exports.timeout("5 seconds"),
128
- Effect_exports.catchCause(() => Effect_exports.logWarning("MCP catalog invalidation failed"))
129
- )
130
- );
131
- pending.add(task);
132
- return task.finally(() => pending.delete(task));
133
- });
134
- }
135
- return {
136
- client: client2,
137
- transport: kind === "http" ? new StreamableHTTPClientTransport(connection.url, {
138
- fetch,
139
- reconnectionOptions: {
140
- maxRetries: 0,
141
- initialReconnectionDelay: 1e3,
142
- maxReconnectionDelay: 1e3,
143
- reconnectionDelayGrowFactor: 1
144
- }
145
- }) : new SSEClientTransport(connection.url, { fetch })
146
- };
147
- }),
148
- ({ client: client2, transport: transport2 }) => Effect_exports.gen(function* () {
149
- client2.removeNotificationHandler("notifications/tools/list_changed");
150
- yield* Effect_exports.promise(async () => {
151
- await Promise.allSettled(pending);
152
- });
153
- if (transport2 instanceof StreamableHTTPClientTransport && transport2.sessionId !== void 0) {
154
- yield* Effect_exports.tryPromise(() => transport2.terminateSession()).pipe(
155
- Effect_exports.timeout(defaultMcpClientLimits.cleanupTimeoutMs),
156
- Effect_exports.ignore
157
- );
158
- }
159
- yield* Effect_exports.tryPromise(() => client2.close()).pipe(
160
- Effect_exports.timeout(defaultMcpClientLimits.cleanupTimeoutMs),
161
- Effect_exports.ignore
162
- );
163
- }).pipe(Effect_exports.withSpan("provider.mcp.close"))
164
- );
165
- const wire = transport;
166
- yield* Effect_exports.tryPromise({
167
- try: (signal) => client.connect(wire, { signal, timeout: connection.timeoutMs }),
168
- catch: (error) => failure("connect", error)
169
- }).pipe(
170
- Effect_exports.raceFirst(Deferred_exports.await(rejected)),
171
- Effect_exports.timeout(connection.timeoutMs),
172
- Effect_exports.withSpan("provider.mcp.connect")
173
- );
174
- return yield* use(client).pipe(Effect_exports.raceFirst(Deferred_exports.await(rejected)));
175
- })
176
- ).pipe(
177
- Effect_exports.withSpan("provider.mcp.session", {
178
- attributes: {
179
- "mcp.transport": kind,
180
- "mcp.operation": mode,
181
- "server.address": connection.url.hostname
182
- }
183
- })
184
- );
185
- return attempt("http").pipe(
186
- // Fallback is only for negotiation. Tool calls are never automatically replayed.
187
- Effect_exports.catch(
188
- (error) => Schema_exports.is(McpError)(error) && error.phase === "connect" && (error.status === 404 || error.status === 405) ? attempt("sse") : Effect_exports.fail(error)
189
- ),
190
- (operation) => mode === "discover" ? operation.pipe(Effect_exports.timeout(connection.timeoutMs)) : operation,
191
- Effect_exports.catchTag(
192
- "TimeoutError",
193
- () => Effect_exports.fail(new McpError({ phase: "transport", reason: "timeout" }))
194
- )
195
- );
196
- }
197
- var mcpClientEffect = (input, changed) => Effect_exports.gen(function* () {
198
- const options = yield* Schema_exports.decodeUnknownEffect(McpToolsOptions)(input).pipe(
199
- Effect_exports.mapError(() => new McpError({ phase: "connect", reason: "invalid_input" }))
200
- );
201
- const url = new URL(options.url);
202
- if (url.username || url.password || url.hash)
203
- return yield* new McpError({ phase: "connect", reason: "invalid_input" });
204
- const connection = {
205
- url,
206
- headers: Redacted_exports.make({ ...options.headers }),
207
- timeoutMs: options.timeoutMs ?? defaultMcpClientLimits.timeoutMs
208
- };
209
- return mcpClient(
210
- (mode, use) => withClient(connection, mode, use, changed).pipe(
211
- Effect_exports.mapError(
212
- (error) => options.accountId === void 0 ? error : accountProviderError(error, options.accountId)
213
- )
214
- ),
215
- connection.timeoutMs,
216
- failure
217
- );
218
- });
219
- var mcpToolsEffect = (input) => mcpClientEffect(input).pipe(Effect_exports.flatMap(adaptMcpTools));
220
-
221
- export {
222
- mcpClientEffect,
223
- mcpToolsEffect
224
- };
@@ -1,63 +0,0 @@
1
- import {
2
- ProviderError
3
- } from "./chunk-R3EV5FTO.js";
4
- import {
5
- AccountId
6
- } from "./chunk-27F7W2LG.js";
7
- import {
8
- Option_exports,
9
- Schema_exports
10
- } from "./chunk-CDL5PM2Q.js";
11
-
12
- // src/implementation/provider-error.ts
13
- function parseProviderError(error) {
14
- return Schema_exports.decodeUnknownOption(ProviderError)(error).pipe(
15
- Option_exports.map(({ reason, status, accountId }) => new ProviderError({ reason, status, accountId }))
16
- );
17
- }
18
- function httpProviderError(status, headers = {}) {
19
- if (status >= 500 && status <= 599) return new ProviderError({ reason: "unavailable", status });
20
- if (status === 401) return new ProviderError({ reason: "unauthorized", status });
21
- if (status === 429) return new ProviderError({ reason: "rate_limited", status });
22
- if (status !== 403) return void 0;
23
- const retry = headers["retry-after"];
24
- if (headers["x-ratelimit-remaining"] === "0" || retry !== void 0 && (/^\d+$/.test(retry) || Number.isFinite(Date.parse(retry))))
25
- return new ProviderError({ reason: "rate_limited", status });
26
- if (/\bBearer\b.*\berror="insufficient_scope"/i.test(headers["www-authenticate"] ?? ""))
27
- return new ProviderError({ reason: "forbidden", status });
28
- return new ProviderError({ reason: "rejected", status });
29
- }
30
- function accountProviderError(error, accountId) {
31
- const parsed = parseProviderError(error);
32
- const account = Schema_exports.decodeUnknownOption(AccountId)(accountId);
33
- if (Option_exports.isNone(parsed) || Option_exports.isNone(account)) return error;
34
- return new ProviderError({
35
- reason: parsed.value.reason,
36
- status: parsed.value.status,
37
- accountId: account.value
38
- });
39
- }
40
- function graphqlProviderError(errors, status) {
41
- const codes = errors.flatMap((error) => {
42
- const parsed = Schema_exports.decodeUnknownOption(
43
- Schema_exports.Struct({
44
- type: Schema_exports.optional(Schema_exports.String),
45
- extensions: Schema_exports.optional(Schema_exports.Struct({ code: Schema_exports.optional(Schema_exports.String) }))
46
- })
47
- )(error);
48
- return Option_exports.isSome(parsed) ? [parsed.value.type, parsed.value.extensions?.code] : [];
49
- });
50
- if (codes.includes("RATE_LIMITED") || codes.includes("TOO_MANY_REQUESTS"))
51
- return new ProviderError({ reason: "rate_limited", status });
52
- if (codes.includes("UNAUTHENTICATED"))
53
- return new ProviderError({ reason: "unauthorized", status });
54
- if (codes.includes("FORBIDDEN")) return new ProviderError({ reason: "forbidden", status });
55
- return void 0;
56
- }
57
-
58
- export {
59
- parseProviderError,
60
- httpProviderError,
61
- accountProviderError,
62
- graphqlProviderError
63
- };