apps 0.0.1-beta.6 → 0.0.1-beta.61

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 (173) hide show
  1. package/README.md +24 -21
  2. package/framework-reference.json +1 -1
  3. package/js/chunk-2A26IT3X.js +171 -0
  4. package/js/chunk-4HYFEAR7.js +49 -0
  5. package/js/chunk-5FHWNLCI.js +88 -0
  6. package/js/{chunk-M3B3DE4K.js → chunk-74YVXBKY.js} +463 -218
  7. package/js/{chunk-MNMNLXBL.js → chunk-7QBUFK6I.js} +316 -69
  8. package/js/{chunk-SB4HEPNJ.js → chunk-A4RQSTHG.js} +883 -189
  9. package/js/{chunk-T7GKZBLP.js → chunk-ANN7H2FL.js} +67 -55
  10. package/js/{chunk-NKLWZJLE.js → chunk-AQU56EPI.js} +9 -5
  11. package/js/chunk-CDXQDN7W.js +92 -0
  12. package/js/{chunk-UK573G7W.js → chunk-EOPQ727L.js} +87 -51
  13. package/js/{chunk-27F7W2LG.js → chunk-H2CJWXA3.js} +2 -2
  14. package/js/{chunk-JU7VHODU.js → chunk-H72MEDMN.js} +65 -10
  15. package/js/{chunk-CDL5PM2Q.js → chunk-IFJU5SYQ.js} +19082 -18402
  16. package/js/{chunk-VFZKSM3T.js → chunk-JPEUKEV4.js} +3 -3
  17. package/js/{chunk-RFVIONFX.js → chunk-JSAZHHWI.js} +79 -41
  18. package/js/{chunk-RJDDBDSN.js → chunk-K6P2US3D.js} +635 -89
  19. package/js/{chunk-5T57N25Q.js → chunk-KGCTYL2S.js} +511 -63
  20. package/js/{chunk-KUMBKVJD.js → chunk-KLYSEHUD.js} +2 -2
  21. package/js/chunk-MWKHKOTL.js +240 -0
  22. package/js/chunk-NFHURZBA.js +340 -0
  23. package/js/chunk-OD3KFKZD.js +1617 -0
  24. package/js/{chunk-57RKNWL2.js → chunk-PD6I2SDG.js} +4 -4
  25. package/js/{chunk-ITM77QPO.js → chunk-QE4JSN3X.js} +126 -31
  26. package/js/chunk-S34PXQUC.js +266 -0
  27. package/js/{chunk-B3EOZTK3.js → chunk-TLWLJ7PD.js} +2227 -453
  28. package/js/{chunk-IJX4CYZO.js → chunk-TUMGL2OC.js} +228 -264
  29. package/js/{chunk-ECQFRCH4.js → chunk-VHUR5HUL.js} +4 -3
  30. package/js/{chunk-IPI4MFSN.js → chunk-XBG7HHXC.js} +2 -2
  31. package/js/client.js +142 -94
  32. package/js/contracts.js +103 -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 +90 -61
  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 +4050 -1354
  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 +8517 -214
  50. package/package.json +2 -3
  51. package/runtime.json +1 -1
  52. package/types/app-cache/src/index.d.ts +10 -1
  53. package/types/apps/src/contracts/api-response-error.d.ts +4 -0
  54. package/types/apps/src/contracts/app.d.ts +7 -3
  55. package/types/apps/src/contracts/cache.d.ts +20 -0
  56. package/types/apps/src/contracts/context.d.ts +19 -11
  57. package/types/apps/src/contracts/elicitation.d.ts +6 -6
  58. package/types/apps/src/contracts/events.d.ts +93 -0
  59. package/types/apps/src/contracts/failure.d.ts +30 -1
  60. package/types/apps/src/contracts/graphql.d.ts +2 -1
  61. package/types/apps/src/contracts/host.d.ts +48 -13
  62. package/types/apps/src/contracts/live.d.ts +2 -0
  63. package/types/apps/src/contracts/mcp.d.ts +80 -10
  64. package/types/apps/src/contracts/network.d.ts +84 -0
  65. package/types/apps/src/contracts/openapi-compile.d.ts +82 -3
  66. package/types/apps/src/contracts/openapi.d.ts +41 -9
  67. package/types/apps/src/contracts/operations.d.ts +8 -4
  68. package/types/apps/src/contracts/protocol-version.d.ts +2 -2
  69. package/types/apps/src/contracts/protocols/1.d.ts +733 -81
  70. package/types/apps/src/contracts/protocols/10.d.ts +1450 -0
  71. package/types/apps/src/contracts/protocols/2.d.ts +69 -26
  72. package/types/apps/src/contracts/protocols/3.d.ts +133 -33
  73. package/types/apps/src/contracts/protocols/4.d.ts +122 -45
  74. package/types/apps/src/contracts/protocols/5.d.ts +1200 -0
  75. package/types/apps/src/contracts/protocols/6.d.ts +1629 -0
  76. package/types/apps/src/contracts/protocols/7.d.ts +1785 -0
  77. package/types/apps/src/contracts/protocols/8.d.ts +1182 -0
  78. package/types/apps/src/contracts/protocols/9.d.ts +1104 -0
  79. package/types/apps/src/contracts/protocols/current.d.ts +2476 -0
  80. package/types/apps/src/contracts/protocols/oauth-6.d.ts +74 -0
  81. package/types/apps/src/contracts/protocols/oauth.d.ts +134 -0
  82. package/types/apps/src/contracts/provider-error.d.ts +9 -0
  83. package/types/apps/src/contracts/provider.d.ts +115 -10
  84. package/types/apps/src/contracts/skills.d.ts +50 -13
  85. package/types/apps/src/contracts/sql.d.ts +58 -0
  86. package/types/apps/src/contracts/ui.d.ts +19 -1
  87. package/types/apps/src/contracts/workflows.d.ts +6 -0
  88. package/types/apps/src/facet.d.ts +4 -5
  89. package/types/apps/src/host.d.ts +5 -0
  90. package/types/apps/src/implementation/account-router.d.ts +4 -3
  91. package/types/apps/src/implementation/authoring.d.ts +25 -5
  92. package/types/apps/src/implementation/browser-scripts.gen.d.ts +6 -0
  93. package/types/apps/src/implementation/cache.d.ts +4 -0
  94. package/types/apps/src/implementation/catalog-cache.d.ts +35 -4
  95. package/types/apps/src/implementation/elicitation.d.ts +18 -15
  96. package/types/apps/src/implementation/events.d.ts +59 -0
  97. package/types/apps/src/implementation/failure-detail.d.ts +25 -3
  98. package/types/apps/src/implementation/graphql-catalog.d.ts +3 -3
  99. package/types/apps/src/implementation/graphql.d.ts +4 -3
  100. package/types/apps/src/implementation/input-problems.d.ts +6 -2
  101. package/types/apps/src/implementation/invocation-timing.d.ts +16 -0
  102. package/types/apps/src/implementation/live.d.ts +2 -2
  103. package/types/apps/src/implementation/mcp-call.d.ts +6 -5
  104. package/types/apps/src/implementation/mcp-catalog.d.ts +6 -4
  105. package/types/apps/src/implementation/mcp-client.d.ts +17 -9
  106. package/types/apps/src/implementation/mcp-stdio.d.ts +1 -1
  107. package/types/apps/src/implementation/mcp-tools.d.ts +2 -1
  108. package/types/apps/src/implementation/mcp.d.ts +20 -9
  109. package/types/apps/src/implementation/network.d.ts +16 -0
  110. package/types/apps/src/implementation/openapi-compile.d.ts +26 -6
  111. package/types/apps/src/implementation/openapi-document.d.ts +46 -19
  112. package/types/apps/src/implementation/openapi-names.d.ts +9 -4
  113. package/types/apps/src/implementation/openapi-request.d.ts +10 -2
  114. package/types/apps/src/implementation/openapi-source.d.ts +18 -0
  115. package/types/apps/src/implementation/openapi-upgrade.d.ts +4 -0
  116. package/types/apps/src/implementation/operations.d.ts +17 -2
  117. package/types/apps/src/implementation/optimistic.d.ts +1 -1
  118. package/types/apps/src/implementation/protocol-operations.d.ts +3 -0
  119. package/types/apps/src/implementation/provider-error.d.ts +28 -1
  120. package/types/apps/src/implementation/provider.d.ts +19 -5
  121. package/types/apps/src/implementation/query-commit.d.ts +1 -1
  122. package/types/apps/src/implementation/router-catalog.d.ts +11 -13
  123. package/types/apps/src/implementation/router.d.ts +16 -5
  124. package/types/apps/src/implementation/runtime-yield.d.ts +7 -0
  125. package/types/apps/src/implementation/schema.d.ts +90 -10
  126. package/types/apps/src/implementation/skills.d.ts +18 -24
  127. package/types/apps/src/implementation/sql.d.ts +71 -0
  128. package/types/apps/src/implementation/ui-account-notice.d.ts +9 -0
  129. package/types/apps/src/implementation/ui-auth.d.ts +1 -1
  130. package/types/apps/src/implementation/ui-client.d.ts +2 -2
  131. package/types/apps/src/implementation/ui-document.d.ts +5 -0
  132. package/types/apps/src/implementation/ui-errors.d.ts +1 -1
  133. package/types/apps/src/implementation/ui-serving.d.ts +11 -5
  134. package/types/apps/src/implementation/ui-watch.d.ts +1 -1
  135. package/types/apps/src/implementation/upstream-error.d.ts +7 -0
  136. package/types/apps/src/implementation/webhooks.d.ts +1 -1
  137. package/types/apps/src/implementation/workflows.d.ts +1 -1
  138. package/types/apps/src/index.d.ts +30 -12
  139. package/types/apps/src/mcp.d.ts +20 -1
  140. package/types/apps/src/openapi.d.ts +1 -1
  141. package/types/apps/src/react.d.ts +1 -1
  142. package/types/apps/src/skills.d.ts +10 -8
  143. package/types/telemetry/src/app-records.d.ts +42 -0
  144. package/types/telemetry/src/browser-operations.d.ts +7 -4
  145. package/types/telemetry/src/browser.d.ts +8 -3
  146. package/types/telemetry/src/config.d.ts +2 -2
  147. package/types/telemetry/src/index.d.ts +1 -0
  148. package/types/telemetry/src/layer.d.ts +2 -2
  149. package/types/telemetry/src/ownership.d.ts +56 -0
  150. package/types/telemetry/src/recorded-failure.d.ts +29 -0
  151. package/types/telemetry/src/relay.d.ts +11 -3
  152. package/types/telemetry/src/transport.d.ts +8 -1
  153. package/types/utils/src/api-error.d.ts +55 -0
  154. package/types/utils/src/connection-failure.d.ts +33 -0
  155. package/types/utils/src/recorded-message.d.ts +18 -0
  156. package/types/utils/src/user-facing-error.d.ts +83 -0
  157. package/js/chunk-6BSSI67S.js +0 -224
  158. package/js/chunk-MKWZPDR6.js +0 -63
  159. package/js/chunk-N7YDVXYJ.js +0 -186
  160. package/js/chunk-OE3QQTSB.js +0 -222
  161. package/js/chunk-PJJ24GU7.js +0 -877
  162. package/js/chunk-PZB6T6KU.js +0 -19
  163. package/js/chunk-R3EV5FTO.js +0 -97
  164. package/js/chunk-ZQINWV4W.js +0 -630
  165. package/types/app-data/src/implementation/cursor.d.ts +0 -10
  166. package/types/app-data/src/implementation/index-key.d.ts +0 -7
  167. package/types/app-data/src/implementation/promise.d.ts +0 -68
  168. package/types/app-data/src/implementation/range.d.ts +0 -8
  169. package/types/app-data/src/implementation/schema.d.ts +0 -18
  170. package/types/app-data/src/implementation/sqlite.d.ts +0 -11
  171. package/types/app-data/src/index.d.ts +0 -4
  172. package/types/apps/src/contracts/storage.d.ts +0 -68
  173. package/types/apps/src/implementation/storage.d.ts +0 -15
