apps 0.0.1-beta.8 → 0.0.1-beta.80
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.
- package/README.md +25 -22
- package/framework-reference.json +1 -1
- package/js/chunk-4IN2N5CY.js +348 -0
- package/js/chunk-5FHWNLCI.js +88 -0
- package/js/{chunk-M3B3DE4K.js → chunk-74YVXBKY.js} +463 -218
- package/js/chunk-BIUWK47W.js +49 -0
- package/js/{chunk-RJDDBDSN.js → chunk-C6P3YMHI.js} +789 -171
- package/js/chunk-CDXQDN7W.js +92 -0
- package/js/{chunk-UESPOTUI.js → chunk-CT3QZBWU.js} +861 -231
- package/js/{chunk-UK573G7W.js → chunk-EOPQ727L.js} +87 -51
- package/js/{chunk-RFVIONFX.js → chunk-EZCV4Q4R.js} +123 -44
- package/js/{chunk-27F7W2LG.js → chunk-H2CJWXA3.js} +2 -2
- package/js/{chunk-JU7VHODU.js → chunk-H72MEDMN.js} +65 -10
- package/js/{chunk-CDL5PM2Q.js → chunk-IFJU5SYQ.js} +19082 -18402
- package/js/{chunk-72JNVHPK.js → chunk-IUPDGBBF.js} +4 -3
- package/js/{chunk-VFZKSM3T.js → chunk-JPEUKEV4.js} +3 -3
- package/js/{chunk-5T57N25Q.js → chunk-KGCTYL2S.js} +511 -63
- package/js/{chunk-KUMBKVJD.js → chunk-KLYSEHUD.js} +2 -2
- package/js/{chunk-WLE7WX2U.js → chunk-NG56RPCA.js} +2348 -472
- package/js/chunk-OD3KFKZD.js +1617 -0
- package/js/chunk-OK4MIBPW.js +334 -0
- package/js/{chunk-57RKNWL2.js → chunk-PD6I2SDG.js} +4 -4
- package/js/chunk-PW4S2HP5.js +426 -0
- package/js/chunk-Q4IZAUIF.js +285 -0
- package/js/{chunk-FL2QR3XW.js → chunk-Q5S3SWMO.js} +333 -69
- package/js/{chunk-Z5M2LQOZ.js → chunk-SNKDWIYL.js} +67 -55
- package/js/{chunk-IJX4CYZO.js → chunk-TUMGL2OC.js} +228 -264
- package/js/{chunk-CMYUWAX7.js → chunk-WFCOT6UW.js} +126 -31
- package/js/{chunk-IPI4MFSN.js → chunk-XBG7HHXC.js} +2 -2
- package/js/chunk-ZYXY6JLH.js +171 -0
- package/js/client.js +142 -94
- package/js/contracts.js +127 -26
- package/js/effect.js +19 -19
- package/js/{es-APDZKREY.js → es-DIULA3ZF.js} +62 -1659
- package/js/graphql.js +50 -40
- package/js/host.js +83 -58
- package/js/index.js +131 -46
- package/js/mcp/effect.js +23 -21
- package/js/mcp/stdio.js +44 -34
- package/js/mcp.js +76 -53
- package/js/openapi.js +4071 -1357
- package/js/react.js +2 -3
- package/js/skills/effect.js +6 -3
- package/js/skills.js +208 -81
- package/js/storage/facet.js +1 -540
- package/js/ui/auth/contracts.js +2 -2
- package/js/ui/auth.js +5 -5
- package/js/ui/contracts.js +5 -4
- package/js/ui/serving.js +8604 -223
- package/package.json +3 -4
- package/runtime.json +1 -1
- package/types/app-cache/src/contracts/cache.d.ts +18 -0
- package/types/app-cache/src/index.d.ts +34 -2
- package/types/apps/src/contracts/api-response-error.d.ts +4 -0
- package/types/apps/src/contracts/app.d.ts +7 -3
- package/types/apps/src/contracts/cache.d.ts +20 -0
- package/types/apps/src/contracts/context.d.ts +19 -11
- package/types/apps/src/contracts/elicitation.d.ts +23 -7
- package/types/apps/src/contracts/events.d.ts +93 -0
- package/types/apps/src/contracts/failure.d.ts +30 -1
- package/types/apps/src/contracts/graphql.d.ts +2 -1
- package/types/apps/src/contracts/host.d.ts +649 -17
- package/types/apps/src/contracts/live.d.ts +2 -0
- package/types/apps/src/contracts/mcp.d.ts +80 -10
- package/types/apps/src/contracts/network.d.ts +120 -0
- package/types/apps/src/contracts/openapi-compile.d.ts +82 -3
- package/types/apps/src/contracts/openapi.d.ts +41 -9
- package/types/apps/src/contracts/operations.d.ts +8 -4
- package/types/apps/src/contracts/placement.d.ts +102 -0
- package/types/apps/src/contracts/protocol-version.d.ts +2 -2
- package/types/apps/src/contracts/protocols/1.d.ts +733 -81
- package/types/apps/src/contracts/protocols/10.d.ts +1450 -0
- package/types/apps/src/contracts/protocols/2.d.ts +69 -26
- package/types/apps/src/contracts/protocols/3.d.ts +133 -33
- package/types/apps/src/contracts/protocols/4.d.ts +122 -45
- package/types/apps/src/contracts/protocols/5.d.ts +157 -47
- package/types/apps/src/contracts/protocols/6.d.ts +1629 -0
- package/types/apps/src/contracts/protocols/7.d.ts +1785 -0
- package/types/apps/src/contracts/protocols/8.d.ts +1182 -0
- package/types/apps/src/contracts/protocols/9.d.ts +1104 -0
- package/types/apps/src/contracts/protocols/current.d.ts +3843 -0
- package/types/apps/src/contracts/protocols/oauth-6.d.ts +74 -0
- package/types/apps/src/contracts/protocols/oauth.d.ts +134 -0
- package/types/apps/src/contracts/provider-error.d.ts +9 -0
- package/types/apps/src/contracts/provider.d.ts +90 -6
- package/types/apps/src/contracts/skills.d.ts +50 -13
- package/types/apps/src/contracts/sql.d.ts +63 -0
- package/types/apps/src/contracts/ui.d.ts +37 -3
- package/types/apps/src/contracts/workflows.d.ts +6 -0
- package/types/apps/src/facet.d.ts +4 -5
- package/types/apps/src/host.d.ts +5 -0
- package/types/apps/src/implementation/account-router.d.ts +4 -3
- package/types/apps/src/implementation/authoring.d.ts +25 -5
- package/types/apps/src/implementation/browser-scripts.gen.d.ts +6 -0
- package/types/apps/src/implementation/cache.d.ts +28 -1
- package/types/apps/src/implementation/catalog-cache.d.ts +35 -4
- package/types/apps/src/implementation/elicitation.d.ts +18 -15
- package/types/apps/src/implementation/events.d.ts +59 -0
- package/types/apps/src/implementation/failure-detail.d.ts +25 -3
- package/types/apps/src/implementation/graphql-catalog.d.ts +3 -3
- package/types/apps/src/implementation/graphql.d.ts +4 -3
- package/types/apps/src/implementation/input-problems.d.ts +6 -2
- package/types/apps/src/implementation/invocation-timing.d.ts +18 -0
- package/types/apps/src/implementation/live.d.ts +2 -2
- package/types/apps/src/implementation/mcp-call.d.ts +6 -5
- package/types/apps/src/implementation/mcp-catalog.d.ts +6 -4
- package/types/apps/src/implementation/mcp-client.d.ts +17 -9
- package/types/apps/src/implementation/mcp-stdio.d.ts +1 -1
- package/types/apps/src/implementation/mcp-tools.d.ts +2 -1
- package/types/apps/src/implementation/mcp.d.ts +20 -9
- package/types/apps/src/implementation/network.d.ts +16 -0
- package/types/apps/src/implementation/openapi-compile.d.ts +26 -6
- package/types/apps/src/implementation/openapi-document.d.ts +46 -19
- package/types/apps/src/implementation/openapi-names.d.ts +9 -4
- package/types/apps/src/implementation/openapi-request.d.ts +10 -2
- package/types/apps/src/implementation/openapi-source.d.ts +18 -0
- package/types/apps/src/implementation/openapi-upgrade.d.ts +4 -0
- package/types/apps/src/implementation/operations.d.ts +17 -2
- package/types/apps/src/implementation/optimistic.d.ts +1 -1
- package/types/apps/src/implementation/placement.d.ts +60 -0
- package/types/apps/src/implementation/protocol-operations.d.ts +3 -0
- package/types/apps/src/implementation/provider-error.d.ts +28 -1
- package/types/apps/src/implementation/provider.d.ts +18 -3
- package/types/apps/src/implementation/query-commit.d.ts +1 -1
- package/types/apps/src/implementation/router-catalog.d.ts +11 -13
- package/types/apps/src/implementation/router.d.ts +16 -5
- package/types/apps/src/implementation/runtime-yield.d.ts +7 -0
- package/types/apps/src/implementation/schema.d.ts +90 -10
- package/types/apps/src/implementation/skills.d.ts +18 -24
- package/types/apps/src/implementation/sql.d.ts +71 -0
- package/types/apps/src/implementation/ui-account-notice.d.ts +9 -0
- package/types/apps/src/implementation/ui-auth.d.ts +1 -1
- package/types/apps/src/implementation/ui-client.d.ts +2 -2
- package/types/apps/src/implementation/ui-document.d.ts +5 -0
- package/types/apps/src/implementation/ui-errors.d.ts +1 -1
- package/types/apps/src/implementation/ui-serving.d.ts +28 -9
- package/types/apps/src/implementation/ui-watch.d.ts +1 -1
- package/types/apps/src/implementation/upstream-error.d.ts +7 -0
- package/types/apps/src/implementation/webhooks.d.ts +1 -1
- package/types/apps/src/implementation/workflows.d.ts +1 -1
- package/types/apps/src/index.d.ts +55 -13
- package/types/apps/src/mcp.d.ts +20 -1
- package/types/apps/src/openapi.d.ts +1 -1
- package/types/apps/src/react.d.ts +1 -1
- package/types/apps/src/skills.d.ts +10 -8
- package/types/apps/src/ui-serving.d.ts +1 -1
- package/types/telemetry/src/app-records.d.ts +42 -0
- package/types/telemetry/src/browser-operations.d.ts +2 -2
- package/types/telemetry/src/browser.d.ts +8 -3
- package/types/telemetry/src/config.d.ts +2 -2
- package/types/telemetry/src/index.d.ts +2 -1
- package/types/telemetry/src/layer.d.ts +2 -2
- package/types/telemetry/src/measurements.d.ts +1 -1
- package/types/telemetry/src/ownership.d.ts +60 -0
- package/types/telemetry/src/recorded-failure.d.ts +29 -0
- package/types/telemetry/src/relay.d.ts +16 -6
- package/types/telemetry/src/span-attributes.d.ts +17 -1
- package/types/telemetry/src/transport.d.ts +8 -1
- package/types/utils/src/api-error.d.ts +55 -0
- package/types/utils/src/connection-failure.d.ts +33 -0
- package/types/utils/src/recorded-message.d.ts +18 -0
- package/types/utils/src/user-facing-error.d.ts +83 -0
- package/js/chunk-MKWZPDR6.js +0 -63
- package/js/chunk-N7YDVXYJ.js +0 -186
- package/js/chunk-NKLWZJLE.js +0 -172
- package/js/chunk-OCYUEU47.js +0 -224
- package/js/chunk-PJJ24GU7.js +0 -877
- package/js/chunk-PZB6T6KU.js +0 -19
- package/js/chunk-R3EV5FTO.js +0 -97
- package/js/chunk-YXQHV65J.js +0 -242
- package/js/chunk-ZQINWV4W.js +0 -630
- package/types/app-data/src/implementation/cursor.d.ts +0 -10
- package/types/app-data/src/implementation/index-key.d.ts +0 -7
- package/types/app-data/src/implementation/promise.d.ts +0 -68
- package/types/app-data/src/implementation/range.d.ts +0 -8
- package/types/app-data/src/implementation/schema.d.ts +0 -18
- package/types/app-data/src/implementation/sqlite.d.ts +0 -11
- package/types/app-data/src/index.d.ts +0 -4
- package/types/apps/src/contracts/storage.d.ts +0 -68
- package/types/apps/src/implementation/storage.d.ts +0 -15
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import {
|
|
2
|
+
adaptMcpTools,
|
|
3
|
+
answeredError,
|
|
4
|
+
mcpClient,
|
|
5
|
+
mcpJsonSchemaValidator
|
|
6
|
+
} from "./chunk-WFCOT6UW.js";
|
|
7
|
+
import {
|
|
8
|
+
failOnNetworkRefusal
|
|
9
|
+
} from "./chunk-BIUWK47W.js";
|
|
10
|
+
import {
|
|
11
|
+
accountProviderError,
|
|
12
|
+
bodyUpstreamError,
|
|
13
|
+
httpProviderError,
|
|
14
|
+
providerErrorDetail
|
|
15
|
+
} from "./chunk-ZYXY6JLH.js";
|
|
16
|
+
import {
|
|
17
|
+
McpCredentialsUnverified,
|
|
18
|
+
McpError,
|
|
19
|
+
McpHealthInput,
|
|
20
|
+
McpToolsOptions,
|
|
21
|
+
defaultMcpClientLimits,
|
|
22
|
+
mcpHealthReserveMs
|
|
23
|
+
} from "./chunk-NG56RPCA.js";
|
|
24
|
+
import {
|
|
25
|
+
NetworkRefused,
|
|
26
|
+
ProviderError
|
|
27
|
+
} from "./chunk-Q4IZAUIF.js";
|
|
28
|
+
import {
|
|
29
|
+
captureTelemetry,
|
|
30
|
+
owned
|
|
31
|
+
} from "./chunk-C6P3YMHI.js";
|
|
32
|
+
import {
|
|
33
|
+
FetchHttpClient_exports
|
|
34
|
+
} from "./chunk-PD6I2SDG.js";
|
|
35
|
+
import {
|
|
36
|
+
HttpClientRequest_exports,
|
|
37
|
+
HttpClient_exports
|
|
38
|
+
} from "./chunk-EOPQ727L.js";
|
|
39
|
+
import {
|
|
40
|
+
Clock_exports,
|
|
41
|
+
Deferred_exports,
|
|
42
|
+
Effect_exports,
|
|
43
|
+
Match_exports,
|
|
44
|
+
Option_exports,
|
|
45
|
+
Predicate_exports,
|
|
46
|
+
Redacted_exports,
|
|
47
|
+
Ref_exports,
|
|
48
|
+
Schema_exports,
|
|
49
|
+
Stream_exports
|
|
50
|
+
} from "./chunk-IFJU5SYQ.js";
|
|
51
|
+
|
|
52
|
+
// src/implementation/mcp.ts
|
|
53
|
+
import { UnauthorizedError } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
54
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
55
|
+
import {
|
|
56
|
+
ErrorCode,
|
|
57
|
+
McpError as ProtocolError,
|
|
58
|
+
ToolListChangedNotificationSchema
|
|
59
|
+
} from "@modelcontextprotocol/sdk/types.js";
|
|
60
|
+
import { SSEClientTransport, SseError } from "@modelcontextprotocol/sdk/client/sse.js";
|
|
61
|
+
import {
|
|
62
|
+
StreamableHTTPClientTransport,
|
|
63
|
+
StreamableHTTPError
|
|
64
|
+
} from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
65
|
+
var unreadable = (error) => error instanceof SyntaxError || error instanceof Error && Predicate_exports.hasProperty(error, "issues") && Array.isArray(error.issues);
|
|
66
|
+
var failure = (phase, error) => {
|
|
67
|
+
if (Schema_exports.is(ProviderError)(error) || Schema_exports.is(McpError)(error) || Schema_exports.is(NetworkRefused)(error))
|
|
68
|
+
return error;
|
|
69
|
+
const code = error instanceof UnauthorizedError ? 401 : error instanceof StreamableHTTPError || error instanceof SseError ? error.code : void 0;
|
|
70
|
+
if (code !== void 0 && code >= 300 && code <= 599)
|
|
71
|
+
return httpProviderError(code) ?? new McpError({ phase, reason: "request", status: code });
|
|
72
|
+
const upstream = answeredError(error);
|
|
73
|
+
return new McpError({
|
|
74
|
+
phase,
|
|
75
|
+
reason: code !== void 0 || unreadable(error) ? "invalid_response" : error instanceof ProtocolError && error.code === ErrorCode.RequestTimeout ? "timeout" : "request",
|
|
76
|
+
...upstream === void 0 ? {} : { upstream }
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
var errorBodyLimits = { maxBytes: 65536, readTimeoutMs: 2e3 };
|
|
80
|
+
var errorBody = (response) => Effect_exports.gen(function* () {
|
|
81
|
+
const json = /^application\/(?:[\w.-]+\+)?json$/i.test(
|
|
82
|
+
response.headers["content-type"]?.split(";")[0]?.trim() ?? ""
|
|
83
|
+
);
|
|
84
|
+
const length = response.headers["content-length"];
|
|
85
|
+
if (!json || length !== void 0 && Number(length) > errorBodyLimits.maxBytes)
|
|
86
|
+
return { body: Stream_exports.toReadableStream(response.stream), upstream: void 0 };
|
|
87
|
+
const unreadable2 = new McpError({ phase: "transport", reason: "invalid_response" });
|
|
88
|
+
const read = yield* response.stream.pipe(
|
|
89
|
+
Stream_exports.mapError(() => unreadable2),
|
|
90
|
+
Stream_exports.limitBytes(errorBodyLimits.maxBytes, () => Stream_exports.fail(unreadable2)),
|
|
91
|
+
Stream_exports.decodeText,
|
|
92
|
+
Stream_exports.mkString,
|
|
93
|
+
Effect_exports.timeout(errorBodyLimits.readTimeoutMs),
|
|
94
|
+
Effect_exports.option
|
|
95
|
+
);
|
|
96
|
+
if (Option_exports.isNone(read)) return { body: null, upstream: void 0 };
|
|
97
|
+
const parsed = Schema_exports.decodeUnknownOption(Schema_exports.fromJsonString(Schema_exports.Json))(read.value);
|
|
98
|
+
return {
|
|
99
|
+
body: read.value,
|
|
100
|
+
upstream: Option_exports.isSome(parsed) ? bodyUpstreamError(parsed.value) : void 0
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
var transportFetch = (connection, telemetry, rejected, answered) => (url, init) => Effect_exports.runPromiseWith(telemetry.context)(
|
|
104
|
+
Effect_exports.gen(function* () {
|
|
105
|
+
const target = yield* Effect_exports.try({
|
|
106
|
+
try: () => new URL(url),
|
|
107
|
+
catch: () => new McpError({ phase: "transport", reason: "invalid_response" })
|
|
108
|
+
});
|
|
109
|
+
if (connection.url.username || connection.url.password)
|
|
110
|
+
return yield* new McpError({ phase: "transport", reason: "invalid_input" });
|
|
111
|
+
if (target.origin !== connection.url.origin || target.username || target.password)
|
|
112
|
+
return yield* new McpError({ phase: "transport", reason: "invalid_response" });
|
|
113
|
+
const request = yield* Effect_exports.try({
|
|
114
|
+
try: () => {
|
|
115
|
+
const headers = new Headers(Redacted_exports.value(connection.headers));
|
|
116
|
+
new Headers(init?.headers).forEach((value, name) => headers.set(name, value));
|
|
117
|
+
if (!headers.has("user-agent")) headers.set("user-agent", "Executor");
|
|
118
|
+
return HttpClientRequest_exports.fromWeb(new Request(target, { ...init, headers }));
|
|
119
|
+
},
|
|
120
|
+
// The provider's headers cannot form an HTTP request, such as a name with a space.
|
|
121
|
+
catch: () => new McpError({ phase: "transport", reason: "invalid_input" })
|
|
122
|
+
});
|
|
123
|
+
const client = yield* HttpClient_exports.HttpClient;
|
|
124
|
+
const response = yield* client.execute(request);
|
|
125
|
+
yield* failOnNetworkRefusal(response).pipe(
|
|
126
|
+
Effect_exports.tapError((refused) => Deferred_exports.fail(rejected, refused))
|
|
127
|
+
);
|
|
128
|
+
if (response.status < 400)
|
|
129
|
+
return new Response(
|
|
130
|
+
[204, 205, 304].includes(response.status) ? null : Stream_exports.toReadableStream(response.stream),
|
|
131
|
+
{
|
|
132
|
+
status: response.status,
|
|
133
|
+
headers: response.headers
|
|
134
|
+
}
|
|
135
|
+
);
|
|
136
|
+
const { body, upstream } = yield* errorBody(response);
|
|
137
|
+
const provider = httpProviderError(response.status, response.headers);
|
|
138
|
+
if (provider !== void 0) {
|
|
139
|
+
const refused = providerErrorDetail(provider, { upstream });
|
|
140
|
+
yield* Deferred_exports.fail(rejected, refused);
|
|
141
|
+
return yield* refused;
|
|
142
|
+
}
|
|
143
|
+
const session = new Headers(init?.headers).has("mcp-session-id");
|
|
144
|
+
yield* Ref_exports.update(
|
|
145
|
+
answered,
|
|
146
|
+
(responses) => new Map(responses).set(response.status, { upstream, session })
|
|
147
|
+
);
|
|
148
|
+
return new Response(body, { status: response.status, headers: response.headers });
|
|
149
|
+
}).pipe(
|
|
150
|
+
Effect_exports.provide(FetchHttpClient_exports.layer),
|
|
151
|
+
Effect_exports.provideService(FetchHttpClient_exports.RequestInit, { redirect: "manual" }),
|
|
152
|
+
Effect_exports.provideService(
|
|
153
|
+
FetchHttpClient_exports.Fetch,
|
|
154
|
+
(url2, options) => globalThis.fetch(url2, {
|
|
155
|
+
...options,
|
|
156
|
+
signal: AbortSignal.any([
|
|
157
|
+
...options?.signal ? [options.signal] : [],
|
|
158
|
+
...init?.signal ? [init.signal] : []
|
|
159
|
+
])
|
|
160
|
+
})
|
|
161
|
+
),
|
|
162
|
+
Effect_exports.mapError((error) => failure("transport", error))
|
|
163
|
+
),
|
|
164
|
+
init?.signal ? { signal: init.signal } : {}
|
|
165
|
+
);
|
|
166
|
+
var explain = (error, phase, responses) => {
|
|
167
|
+
if (Schema_exports.is(ProviderError)(error)) return providerErrorDetail(error, { phase });
|
|
168
|
+
if (phase === "call" && Schema_exports.is(McpError)(error) && error.phase === "transport" && error.reason === "request")
|
|
169
|
+
return new McpError({
|
|
170
|
+
phase,
|
|
171
|
+
reason: error.reason,
|
|
172
|
+
...error.status === void 0 ? {} : { status: error.status },
|
|
173
|
+
...error.upstream === void 0 ? {} : { upstream: error.upstream }
|
|
174
|
+
});
|
|
175
|
+
if (!Schema_exports.is(McpError)(error) || error.status === void 0) return error;
|
|
176
|
+
const response = responses.get(error.status);
|
|
177
|
+
if (response === void 0 || (error.upstream !== void 0 || response.upstream === void 0) && !response.session)
|
|
178
|
+
return error;
|
|
179
|
+
const upstream = error.upstream ?? response.upstream;
|
|
180
|
+
return new McpError({
|
|
181
|
+
phase: error.phase,
|
|
182
|
+
reason: error.reason,
|
|
183
|
+
status: error.status,
|
|
184
|
+
...upstream === void 0 ? {} : { upstream },
|
|
185
|
+
...response.session ? { session: true } : {}
|
|
186
|
+
});
|
|
187
|
+
};
|
|
188
|
+
var explained = (phase, answered) => (error) => Ref_exports.get(answered).pipe(
|
|
189
|
+
Effect_exports.flatMap((responses) => Effect_exports.fail(explain(error, phase, responses)))
|
|
190
|
+
);
|
|
191
|
+
function withClient(connection, mode, use, changed) {
|
|
192
|
+
const attempt = (kind) => Effect_exports.scoped(
|
|
193
|
+
Effect_exports.gen(function* () {
|
|
194
|
+
const telemetry = yield* captureTelemetry;
|
|
195
|
+
const rejected = yield* Deferred_exports.make();
|
|
196
|
+
const answered = yield* Ref_exports.make(/* @__PURE__ */ new Map());
|
|
197
|
+
const pending = /* @__PURE__ */ new Set();
|
|
198
|
+
const { client, transport } = yield* Effect_exports.acquireRelease(
|
|
199
|
+
Effect_exports.sync(() => {
|
|
200
|
+
const fetch = transportFetch(connection, telemetry, rejected, answered);
|
|
201
|
+
const client2 = new Client(
|
|
202
|
+
{ name: "executor-apps", version: "0.1.0" },
|
|
203
|
+
{
|
|
204
|
+
jsonSchemaValidator: mcpJsonSchemaValidator,
|
|
205
|
+
capabilities: mode === "call" ? { elicitation: { form: {} } } : {}
|
|
206
|
+
}
|
|
207
|
+
);
|
|
208
|
+
if (changed !== void 0) {
|
|
209
|
+
client2.setNotificationHandler(ToolListChangedNotificationSchema, () => {
|
|
210
|
+
const task = Effect_exports.runPromiseWith(telemetry.context)(
|
|
211
|
+
changed.pipe(
|
|
212
|
+
Effect_exports.timeout("5 seconds"),
|
|
213
|
+
Effect_exports.catchCause(() => Effect_exports.logWarning("MCP catalog invalidation failed"))
|
|
214
|
+
)
|
|
215
|
+
);
|
|
216
|
+
pending.add(task);
|
|
217
|
+
return task.finally(() => pending.delete(task));
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
client: client2,
|
|
222
|
+
transport: kind === "http" ? new StreamableHTTPClientTransport(connection.url, {
|
|
223
|
+
fetch,
|
|
224
|
+
reconnectionOptions: {
|
|
225
|
+
maxRetries: 0,
|
|
226
|
+
initialReconnectionDelay: 1e3,
|
|
227
|
+
maxReconnectionDelay: 1e3,
|
|
228
|
+
reconnectionDelayGrowFactor: 1
|
|
229
|
+
}
|
|
230
|
+
}) : new SSEClientTransport(connection.url, { fetch })
|
|
231
|
+
};
|
|
232
|
+
}),
|
|
233
|
+
({ client: client2, transport: transport2 }) => Effect_exports.gen(function* () {
|
|
234
|
+
client2.removeNotificationHandler("notifications/tools/list_changed");
|
|
235
|
+
yield* Effect_exports.promise(async () => {
|
|
236
|
+
await Promise.allSettled(pending);
|
|
237
|
+
});
|
|
238
|
+
if (transport2 instanceof StreamableHTTPClientTransport && transport2.sessionId !== void 0) {
|
|
239
|
+
yield* Effect_exports.tryPromise(() => transport2.terminateSession()).pipe(
|
|
240
|
+
Effect_exports.timeout(defaultMcpClientLimits.cleanupTimeoutMs),
|
|
241
|
+
Effect_exports.ignore
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
yield* Effect_exports.tryPromise(() => client2.close()).pipe(
|
|
245
|
+
Effect_exports.timeout(defaultMcpClientLimits.cleanupTimeoutMs),
|
|
246
|
+
Effect_exports.ignore
|
|
247
|
+
);
|
|
248
|
+
}).pipe(owned("upstream", "provider.mcp.close"))
|
|
249
|
+
);
|
|
250
|
+
const wire = transport;
|
|
251
|
+
yield* Effect_exports.tryPromise({
|
|
252
|
+
try: (signal) => client.connect(wire, { signal, timeout: connection.timeoutMs }),
|
|
253
|
+
catch: (error) => failure("connect", error)
|
|
254
|
+
}).pipe(
|
|
255
|
+
Effect_exports.raceFirst(Deferred_exports.await(rejected)),
|
|
256
|
+
Effect_exports.catch(explained("connect", answered)),
|
|
257
|
+
Effect_exports.timeout(connection.timeoutMs),
|
|
258
|
+
owned("upstream", "provider.mcp.connect")
|
|
259
|
+
);
|
|
260
|
+
return yield* use(client).pipe(
|
|
261
|
+
Effect_exports.raceFirst(Deferred_exports.await(rejected)),
|
|
262
|
+
Effect_exports.catch(explained(mode, answered))
|
|
263
|
+
);
|
|
264
|
+
})
|
|
265
|
+
).pipe(
|
|
266
|
+
owned("upstream", "provider.mcp.session", {
|
|
267
|
+
attributes: {
|
|
268
|
+
"mcp.transport": kind,
|
|
269
|
+
"mcp.operation": mode,
|
|
270
|
+
"server.address": connection.url.hostname
|
|
271
|
+
}
|
|
272
|
+
})
|
|
273
|
+
);
|
|
274
|
+
return attempt("http").pipe(
|
|
275
|
+
// Fallback is only for negotiation. Tool calls are never automatically replayed.
|
|
276
|
+
Effect_exports.catch(
|
|
277
|
+
(error) => Schema_exports.is(McpError)(error) && error.phase === "connect" && (error.status === 404 || error.status === 405) ? attempt("sse") : Effect_exports.fail(error)
|
|
278
|
+
),
|
|
279
|
+
(operation) => mode === "discover" ? operation.pipe(Effect_exports.timeout(connection.timeoutMs)) : operation,
|
|
280
|
+
Effect_exports.catchTag(
|
|
281
|
+
"TimeoutError",
|
|
282
|
+
() => Effect_exports.fail(new McpError({ phase: "transport", reason: "timeout" }))
|
|
283
|
+
)
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
var mcpClientEffect = (input, changed) => Effect_exports.gen(function* () {
|
|
287
|
+
const options = yield* Schema_exports.decodeUnknownEffect(McpToolsOptions)(input).pipe(
|
|
288
|
+
Effect_exports.mapError(() => new McpError({ phase: "connect", reason: "invalid_input" }))
|
|
289
|
+
);
|
|
290
|
+
const url = new URL(options.url);
|
|
291
|
+
if (url.username || url.password || url.hash)
|
|
292
|
+
return yield* new McpError({ phase: "connect", reason: "invalid_input" });
|
|
293
|
+
const connection = {
|
|
294
|
+
url,
|
|
295
|
+
headers: Redacted_exports.make({ ...options.headers }),
|
|
296
|
+
timeoutMs: options.timeoutMs ?? defaultMcpClientLimits.timeoutMs
|
|
297
|
+
};
|
|
298
|
+
return mcpClient(
|
|
299
|
+
(mode, use) => withClient(connection, mode, use, changed).pipe(
|
|
300
|
+
Effect_exports.mapError(
|
|
301
|
+
(error) => options.accountId === void 0 ? error : accountProviderError(error, options.accountId)
|
|
302
|
+
)
|
|
303
|
+
),
|
|
304
|
+
connection.timeoutMs,
|
|
305
|
+
failure
|
|
306
|
+
);
|
|
307
|
+
});
|
|
308
|
+
var refusesCredentials = (error) => Schema_exports.is(ProviderError)(error) && Match_exports.value(error.reason).pipe(
|
|
309
|
+
Match_exports.whenOr("unauthorized", "forbidden", "rejected", () => true),
|
|
310
|
+
Match_exports.whenOr("rate_limited", "unavailable", () => false),
|
|
311
|
+
Match_exports.exhaustive
|
|
312
|
+
);
|
|
313
|
+
var mcpHealthEffect = (check, options) => Effect_exports.gen(function* () {
|
|
314
|
+
const { deadline, timeoutMs, ...parsed } = yield* Schema_exports.decodeUnknownEffect(McpHealthInput)({
|
|
315
|
+
...options,
|
|
316
|
+
accountId: check.account.id,
|
|
317
|
+
signal: check.signal,
|
|
318
|
+
deadline: check.deadline
|
|
319
|
+
}).pipe(Effect_exports.mapError(() => new McpError({ phase: "connect", reason: "invalid_input" })));
|
|
320
|
+
const end = Math.min(
|
|
321
|
+
(yield* Clock_exports.currentTimeMillis) + (timeoutMs ?? defaultMcpClientLimits.timeoutMs),
|
|
322
|
+
deadline === void 0 ? Number.POSITIVE_INFINITY : deadline - mcpHealthReserveMs
|
|
323
|
+
);
|
|
324
|
+
const remaining = Effect_exports.flatMap(
|
|
325
|
+
Clock_exports.currentTimeMillis,
|
|
326
|
+
(now) => end - now >= 1 ? Effect_exports.succeed(Math.floor(end - now)) : Effect_exports.fail(new McpError({ phase: "transport", reason: "timeout" }))
|
|
327
|
+
);
|
|
328
|
+
yield* (yield* mcpClientEffect({ ...parsed, timeoutMs: yield* remaining })).check;
|
|
329
|
+
return yield* remaining.pipe(
|
|
330
|
+
Effect_exports.flatMap(
|
|
331
|
+
(timeoutMs2) => mcpClientEffect({ url: parsed.url, signal: parsed.signal, timeoutMs: timeoutMs2 })
|
|
332
|
+
),
|
|
333
|
+
Effect_exports.flatMap((anonymous) => anonymous.check),
|
|
334
|
+
Effect_exports.matchEffect({
|
|
335
|
+
onSuccess: () => Effect_exports.fail(new McpCredentialsUnverified({ anonymous: "answered" })),
|
|
336
|
+
// Executor's network refused the attempt, so the server never answered it.
|
|
337
|
+
onFailure: (error) => Schema_exports.is(NetworkRefused)(error) ? Effect_exports.fail(error) : refusesCredentials(error) ? Effect_exports.void : Effect_exports.fail(new McpCredentialsUnverified({ anonymous: error }))
|
|
338
|
+
}),
|
|
339
|
+
owned("upstream", "provider.mcp.anonymous")
|
|
340
|
+
);
|
|
341
|
+
}).pipe(owned("upstream", "provider.mcp.health"));
|
|
342
|
+
var mcpToolsEffect = (input) => mcpClientEffect(input).pipe(Effect_exports.flatMap(adaptMcpTools));
|
|
343
|
+
|
|
344
|
+
export {
|
|
345
|
+
mcpClientEffect,
|
|
346
|
+
mcpHealthEffect,
|
|
347
|
+
mcpToolsEffect
|
|
348
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Predicate_exports
|
|
3
|
+
} from "./chunk-IFJU5SYQ.js";
|
|
4
|
+
|
|
5
|
+
// ../utils/src/recorded-message.ts
|
|
6
|
+
var RecordedMessage = /* @__PURE__ */ Symbol.for("@executor-js/utils/RecordedMessage");
|
|
7
|
+
var recordedMessage = (error) => {
|
|
8
|
+
if (Predicate_exports.hasProperty(error, RecordedMessage)) {
|
|
9
|
+
const message = error[RecordedMessage];
|
|
10
|
+
return typeof message === "string" ? message : void 0;
|
|
11
|
+
}
|
|
12
|
+
return protocolErrorMessage(error) ?? sqlErrorMessage(error);
|
|
13
|
+
};
|
|
14
|
+
var jsonRpcMeanings = {
|
|
15
|
+
[-32700]: "Parse error",
|
|
16
|
+
[-32600]: "Invalid request",
|
|
17
|
+
[-32601]: "Method not found",
|
|
18
|
+
[-32602]: "Invalid params",
|
|
19
|
+
[-32603]: "Internal error",
|
|
20
|
+
[-32002]: "Resource not found"
|
|
21
|
+
};
|
|
22
|
+
var protocolErrorMessage = (error) => {
|
|
23
|
+
if (!Predicate_exports.isTagged(error, "ProtocolError") || !Predicate_exports.hasProperty(error, "code") || typeof error.code !== "number" || !Predicate_exports.hasProperty(error, "message") || !Predicate_exports.isString(error.message))
|
|
24
|
+
return void 0;
|
|
25
|
+
const code = error.code;
|
|
26
|
+
const refusal = /^Tool '.*' not found$/s.test(error.message) ? ": the requested tool does not exist" : error.message.startsWith("Invalid parameters for tool '") ? ": the tool's arguments failed validation" : "";
|
|
27
|
+
const meaning = jsonRpcMeanings[code];
|
|
28
|
+
const kind = meaning === void 0 ? "JSON-RPC error with an unlisted code" : `${meaning} (${code})`;
|
|
29
|
+
return kind + refusal;
|
|
30
|
+
};
|
|
31
|
+
var sqlReasons = /* @__PURE__ */ new Set([
|
|
32
|
+
"ConnectionError",
|
|
33
|
+
"AuthenticationError",
|
|
34
|
+
"AuthorizationError",
|
|
35
|
+
"SqlSyntaxError",
|
|
36
|
+
"UniqueViolation",
|
|
37
|
+
"ConstraintError",
|
|
38
|
+
"DeadlockError",
|
|
39
|
+
"SerializationError",
|
|
40
|
+
"LockTimeoutError",
|
|
41
|
+
"StatementTimeoutError",
|
|
42
|
+
"UnknownError"
|
|
43
|
+
]);
|
|
44
|
+
var sqlMessages = new Set(
|
|
45
|
+
[
|
|
46
|
+
"A pipelined query completed out of order",
|
|
47
|
+
"Connection closed",
|
|
48
|
+
"Connection closed during startup",
|
|
49
|
+
"Connection is closed",
|
|
50
|
+
"Connection timed out",
|
|
51
|
+
"Failed to connect",
|
|
52
|
+
"Failed to decode row",
|
|
53
|
+
"Failed to encode query",
|
|
54
|
+
"Failed to negotiate TLS",
|
|
55
|
+
"Failed to parse SSLRequest error response",
|
|
56
|
+
"Failed to parse server messages",
|
|
57
|
+
"Failed to parse server response",
|
|
58
|
+
"Failed to write query",
|
|
59
|
+
"Failed to write query batch",
|
|
60
|
+
"Invalid SSLRequest response",
|
|
61
|
+
"MD5 authentication failed",
|
|
62
|
+
"No password configured",
|
|
63
|
+
"Protocol desync",
|
|
64
|
+
"Query cancellation timed out",
|
|
65
|
+
"Query failed",
|
|
66
|
+
"SCRAM authentication failed",
|
|
67
|
+
"SCRAM exchange did not complete",
|
|
68
|
+
"SCRAM server verification failed",
|
|
69
|
+
"Server refused TLS",
|
|
70
|
+
"Socket error",
|
|
71
|
+
"Stream cancellation timed out",
|
|
72
|
+
"The server reported an error",
|
|
73
|
+
"Unsupported authentication method"
|
|
74
|
+
].map((message) => `PgConnection: ${message}`)
|
|
75
|
+
);
|
|
76
|
+
var sqlErrorMessage = (error) => {
|
|
77
|
+
if (!Predicate_exports.isTagged(error, "SqlError") || !Predicate_exports.hasProperty(error, "reason"))
|
|
78
|
+
return void 0;
|
|
79
|
+
const reason = error.reason;
|
|
80
|
+
const kind = Predicate_exports.hasProperty(reason, "_tag") && Predicate_exports.isString(reason._tag) && sqlReasons.has(reason._tag) ? reason._tag : "an unlisted kind";
|
|
81
|
+
const message = Predicate_exports.hasProperty(reason, "message") && Predicate_exports.isString(reason.message) && sqlMessages.has(reason.message) ? `: ${reason.message}` : "";
|
|
82
|
+
return `The database failed (${kind})${message}`;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export {
|
|
86
|
+
RecordedMessage,
|
|
87
|
+
recordedMessage
|
|
88
|
+
};
|