apps 0.0.1-beta.9 → 0.0.1-beta.91

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 (191) hide show
  1. package/README.md +56 -38
  2. package/framework-reference.json +1 -1
  3. package/js/chunk-3LEVTFD4.js +712 -0
  4. package/js/chunk-5FHWNLCI.js +88 -0
  5. package/js/{chunk-FL2QR3XW.js → chunk-5MDA7MKL.js} +338 -73
  6. package/js/chunk-6XQLA5NC.js +5047 -0
  7. package/js/{chunk-M3B3DE4K.js → chunk-74YVXBKY.js} +463 -218
  8. package/js/chunk-7PHHWYV4.js +335 -0
  9. package/js/chunk-DADXWWRZ.js +449 -0
  10. package/js/{chunk-27F7W2LG.js → chunk-DDHBUKXX.js} +18 -2
  11. package/js/{chunk-UK573G7W.js → chunk-EOPQ727L.js} +87 -51
  12. package/js/{chunk-5T57N25Q.js → chunk-GQ33QSNB.js} +583 -69
  13. package/js/{chunk-JU7VHODU.js → chunk-H72MEDMN.js} +65 -10
  14. package/js/chunk-I5C7FD5Z.js +171 -0
  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-KUMBKVJD.js → chunk-KLYSEHUD.js} +2 -2
  18. package/js/{chunk-RFVIONFX.js → chunk-KUCCHNVY.js} +123 -44
  19. package/js/chunk-OD3KFKZD.js +1617 -0
  20. package/js/{chunk-57RKNWL2.js → chunk-PD6I2SDG.js} +4 -4
  21. package/js/{chunk-72JNVHPK.js → chunk-PYQLOLOC.js} +4 -3
  22. package/js/{chunk-ODEIDRGW.js → chunk-QWQM3CLH.js} +795 -176
  23. package/js/{chunk-IJX4CYZO.js → chunk-TUMGL2OC.js} +228 -264
  24. package/js/{chunk-IPI4MFSN.js → chunk-XBG7HHXC.js} +2 -2
  25. package/js/chunk-XPRZTLHD.js +1915 -0
  26. package/js/chunk-YNJ5CZMJ.js +93 -0
  27. package/js/chunk-YRGL4QEF.js +49 -0
  28. package/js/{chunk-Z5M2LQOZ.js → chunk-YWFUWTUJ.js} +113 -58
  29. package/js/client.js +142 -78
  30. package/js/contracts.js +142 -21
  31. package/js/effect.js +18 -19
  32. package/js/{es-APDZKREY.js → es-DIULA3ZF.js} +62 -1659
  33. package/js/graphql.js +49 -40
  34. package/js/host.js +85 -62
  35. package/js/index.js +165 -70
  36. package/js/mcp/effect.js +21 -21
  37. package/js/mcp.js +76 -56
  38. package/js/openapi.js +4189 -1411
  39. package/js/react.js +2 -3
  40. package/js/skills/effect.js +6 -3
  41. package/js/skills.js +208 -81
  42. package/js/storage/facet.js +1 -540
  43. package/js/ui/auth/contracts.js +2 -2
  44. package/js/ui/auth.js +5 -5
  45. package/js/ui/contracts.js +5 -4
  46. package/js/ui/serving.js +8605 -225
  47. package/package.json +3 -8
  48. package/runtime.json +1 -1
  49. package/types/app-cache/src/contracts/cache.d.ts +18 -0
  50. package/types/app-cache/src/index.d.ts +34 -2
  51. package/types/apps/src/contracts/api-response-error.d.ts +4 -0
  52. package/types/apps/src/contracts/app.d.ts +60 -11
  53. package/types/apps/src/contracts/cache.d.ts +20 -0
  54. package/types/apps/src/contracts/context.d.ts +60 -17
  55. package/types/apps/src/contracts/elicitation.d.ts +23 -7
  56. package/types/apps/src/contracts/events.d.ts +94 -0
  57. package/types/apps/src/contracts/failure.d.ts +30 -1
  58. package/types/apps/src/contracts/graphql.d.ts +2 -1
  59. package/types/apps/src/contracts/host.d.ts +1446 -17
  60. package/types/apps/src/contracts/icons.d.ts +28 -0
  61. package/types/apps/src/contracts/live.d.ts +2 -0
  62. package/types/apps/src/contracts/mcp.d.ts +81 -20
  63. package/types/apps/src/contracts/network.d.ts +120 -0
  64. package/types/apps/src/contracts/openapi-compile.d.ts +82 -3
  65. package/types/apps/src/contracts/openapi.d.ts +41 -9
  66. package/types/apps/src/contracts/operations.d.ts +14 -7
  67. package/types/apps/src/contracts/placement.d.ts +102 -0
  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/11.d.ts +1149 -0
  72. package/types/apps/src/contracts/protocols/12.d.ts +3310 -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 +6669 -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/schedules.d.ts +7 -1
  87. package/types/apps/src/contracts/schema.d.ts +21 -0
  88. package/types/apps/src/contracts/skills.d.ts +50 -13
  89. package/types/apps/src/contracts/sql.d.ts +63 -0
  90. package/types/apps/src/contracts/ui.d.ts +44 -14
  91. package/types/apps/src/contracts/webhooks.d.ts +24 -7
  92. package/types/apps/src/contracts/workflows.d.ts +19 -17
  93. package/types/apps/src/facet.d.ts +4 -5
  94. package/types/apps/src/host.d.ts +5 -0
  95. package/types/apps/src/implementation/account-router.d.ts +4 -3
  96. package/types/apps/src/implementation/app.d.ts +41 -14
  97. package/types/apps/src/implementation/authoring.d.ts +25 -5
  98. package/types/apps/src/implementation/browser-scripts.gen.d.ts +6 -0
  99. package/types/apps/src/implementation/cache.d.ts +29 -2
  100. package/types/apps/src/implementation/catalog-cache.d.ts +35 -4
  101. package/types/apps/src/implementation/elicitation.d.ts +18 -15
  102. package/types/apps/src/implementation/events.d.ts +64 -0
  103. package/types/apps/src/implementation/failure-detail.d.ts +28 -5
  104. package/types/apps/src/implementation/graphql-catalog.d.ts +3 -3
  105. package/types/apps/src/implementation/graphql.d.ts +4 -3
  106. package/types/apps/src/implementation/input-problems.d.ts +6 -2
  107. package/types/apps/src/implementation/invocation-timing.d.ts +18 -0
  108. package/types/apps/src/implementation/live.d.ts +2 -2
  109. package/types/apps/src/implementation/mcp-call.d.ts +6 -5
  110. package/types/apps/src/implementation/mcp-catalog.d.ts +6 -4
  111. package/types/apps/src/implementation/mcp-client.d.ts +17 -9
  112. package/types/apps/src/implementation/mcp-tools.d.ts +2 -1
  113. package/types/apps/src/implementation/mcp.d.ts +20 -9
  114. package/types/apps/src/implementation/network.d.ts +16 -0
  115. package/types/apps/src/implementation/openapi-compile.d.ts +28 -7
  116. package/types/apps/src/implementation/openapi-document.d.ts +46 -19
  117. package/types/apps/src/implementation/openapi-names.d.ts +9 -4
  118. package/types/apps/src/implementation/openapi-request.d.ts +10 -2
  119. package/types/apps/src/implementation/openapi-source.d.ts +23 -1
  120. package/types/apps/src/implementation/openapi-upgrade.d.ts +4 -0
  121. package/types/apps/src/implementation/operations.d.ts +57 -7
  122. package/types/apps/src/implementation/optimistic.d.ts +1 -1
  123. package/types/apps/src/implementation/placement.d.ts +60 -0
  124. package/types/apps/src/implementation/protocol-operations.d.ts +3 -0
  125. package/types/apps/src/implementation/provider-error.d.ts +28 -1
  126. package/types/apps/src/implementation/provider.d.ts +19 -4
  127. package/types/apps/src/implementation/query-commit.d.ts +1 -1
  128. package/types/apps/src/implementation/router-catalog.d.ts +20 -18
  129. package/types/apps/src/implementation/router.d.ts +24 -5
  130. package/types/apps/src/implementation/runtime-yield.d.ts +7 -0
  131. package/types/apps/src/implementation/schedules.d.ts +39 -8
  132. package/types/apps/src/implementation/schema.d.ts +98 -11
  133. package/types/apps/src/implementation/skills.d.ts +18 -24
  134. package/types/apps/src/implementation/sql.d.ts +71 -0
  135. package/types/apps/src/implementation/ui-account-notice.d.ts +9 -0
  136. package/types/apps/src/implementation/ui-auth.d.ts +1 -1
  137. package/types/apps/src/implementation/ui-client.d.ts +2 -2
  138. package/types/apps/src/implementation/ui-document.d.ts +5 -0
  139. package/types/apps/src/implementation/ui-errors.d.ts +1 -1
  140. package/types/apps/src/implementation/ui-serving.d.ts +26 -9
  141. package/types/apps/src/implementation/ui-watch.d.ts +1 -1
  142. package/types/apps/src/implementation/upstream-error.d.ts +7 -0
  143. package/types/apps/src/implementation/webhooks.d.ts +15 -6
  144. package/types/apps/src/implementation/workflow-context.d.ts +6 -2
  145. package/types/apps/src/implementation/workflows.d.ts +11 -4
  146. package/types/apps/src/index.d.ts +68 -19
  147. package/types/apps/src/mcp.d.ts +20 -1
  148. package/types/apps/src/openapi.d.ts +6 -1
  149. package/types/apps/src/react.d.ts +1 -1
  150. package/types/apps/src/skills.d.ts +10 -8
  151. package/types/apps/src/ui-serving.d.ts +1 -1
  152. package/types/telemetry/src/app-records.d.ts +42 -0
  153. package/types/telemetry/src/browser-operations.d.ts +2 -2
  154. package/types/telemetry/src/browser.d.ts +8 -3
  155. package/types/telemetry/src/config.d.ts +2 -2
  156. package/types/telemetry/src/index.d.ts +2 -1
  157. package/types/telemetry/src/layer.d.ts +10 -4
  158. package/types/telemetry/src/measurements.d.ts +1 -1
  159. package/types/telemetry/src/ownership.d.ts +60 -0
  160. package/types/telemetry/src/recorded-failure.d.ts +29 -0
  161. package/types/telemetry/src/relay.d.ts +16 -6
  162. package/types/telemetry/src/span-attributes.d.ts +17 -1
  163. package/types/telemetry/src/transport.d.ts +8 -1
  164. package/types/utils/src/api-error.d.ts +55 -0
  165. package/types/utils/src/connection-failure.d.ts +33 -0
  166. package/types/utils/src/recorded-message.d.ts +18 -0
  167. package/types/utils/src/user-facing-error.d.ts +83 -0
  168. package/js/chunk-7EK2JDX4.js +0 -299
  169. package/js/chunk-IKS2C5MQ.js +0 -224
  170. package/js/chunk-MKWZPDR6.js +0 -63
  171. package/js/chunk-N7YDVXYJ.js +0 -186
  172. package/js/chunk-NKLWZJLE.js +0 -172
  173. package/js/chunk-PJJ24GU7.js +0 -877
  174. package/js/chunk-PZB6T6KU.js +0 -19
  175. package/js/chunk-R3EV5FTO.js +0 -97
  176. package/js/chunk-SJFZCGXG.js +0 -1243
  177. package/js/chunk-WLE7WX2U.js +0 -2645
  178. package/js/chunk-YXQHV65J.js +0 -242
  179. package/js/chunk-ZQINWV4W.js +0 -630
  180. package/js/mcp/stdio.js +0 -128
  181. package/types/app-data/src/implementation/cursor.d.ts +0 -10
  182. package/types/app-data/src/implementation/index-key.d.ts +0 -7
  183. package/types/app-data/src/implementation/promise.d.ts +0 -68
  184. package/types/app-data/src/implementation/range.d.ts +0 -8
  185. package/types/app-data/src/implementation/schema.d.ts +0 -18
  186. package/types/app-data/src/implementation/sqlite.d.ts +0 -11
  187. package/types/app-data/src/index.d.ts +0 -4
  188. package/types/apps/src/contracts/storage.d.ts +0 -68
  189. package/types/apps/src/implementation/mcp-stdio.d.ts +0 -4
  190. package/types/apps/src/implementation/storage.d.ts +0 -15
  191. package/types/apps/src/mcp-stdio.d.ts +0 -5