@@ -4,7 +4,7 @@ import {
4
4
  fromWeb,
5
5
  layerMergedContext,
6
6
  make2 as make
7
- } from "./chunk-UK573G7W.js";
7
+ } from "./chunk-EOPQ727L.js";
8
8
  import {
9
9
  Reference,
10
10
  Service,
@@ -13,16 +13,16 @@ import {
13
13
  getOrUndefined2 as getOrUndefined,
14
14
  map3 as map,
15
15
  merge3 as merge,
16
- remove3 as remove,
16
+ remove2 as remove,
17
17
  succeed4 as succeed,
18
18
  toReadableStreamEffect,
19
19
  tryPromise
20
- } from "./chunk-CDL5PM2Q.js";
20
+ } from "./chunk-IFJU5SYQ.js";
21
21
  import {
22
22
  __export
23
23
  } from "./chunk-CZ7CSFO4.js";
24
24
 
25
- // ../../node_modules/.bun/effect@https+++pkg.pr.new+Effect-TS+effect+effect@c7d1ffff31a3e2ae0b0b+a654a55b752bdb24/node_modules/effect/dist/unstable/http/FetchHttpClient.js
25
+ // ../../node_modules/.bun/effect@4.0.1/node_modules/effect/dist/http/FetchHttpClient.js
26
26
  var FetchHttpClient_exports = {};
