apps 0.0.1-beta.8 → 0.0.1-beta.81

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 (180) hide show
  1. package/README.md +25 -22
  2. package/framework-reference.json +1 -1
  3. package/js/{chunk-72JNVHPK.js → chunk-4NFSABEA.js} +4 -3
  4. package/js/chunk-5FHWNLCI.js +88 -0
  5. package/js/chunk-5WGONRKQ.js +426 -0
  6. package/js/{chunk-M3B3DE4K.js → chunk-74YVXBKY.js} +463 -218
  7. package/js/chunk-CDXQDN7W.js +92 -0
  8. package/js/{chunk-UK573G7W.js → chunk-EOPQ727L.js} +87 -51
  9. package/js/{chunk-27F7W2LG.js → chunk-H2CJWXA3.js} +2 -2
  10. package/js/{chunk-JU7VHODU.js → chunk-H72MEDMN.js} +65 -10
  11. package/js/{chunk-FL2QR3XW.js → chunk-HJG4RBYM.js} +333 -69
  12. package/js/chunk-I6Q7ZPKJ.js +49 -0
  13. package/js/{chunk-CDL5PM2Q.js → chunk-IFJU5SYQ.js} +19082 -18402
  14. package/js/{chunk-VFZKSM3T.js → chunk-JPEUKEV4.js} +3 -3
  15. package/js/{chunk-5T57N25Q.js → chunk-KGCTYL2S.js} +511 -63
  16. package/js/{chunk-KUMBKVJD.js → chunk-KLYSEHUD.js} +2 -2
  17. package/js/{chunk-WLE7WX2U.js → chunk-NG56RPCA.js} +2348 -472
  18. package/js/chunk-OD3KFKZD.js +1617 -0
  19. package/js/{chunk-Z5M2LQOZ.js → chunk-OY47QPQY.js} +67 -55
  20. package/js/{chunk-57RKNWL2.js → chunk-PD6I2SDG.js} +4 -4
  21. package/js/chunk-PL5KOEZD.js +334 -0
  22. package/js/chunk-Q4IZAUIF.js +285 -0
  23. package/js/{chunk-RJDDBDSN.js → chunk-QWQM3CLH.js} +795 -177
  24. package/js/{chunk-RFVIONFX.js → chunk-TE25A7D6.js} +123 -44
  25. package/js/{chunk-IJX4CYZO.js → chunk-TUMGL2OC.js} +228 -264
  26. package/js/chunk-W6XCQAXP.js +171 -0
  27. package/js/chunk-WCGAO3X5.js +348 -0
  28. package/js/{chunk-IPI4MFSN.js → chunk-XBG7HHXC.js} +2 -2
  29. package/js/{chunk-CMYUWAX7.js → chunk-YQUG4CES.js} +126 -31
  30. package/js/{chunk-UESPOTUI.js → chunk-Z2SWTZCF.js} +861 -231
  31. package/js/client.js +142 -94
  32. package/js/contracts.js +127 -26
  33. package/js/effect.js +19 -19
  34. package/js/{es-APDZKREY.js → es-DIULA3ZF.js} +62 -1659
  35. package/js/graphql.js +50 -40
  36. package/js/host.js +83 -58
  37. package/js/index.js +131 -46
  38. package/js/mcp/effect.js +23 -21
  39. package/js/mcp/stdio.js +44 -34
  40. package/js/mcp.js +76 -53
  41. package/js/openapi.js +4071 -1357
  42. package/js/react.js +2 -3
  43. package/js/skills/effect.js +6 -3
  44. package/js/skills.js +208 -81
  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 +8604 -223
  50. package/package.json +3 -4
  51. package/runtime.json +1 -1
  52. package/types/app-cache/src/contracts/cache.d.ts +18 -0
  53. package/types/app-cache/src/index.d.ts +34 -2
  54. package/types/apps/src/contracts/api-response-error.d.ts +4 -0
  55. package/types/apps/src/contracts/app.d.ts +7 -3
  56. package/types/apps/src/contracts/cache.d.ts +20 -0
  57. package/types/apps/src/contracts/context.d.ts +19 -11
  58. package/types/apps/src/contracts/elicitation.d.ts +23 -7
  59. package/types/apps/src/contracts/events.d.ts +93 -0
  60. package/types/apps/src/contracts/failure.d.ts +30 -1
  61. package/types/apps/src/contracts/graphql.d.ts +2 -1
  62. package/types/apps/src/contracts/host.d.ts +649 -17
  63. package/types/apps/src/contracts/live.d.ts +2 -0
  64. package/types/apps/src/contracts/mcp.d.ts +80 -10
  65. package/types/apps/src/contracts/network.d.ts +120 -0
  66. package/types/apps/src/contracts/openapi-compile.d.ts +82 -3
  67. package/types/apps/src/contracts/openapi.d.ts +41 -9
  68. package/types/apps/src/contracts/operations.d.ts +8 -4
  69. package/types/apps/src/contracts/placement.d.ts +102 -0
  70. package/types/apps/src/contracts/protocol-version.d.ts +2 -2
  71. package/types/apps/src/contracts/protocols/1.d.ts +733 -81
  72. package/types/apps/src/contracts/protocols/10.d.ts +1450 -0
  73. package/types/apps/src/contracts/protocols/2.d.ts +69 -26
  74. package/types/apps/src/contracts/protocols/3.d.ts +133 -33
  75. package/types/apps/src/contracts/protocols/4.d.ts +122 -45
  76. package/types/apps/src/contracts/protocols/5.d.ts +157 -47
  77. package/types/apps/src/contracts/protocols/6.d.ts +1629 -0
  78. package/types/apps/src/contracts/protocols/7.d.ts +1785 -0
  79. package/types/apps/src/contracts/protocols/8.d.ts +1182 -0
  80. package/types/apps/src/contracts/protocols/9.d.ts +1104 -0
  81. package/types/apps/src/contracts/protocols/current.d.ts +3843 -0
  82. package/types/apps/src/contracts/protocols/oauth-6.d.ts +74 -0
  83. package/types/apps/src/contracts/protocols/oauth.d.ts +134 -0
  84. package/types/apps/src/contracts/provider-error.d.ts +9 -0
  85. package/types/apps/src/contracts/provider.d.ts +90 -6
  86. package/types/apps/src/contracts/skills.d.ts +50 -13
  87. package/types/apps/src/contracts/sql.d.ts +63 -0
  88. package/types/apps/src/contracts/ui.d.ts +37 -3
  89. package/types/apps/src/contracts/workflows.d.ts +6 -0
  90. package/types/apps/src/facet.d.ts +4 -5
  91. package/types/apps/src/host.d.ts +5 -0
  92. package/types/apps/src/implementation/account-router.d.ts +4 -3
  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 +28 -1
  96. package/types/apps/src/implementation/catalog-cache.d.ts +35 -4
  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 +3 -3
  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 +18 -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 +6 -4
  107. package/types/apps/src/implementation/mcp-client.d.ts +17 -9
  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 +20 -9
  111. package/types/apps/src/implementation/network.d.ts +16 -0
  112. package/types/apps/src/implementation/openapi-compile.d.ts +26 -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 +18 -0
  117. package/types/apps/src/implementation/openapi-upgrade.d.ts +4 -0
  118. package/types/apps/src/implementation/operations.d.ts +17 -2
  119. package/types/apps/src/implementation/optimistic.d.ts +1 -1
  120. package/types/apps/src/implementation/placement.d.ts +60 -0
  121. package/types/apps/src/implementation/protocol-operations.d.ts +3 -0
  122. package/types/apps/src/implementation/provider-error.d.ts +28 -1
  123. package/types/apps/src/implementation/provider.d.ts +18 -3
  124. package/types/apps/src/implementation/query-commit.d.ts +1 -1
  125. package/types/apps/src/implementation/router-catalog.d.ts +11 -13
  126. package/types/apps/src/implementation/router.d.ts +16 -5
  127. package/types/apps/src/implementation/runtime-yield.d.ts +7 -0
  128. package/types/apps/src/implementation/schema.d.ts +90 -10
  129. package/types/apps/src/implementation/skills.d.ts +18 -24
  130. package/types/apps/src/implementation/sql.d.ts +71 -0
  131. package/types/apps/src/implementation/ui-account-notice.d.ts +9 -0
  132. package/types/apps/src/implementation/ui-auth.d.ts +1 -1
  133. package/types/apps/src/implementation/ui-client.d.ts +2 -2
  134. package/types/apps/src/implementation/ui-document.d.ts +5 -0
  135. package/types/apps/src/implementation/ui-errors.d.ts +1 -1
  136. package/types/apps/src/implementation/ui-serving.d.ts +28 -9
  137. package/types/apps/src/implementation/ui-watch.d.ts +1 -1
  138. package/types/apps/src/implementation/upstream-error.d.ts +7 -0
  139. package/types/apps/src/implementation/webhooks.d.ts +1 -1
  140. package/types/apps/src/implementation/workflows.d.ts +1 -1
  141. package/types/apps/src/index.d.ts +55 -13
  142. package/types/apps/src/mcp.d.ts +20 -1
  143. package/types/apps/src/openapi.d.ts +1 -1
  144. package/types/apps/src/react.d.ts +1 -1
  145. package/types/apps/src/skills.d.ts +10 -8
  146. package/types/apps/src/ui-serving.d.ts +1 -1
  147. package/types/telemetry/src/app-records.d.ts +42 -0
  148. package/types/telemetry/src/browser-operations.d.ts +2 -2
  149. package/types/telemetry/src/browser.d.ts +8 -3
  150. package/types/telemetry/src/config.d.ts +2 -2
  151. package/types/telemetry/src/index.d.ts +2 -1
  152. package/types/telemetry/src/layer.d.ts +10 -4
  153. package/types/telemetry/src/measurements.d.ts +1 -1
  154. package/types/telemetry/src/ownership.d.ts +60 -0
  155. package/types/telemetry/src/recorded-failure.d.ts +29 -0
  156. package/types/telemetry/src/relay.d.ts +16 -6
  157. package/types/telemetry/src/span-attributes.d.ts +17 -1
  158. package/types/telemetry/src/transport.d.ts +8 -1
  159. package/types/utils/src/api-error.d.ts +55 -0
  160. package/types/utils/src/connection-failure.d.ts +33 -0
  161. package/types/utils/src/recorded-message.d.ts +18 -0
  162. package/types/utils/src/user-facing-error.d.ts +83 -0
  163. package/js/chunk-MKWZPDR6.js +0 -63
  164. package/js/chunk-N7YDVXYJ.js +0 -186
  165. package/js/chunk-NKLWZJLE.js +0 -172
  166. package/js/chunk-OCYUEU47.js +0 -224
  167. package/js/chunk-PJJ24GU7.js +0 -877
  168. package/js/chunk-PZB6T6KU.js +0 -19
  169. package/js/chunk-R3EV5FTO.js +0 -97
  170. package/js/chunk-YXQHV65J.js +0 -242
  171. package/js/chunk-ZQINWV4W.js +0 -630
  172. package/types/app-data/src/implementation/cursor.d.ts +0 -10
  173. package/types/app-data/src/implementation/index-key.d.ts +0 -7
  174. package/types/app-data/src/implementation/promise.d.ts +0 -68
  175. package/types/app-data/src/implementation/range.d.ts +0 -8
  176. package/types/app-data/src/implementation/schema.d.ts +0 -18
  177. package/types/app-data/src/implementation/sqlite.d.ts +0 -11
  178. package/types/app-data/src/index.d.ts +0 -4
  179. package/types/apps/src/contracts/storage.d.ts +0 -68
  180. package/types/apps/src/implementation/storage.d.ts +0 -15