@@ -1,224 +0,0 @@
1
- import {
2
- adaptMcpTools,
3
- mcpClient,
4
- mcpJsonSchemaValidator
5
- } from "./chunk-7EK2JDX4.js";
6
- import {
7
- accountProviderError,
8
- httpProviderError
9
- } from "./chunk-MKWZPDR6.js";
10
- import {
11
- McpError,
12
- McpToolsOptions,
13
- defaultMcpClientLimits
14
- } from "./chunk-WLE7WX2U.js";
15
- import {
16
- ProviderError
17
- } from "./chunk-R3EV5FTO.js";
18
- import {
19
- captureTelemetry
20
- } from "./chunk-ODEIDRGW.js";
21
- import {
22
- FetchHttpClient_exports
23
- } from "./chunk-57RKNWL2.js";
24
- import {
25
- HttpClientRequest_exports,
26
- HttpClient_exports
27
- } from "./chunk-UK573G7W.js";
28
- import {
29
- Deferred_exports,
30
- Effect_exports,
31
- Redacted_exports,
32
- Schema_exports,
33
- Stream_exports
34
- } from "./chunk-CDL5PM2Q.js";
35
-
36
- // src/implementation/mcp.ts
37
- import { UnauthorizedError } from "@modelcontextprotocol/sdk/client/auth.js";
38
- import { Client } from "@modelcontextprotocol/sdk/client/index.js";
39
- import {
40
- ErrorCode,
41
- McpError as ProtocolError,
42
- ToolListChangedNotificationSchema
43
- } from "@modelcontextprotocol/sdk/types.js";
44
- import { SSEClientTransport, SseError } from "@modelcontextprotocol/sdk/client/sse.js";
45
- import {
46
- StreamableHTTPClientTransport,
47
- StreamableHTTPError
48
- } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
49
- var failure = (phase, error) => {
50
- if (Schema_exports.is(ProviderError)(error) || Schema_exports.is(McpError)(error)) return error;
51
- const status = error instanceof UnauthorizedError ? 401 : error instanceof StreamableHTTPError || error instanceof SseError ? error.code : void 0;
52
- const provider = status === void 0 ? void 0 : httpProviderError(status);
53
- if (provider !== void 0) return provider;
54
- return new McpError({
55
- phase,
56
- reason: error instanceof ProtocolError && error.code === ErrorCode.RequestTimeout ? "timeout" : "request",
57
- ...status === void 0 ? {} : { status }
58
- });
59
- };
60
- var transportFetch = (connection, telemetry, rejected) => (url, init) => Effect_exports.runPromiseWith(telemetry.context)(
61
- Effect_exports.gen(function* () {
62
- const target = yield* Effect_exports.try({
63
- try: () => new URL(url),
64
- catch: () => new McpError({ phase: "transport", reason: "invalid_response" })
65
- });
66
- if (connection.url.username || connection.url.password)
67
- return yield* new McpError({ phase: "transport", reason: "invalid_input" });
68
- if (target.origin !== connection.url.origin || target.username || target.password)
69
- return yield* new McpError({ phase: "transport", reason: "invalid_response" });
70
- const headers = new Headers(Redacted_exports.value(connection.headers));
71
- new Headers(init?.headers).forEach((value, name) => headers.set(name, value));
72
- const request = yield* Effect_exports.try({
73
- try: () => HttpClientRequest_exports.fromWeb(new Request(target, { ...init, headers })),
74
- catch: () => failure("transport", void 0)
75
- });
76
- const client = yield* HttpClient_exports.HttpClient;
77
- const response = yield* client.execute(request);
78
- const provider = httpProviderError(response.status, response.headers);
79
- if (provider !== void 0) {
80
- yield* Deferred_exports.fail(rejected, provider);
81
- return yield* provider;
82
- }
83
- return new Response(
84
- [204, 205, 304].includes(response.status) ? null : Stream_exports.toReadableStream(response.stream),
85
- {
86
- status: response.status,
87
- headers: response.headers
88
- }
89
- );
90
- }).pipe(
91
- Effect_exports.provide(FetchHttpClient_exports.layer),
92
- Effect_exports.provideService(FetchHttpClient_exports.RequestInit, { redirect: "manual" }),
93
- Effect_exports.provideService(
94
- FetchHttpClient_exports.Fetch,
95
- (url2, options) => globalThis.fetch(url2, {
96
- ...options,
97
- signal: AbortSignal.any([
98
- ...options?.signal ? [options.signal] : [],
99
- ...init?.signal ? [init.signal] : []
100
- ])
101
- })
102
- ),
103
- Effect_exports.mapError((error) => failure("transport", error))
104
- ),
105
- init?.signal ? { signal: init.signal } : {}
106
- );
107
- function withClient(connection, mode, use, changed) {
108
- const attempt = (kind) => Effect_exports.scoped(
109
- Effect_exports.gen(function* () {
110
- const telemetry = yield* captureTelemetry;
111
- const rejected = yield* Deferred_exports.make();
112
- const pending = /* @__PURE__ */ new Set();
113
- const { client, transport } = yield* Effect_exports.acquireRelease(
114
- Effect_exports.sync(() => {
115
- const fetch = transportFetch(connection, telemetry, rejected);
116
- const client2 = new Client(
117
- { name: "executor-apps", version: "0.1.0" },
118
- {
119
- jsonSchemaValidator: mcpJsonSchemaValidator,
120
- capabilities: mode === "call" ? { elicitation: { form: {} } } : {}
121
- }
122
- );
123
- if (changed !== void 0) {
124
- client2.setNotificationHandler(ToolListChangedNotificationSchema, () => {
125
- const task = Effect_exports.runPromiseWith(telemetry.context)(
126
- changed.pipe(
127
- Effect_exports.timeout("5 seconds"),
128
- Effect_exports.catchCause(() => Effect_exports.logWarning("MCP catalog invalidation failed"))
129
- )
130
- );
131
- pending.add(task);
132
- return task.finally(() => pending.delete(task));
133
- });
134
- }
135
- return {
136
- client: client2,
137
- transport: kind === "http" ? new StreamableHTTPClientTransport(connection.url, {
138
- fetch,
139
- reconnectionOptions: {
140
- maxRetries: 0,
141
- initialReconnectionDelay: 1e3,
142
- maxReconnectionDelay: 1e3,
143
- reconnectionDelayGrowFactor: 1
144
- }
145
- }) : new SSEClientTransport(connection.url, { fetch })
146
- };
147
- }),
148
- ({ client: client2, transport: transport2 }) => Effect_exports.gen(function* () {
149
- client2.removeNotificationHandler("notifications/tools/list_changed");
150
- yield* Effect_exports.promise(async () => {
151
- await Promise.allSettled(pending);
152
- });
153
- if (transport2 instanceof StreamableHTTPClientTransport && transport2.sessionId !== void 0) {
154
- yield* Effect_exports.tryPromise(() => transport2.terminateSession()).pipe(
155
- Effect_exports.timeout(defaultMcpClientLimits.cleanupTimeoutMs),
156
- Effect_exports.ignore
157
- );
158
- }
159
- yield* Effect_exports.tryPromise(() => client2.close()).pipe(
160
- Effect_exports.timeout(defaultMcpClientLimits.cleanupTimeoutMs),
161
- Effect_exports.ignore
162
- );
163
- }).pipe(Effect_exports.withSpan("provider.mcp.close"))
164
- );
165
- const wire = transport;
166
- yield* Effect_exports.tryPromise({
167
- try: (signal) => client.connect(wire, { signal, timeout: connection.timeoutMs }),
168
- catch: (error) => failure("connect", error)
169
- }).pipe(
170
- Effect_exports.raceFirst(Deferred_exports.await(rejected)),
171
- Effect_exports.timeout(connection.timeoutMs),
172
- Effect_exports.withSpan("provider.mcp.connect")
173
- );
174
- return yield* use(client).pipe(Effect_exports.raceFirst(Deferred_exports.await(rejected)));
175
- })
176
- ).pipe(
177
- Effect_exports.withSpan("provider.mcp.session", {
178
- attributes: {
179
- "mcp.transport": kind,
180
- "mcp.operation": mode,
181
- "server.address": connection.url.hostname
182
- }
183
- })
184
- );
185
- return attempt("http").pipe(
186
- // Fallback is only for negotiation. Tool calls are never automatically replayed.
187
- Effect_exports.catch(
188
- (error) => Schema_exports.is(McpError)(error) && error.phase === "connect" && (error.status === 404 || error.status === 405) ? attempt("sse") : Effect_exports.fail(error)
189
- ),
190
- (operation) => mode === "discover" ? operation.pipe(Effect_exports.timeout(connection.timeoutMs)) : operation,
191
- Effect_exports.catchTag(
192
- "TimeoutError",
193
- () => Effect_exports.fail(new McpError({ phase: "transport", reason: "timeout" }))
194
- )
195
- );
196
- }
197
- var mcpClientEffect = (input, changed) => Effect_exports.gen(function* () {
198
- const options = yield* Schema_exports.decodeUnknownEffect(McpToolsOptions)(input).pipe(
199
- Effect_exports.mapError(() => new McpError({ phase: "connect", reason: "invalid_input" }))
200
- );
201
- const url = new URL(options.url);
202
- if (url.username || url.password || url.hash)
203
- return yield* new McpError({ phase: "connect", reason: "invalid_input" });
204
- const connection = {
205
- url,
206
- headers: Redacted_exports.make({ ...options.headers }),
207
- timeoutMs: options.timeoutMs ?? defaultMcpClientLimits.timeoutMs
208
- };
209
- return mcpClient(
210
- (mode, use) => withClient(connection, mode, use, changed).pipe(
211
- Effect_exports.mapError(
212
- (error) => options.accountId === void 0 ? error : accountProviderError(error, options.accountId)
213
- )
214
- ),
215
- connection.timeoutMs,
216
- failure
217
- );
218
- });
219
- var mcpToolsEffect = (input) => mcpClientEffect(input).pipe(Effect_exports.flatMap(adaptMcpTools));
220
-
221
- export {
222
- mcpClientEffect,
223
- mcpToolsEffect
224
- };
@@ -1,63 +0,0 @@
1
- import {
2
- ProviderError
3
- } from "./chunk-R3EV5FTO.js";
4
- import {
5
- AccountId
6
- } from "./chunk-27F7W2LG.js";
7
- import {
8
- Option_exports,
9
- Schema_exports
10
- } from "./chunk-CDL5PM2Q.js";
11
-
12
- // src/implementation/provider-error.ts
13
- function parseProviderError(error) {
14
- return Schema_exports.decodeUnknownOption(ProviderError)(error).pipe(
15
- Option_exports.map(({ reason, status, accountId }) => new ProviderError({ reason, status, accountId }))
16
- );
17
- }
18
- function httpProviderError(status, headers = {}) {
19
- if (status >= 500 && status <= 599) return new ProviderError({ reason: "unavailable", status });
20
- if (status === 401) return new ProviderError({ reason: "unauthorized", status });
21
- if (status === 429) return new ProviderError({ reason: "rate_limited", status });
22
- if (status !== 403) return void 0;
23
- const retry = headers["retry-after"];
24
- if (headers["x-ratelimit-remaining"] === "0" || retry !== void 0 && (/^\d+$/.test(retry) || Number.isFinite(Date.parse(retry))))
25
- return new ProviderError({ reason: "rate_limited", status });
26
- if (/\bBearer\b.*\berror="insufficient_scope"/i.test(headers["www-authenticate"] ?? ""))
27
- return new ProviderError({ reason: "forbidden", status });
28
- return new ProviderError({ reason: "rejected", status });
29
- }
30
- function accountProviderError(error, accountId) {
31
- const parsed = parseProviderError(error);
32
- const account = Schema_exports.decodeUnknownOption(AccountId)(accountId);
33
- if (Option_exports.isNone(parsed) || Option_exports.isNone(account)) return error;
34
- return new ProviderError({
35
- reason: parsed.value.reason,
36
- status: parsed.value.status,
37
- accountId: account.value
38
- });
39
- }
40
- function graphqlProviderError(errors, status) {
41
- const codes = errors.flatMap((error) => {
42
- const parsed = Schema_exports.decodeUnknownOption(
43
- Schema_exports.Struct({
44
- type: Schema_exports.optional(Schema_exports.String),
45
- extensions: Schema_exports.optional(Schema_exports.Struct({ code: Schema_exports.optional(Schema_exports.String) }))
46
- })
47
- )(error);
48
- return Option_exports.isSome(parsed) ? [parsed.value.type, parsed.value.extensions?.code] : [];
49
- });
50
- if (codes.includes("RATE_LIMITED") || codes.includes("TOO_MANY_REQUESTS"))
51
- return new ProviderError({ reason: "rate_limited", status });
52
- if (codes.includes("UNAUTHENTICATED"))
53
- return new ProviderError({ reason: "unauthorized", status });
54
- if (codes.includes("FORBIDDEN")) return new ProviderError({ reason: "forbidden", status });
55
- return void 0;
56
- }
57
-
58
- export {
59
- parseProviderError,
60
- httpProviderError,
61
- accountProviderError,
62
- graphqlProviderError
63
- };
@@ -1,186 +0,0 @@
1
- import {
2
- Schema_exports
3
- } from "./chunk-CDL5PM2Q.js";
4
-
5
- // ../app-data/src/contracts/database.ts
6
- var DataName = Schema_exports.String.check(
7
- Schema_exports.makeFilter((value) => /^[A-Za-z][A-Za-z0-9_]*$/.test(value) && value.length <= 128)
8
- );
9
- var Scalar = Schema_exports.Union([Schema_exports.String, Schema_exports.Finite, Schema_exports.Boolean]);
10
- var Field = Schema_exports.Struct({
11
- kind: Schema_exports.Literals(["string", "number", "boolean", "id", "userId"]),
12
- optional: Schema_exports.optional(Schema_exports.Boolean),
13
- default: Schema_exports.optional(Scalar),
14
- references: Schema_exports.optional(DataName)
15
- });
16
- var Index = Schema_exports.Struct({ name: DataName, fields: Schema_exports.NonEmptyArray(DataName) });
17
- var Table = Schema_exports.Struct({
18
- fields: Schema_exports.Record(DataName, Field),
19
- indexes: Schema_exports.Array(Index)
20
- });
21
- var DatabaseSchema = Schema_exports.Record(DataName, Table);
22
- var Row = Schema_exports.Record(Schema_exports.String, Scalar);
23
- var RowMetadata = Schema_exports.Struct({
24
- id: Schema_exports.NonEmptyString,
25
- createdAt: Schema_exports.String,
26
- updatedAt: Schema_exports.String
27
- });
28
- var Patch = Schema_exports.Record(DataName, Schema_exports.NullOr(Scalar));
29
- var RangeClause = Schema_exports.Struct({
30
- field: DataName,
31
- op: Schema_exports.Literals(["eq", "gt", "gte", "lt", "lte"]),
32
- value: Schema_exports.NullOr(Scalar)
33
- });
34
- var QueryPlan = Schema_exports.Struct({
35
- table: DataName,
36
- index: DataName,
37
- order: Schema_exports.Literals(["asc", "desc"]),
38
- clauses: Schema_exports.Array(RangeClause)
39
- });
40
- var QueryTerminal = Schema_exports.Union([
41
- Schema_exports.Struct({ kind: Schema_exports.Literal("collect") }),
42
- Schema_exports.Struct({ kind: Schema_exports.Literal("count") }),
43
- Schema_exports.Struct({ kind: Schema_exports.Literal("first") }),
44
- Schema_exports.Struct({
45
- kind: Schema_exports.Literal("take"),
46
- count: Schema_exports.Int.check(Schema_exports.isGreaterThanOrEqualTo(0))
47
- }),
48
- Schema_exports.Struct({
49
- kind: Schema_exports.Literal("paginate"),
50
- cursor: Schema_exports.NullOr(Schema_exports.String),
51
- numItems: Schema_exports.Int.check(Schema_exports.isGreaterThan(0))
52
- })
53
- ]);
54
- var DatabaseOperation = Schema_exports.Union([
55
- Schema_exports.Struct({ kind: Schema_exports.Literal("get"), table: DataName, id: Schema_exports.NonEmptyString }),
56
- Schema_exports.Struct({ kind: Schema_exports.Literal("insert"), table: DataName, value: Patch }),
57
- Schema_exports.Struct({
58
- kind: Schema_exports.Literal("update"),
59
- table: DataName,
60
- id: Schema_exports.NonEmptyString,
61
- patch: Patch
62
- }),
63
- Schema_exports.Struct({ kind: Schema_exports.Literal("delete"), table: DataName, id: Schema_exports.NonEmptyString }),
64
- Schema_exports.Struct({ kind: Schema_exports.Literal("query"), plan: QueryPlan, terminal: QueryTerminal })
65
- ]);
66
- var PaginationResult = Schema_exports.Struct({
67
- page: Schema_exports.Array(Row),
68
- continueCursor: Schema_exports.NullOr(Schema_exports.String),
69
- isDone: Schema_exports.Boolean
70
- });
71
- var OperationResult = Schema_exports.Union([
72
- Row,
73
- Schema_exports.Array(Row),
74
- PaginationResult,
75
- Schema_exports.Boolean,
76
- Schema_exports.Finite,
77
- Schema_exports.Null
78
- ]);
79
- var AppDatabaseError = class extends Schema_exports.TaggedError()("AppDatabaseError", {
80
- reason: Schema_exports.Literals([
81
- "schema",
82
- "schema_changed",
83
- "table",
84
- "index",
85
- "range",
86
- "value",
87
- "readonly",
88
- "cursor",
89
- "limit",
90
- "closed",
91
- "storage",
92
- "replay"
93
- ])
94
- }) {
95
- };
96
- var DatabaseLimits = Schema_exports.Struct({
97
- rowsRead: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
98
- rowsReturned: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
99
- bytesRead: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
100
- writes: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
101
- scanCalls: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
102
- directGets: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
103
- valueBytes: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
104
- indexBytes: Schema_exports.Int.check(Schema_exports.isGreaterThan(0))
105
- });
106
- var defaultDatabaseLimits = {
107
- rowsRead: 5e3,
108
- rowsReturned: 1e3,
109
- bytesRead: 4 * 1024 * 1024,
110
- writes: 1e3,
111
- scanCalls: 100,
112
- directGets: 1e3,
113
- valueBytes: 64 * 1024,
114
- indexBytes: 2048
115
- };
116
- var DatabaseLimit = Schema_exports.Literals([
117
- "scanCalls",
118
- "directGets",
119
- "rowsRead",
120
- "rowsReturned",
121
- "pageSize",
122
- "bytesRead",
123
- "writes",
124
- "valueBytes"
125
- ]);
126
- var count = (value) => value.toLocaleString("en-US");
127
- var limitMessages = {
128
- scanCalls: (maximum, requested) => `This invocation made ${count(requested)} index queries; the limit is ${count(maximum)}. Each first(), take(), collect(), count() or paginate() call on withIndex(...) counts once. Read related rows with one take() or paginate() over a shared index prefix instead of one first() per item, use get(id) for known IDs, or split the work across workflow steps.`,
129
- directGets: (maximum, requested) => `This invocation made ${count(requested)} get(id) calls, including those made by update and delete; the limit is ${count(maximum)}. Split the work across workflow steps or mutations.`,
130
- rowsRead: (maximum, requested) => `This invocation scanned ${count(requested)} rows; the limit is ${count(maximum)}. Narrow the index range, or page with paginate() across calls or workflow steps.`,
131
- rowsReturned: (maximum, requested) => `This invocation returned ${count(requested)} rows; the limit is ${count(maximum)}. collect() fails rather than truncating. Page with paginate() across calls or workflow steps.`,
132
- pageSize: (maximum, requested) => `One call asked for ${count(requested)} rows; take(n) and paginate({ numItems }) accept at most ${count(maximum)}. Page with paginate() across calls or workflow steps.`,
133
- bytesRead: (maximum, requested) => `This invocation read ${count(requested)} bytes; the limit is ${count(maximum)}. Read fewer or smaller rows per call, or page with paginate() across calls or workflow steps.`,
134
- writes: (maximum, requested) => `This mutation made ${count(requested)} writes; the limit is ${count(maximum)}. Split large ingests into batches, one batch per mutation or workflow step.`,
135
- valueBytes: (maximum, requested) => `A row encodes to ${count(requested)} bytes; each row may use at most ${count(maximum)}. Store large content outside the row or split it across rows.`
136
- };
137
- var DatabaseLimitExceeded = class extends Schema_exports.TaggedError()(
138
- "DatabaseLimitExceeded",
139
- {
140
- limit: DatabaseLimit,
141
- maximum: Schema_exports.Int,
142
- requested: Schema_exports.Int
143
- }
144
- ) {
145
- get message() {
146
- return limitMessages[this.limit](this.maximum, this.requested);
147
- }
148
- };
149
- var reservedFieldNames = ["id", "createdAt", "updatedAt"];
150
- var DatabaseFieldReserved = class extends Schema_exports.TaggedError()(
151
- "DatabaseFieldReserved",
152
- {
153
- table: Schema_exports.String,
154
- field: Schema_exports.Literals(reservedFieldNames)
155
- }
156
- ) {
157
- get message() {
158
- return `Table "${this.table}" declares "${this.field}", which is reserved: the host adds id, createdAt and updatedAt to every row. Rename the field, or use the row's own ${this.field}.`;
159
- }
160
- };
161
- var DatabaseRuntimeLimits = Schema_exports.Struct({
162
- maxCursorChars: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
163
- connectionCacheCapacity: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
164
- connectionCacheTtlMs: Schema_exports.Int.check(Schema_exports.isGreaterThan(0))
165
- });
166
- var defaultDatabaseRuntimeLimits = DatabaseRuntimeLimits.make({
167
- maxCursorChars: 8192,
168
- connectionCacheCapacity: 64,
169
- connectionCacheTtlMs: 5 * 60 * 1e3
170
- });
171
-
172
- export {
173
- DatabaseSchema,
174
- Row,
175
- RowMetadata,
176
- RangeClause,
177
- DatabaseOperation,
178
- PaginationResult,
179
- AppDatabaseError,
180
- DatabaseLimits,
181
- defaultDatabaseLimits,
182
- DatabaseLimitExceeded,
183
- reservedFieldNames,
184
- DatabaseFieldReserved,
185
- defaultDatabaseRuntimeLimits
186
- };
@@ -1,172 +0,0 @@
1
- import {
2
- CacheAcquired,
3
- CacheEntry,
4
- CacheError,
5
- cacheLimits
6
- } from "./chunk-R3EV5FTO.js";
7
- import {
8
- Clock_exports,
9
- Duration_exports,
10
- Effect_exports,
11
- Exit_exports,
12
- Schema_exports
13
- } from "./chunk-CDL5PM2Q.js";
14
-
15
- // ../app-cache/src/index.ts
16
- var canonical = (value) => {
17
- if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
18
- if (value !== null && typeof value === "object")
19
- return `{${Object.entries(value).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([key, item]) => `${JSON.stringify(key)}:${canonical(item)}`).join(",")}}`;
20
- return JSON.stringify(value);
21
- };
22
- var cacheKey = (key) => Effect_exports.gen(function* () {
23
- const parsed = yield* Schema_exports.decodeUnknownEffect(Schema_exports.Json)(key).pipe(
24
- Effect_exports.mapError(() => new CacheError({ reason: "invalid" }))
25
- );
26
- const bytes = new TextEncoder().encode(canonical(parsed));
27
- if (bytes.byteLength > cacheLimits.keyBytes)
28
- return yield* new CacheError({ reason: "capacity" });
29
- const hash = yield* Effect_exports.tryPromise({
30
- try: () => crypto.subtle.digest("SHA-256", bytes),
31
- catch: () => new CacheError({ reason: "invalid" })
32
- });
33
- return [...new Uint8Array(hash)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
34
- });
35
- var makeCache = (host, background, scope = "shared", deadline) => {
36
- const transport = (command) => host(command).pipe(
37
- Effect_exports.withSpan("app.cache.command", {
38
- attributes: { "cache.operation": command.operation }
39
- })
40
- );
41
- const keyOf = (key) => cacheKey([scope, key]);
42
- const readKeys = (keys) => transport({ operation: "read", keys }).pipe(
43
- Effect_exports.flatMap(Schema_exports.decodeUnknownEffect(Schema_exports.Array(Schema_exports.NullOr(CacheEntry)))),
44
- Effect_exports.mapError(() => new CacheError({ reason: "storage" }))
45
- );
46
- const durations = (freshFor, staleFor = 0) => Effect_exports.try({
47
- try: () => {
48
- const fresh = Duration_exports.toMillis(Duration_exports.fromInputUnsafe(freshFor));
49
- const stale = Duration_exports.toMillis(Duration_exports.fromInputUnsafe(staleFor));
50
- if (![fresh, stale].every((value) => Number.isFinite(value) && value >= 0) || fresh + stale > cacheLimits.retentionMs)
51
- throw new CacheError({ reason: "invalid" });
52
- return { fresh, stale };
53
- },
54
- catch: () => new CacheError({ reason: "invalid" })
55
- });
56
- const get = (options, refresh) => Effect_exports.gen(function* () {
57
- const key = yield* keyOf(options.key);
58
- const { fresh, stale } = yield* durations(options.freshFor, options.staleFor);
59
- const decode = (value) => Schema_exports.decodeUnknownEffect(options.schema)(value);
60
- const load = (lease) => Effect_exports.gen(function* () {
61
- const value = yield* options.load.pipe(Effect_exports.flatMap(decode));
62
- const json = yield* Schema_exports.decodeUnknownEffect(Schema_exports.Json)(value).pipe(
63
- Effect_exports.mapError(() => new CacheError({ reason: "invalid" }))
64
- );
65
- const now = yield* Clock_exports.currentTimeMillis;
66
- const published = yield* transport({
67
- operation: "publish",
68
- key,
69
- lease,
70
- entry: {
71
- value: json,
72
- version: crypto.randomUUID(),
73
- freshUntil: now + fresh,
74
- staleUntil: now + fresh + stale
75
- }
76
- }).pipe(Effect_exports.withSpan("app.cache.publish"));
77
- if (published !== true) return yield* new CacheError({ reason: "unavailable" });
78
- return value;
79
- }).pipe(
80
- Effect_exports.withSpan("app.cache.load"),
81
- Effect_exports.timeout(cacheLimits.loadTimeoutMs),
82
- // Publishing clears the lease in the same transaction. Only an unpublished load releases it.
83
- Effect_exports.onExit(
84
- (exit) => Exit_exports.isSuccess(exit) ? Effect_exports.void : transport({ operation: "release", key, lease }).pipe(
85
- Effect_exports.catch(() => Effect_exports.void)
86
- )
87
- )
88
- );
89
- const waitUntil = Math.min(
90
- (yield* Clock_exports.currentTimeMillis) + cacheLimits.waitMs,
91
- deadline ?? Number.POSITIVE_INFINITY
92
- );
93
- let initialVersion;
94
- while (true) {
95
- const { entry, lease } = yield* transport({
96
- operation: "acquire",
97
- key,
98
- refresh,
99
- ...initialVersion === void 0 ? {} : { version: initialVersion }
100
- }).pipe(
101
- Effect_exports.flatMap(
102
- (reply) => Schema_exports.decodeUnknownEffect(CacheAcquired)(reply).pipe(
103
- Effect_exports.mapError(() => new CacheError({ reason: "storage" }))
104
- )
105
- )
106
- );
107
- const now = yield* Clock_exports.currentTimeMillis;
108
- if (initialVersion === void 0) initialVersion = entry?.version ?? null;
109
- const refreshed = refresh && entry !== null && entry.version !== initialVersion;
110
- if (entry !== null && (refreshed || !refresh && lease === null && now < entry.freshUntil)) {
111
- yield* Effect_exports.annotateCurrentSpan("cache.result", "fresh");
112
- return yield* decode(entry.value);
113
- }
114
- if (!refresh && entry !== null && now < entry.staleUntil) {
115
- yield* Effect_exports.annotateCurrentSpan("cache.result", "stale");
116
- if (lease !== null) yield* background(load(lease).pipe(Effect_exports.asVoid));
117
- return yield* decode(entry.value);
118
- }
119
- if (lease !== null) {
120
- yield* Effect_exports.annotateCurrentSpan("cache.result", "miss");
121
- return yield* load(lease);
122
- }
123
- if (now >= waitUntil) {
124
- yield* Effect_exports.annotateCurrentSpan("cache.result", "local");
125
- return yield* options.load.pipe(
126
- Effect_exports.flatMap(decode),
127
- Effect_exports.timeout(cacheLimits.loadTimeoutMs),
128
- Effect_exports.withSpan("app.cache.load", { attributes: { "cache.load.leased": false } })
129
- );
130
- }
131
- yield* Effect_exports.sleep("100 millis");
132
- }
133
- }).pipe(Effect_exports.withSpan("app.cache.get"));
134
- return {
135
- /** Read arbitrary retained JSON entries without initiating a refresh. Missing and null are distinct. */
136
- read: (keys) => Effect_exports.forEach(keys, keyOf).pipe(Effect_exports.flatMap(readKeys)),
137
- /** Publish bounded immutable parts before publishing the manifest that references them. */
138
- write: (entries, retention) => Effect_exports.gen(function* () {
139
- const { fresh } = yield* durations(retention);
140
- const now = yield* Clock_exports.currentTimeMillis;
141
- const values = yield* Effect_exports.forEach(
142
- entries,
143
- ({ key, value }) => Effect_exports.gen(function* () {
144
- return {
145
- key: yield* keyOf(key),
146
- entry: {
147
- value,
148
- version: crypto.randomUUID(),
149
- freshUntil: now + fresh,
150
- staleUntil: now + fresh
151
- }
152
- };
153
- })
154
- );
155
- yield* transport({ operation: "write", entries: values });
156
- }),
157
- /** Revoke retained data and any loader's right to publish its in-flight result. */
158
- invalidate: (key) => keyOf(key).pipe(
159
- Effect_exports.flatMap((key2) => transport({ operation: "invalidate", key: key2 })),
160
- Effect_exports.asVoid
161
- ),
162
- /** Read fresh data, refresh stale data in the background, or wait for the lease owner. */
163
- get: (options) => get(options, false),
164
- /** Force one awaited refresh without removing the retained value. Concurrent refreshes share a load. */
165
- revalidate: (options) => get(options, true)
166
- };
167
- };
168
-
169
- export {
170
- cacheKey,
171
- makeCache
172
- };