27
27
  __export(FetchHttpClient_exports, {
28
28
  Fetch: () => Fetch,
@@ -1,9 +1,10 @@
1
1
  import {
2
2
  prepareElicitation
3
- } from "./chunk-SB4HEPNJ.js";
3
+ } from "./chunk-A4RQSTHG.js";
4
4
  import {
5
+ bodyUpstreamError,
5
6
  fromPromise
6
- } from "./chunk-T7GKZBLP.js";
7
+ } from "./chunk-2A26IT3X.js";
7
8
  import {
8
9
  ElicitationFailed,
9
10
  McpError,
@@ -15,14 +16,18 @@ import {
15
16
  defaultElicitationLimits,
16
17
  defaultMcpClientLimits,
17
18
  mcpSdkTimerCeilingMs
18
- } from "./chunk-B3EOZTK3.js";
19
+ } from "./chunk-TLWLJ7PD.js";
19
20
  import {
20
- compileJsonSchemaDecoder,
21
- jsonSchemaDecoder
22
- } from "./chunk-5T57N25Q.js";
21
+ jsonSchemaDecoder,
22
+ nestJsonSchema,
23
+ preparedJsonSchemaDecoder
24
+ } from "./chunk-KGCTYL2S.js";
25
+ import {
26
+ owned
27
+ } from "./chunk-K6P2US3D.js";
23
28
  import {
24
29
  JsonObject
25
- } from "./chunk-27F7W2LG.js";
30
+ } from "./chunk-H2CJWXA3.js";
26
31
  import {
27
32
  Clock_exports,
28
33
  Deferred_exports,
@@ -31,29 +36,79 @@ import {
31
36
  Option_exports,
32
37
  Queue_exports,
33
38
  Schema_exports
34
- } from "./chunk-CDL5PM2Q.js";
39
+ } from "./chunk-IFJU5SYQ.js";
35
40
 
