apps 0.0.1-beta.5 → 0.0.1-beta.55

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 (188) hide show
  1. package/README.md +68 -44
  2. package/framework-reference.json +1 -1
  3. package/js/chunk-47F7VXST.js +221 -0
  4. package/js/chunk-5FHWNLCI.js +88 -0
  5. package/js/{chunk-M3B3DE4K.js → chunk-74YVXBKY.js} +463 -218
  6. package/js/chunk-7UUHJR2Q.js +49 -0
  7. package/js/{chunk-CYYBFC2K.js → chunk-AQU56EPI.js} +9 -5
  8. package/js/chunk-BTSIG4NQ.js +1885 -0
  9. package/js/chunk-CDXQDN7W.js +92 -0
  10. package/js/{chunk-UK573G7W.js → chunk-EOPQ727L.js} +87 -51
  11. package/js/{chunk-27F7W2LG.js → chunk-H2CJWXA3.js} +2 -2
  12. package/js/{chunk-JU7VHODU.js → chunk-H72MEDMN.js} +65 -10
  13. package/js/{chunk-CDL5PM2Q.js → chunk-IFJU5SYQ.js} +19082 -18402
  14. package/js/{chunk-UDDE5KOR.js → chunk-JK5S2N2S.js} +148 -34
  15. package/js/{chunk-RJDDBDSN.js → chunk-JM7LOD2W.js} +628 -85
  16. package/js/{chunk-VFZKSM3T.js → chunk-JPEUKEV4.js} +3 -3
  17. package/js/{chunk-FWQC6I3C.js → chunk-KGCTYL2S.js} +523 -63
  18. package/js/{chunk-KUMBKVJD.js → chunk-KLYSEHUD.js} +2 -2
  19. package/js/chunk-L4K2K22P.js +42 -0
  20. package/js/chunk-LTDHQJ2Z.js +171 -0
  21. package/js/chunk-MWKHKOTL.js +240 -0
  22. package/js/chunk-OD3KFKZD.js +1617 -0
  23. package/js/{chunk-57RKNWL2.js → chunk-PD6I2SDG.js} +4 -4
  24. package/js/chunk-PXXZ6ABC.js +266 -0
  25. package/js/chunk-QEBRH5AP.js +729 -0
  26. package/js/chunk-TLWLJ7PD.js +4342 -0
  27. package/js/{chunk-IJX4CYZO.js → chunk-TUMGL2OC.js} +228 -264
  28. package/js/{chunk-XHO2ZX6W.js → chunk-UM62MBJQ.js} +96 -41
  29. package/js/{chunk-IPI4MFSN.js → chunk-XBG7HHXC.js} +2 -2
  30. package/js/chunk-XCSG7FT7.js +340 -0
  31. package/js/client.js +142 -94
  32. package/js/contracts.js +123 -33
  33. package/js/effect.js +19 -21
  34. package/js/{es-APDZKREY.js → es-DIULA3ZF.js} +62 -1659
  35. package/js/graphql.js +63 -60
  36. package/js/host.js +83 -60
  37. package/js/index.js +262 -222
  38. package/js/mcp/effect.js +23 -23
  39. package/js/mcp/stdio.js +48 -40
  40. package/js/mcp.js +109 -72
  41. package/js/openapi.js +4129 -1419
  42. package/js/react.js +2 -3
  43. package/js/skills/effect.js +6 -3
  44. package/js/skills.js +208 -82
  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 +9 -8
  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 +57 -18
  62. package/types/apps/src/contracts/live.d.ts +2 -0
  63. package/types/apps/src/contracts/mcp.d.ts +96 -10
  64. package/types/apps/src/contracts/network.d.ts +84 -0
  65. package/types/apps/src/contracts/openapi-compile.d.ts +32 -3
  66. package/types/apps/src/contracts/openapi.d.ts +45 -9
  67. package/types/apps/src/contracts/operations.d.ts +8 -9
  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 +1306 -0
  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/router.d.ts +59 -0
  85. package/types/apps/src/contracts/skills.d.ts +50 -13
  86. package/types/apps/src/contracts/sql.d.ts +58 -0
  87. package/types/apps/src/contracts/ui.d.ts +19 -1
  88. package/types/apps/src/contracts/workflows.d.ts +6 -0
  89. package/types/apps/src/facet.d.ts +4 -5
  90. package/types/apps/src/graphql.d.ts +1 -3
  91. package/types/apps/src/host.d.ts +5 -0
  92. package/types/apps/src/implementation/account-router.d.ts +13 -0
  93. package/types/apps/src/implementation/app.d.ts +5 -4
  94. package/types/apps/src/implementation/authoring.d.ts +25 -5
  95. package/types/apps/src/implementation/browser-scripts.gen.d.ts +6 -0
  96. package/types/apps/src/implementation/cache.d.ts +4 -0
  97. package/types/apps/src/implementation/catalog-cache.d.ts +43 -5
  98. package/types/apps/src/implementation/elicitation.d.ts +18 -15
  99. package/types/apps/src/implementation/events.d.ts +59 -0
  100. package/types/apps/src/implementation/failure-detail.d.ts +25 -3
  101. package/types/apps/src/implementation/graphql-catalog.d.ts +4 -7
  102. package/types/apps/src/implementation/graphql.d.ts +4 -3
  103. package/types/apps/src/implementation/input-problems.d.ts +6 -2
  104. package/types/apps/src/implementation/invocation-timing.d.ts +16 -0
  105. package/types/apps/src/implementation/live.d.ts +2 -2
  106. package/types/apps/src/implementation/mcp-call.d.ts +6 -5
  107. package/types/apps/src/implementation/mcp-catalog.d.ts +7 -8
  108. package/types/apps/src/implementation/mcp-client.d.ts +49 -25
  109. package/types/apps/src/implementation/mcp-stdio.d.ts +1 -1
  110. package/types/apps/src/implementation/mcp-tools.d.ts +2 -1
  111. package/types/apps/src/implementation/mcp.d.ts +52 -25
  112. package/types/apps/src/implementation/network.d.ts +16 -0
  113. package/types/apps/src/implementation/openapi-compile.d.ts +27 -6
  114. package/types/apps/src/implementation/openapi-document.d.ts +46 -19
  115. package/types/apps/src/implementation/openapi-names.d.ts +9 -4
  116. package/types/apps/src/implementation/openapi-request.d.ts +10 -2
  117. package/types/apps/src/implementation/openapi-source.d.ts +8 -6
  118. package/types/apps/src/implementation/openapi-upgrade.d.ts +4 -0
  119. package/types/apps/src/implementation/operations.d.ts +43 -5
  120. package/types/apps/src/implementation/optimistic.d.ts +1 -1
  121. package/types/apps/src/implementation/protocol-operations.d.ts +6 -4
  122. package/types/apps/src/implementation/provider-error.d.ts +28 -1
  123. package/types/apps/src/implementation/provider.d.ts +19 -5
  124. package/types/apps/src/implementation/query-commit.d.ts +1 -1
  125. package/types/apps/src/implementation/router-catalog.d.ts +223 -0
  126. package/types/apps/src/implementation/router.d.ts +70 -0
  127. package/types/apps/src/implementation/runtime-yield.d.ts +7 -0
  128. package/types/apps/src/implementation/schema.d.ts +95 -11
  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 +11 -5
  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/workflow-context.d.ts +1 -1
  141. package/types/apps/src/implementation/workflows.d.ts +1 -1
  142. package/types/apps/src/index.d.ts +32 -13
  143. package/types/apps/src/mcp-stdio.d.ts +2 -5
  144. package/types/apps/src/mcp.d.ts +25 -5
  145. package/types/apps/src/openapi.d.ts +6 -6
  146. package/types/apps/src/react.d.ts +1 -1
  147. package/types/apps/src/skills.d.ts +10 -8
  148. package/types/telemetry/src/app-records.d.ts +42 -0
  149. package/types/telemetry/src/browser-operations.d.ts +7 -4
  150. package/types/telemetry/src/browser.d.ts +8 -3
  151. package/types/telemetry/src/config.d.ts +2 -2
  152. package/types/telemetry/src/index.d.ts +1 -0
  153. package/types/telemetry/src/layer.d.ts +2 -2
  154. package/types/telemetry/src/ownership.d.ts +56 -0
  155. package/types/telemetry/src/recorded-failure.d.ts +29 -0
  156. package/types/telemetry/src/relay.d.ts +2 -2
  157. package/types/telemetry/src/transport.d.ts +8 -1
  158. package/types/utils/src/api-error.d.ts +55 -0
  159. package/types/utils/src/connection-failure.d.ts +33 -0
  160. package/types/utils/src/recorded-message.d.ts +18 -0
  161. package/types/utils/src/user-facing-error.d.ts +83 -0
  162. package/js/chunk-3XKZDQLM.js +0 -93
  163. package/js/chunk-4M277YTM.js +0 -136
  164. package/js/chunk-67EVWIGJ.js +0 -224
  165. package/js/chunk-C3VAOK5B.js +0 -215
  166. package/js/chunk-DQAZTA4I.js +0 -2375
  167. package/js/chunk-G7T27IWB.js +0 -63
  168. package/js/chunk-LUVSFETN.js +0 -1347
  169. package/js/chunk-N7YDVXYJ.js +0 -186
  170. package/js/chunk-PJJ24GU7.js +0 -877
  171. package/js/chunk-PZB6T6KU.js +0 -19
  172. package/js/chunk-SB3V4YVR.js +0 -18
  173. package/js/chunk-TDNYXSIX.js +0 -29
  174. package/js/chunk-W4DMKWAB.js +0 -35
  175. package/js/chunk-YEPYT6SD.js +0 -85
  176. package/js/chunk-ZQINWV4W.js +0 -630
  177. package/types/app-data/src/implementation/cursor.d.ts +0 -10
  178. package/types/app-data/src/implementation/index-key.d.ts +0 -7
  179. package/types/app-data/src/implementation/promise.d.ts +0 -68
  180. package/types/app-data/src/implementation/range.d.ts +0 -8
  181. package/types/app-data/src/implementation/schema.d.ts +0 -18
  182. package/types/app-data/src/implementation/sqlite.d.ts +0 -11
  183. package/types/app-data/src/index.d.ts +0 -4
  184. package/types/apps/src/contracts/dynamic-tools.d.ts +0 -13
  185. package/types/apps/src/contracts/storage.d.ts +0 -68
  186. package/types/apps/src/implementation/account-operations.d.ts +0 -151
  187. package/types/apps/src/implementation/dynamic-tools.d.ts +0 -8
  188. package/types/apps/src/implementation/storage.d.ts +0 -15