@@ -0,0 +1,171 @@
1
+ import {
2
+ ProviderError,
3
+ maxUpstreamMessageLength
4
+ } from "./chunk-Q4IZAUIF.js";
5
+ import {
6
+ owned
7
+ } from "./chunk-QWQM3CLH.js";
8
+ import {
9
+ AccountId
10
+ } from "./chunk-H2CJWXA3.js";
11
+ import {
12
+ Effect_exports,
13
+ Option_exports,
14
+ Schema_exports
15
+ } from "./chunk-IFJU5SYQ.js";
16
+
17
+ // src/implementation/authoring.ts
18
+ var NativeCallback = /* @__PURE__ */ Symbol("apps.NativeCallback");
19
+ var appCode = (code) => owned("app", "app.code", { attributes: { "executor.app.code": code } });
20
+ var fromPromise = (callback, code) => (...args) => {
21
+ if (NativeCallback in callback) {
22
+ const native = callback[NativeCallback];
23
+ return native(...args);
24
+ }
25
+ return Effect_exports.tryPromise({ try: () => callback(...args), catch: (error) => error }).pipe(
26
+ appCode(code)
27
+ );
28
+ };
29
+ var method = (target, key) => {
30
+ const value = target[key];
31
+ const call = (...args) => Reflect.apply(value, target, args);
32
+ if (NativeCallback in value) Object.assign(call, { [NativeCallback]: value[NativeCallback] });
33
+ return call;
34
+ };
35
+ var toPromise = (operation, signalOf, services) => {
36
+ const native = (...args) => Effect_exports.suspend(() => {
37
+ const signal = typeof signalOf === "function" ? signalOf(...args) : signalOf;
38
+ if (signal === void 0) return operation(...args);
39
+ if (signal.aborted) return Effect_exports.interrupt;
40
+ const cancelled = Effect_exports.callback((resume) => {
41
+ if (signal.aborted) {
42
+ resume(Effect_exports.interrupt);
43
+ return;
44
+ }
45
+ const abort = () => resume(Effect_exports.interrupt);
46
+ signal.addEventListener("abort", abort, { once: true });
47
+ return Effect_exports.sync(() => signal.removeEventListener("abort", abort));
48
+ });
49
+ return Effect_exports.raceFirst(
50
+ cancelled,
51
+ Effect_exports.suspend(() => operation(...args))
52
+ );
53
+ });
54
+ return Object.assign(
55
+ (...args) => services === void 0 ? Effect_exports.runPromise(native(...args)) : Effect_exports.runPromiseWith(services)(native(...args)),
56
+ {
57
+ [NativeCallback]: native
58
+ }
59
+ );
60
+ };
61
+
62
+ // src/implementation/upstream-error.ts
63
+ var ErrorToken = Schema_exports.String.check(Schema_exports.isPattern(/^[A-Za-z0-9._-]{1,128}$/u));
64
+ var NestedError = Schema_exports.Struct({
65
+ error: Schema_exports.Struct({ code: Schema_exports.Union([Schema_exports.Int, ErrorToken]), message: Schema_exports.String })
66
+ });
67
+ var OAuthError = Schema_exports.Struct({
68
+ error: ErrorToken,
69
+ error_description: Schema_exports.optional(Schema_exports.String)
70
+ });
71
+ var bounded = (message) => message.length <= maxUpstreamMessageLength ? message : `${message.slice(0, maxUpstreamMessageLength - 1)}\u2026`;
72
+ var isShortenedUpstream = (message) => message.length === maxUpstreamMessageLength && message.endsWith("\u2026");
73
+ var stated = (code, message) => ({
74
+ code,
75
+ ...message === void 0 || message === "" ? {} : { message: bounded(message) }
76
+ });
77
+ var bodyUpstreamError = (json) => {
78
+ const nested = Schema_exports.decodeUnknownOption(NestedError)(json);
79
+ if (Option_exports.isSome(nested)) return stated(nested.value.error.code, nested.value.error.message);
80
+ const oauth = Schema_exports.decodeUnknownOption(OAuthError)(json);
81
+ if (Option_exports.isSome(oauth)) return stated(oauth.value.error, oauth.value.error_description);
82
+ return void 0;
83
+ };
84
+ var authParam = /([A-Za-z][A-Za-z0-9_-]*)\s*=\s*(?:"((?:[^"\\]|\\.)*)"|([^\s,"]+))/g;
85
+ var challengeUpstreamError = (header) => {
86
+ const bearer = header === void 0 ? -1 : header.search(/\bBearer\b/i);
87
+ if (header === void 0 || bearer === -1) return void 0;
88
+ const params = /* @__PURE__ */ new Map();
89
+ for (const [, name, quoted, token] of header.slice(bearer + "Bearer".length).matchAll(authParam))
90
+ if (name !== void 0 && !params.has(name.toLowerCase()))
91
+ params.set(name.toLowerCase(), quoted?.replace(/\\(.)/g, "$1") ?? token ?? "");
92
+ const code = Schema_exports.decodeUnknownOption(ErrorToken)(params.get("error"));
93
+ return Option_exports.isNone(code) ? void 0 : stated(code.value, params.get("error_description"));
94
+ };
95
+
96
+ // src/implementation/provider-error.ts
97
+ var providerError = ({
98
+ reason,
99
+ status,
100
+ accountId,
101
+ phase,
102
+ upstream
103
+ }) => new ProviderError({
104
+ reason,
105
+ ...status === void 0 ? {} : { status },
106
+ ...accountId === void 0 ? {} : { accountId },
107
+ ...phase === void 0 ? {} : { phase },
108
+ ...upstream === void 0 ? {} : { upstream }
109
+ });
110
+ function parseProviderError(error) {
111
+ return Schema_exports.decodeUnknownOption(ProviderError)(error).pipe(Option_exports.map(providerError));
112
+ }
113
+ function providerErrorDetail(error, detail) {
114
+ return providerError({
115
+ ...error,
116
+ phase: error.phase ?? detail.phase,
117
+ upstream: error.upstream ?? detail.upstream
118
+ });
119
+ }
120
+ function httpProviderError(status, headers = {}) {
121
+ const upstream = challengeUpstreamError(headers["www-authenticate"]);
122
+ if (status >= 500 && status <= 599)
123
+ return providerError({ reason: "unavailable", status, upstream });
124
+ if (status === 401) return providerError({ reason: "unauthorized", status, upstream });
125
+ if (status === 429) return providerError({ reason: "rate_limited", status, upstream });
126
+ if (status !== 403) return void 0;
127
+ const retry = headers["retry-after"];
128
+ if (headers["x-ratelimit-remaining"] === "0" || retry !== void 0 && (/^\d+$/.test(retry) || Number.isFinite(Date.parse(retry))))
129
+ return providerError({ reason: "rate_limited", status, upstream });
130
+ if (typeof upstream?.code === "string" && upstream.code.toLowerCase() === "insufficient_scope")
131
+ return providerError({ reason: "forbidden", status, upstream });
132
+ return providerError({ reason: "rejected", status, upstream });
133
+ }
134
+ function accountProviderError(error, accountId) {
135
+ const parsed = parseProviderError(error);
136
+ const account = Schema_exports.decodeUnknownOption(AccountId)(accountId);
137
+ if (Option_exports.isNone(parsed) || Option_exports.isNone(account)) return error;
138
+ return providerError({ ...parsed.value, accountId: account.value });
139
+ }
140
+ function graphqlProviderError(errors, status) {
141
+ const codes = errors.flatMap((error) => {
142
+ const parsed = Schema_exports.decodeUnknownOption(
143
+ Schema_exports.Struct({
144
+ type: Schema_exports.optional(Schema_exports.String),
145
+ extensions: Schema_exports.optional(Schema_exports.Struct({ code: Schema_exports.optional(Schema_exports.String) }))
146
+ })
147
+ )(error);
148
+ return Option_exports.isSome(parsed) ? [parsed.value.type, parsed.value.extensions?.code] : [];
149
+ });
150
+ if (codes.includes("RATE_LIMITED") || codes.includes("TOO_MANY_REQUESTS"))
151
+ return new ProviderError({ reason: "rate_limited", status });
152
+ if (codes.includes("UNAUTHENTICATED"))
153
+ return new ProviderError({ reason: "unauthorized", status });
154
+ if (codes.includes("FORBIDDEN")) return new ProviderError({ reason: "forbidden", status });
155
+ return void 0;
156
+ }
157
+
158
+ export {
159
+ appCode,
160
+ fromPromise,
161
+ method,
162
+ toPromise,
163
+ isShortenedUpstream,
164
+ bodyUpstreamError,
165
+ providerError,
166
+ parseProviderError,
167
+ providerErrorDetail,
168
+ httpProviderError,
169
+ accountProviderError,
170
+ graphqlProviderError
171
+ };
@@ -0,0 +1,348 @@
1
+ import {
2
+ adaptMcpTools,
3
+ answeredError,
4
+ mcpClient,
5
+ mcpJsonSchemaValidator
6
+ } from "./chunk-YQUG4CES.js";
7
+ import {
8
+ failOnNetworkRefusal
9
+ } from "./chunk-I6Q7ZPKJ.js";
10
+ import {
11
+ accountProviderError,
12
+ bodyUpstreamError,
13
+ httpProviderError,
14
+ providerErrorDetail
15
+ } from "./chunk-W6XCQAXP.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-QWQM3CLH.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
+ };
@@ -5,11 +5,11 @@ import {
5
5
  SkillDefinitionInvalid,
6
6
  SkillFile,
7
7
  SkillFilePath
8
- } from "./chunk-JU7VHODU.js";
8
+ } from "./chunk-H72MEDMN.js";
9
9
  import {
10
10
  Effect_exports,
11
11
  Schema_exports
12
- } from "./chunk-CDL5PM2Q.js";
12
+ } from "./chunk-IFJU5SYQ.js";
13
13
 
14
14
  // src/implementation/skill-files.ts
15
15
  var skillFromFiles = (input, source = {}) => Effect_exports.gen(function* () {