36
41
  // src/implementation/mcp-tools.ts
42
+ var resultFields = {
43
+ content: { type: "array", items: { type: "object" } },
44
+ structuredContent: { type: "object" },
45
+ isError: { type: "boolean" },
46
+ _meta: { type: "object" }
47
+ };
48
+ var definitionReference = /^#\/(?:\$defs|definitions)\/[^/]+$/;
49
+ var locating = /* @__PURE__ */ new Set(["$id", "$anchor", "$dynamicAnchor", "$recursiveAnchor"]);
50
+ var onlyDefinitionReferences = (value) => Array.isArray(value) ? value.every(onlyDefinitionReferences) : value === null || typeof value !== "object" ? true : Object.entries(value).every(
51
+ ([key, item]) => locating.has(key) || key === "$dynamicRef" || key === "$recursiveRef" ? false : key === "$ref" ? typeof item === "string" && definitionReference.test(item) : onlyDefinitionReferences(item)
52
+ );
53
+ var placed = (structuredContent, pointer) => {
54
+ if (onlyDefinitionReferences(structuredContent)) {
55
+ const { $defs, definitions, $schema: _draft, ...schema } = structuredContent;
56
+ return {
57
+ schema,
58
+ root: {
59
+ ...$defs === void 0 ? {} : { $defs },
60
+ ...definitions === void 0 ? {} : { definitions }
61
+ }
62
+ };
63
+ }
64
+ try {
65
+ return { schema: nestJsonSchema(structuredContent, pointer), root: {} };
66
+ } catch {
67
+ return { schema: structuredContent, root: {} };
68
+ }
69
+ };
70
+ var resultSchema = (structuredContent) => {
71
+ if (structuredContent === void 0)
72
+ return { type: "object", properties: resultFields, required: ["content"] };
73
+ const { schema, root } = placed(structuredContent, "#/anyOf/0/properties/structuredContent");
74
+ return {
75
+ // The envelope's keywords mean the same in every draft, so the server's draft applies.
76
+ ...structuredContent.$schema === void 0 ? {} : { $schema: structuredContent.$schema },
77
+ ...root,
78
+ anyOf: [
79
+ {
80
+ type: "object",
81
+ properties: { ...resultFields, structuredContent: schema, isError: { const: false } },
82
+ required: ["content", "structuredContent"]
83
+ },
84
+ {
85
+ type: "object",
86
+ properties: { ...resultFields, isError: { const: true } },
87
+ required: ["content", "isError"]
88
+ }
89
+ ]
90
+ };
91
+ };
37
92
  var adaptMcpTool = (client, tool) => Effect_exports.gen(function* () {
38
93
  const decoder = yield* jsonSchemaDecoder(tool.inputSchema).pipe(
39
94
  Effect_exports.mapError(() => new McpError({ phase: "schema", reason: "invalid_response" }))
40
95
  );
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
- );
96
+ const output = preparedJsonSchemaDecoder(resultSchema(tool.outputSchema));
97
+ const { outputSchema: _upstream, ...metadata } = tool;
46
98
  const adapted = {
47
- ...tool,
99
+ ...metadata,
48
100
  description: tool.description ?? tool.title ?? tool.name,
49
101
  input: decoder,
102
+ output: output.decoder,
50
103
  ...tool.annotations?.readOnlyHint === void 0 ? {} : { readOnly: tool.annotations.readOnlyHint },
51
104
  run: (context, input) => Effect_exports.gen(function* () {
52
105
  const arguments_ = yield* Schema_exports.decodeUnknownEffect(decoder)(input).pipe(
53
106
  Effect_exports.flatMap(Schema_exports.decodeUnknownEffect(JsonObject)),
54
107
  Effect_exports.mapError(() => new McpError({ phase: "call", reason: "invalid_input" }))
55
108
  );
56
- const outputDecoder = output === void 0 ? void 0 : yield* output;
109
+ yield* output.compile.pipe(
110
+ Effect_exports.mapError(() => new McpError({ phase: "schema", reason: "invalid_response" }))
111
+ );
57
112
  const result = yield* client.call(tool.name, arguments_, context);
58
113
  if (result.isError === true) {
59
114
  (yield* ToolResultObservation).failed();
@@ -62,10 +117,6 @@ var adaptMcpTool = (client, tool) => Effect_exports.gen(function* () {
62
117
  "error.type": "McpToolError"
63
118
  });
64
119
  }
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
120
  return result;
70
121
  })
71
122
  };
@@ -81,7 +132,11 @@ var adaptMcpTools = (client) => Effect_exports.gen(function* () {
81
132
  });
82
133
 
83
134
  // src/implementation/mcp-client.ts
84
- import { ListToolsResultSchema } from "@modelcontextprotocol/sdk/types.js";
135
+ import {
136
+ ErrorCode as ErrorCode2,
137
+ ListToolsResultSchema,
138
+ McpError as ProtocolError2
139
+ } from "@modelcontextprotocol/sdk/types.js";
85
140
 
86
141
  // src/implementation/mcp-call.ts
87
142
  import {
@@ -133,11 +188,14 @@ var mcpCall = (client, name, input, context, timeoutMs, failure) => Effect_expor
133
188
  const callbacks = /* @__PURE__ */ new Set();
134
189
  const lifetime = yield* Effect_exports.acquireRelease(
135
190
  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
- })
191
+ (controller) => (
192
+ // oxlint-disable-next-line executor/authored-code-through-adapter -- the MCP SDK's elicitation callbacks
193
+ Effect_exports.promise(async () => {
194
+ controller.abort();
195
+ client.removeRequestHandler("elicitation/create");
196
+ await Promise.allSettled(callbacks);
197
+ })
198
+ )
141
199
  );