@@ -1,224 +0,0 @@
1
- import {
2
- adaptMcpTools,
3
- mcpClient,
4
- mcpJsonSchemaValidator
5
- } from "./chunk-UDDE5KOR.js";
6
- import {
7
- accountProviderError,
8
- httpProviderError
9
- } from "./chunk-G7T27IWB.js";
10
- import {
11
- McpError,
12
- McpToolsOptions,
13
- defaultMcpClientLimits
14
- } from "./chunk-DQAZTA4I.js";
15
- import {
16
- ProviderError
17
- } from "./chunk-SB3V4YVR.js";
18
- import {
19
- captureTelemetry
20
- } from "./chunk-RJDDBDSN.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,215 +0,0 @@
1
- import {
2
- promiseTable
3
- } from "./chunk-ZQINWV4W.js";
4
- import {
5
- fromPromise,
6
- nativeOperation
7
- } from "./chunk-3XKZDQLM.js";
8
- import {
9
- ScheduleTiming
10
- } from "./chunk-DQAZTA4I.js";
11
- import {
12
- DatabaseSchema
13
- } from "./chunk-N7YDVXYJ.js";
14
- import {
15
- decoderOf,
16
- isSchema,
17
- storageFieldOf
18
- } from "./chunk-FWQC6I3C.js";
19
- import {
20
- AppStorageUnavailable
21
- } from "./chunk-PZB6T6KU.js";
22
- import {
23
- JsonValue
24
- } from "./chunk-27F7W2LG.js";
25
- import {
26
- Effect_exports,
27
- Schema_exports
28
- } from "./chunk-CDL5PM2Q.js";
29
-
30
- // src/implementation/workflows.ts
31
- var NativeWorkflow = /* @__PURE__ */ Symbol("apps.Workflow");
32
- var workflow = (options, run) => ({
33
- [NativeWorkflow]: {
34
- input: decoderOf(options.input),
35
- ...options.output === void 0 ? {} : { output: decoderOf(options.output) },
36
- ...options.description === void 0 ? {} : { description: options.description },
37
- run: (context, input) => Effect_exports.tryPromise({
38
- // SAFETY: defineApp checks required context; the host supplies the pinned run's capabilities.
39
- try: () => run(context, input),
40
- catch: (error) => error
41
- })
42
- }
43
- });
44
- var nativeWorkflow = (value) => {
45
- if (typeof value !== "object" || value === null || !(NativeWorkflow in value)) return void 0;
46
- return value[NativeWorkflow];
47
- };
48
-
49
- // src/implementation/app.ts
50
- var InternalApp = /* @__PURE__ */ Symbol("apps.App");
51
- var isApp = (value) => typeof value === "object" && value !== null && InternalApp in value;
52
- var toEffectApp = (app) => app[InternalApp];
53
- function adaptDefinition(definition) {
54
- if ("tools" in definition) throw new Error("Use queries and mutations instead of tools");
55
- const webhooks = definition.webhooks === void 0 ? {} : {
56
- webhooks: Object.fromEntries(
57
- Object.entries(definition.webhooks).map(([name, webhook]) => [
58
- name,
59
- {
60
- ...webhook,
61
- ...webhook.register === void 0 ? {} : { register: fromPromise(webhook.register) },
62
- handle: fromPromise(webhook.handle),
63
- ...webhook.unregister === void 0 ? {} : { unregister: fromPromise(webhook.unregister) },
64
- ..."config" in webhook && isSchema(webhook.config) ? { config: decoderOf(webhook.config) } : {},
65
- ..."state" in webhook && isSchema(webhook.state) ? { state: decoderOf(webhook.state) } : {}
66
- }
67
- ])
68
- )
69
- };
70
- const operations = (kind, catalog) => Object.fromEntries(
71
- Object.entries(catalog).map(([name, value]) => {
72
- const operation = nativeOperation(value);
73
- if (operation === void 0 || operation.kind !== kind)
74
- throw new Error("Invalid app data operation");
75
- return [name, operation];
76
- })
77
- );
78
- const workflows = definition.workflows === void 0 ? {} : {
79
- workflows: Object.fromEntries(
80
- Object.entries(definition.workflows).map(([name, value]) => {
81
- const declared = nativeWorkflow(value);
82
- if (declared === void 0) throw new Error("Invalid workflow declaration");
83
- return [name, declared];
84
- })
85
- )
86
- };
87
- const data = {
88
- ...definition.queries === void 0 ? {} : { queries: operations("query", definition.queries) },
89
- ...definition.mutations === void 0 ? {} : { mutations: operations("mutation", definition.mutations) }
90
- };
91
- const schedules = definition.schedules === void 0 ? {} : {
92
- schedules: Object.fromEntries(
93
- Object.entries(definition.schedules).map(([name, schedule]) => {
94
- const matches = Object.entries(definition.mutations ?? {}).filter(
95
- ([, operation]) => operation === schedule.operation
96
- );
97
- const match = matches[0];
98
- if (match === void 0 || matches.length !== 1)
99
- throw new Error("A schedule must reference exactly one named mutation in this app");
100
- return [
101
- name,
102
- {
103
- timing: Schema_exports.decodeUnknownSync(ScheduleTiming)(schedule.timing),
104
- input: Schema_exports.decodeUnknownSync(JsonValue)(schedule.input),
105
- tool: `mutations.${match[0]}`
106
- }
107
- ];
108
- })
109
- )
110
- };
111
- return {
112
- ...definition,
113
- ...webhooks,
114
- ...workflows,
115
- ...data,
116
- ...schedules
117
- };
118
- }
119
- var defineApp = (requirements, definition) => {
120
- const evaluate = typeof definition === "function" ? definition : async () => definition;
121
- const factory = fromPromise(evaluate);
122
- const native = {
123
- accounts: requirements.accounts,
124
- ...requirements.database === void 0 ? {} : { database: requirements.database },
125
- evaluate: (context) => factory(context).pipe(Effect_exports.map((value) => adaptDefinition(value)))
126
- };
127
- return {
128
- [InternalApp]: native,
129
- accounts: native.accounts,
130
- evaluate: (context) => Effect_exports.runPromise(factory(context))
131
- };
132
- };
133
-
134
- // src/implementation/storage.ts
135
- var table = (fields) => tableWithIndexes(fields, []);
136
- var tableWithIndexes = (fields, indexes) => ({
137
- fields,
138
- indexes,
139
- index: (name, fieldsInIndex) => tableWithIndexes(fields, [...indexes, { name, fields: fieldsInIndex }])
140
- });
141
- var serialize = (tables) => {
142
- const definitions = Object.fromEntries(
143
- Object.entries(tables).map(([name, table2]) => [
144
- name,
145
- {
146
- fields: Object.fromEntries(
147
- Object.entries(table2.fields).map(([fieldName, schema]) => {
148
- const field = storageFieldOf(schema);
149
- if (field === void 0) throw new Error("Database columns must use a scalar schema");
150
- return [fieldName, field];
151
- })
152
- ),
153
- indexes: table2.indexes
154
- }
155
- ])
156
- );
157
- return Schema_exports.decodeUnknownSync(DatabaseSchema)(definitions);
158
- };
159
- var authorDatabase = (tables, session, signal, writable) => {
160
- return Object.fromEntries(
161
- Object.entries(tables).map(([name, table2]) => {
162
- const api = promiseTable(session, name, signal);
163
- const parseFields = (input, partial) => {
164
- const values = Schema_exports.decodeUnknownSync(
165
- Schema_exports.Record(Schema_exports.String, Schema_exports.Unknown)
166
- )(input);
167
- const fields = {};
168
- for (const [key, value] of Object.entries(values)) {
169
- if (value === void 0) continue;
170
- const field = Object.hasOwn(table2.fields, key) ? table2.fields[key] : void 0;
171
- if (field === void 0) throw new Error("Unknown database column");
172
- const definition = storageFieldOf(field);
173
- fields[key] = value === null && definition?.optional ? null : field.parse(value);
174
- }
175
- if (!partial) {
176
- for (const [key, field] of Object.entries(table2.fields))
177
- if (!Object.hasOwn(fields, key)) {
178
- const value = field.parse(void 0);
179
- if (value !== void 0) fields[key] = value;
180
- }
181
- }
182
- return fields;
183
- };
184
- const read = { get: api.get, withIndex: api.withIndex };
185
- return [
186
- name,
187
- writable ? {
188
- ...read,
189
- insert: (value) => api.insert(parseFields(value, false)),
190
- update: (id, value) => api.update(id, parseFields(value, true)),
191
- delete: api.delete
192
- } : read
193
- ];
194
- })
195
- );
196
- };
197
- var defineDatabase = (tables) => ({
198
- schema: serialize(tables),
199
- tables
200
- });
201
- var unavailableStorage = {
202
- read: () => Effect_exports.fail(new AppStorageUnavailable()),
203
- mutate: () => Effect_exports.fail(new AppStorageUnavailable())
204
- };
205
-
206
- export {
207
- workflow,
208
- isApp,
209
- toEffectApp,
210
- defineApp,
211
- table,
212
- authorDatabase,
213
- defineDatabase,
214
- unavailableStorage
215
- };