142
200
  client.setRequestHandler(ElicitRequestSchema, (request, extra) => {
143
201
  const signal = AbortSignal.any([lifetime.signal, extra.signal]);
@@ -149,7 +207,10 @@ var mcpCall = (client, name, input, context, timeoutMs, failure) => Effect_expor
149
207
  const deliver = context.elicit;
150
208
  if (deliver === void 0) return yield* new ElicitationFailed({ reason: "unavailable" });
151
209
  const answer = yield* budget.waitForInput(
152
- fromPromise(deliver)(form.request).pipe(
210
+ fromPromise(
211
+ deliver,
212
+ "elicitation"
213
+ )(form.request).pipe(
153
214
  Effect_exports.mapError(
154
215
  (error) => Option_exports.getOrElse(
155
216
  Schema_exports.decodeUnknownOption(ElicitationFailed)(error),
@@ -199,7 +260,7 @@ var mcpCall = (client, name, input, context, timeoutMs, failure) => Effect_expor
199
260
  );
200
261
  })
201
262
  ).pipe(
202
- Effect_exports.withSpan("provider.mcp.request", {
263
+ owned("upstream", "provider.mcp.request", {
203
264
  kind: "client",
204
265
  attributes: {
205
266
  "rpc.system.name": "jsonrpc",
@@ -210,6 +271,20 @@ var mcpCall = (client, name, input, context, timeoutMs, failure) => Effect_expor
210
271
  );
211
272
 
212
273
  // src/implementation/mcp-client.ts
274
+ var clientCodes = /* @__PURE__ */ new Set([
275
+ ErrorCode2.RequestTimeout,
276
+ ErrorCode2.ConnectionClosed
277
+ ]);
278
+ var answeredError = (error) => {
279
+ if (!(error instanceof ProtocolError2) || clientCodes.has(error.code)) return void 0;
280
+ const prefix = `MCP error ${error.code}: `;
281
+ return bodyUpstreamError({
282
+ error: {
283
+ code: error.code,
284
+ message: error.message.startsWith(prefix) ? error.message.slice(prefix.length) : error.message
285
+ }
286
+ });
287
+ };
213
288
  var mcpJsonSchemaValidator = {
214
289
  getValidator(document) {
215
290
  const decoder = Effect_exports.runSync(jsonSchemaDecoder(document));
@@ -243,7 +318,7 @@ function mcpClient(withClient, timeoutMs, failure) {
243
318
  ),
244
319
  catch: (error) => failure("discover", error)
245
320
  }).pipe(
246
- Effect_exports.withSpan("provider.mcp.request", {
321
+ owned("upstream", "provider.mcp.request", {
247
322
  kind: "client",
248
323
  attributes: { "rpc.system.name": "jsonrpc", "rpc.method": "tools/list" }
249
324
  })
@@ -284,16 +359,36 @@ function mcpClient(withClient, timeoutMs, failure) {
284
359
  server: Option_exports.getOrElse(server, () => ({}))
285
360
  };
286
361
  })
287
- ).pipe(Effect_exports.withSpan("provider.mcp.discover"));
362
+ ).pipe(owned("upstream", "provider.mcp.discover"));
363
+ const check = withClient(
364
+ "discover",
365
+ (client) => (
366
+ // oxlint-disable-next-line executor/authored-code-through-adapter -- MCP SDK
367
+ Effect_exports.tryPromise({
368
+ try: (signal) => client.request({ method: "tools/list", params: {} }, ListToolsResultSchema, {
369
+ signal,
370
+ timeout: timeoutMs
371
+ }),
372
+ catch: (error) => failure("discover", error)
373
+ }).pipe(
374
+ Effect_exports.asVoid,
375
+ owned("upstream", "provider.mcp.request", {
376
+ kind: "client",
377
+ attributes: { "rpc.system.name": "jsonrpc", "rpc.method": "tools/list" }
378
+ })
379
+ )
380
+ )
381
+ ).pipe(owned("upstream", "provider.mcp.check"));
288
382
  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 } })
383
+ owned("upstream", "provider.mcp.call", { attributes: { "mcp.tool.name": name } })
290
384
  );
291
- return { list, call };
385
+ return { list, check, call };
292
386
  }
293
387
 
294
388
  export {
295
389
  adaptMcpTool,
296
390
  adaptMcpTools,
391
+ answeredError,
297
392
  mcpJsonSchemaValidator,
298
393
  mcpClient
299
394
  };
@@ -0,0 +1,266 @@
1
+ import {
2
+ declaredOperations,
3
+ nativeOperation,
4
+ nativeRouter
5
+ } from "./chunk-ANN7H2FL.js";
6
+ import {
7
+ fromPromise,
8
+ method
9
+ } from "./chunk-2A26IT3X.js";
10
+ import {
11
+ EmittedEvent,
12
+ EventName,
13
+ ScheduleTiming,
14
+ defaultEventLimits
15
+ } from "./chunk-TLWLJ7PD.js";
16
+ import {
17
+ decoderOf,
18
+ isSchema,
19
+ jsonSchemaDocument,
20
+ schemaArgument
21
+ } from "./chunk-KGCTYL2S.js";
22
+ import {
23
+ JsonValue
24
+ } from "./chunk-H2CJWXA3.js";
25
+ import {
26
+ Effect_exports,
27
+ Schema_exports
28
+ } from "./chunk-IFJU5SYQ.js";
29
+
30
+ // src/contracts/http.ts
31
+ var ResponseStatusError = class extends Schema_exports.TaggedError()(
32
+ "ResponseStatusError",
33
+ { status: Schema_exports.Number }
34
+ ) {
35
+ get message() {
36
+ return `Request failed with status ${this.status}`;
37
+ }
38
+ };
39
+ var ResponseDecodeError = class extends Schema_exports.TaggedError()(
40
+ "ResponseDecodeError",
41
+ {}
42
+ ) {
43
+ get message() {
44
+ return "Response body did not match the expected schema";
45
+ }
46
+ };
47
+
48
+ // src/implementation/workflows.ts
49
+ var NativeWorkflow = /* @__PURE__ */ Symbol("apps.Workflow");
50
+ var workflow = (options, run) => ({
51
+ [NativeWorkflow]: {
52
+ input: decoderOf(schemaArgument(options.input, "The workflow input")),
53
+ ...options.output === void 0 ? {} : { output: decoderOf(schemaArgument(options.output, "The workflow output")) },
54
+ ...options.description === void 0 ? {} : { description: options.description },
55
+ // SAFETY: defineApp checks required context; the host supplies the pinned run's capabilities.
56
+ run: (context, input) => fromPromise(run, "workflow")(context, input)
57
+ }
58
+ });
59
+ var nativeWorkflow = (value) => {
60
+ if (typeof value !== "object" || value === null || !(NativeWorkflow in value)) return void 0;
61
+ return value[NativeWorkflow];
62
+ };
63
+
64
+ // src/implementation/events.ts
65
+ var Native = /* @__PURE__ */ Symbol("apps.Event");
66
+ var scalarTypes = /* @__PURE__ */ new Set(["string", "number", "integer", "boolean"]);
67
+ var isScalarSchema = (document) => {
68
+ const type = document.type;
69
+ if (typeof type === "string") return scalarTypes.has(type);
70
+ const choices = Array.isArray(document.enum) ? document.enum : "const" in document ? [document.const] : void 0;
71
+ return choices !== void 0 && choices.length > 0 && choices.every((value) => ["string", "number", "boolean"].includes(typeof value));
72
+ };
73
+ var event = (options) => {
74
+ const filters = options.filters ?? {};
75
+ const fieldDecoders = Object.fromEntries(
76
+ Object.entries(filters).map(([key, field]) => [
77
+ key,
78
+ decoderOf(schemaArgument(field, `The event filter ${JSON.stringify(key)}`))
79
+ ])
80
+ );
81
+ for (const [key, decoder] of Object.entries(fieldDecoders)) {
82
+ const document = Effect_exports.runSync(jsonSchemaDocument(decoder));
83
+ if (!isScalarSchema(document))
84
+ throw new TypeError(
85
+ `The event filter ${JSON.stringify(key)} must be a string, number, boolean or literal`
86
+ );
87
+ }
88
+ return {
89
+ [Native]: {
90
+ description: options.description,
91
+ filters: fieldDecoders,
92
+ payload: decoderOf(schemaArgument(options.payload, "The event payload"))
93
+ },
94
+ description: options.description,
95
+ filters,
96
+ payload: options.payload
97
+ };
98
+ };
99
+ var nativeEvent = (declaration) => typeof declaration === "object" && declaration !== null && Native in declaration ? declaration[Native] : void 0;
100
+ var declaredEvents = (events) => Effect_exports.forEach(
101
+ Object.entries(events),
102
+ ([name, declared]) => Effect_exports.gen(function* () {
103
+ const filters = yield* jsonSchemaDocument(Schema_exports.Struct(declared.filters));
104
+ const payload = yield* jsonSchemaDocument(declared.payload);
105
+ return [name, { description: declared.description, filters, payload }];
106
+ })
107
+ ).pipe(Effect_exports.map((entries) => Object.fromEntries(entries)));
108
+ var makeEmitter = (input) => ({
109
+ emit: (name, data, ...rest) => {
110
+ const options = rest[0] ?? {};
111
+ const declared = Object.hasOwn(input.events, name) ? input.events[name] : void 0;
112
+ if (declared === void 0) throw new TypeError(`This app declares no event named "${name}"`);
113
+ if (input.emitted.length >= defaultEventLimits.maxEventsPerInvocation)
114
+ throw new RangeError(
115
+ `An invocation can emit at most ${defaultEventLimits.maxEventsPerInvocation} events`
116
+ );
117
+ const payload = Schema_exports.decodeUnknownSync(declared.payload)(data);
118
+ const filters = Schema_exports.decodeUnknownSync(Schema_exports.Struct(declared.filters))(
119
+ options.filters ?? {}
120
+ );
121
+ const account = options.account ?? input.sourceAccount ?? (input.accounts.length === 1 ? input.accounts[0] : void 0) ?? null;
122
+ if (account === null && input.accounts.length > 1)
123
+ throw new TypeError(
124
+ "This invocation has several accounts; name the one the event came from with { account }"
125
+ );
126
+ if (account !== null && !input.accounts.includes(account))
127
+ throw new TypeError("The event's account is not one of this invocation's accounts");
128
+ const occurredAt = options.occurredAt === void 0 ? Date.now() : options.occurredAt instanceof Date ? options.occurredAt.getTime() : options.occurredAt;
129
+ const occurrence = Schema_exports.decodeUnknownSync(EmittedEvent)({
130
+ name: Schema_exports.decodeUnknownSync(EventName)(name),
131
+ id: options.id ?? crypto.randomUUID(),
132
+ occurredAt,
133
+ data: payload,
134
+ filters,
135
+ account
136
+ });
137
+ if (new TextEncoder().encode(JSON.stringify(occurrence.data)).byteLength > defaultEventLimits.maxDataBytes)
138
+ throw new RangeError(
139
+ `An event's data can be at most ${defaultEventLimits.maxDataBytes} bytes of JSON; send a summary and a tool to read the rest`
140
+ );
141
+ input.emitted.push(occurrence);
142
+ }
143
+ });
144
+
145
+ // src/implementation/app.ts
146
+ var InternalApp = /* @__PURE__ */ Symbol("apps.App");
147
+ var isApp = (value) => typeof value === "object" && value !== null && InternalApp in value;
148
+ var toEffectApp = (app) => app[InternalApp];
149
+ function rejectCatalogs(definition) {
150
+ if ("queries" in definition || "mutations" in definition)
151
+ throw new Error("Put queries and mutations in a router under tools");
152
+ }
153
+ function adaptDefinition(definition) {
154
+ rejectCatalogs(definition);
155
+ const webhooks = definition.webhooks === void 0 ? {} : {
156
+ // SAFETY: `Required` only where the optional method was just checked to be present.
157
+ webhooks: Object.fromEntries(
158
+ Object.entries(definition.webhooks).map(([name, webhook]) => [
159
+ name,
160
+ {
161
+ ...webhook,
162
+ ...webhook.register === void 0 ? {} : {
163
+ register: fromPromise(
164
+ method(webhook, "register"),
165
+ "webhook"
166
+ )
167
+ },
168
+ handle: fromPromise(method(webhook, "handle"), "webhook"),
169
+ ...webhook.unregister === void 0 ? {} : {
170
+ unregister: fromPromise(
171
+ method(webhook, "unregister"),
172
+ "webhook"
173
+ )
174
+ },
175
+ ..."config" in webhook && isSchema(webhook.config) ? { config: decoderOf(webhook.config) } : {},
176
+ ..."state" in webhook && isSchema(webhook.state) ? { state: decoderOf(webhook.state) } : {}
177
+ }
178
+ ])
179
+ )
180
+ };
181
+ const workflows = definition.workflows === void 0 ? {} : {
182
+ workflows: Object.fromEntries(
183
+ Object.entries(definition.workflows).map(([name, value]) => {
184
+ const declared2 = nativeWorkflow(value);
185
+ if (declared2 === void 0) throw new Error("Invalid workflow declaration");
186
+ return [name, declared2];
187
+ })
188
+ )
189
+ };
190
+ const root = definition.tools === void 0 ? void 0 : nativeRouter(definition.tools);
191
+ if (definition.tools !== void 0 && root === void 0)
192
+ throw new Error("tools must be a router");
193
+ const data = root === void 0 ? {} : { tools: root };
194
+ const declared = root?.kind === "router" ? declaredOperations(root) : [];
195
+ const mutations = /* @__PURE__ */ new Set();
196
+ for (const { operation } of declared) {
197
+ if (operation.kind !== "mutation") continue;
198
+ if (mutations.has(operation))
199
+ throw new Error("A mutation can be mounted at only one path in tools");
200
+ mutations.add(operation);
201
+ }
202
+ const schedules = definition.schedules === void 0 ? {} : {
203
+ schedules: Object.fromEntries(
204
+ Object.entries(definition.schedules).map(([name, schedule]) => {
205
+ const target = nativeOperation(schedule.operation);
206
+ const match = declared.find(
207
+ ({ operation }) => operation === target && operation.kind === "mutation"
208
+ );
209
+ if (match === void 0)
210
+ throw new Error("A schedule must reference a mutation in this app's tools");
211
+ return [
212
+ name,
213
+ {
214
+ timing: Schema_exports.decodeUnknownSync(ScheduleTiming)(schedule.timing),
215
+ input: Schema_exports.decodeUnknownSync(JsonValue)(schedule.input),
216
+ tool: match.name
217
+ }
218
+ ];
219
+ })
220
+ )
221
+ };
222
+ return {
223
+ ...definition,
224
+ ...webhooks,
225
+ ...workflows,
226
+ ...data,
227
+ ...schedules
228
+ };
229
+ }
230
+ var defineApp = (requirements, definition) => {
231
+ if (typeof definition !== "function") rejectCatalogs(definition);
232
+ const evaluate = typeof definition === "function" ? definition : async () => definition;
233
+ const factory = fromPromise(evaluate, "factory");
234
+ const events = requirements.events === void 0 ? void 0 : Object.fromEntries(
235
+ Object.entries(requirements.events).map(([name, declared]) => {
236
+ const native2 = nativeEvent(declared);
237
+ if (native2 === void 0)
238
+ throw new TypeError(
239
+ `The event ${JSON.stringify(name)} must be declared with event()`
240
+ );
241
+ return [name, native2];
242
+ })
243
+ );
244
+ const native = {
245
+ accounts: requirements.accounts,
246
+ ...events === void 0 ? {} : { events },
247
+ evaluate: (context) => factory(context).pipe(Effect_exports.map((value) => adaptDefinition(value)))
248
+ };
249
+ return {
250
+ [InternalApp]: native,
251
+ accounts: native.accounts,
252
+ evaluate: (context) => Effect_exports.runPromise(factory(context))
253
+ };
254
+ };
255
+
256
+ export {
257
+ ResponseStatusError,
258
+ ResponseDecodeError,
259
+ workflow,
260
+ event,
261
+ declaredEvents,
262
+ makeEmitter,
263
+ isApp,
264
+ toEffectApp,
265
+ defineApp
266
+ };