apps 0.0.1-beta.11 → 0.0.1-beta.110

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 (197) hide show
  1. package/README.md +60 -42
  2. package/framework-reference.json +1 -1
  3. package/js/chunk-2RGJMA7N.js +5186 -0
  4. package/js/chunk-3BI34I5S.js +449 -0
  5. package/js/chunk-3BOEMXAJ.js +713 -0
  6. package/js/{chunk-JU7VHODU.js → chunk-4PIQKACY.js} +65 -10
  7. package/js/{chunk-VFZKSM3T.js → chunk-4X2UI4R2.js} +3 -3
  8. package/js/{chunk-KUMBKVJD.js → chunk-62NVUKED.js} +2 -2
  9. package/js/chunk-74H25C4X.js +95 -0
  10. package/js/chunk-7HG422GB.js +90 -0
  11. package/js/{chunk-UK573G7W.js → chunk-ACQXVKVQ.js} +87 -51
  12. package/js/chunk-BKIQCV72.js +994 -0
  13. package/js/{chunk-IJX4CYZO.js → chunk-DILSCQPJ.js} +228 -264
  14. package/js/chunk-HLMJBE4T.js +49 -0
  15. package/js/{chunk-RELFXUOO.js → chunk-JCX2K2SI.js} +931 -289
  16. package/js/{chunk-M3B3DE4K.js → chunk-KLSEU35Y.js} +463 -218
  17. package/js/chunk-OD3KFKZD.js +1617 -0
  18. package/js/chunk-OIH73VFM.js +175 -0
  19. package/js/chunk-OWN3DP2W.js +88 -0
  20. package/js/{chunk-IPI4MFSN.js → chunk-PBGPES67.js} +2 -2
  21. package/js/{chunk-WVVV4TX2.js → chunk-RIV62DRM.js} +4 -3
  22. package/js/{chunk-RFVIONFX.js → chunk-SXQVVXJE.js} +123 -44
  23. package/js/chunk-UPTAFF6L.js +335 -0
  24. package/js/{chunk-ODEIDRGW.js → chunk-URKOTNDA.js} +795 -176
  25. package/js/{chunk-5T57N25Q.js → chunk-VAI3EVCS.js} +643 -69
  26. package/js/{chunk-57RKNWL2.js → chunk-YDW7DX3A.js} +4 -4
  27. package/js/{chunk-CDL5PM2Q.js → chunk-ZKDXML77.js} +19239 -18404
  28. package/js/{chunk-GPFVWWDZ.js → chunk-ZXG7RMCB.js} +113 -58
  29. package/js/client.js +148 -84
  30. package/js/contracts.js +150 -21
  31. package/js/effect.js +18 -19
  32. package/js/{es-APDZKREY.js → es-DIULA3ZF.js} +62 -1659
  33. package/js/graphql.js +231 -188
  34. package/js/host.js +116 -78
  35. package/js/index.js +213 -98
  36. package/js/mcp/effect.js +21 -21
  37. package/js/mcp.js +91 -57
  38. package/js/openapi.js +4349 -1415
  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 +9 -8
  46. package/js/ui/serving.js +8609 -228
  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 +56 -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 +40 -2
  59. package/types/apps/src/contracts/host.d.ts +1456 -20
  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-document.d.ts +1 -1
  66. package/types/apps/src/contracts/openapi.d.ts +41 -9
  67. package/types/apps/src/contracts/operations.d.ts +14 -7
  68. package/types/apps/src/contracts/placement.d.ts +102 -0
  69. package/types/apps/src/contracts/protocol-version.d.ts +2 -2
  70. package/types/apps/src/contracts/protocols/1.d.ts +733 -81
  71. package/types/apps/src/contracts/protocols/10.d.ts +1450 -0
  72. package/types/apps/src/contracts/protocols/11.d.ts +1149 -0
  73. package/types/apps/src/contracts/protocols/12.d.ts +3310 -0
  74. package/types/apps/src/contracts/protocols/2.d.ts +69 -26
  75. package/types/apps/src/contracts/protocols/3.d.ts +133 -33
  76. package/types/apps/src/contracts/protocols/4.d.ts +122 -45
  77. package/types/apps/src/contracts/protocols/5.d.ts +157 -47
  78. package/types/apps/src/contracts/protocols/6.d.ts +1629 -0
  79. package/types/apps/src/contracts/protocols/7.d.ts +1785 -0
  80. package/types/apps/src/contracts/protocols/8.d.ts +1182 -0
  81. package/types/apps/src/contracts/protocols/9.d.ts +1104 -0
  82. package/types/apps/src/contracts/protocols/current.d.ts +6869 -0
  83. package/types/apps/src/contracts/protocols/oauth-6.d.ts +74 -0
  84. package/types/apps/src/contracts/protocols/oauth.d.ts +134 -0
  85. package/types/apps/src/contracts/provider-error.d.ts +9 -0
  86. package/types/apps/src/contracts/provider.d.ts +85 -6
  87. package/types/apps/src/contracts/router.d.ts +2 -1
  88. package/types/apps/src/contracts/schedules.d.ts +7 -1
  89. package/types/apps/src/contracts/schema.d.ts +21 -0
  90. package/types/apps/src/contracts/shared-catalog.d.ts +11 -0
  91. package/types/apps/src/contracts/skills.d.ts +50 -13
  92. package/types/apps/src/contracts/sql.d.ts +63 -0
  93. package/types/apps/src/contracts/ui.d.ts +70 -30
  94. package/types/apps/src/contracts/webhooks.d.ts +24 -7
  95. package/types/apps/src/contracts/workflows.d.ts +56 -34
  96. package/types/apps/src/facet.d.ts +4 -5
  97. package/types/apps/src/host.d.ts +5 -0
  98. package/types/apps/src/implementation/account-router.d.ts +4 -3
  99. package/types/apps/src/implementation/app.d.ts +41 -14
  100. package/types/apps/src/implementation/authoring.d.ts +25 -5
  101. package/types/apps/src/implementation/browser-scripts.gen.d.ts +6 -0
  102. package/types/apps/src/implementation/cache.d.ts +29 -2
  103. package/types/apps/src/implementation/catalog-cache.d.ts +35 -4
  104. package/types/apps/src/implementation/elicitation.d.ts +18 -15
  105. package/types/apps/src/implementation/events.d.ts +64 -0
  106. package/types/apps/src/implementation/failure-detail.d.ts +28 -5
  107. package/types/apps/src/implementation/graphql-catalog.d.ts +3 -3
  108. package/types/apps/src/implementation/graphql.d.ts +4 -3
  109. package/types/apps/src/implementation/input-problems.d.ts +6 -2
  110. package/types/apps/src/implementation/invocation-timing.d.ts +18 -0
  111. package/types/apps/src/implementation/live.d.ts +2 -2
  112. package/types/apps/src/implementation/mcp-call.d.ts +6 -5
  113. package/types/apps/src/implementation/mcp-catalog.d.ts +6 -4
  114. package/types/apps/src/implementation/mcp-client.d.ts +17 -9
  115. package/types/apps/src/implementation/mcp-tools.d.ts +2 -1
  116. package/types/apps/src/implementation/mcp.d.ts +20 -9
  117. package/types/apps/src/implementation/network.d.ts +16 -0
  118. package/types/apps/src/implementation/openapi-compile.d.ts +38 -7
  119. package/types/apps/src/implementation/openapi-document.d.ts +50 -20
  120. package/types/apps/src/implementation/openapi-names.d.ts +9 -4
  121. package/types/apps/src/implementation/openapi-request.d.ts +10 -2
  122. package/types/apps/src/implementation/openapi-source.d.ts +23 -1
  123. package/types/apps/src/implementation/openapi-upgrade.d.ts +4 -0
  124. package/types/apps/src/implementation/operations.d.ts +58 -7
  125. package/types/apps/src/implementation/optimistic.d.ts +1 -1
  126. package/types/apps/src/implementation/placement.d.ts +60 -0
  127. package/types/apps/src/implementation/protocol-operations.d.ts +3 -0
  128. package/types/apps/src/implementation/provider-error.d.ts +28 -1
  129. package/types/apps/src/implementation/provider.d.ts +19 -4
  130. package/types/apps/src/implementation/query-commit.d.ts +1 -1
  131. package/types/apps/src/implementation/router-catalog.d.ts +24 -18
  132. package/types/apps/src/implementation/router.d.ts +26 -6
  133. package/types/apps/src/implementation/runtime-yield.d.ts +7 -0
  134. package/types/apps/src/implementation/schedules.d.ts +39 -8
  135. package/types/apps/src/implementation/schema.d.ts +108 -11
  136. package/types/apps/src/implementation/skills.d.ts +18 -24
  137. package/types/apps/src/implementation/sql.d.ts +71 -0
  138. package/types/apps/src/implementation/ui-account-notice.d.ts +9 -0
  139. package/types/apps/src/implementation/ui-auth.d.ts +1 -1
  140. package/types/apps/src/implementation/ui-client.d.ts +3 -3
  141. package/types/apps/src/implementation/ui-document.d.ts +5 -0
  142. package/types/apps/src/implementation/ui-errors.d.ts +1 -1
  143. package/types/apps/src/implementation/ui-serving.d.ts +28 -11
  144. package/types/apps/src/implementation/ui-watch.d.ts +1 -1
  145. package/types/apps/src/implementation/upstream-error.d.ts +17 -0
  146. package/types/apps/src/implementation/webhooks.d.ts +15 -6
  147. package/types/apps/src/implementation/workflow-context.d.ts +6 -2
  148. package/types/apps/src/implementation/workflows.d.ts +11 -4
  149. package/types/apps/src/index.d.ts +51 -16
  150. package/types/apps/src/mcp.d.ts +20 -1
  151. package/types/apps/src/openapi.d.ts +22 -1
  152. package/types/apps/src/react.d.ts +1 -1
  153. package/types/apps/src/skills.d.ts +10 -8
  154. package/types/apps/src/ui-serving.d.ts +1 -1
  155. package/types/telemetry/src/app-records.d.ts +42 -0
  156. package/types/telemetry/src/browser-operations.d.ts +2 -2
  157. package/types/telemetry/src/browser.d.ts +8 -3
  158. package/types/telemetry/src/config.d.ts +2 -2
  159. package/types/telemetry/src/index.d.ts +2 -1
  160. package/types/telemetry/src/layer.d.ts +10 -4
  161. package/types/telemetry/src/measurements.d.ts +1 -1
  162. package/types/telemetry/src/ownership.d.ts +60 -0
  163. package/types/telemetry/src/recorded-failure.d.ts +29 -0
  164. package/types/telemetry/src/relay.d.ts +16 -6
  165. package/types/telemetry/src/span-attributes.d.ts +17 -1
  166. package/types/telemetry/src/transport.d.ts +8 -1
  167. package/types/utils/src/api-error.d.ts +55 -0
  168. package/types/utils/src/connection-failure.d.ts +33 -0
  169. package/types/utils/src/legacy-keys.d.ts +20 -0
  170. package/types/utils/src/recorded-message.d.ts +18 -0
  171. package/types/utils/src/schema-definitions.d.ts +13 -0
  172. package/types/utils/src/user-facing-error.d.ts +83 -0
  173. package/js/chunk-27F7W2LG.js +0 -34
  174. package/js/chunk-EFAPIRVB.js +0 -299
  175. package/js/chunk-KRSCJDTW.js +0 -2668
  176. package/js/chunk-MKWZPDR6.js +0 -63
  177. package/js/chunk-N7YDVXYJ.js +0 -186
  178. package/js/chunk-NKLWZJLE.js +0 -172
  179. package/js/chunk-PJJ24GU7.js +0 -877
  180. package/js/chunk-PZB6T6KU.js +0 -19
  181. package/js/chunk-R3EV5FTO.js +0 -97
  182. package/js/chunk-TYVDBQSI.js +0 -242
  183. package/js/chunk-YBRC463S.js +0 -224
  184. package/js/chunk-Z2QY3YTF.js +0 -507
  185. package/js/chunk-ZQINWV4W.js +0 -630
  186. package/js/mcp/stdio.js +0 -128
  187. package/types/app-data/src/implementation/cursor.d.ts +0 -10
  188. package/types/app-data/src/implementation/index-key.d.ts +0 -7
  189. package/types/app-data/src/implementation/promise.d.ts +0 -68
  190. package/types/app-data/src/implementation/range.d.ts +0 -8
  191. package/types/app-data/src/implementation/schema.d.ts +0 -18
  192. package/types/app-data/src/implementation/sqlite.d.ts +0 -11
  193. package/types/app-data/src/index.d.ts +0 -4
  194. package/types/apps/src/contracts/storage.d.ts +0 -68
  195. package/types/apps/src/implementation/mcp-stdio.d.ts +0 -4
  196. package/types/apps/src/implementation/storage.d.ts +0 -15
  197. package/types/apps/src/mcp-stdio.d.ts +0 -5
@@ -1,48 +1,20 @@
1
+ import {
2
+ fromPromise
3
+ } from "./chunk-OIH73VFM.js";
1
4
  import {
2
5
  HostedTool,
3
6
  RouterKey,
4
7
  RouterMeta,
5
8
  reservedRouterKeys
6
- } from "./chunk-KRSCJDTW.js";
9
+ } from "./chunk-2RGJMA7N.js";
7
10
  import {
8
- decoderOf
9
- } from "./chunk-5T57N25Q.js";
11
+ decoderOf,
12
+ schemaArgument
13
+ } from "./chunk-VAI3EVCS.js";
10
14
  import {
11
15
  Effect_exports,
12
16
  Schema_exports
13
- } from "./chunk-CDL5PM2Q.js";
14
-
15
- // src/implementation/authoring.ts
16
- var NativeCallback = /* @__PURE__ */ Symbol("apps.NativeCallback");
17
- var fromPromise = (callback) => (...args) => {
18
- if (NativeCallback in callback) {
19
- const native = callback[NativeCallback];
20
- return native(...args);
21
- }
22
- return Effect_exports.tryPromise({ try: () => callback(...args), catch: (error) => error });
23
- };
24
- var toPromise = (operation, signal) => {
25
- const native = (...args) => Effect_exports.suspend(() => {
26
- if (signal === void 0) return operation(...args);
27
- if (signal.aborted) return Effect_exports.interrupt;
28
- const cancelled = Effect_exports.callback((resume) => {
29
- if (signal.aborted) {
30
- resume(Effect_exports.interrupt);
31
- return;
32
- }
33
- const abort = () => resume(Effect_exports.interrupt);
34
- signal.addEventListener("abort", abort, { once: true });
35
- return Effect_exports.sync(() => signal.removeEventListener("abort", abort));
36
- });
37
- return Effect_exports.raceFirst(
38
- cancelled,
39
- Effect_exports.suspend(() => operation(...args))
40
- );
41
- });
42
- return Object.assign((...args) => Effect_exports.runPromise(native(...args)), {
43
- [NativeCallback]: native
44
- });
45
- };
17
+ } from "./chunk-ZKDXML77.js";
46
18
 
47
19
  // src/implementation/operations.ts
48
20
  var NativeOperation = /* @__PURE__ */ Symbol("apps.Operation");
@@ -64,31 +36,38 @@ var operationOptions = (options) => {
64
36
  ...options._meta === void 0 ? {} : { _meta: options._meta },
65
37
  input: decoderOf(options.input),
66
38
  ...approval === void 0 ? {} : {
67
- approval: (context) => Effect_exports.tryPromise({ try: async () => approval(context), catch: (error) => error })
39
+ approval: (context) => fromPromise(async () => approval(context), "approval")()
68
40
  }
69
41
  };
70
42
  };
71
- var withApproval = (operation, approval) => ({
72
- ...operation,
73
- [NativeOperation]: {
74
- ...operation[NativeOperation],
75
- approval: (context) => Effect_exports.tryPromise({ try: async () => approval(context), catch: (error) => error })
43
+ var approvedOperation = (operation, approval) => {
44
+ const copy = Object.defineProperties({}, Object.getOwnPropertyDescriptors(operation));
45
+ return Object.defineProperty(copy, "approval", {
46
+ enumerable: true,
47
+ value: (context) => fromPromise(async () => approval(context), "approval")()
48
+ });
49
+ };
50
+ var withApproval = (operation, approval) => (
51
+ // SAFETY: `Approved` is a type-only mark; the native operation now carries the approval.
52
+ {
53
+ ...operation,
54
+ [NativeOperation]: approvedOperation(operation[NativeOperation], approval)
76
55
  }
77
- });
56
+ );
57
+ var toolAnnotations = (operation) => nativeOperation(operation)?.annotations;
78
58
  var make = (kind, options, run) => operationDeclaration({
79
- ...operationOptions(options),
59
+ ...operationOptions({ ...options, input: schemaArgument(options.input, `The ${kind} input`) }),
80
60
  kind,
81
61
  // The host always validates JSON serialization, even without a stronger output declaration.
82
- ...options.output === void 0 ? {} : { output: decoderOf(options.output) },
83
- run: (context, input) => Effect_exports.tryPromise({
84
- // SAFETY: defineApp checks the handler context against its requirements.
85
- // The host validates account bindings and creates the matching storage facade.
86
- try: () => run(context, input),
87
- catch: (error) => error
88
- })
62
+ ...options.output === void 0 ? {} : { output: decoderOf(schemaArgument(options.output, `The ${kind} output`)) },
63
+ // SAFETY: defineApp checks the handler context against its requirements.
64
+ // The host validates account bindings and creates the matching storage facade.
65
+ run: (context, input) => fromPromise(run, "handler")(context, input)
89
66
  });
90
67
  var query = (options, run) => make("query", options, run);
91
- var mutation = (options, run) => make("mutation", options, run);
68
+ function mutation(options, run) {
69
+ return make("mutation", options, run);
70
+ }
92
71
 
93
72
  // src/implementation/router.ts
94
73
  var routerDeclaration = (node) => ({
@@ -133,14 +112,14 @@ var dynamicRouter = (source) => {
133
112
  return routerDeclaration({
134
113
  kind: "dynamic",
135
114
  ...meta === void 0 ? {} : {
136
- meta: () => fromPromise(async () => meta())().pipe(
115
+ meta: () => fromPromise(async () => meta(), "router")().pipe(
137
116
  Effect_exports.flatMap((options) => Schema_exports.decodeUnknownEffect(RouterMeta)(options))
138
117
  )
139
118
  },
140
- list: () => fromPromise(async () => source.list())().pipe(
119
+ list: () => fromPromise(async () => source.list(), "router")().pipe(
141
120
  Effect_exports.flatMap(Schema_exports.decodeUnknownEffect(Schema_exports.Array(HostedTool)))
142
121
  ),
143
- resolve: (name) => fromPromise(async () => source.resolve(name))().pipe(
122
+ resolve: (name) => fromPromise(async () => source.resolve(name), "router")().pipe(
144
123
  Effect_exports.map((value) => {
145
124
  if (value === void 0) return void 0;
146
125
  const operation = nativeOperation(value);
@@ -189,13 +168,87 @@ var declaredOperations = (root, path = "") => Object.entries(root?.children ?? {
189
168
  return [];
190
169
  }
191
170
  });
171
+ var withApprovals = (source, policy) => {
172
+ const native = nativeRouter(source);
173
+ if (native === void 0) throw new Error("withApprovals expects a router");
174
+ const operation = (node, name) => {
175
+ const approval = policy(operationDeclaration(node), name);
176
+ return approval === void 0 ? node : approvedOperation(node, approval);
177
+ };
178
+ const child = (node, name) => {
179
+ switch (node.kind) {
180
+ case "query":
181
+ case "mutation":
182
+ return operation(node, name);
183
+ case "router":
184
+ case "dynamic":
185
+ return walk(node, name);
186
+ }
187
+ };
188
+ const walk = (node, path) => node.kind === "dynamic" ? {
189
+ ...node,
190
+ resolve: (name) => node.resolve(name).pipe(
191
+ Effect_exports.flatMap(
192
+ (resolved) => resolved === void 0 ? Effect_exports.succeed(void 0) : Effect_exports.try({
193
+ try: () => operation(resolved, joinPath(path, name)),
194
+ catch: (error) => error
195
+ })
196
+ )
197
+ )
198
+ } : {
199
+ ...node,
200
+ children: Object.fromEntries(
201
+ Object.entries(node.children).map(([key, value]) => [
202
+ key,
203
+ child(value, joinPath(path, key))
204
+ ])
205
+ )
206
+ };
207
+ return routerDeclaration(walk(native, ""));
208
+ };
209
+ var renameTools = (source, rename) => {
210
+ const native = nativeRouter(source);
211
+ if (native?.kind !== "dynamic") throw new Error("renameTools expects a protocol router");
212
+ const exposed = (tools) => {
213
+ const seen = /* @__PURE__ */ new Set();
214
+ return tools.flatMap((tool) => {
215
+ const name = rename(tool.name);
216
+ if (name === void 0 || seen.has(name)) return [];
217
+ seen.add(name);
218
+ return [{ ...tool, name, source: tool.name }];
219
+ });
220
+ };
221
+ const listed = native.summaries ?? native.list;
222
+ const original = (name) => listed().pipe(Effect_exports.map((tools) => exposed(tools).find((tool) => tool.name === name)?.source));
223
+ const strip = ({
224
+ source: _source,
225
+ ...tool
226
+ }) => tool;
227
+ return routerDeclaration({
228
+ ...native,
229
+ list: () => native.list().pipe(Effect_exports.map((tools) => exposed(tools).map(strip))),
230
+ ...native.summaries === void 0 ? {} : {
231
+ summaries: () => listed().pipe(Effect_exports.map((tools) => exposed(tools).map(strip)))
232
+ },
233
+ describe: (name) => original(name).pipe(
234
+ Effect_exports.flatMap(
235
+ (found) => found === void 0 ? Effect_exports.succeed(void 0) : native.describe?.(found) ?? native.list().pipe(Effect_exports.map((tools) => tools.find((tool) => tool.name === found)))
236
+ ),
237
+ Effect_exports.map((tool) => tool === void 0 ? void 0 : { ...tool, name })
238
+ ),
239
+ resolve: (name) => original(name).pipe(
240
+ Effect_exports.flatMap(
241
+ (found) => found === void 0 ? Effect_exports.succeed(void 0) : native.resolve(found)
242
+ )
243
+ )
244
+ });
245
+ };
192
246
 
193
247
  export {
194
- fromPromise,
195
- toPromise,
196
248
  operationDeclaration,
197
249
  nativeOperation,
198
250
  withApproval,
251
+ toolAnnotations,
199
252
  query,
200
253
  mutation,
201
254
  routerDeclaration,
@@ -205,5 +258,7 @@ export {
205
258
  dynamicRouter,
206
259
  joinPath,
207
260
  locate,
208
- declaredOperations
261
+ declaredOperations,
262
+ withApprovals,
263
+ renameTools
209
264
  };
package/js/client.js CHANGED
@@ -1,39 +1,38 @@
1
1
  import {
2
2
  AppUiApi,
3
- HttpApiClient_exports,
4
3
  UiContext,
5
- UiDeploymentChanged,
6
- UiFailed
7
- } from "./chunk-IJX4CYZO.js";
4
+ UiFailed,
5
+ UiVersionChanged
6
+ } from "./chunk-74H25C4X.js";
8
7
  import {
9
8
  AsyncResult_exports,
10
9
  AtomRegistry_exports,
11
10
  Atom_exports,
12
11
  queryResult
13
- } from "./chunk-M3B3DE4K.js";
14
- import "./chunk-PJJ24GU7.js";
12
+ } from "./chunk-KLSEU35Y.js";
13
+ import {
14
+ decoderOf
15
+ } from "./chunk-VAI3EVCS.js";
15
16
  import {
16
17
  OtlpExporter_exports,
17
18
  externalTrace,
18
19
  pendingSpan,
19
20
  telemetryLayer,
20
21
  traceLinks
21
- } from "./chunk-ODEIDRGW.js";
22
+ } from "./chunk-URKOTNDA.js";
22
23
  import {
23
24
  FetchHttpClient_exports
24
- } from "./chunk-57RKNWL2.js";
25
- import {
26
- HttpClientError_exports
27
- } from "./chunk-UK573G7W.js";
25
+ } from "./chunk-YDW7DX3A.js";
26
+ import "./chunk-OWN3DP2W.js";
28
27
  import {
29
- decoderOf
30
- } from "./chunk-5T57N25Q.js";
28
+ JsonValue
29
+ } from "./chunk-7HG422GB.js";
31
30
  import {
32
- StorageName
33
- } from "./chunk-PZB6T6KU.js";
31
+ HttpApiClient_exports
32
+ } from "./chunk-DILSCQPJ.js";
34
33
  import {
35
- JsonValue
36
- } from "./chunk-27F7W2LG.js";
34
+ HttpClientError_exports
35
+ } from "./chunk-ACQXVKVQ.js";
37
36
  import {
38
37
  Cause_exports,
39
38
  Clock_exports,
@@ -46,25 +45,27 @@ import {
46
45
  Logger_exports,
47
46
  ManagedRuntime_exports,
48
47
  Option_exports,
48
+ Queue_exports,
49
49
  Schedule_exports,
50
50
  Schema_exports,
51
51
  Semaphore_exports,
52
52
  Stream_exports,
53
53
  Tracer_exports
54
- } from "./chunk-CDL5PM2Q.js";
54
+ } from "./chunk-ZKDXML77.js";
55
55
  import "./chunk-CZ7CSFO4.js";
56
56
 
57
57
  // src/contracts/live.ts
58
+ var OperationName = Schema_exports.NonEmptyString.check(Schema_exports.isMaxLength(200));
58
59
  var AppQueryFailed = class extends Schema_exports.TaggedError()("AppQueryFailed", {}) {
59
60
  };
60
61
 
61
62
  // src/implementation/live.ts
62
63
  var queryReference = (name) => ({
63
- name: Schema_exports.decodeUnknownSync(StorageName)(name),
64
+ name: Schema_exports.decodeUnknownSync(OperationName)(name),
64
65
  kind: "query"
65
66
  });
66
67
  var mutationReference = (name) => ({
67
- name: Schema_exports.decodeUnknownSync(StorageName)(name),
68
+ name: Schema_exports.decodeUnknownSync(OperationName)(name),
68
69
  kind: "mutation"
69
70
  });
70
71
  var liveQueryAtom = (reference, input, options) => Atom_exports.make(
@@ -475,6 +476,8 @@ var browserTelemetryLayer = (settings) => Layer_exports.unwrap(
475
476
  const onError = (event) => error("ui.error", event.error ?? new Error(event.message));
476
477
  const onRejection = (event) => error("ui.unhandled-rejection", event.reason);
477
478
  const onHidden = () => {
479
+ if (navigation !== void 0 && document.visibilityState === "hidden")
480
+ navigation.hidden = true;
478
481
  run(
479
482
  document.visibilityState === "hidden" ? performance.pause.pipe(Effect_exports.andThen(flush)) : performance.resume
480
483
  );
@@ -502,15 +505,27 @@ var browserTelemetryLayer = (settings) => Layer_exports.unwrap(
502
505
  return {
503
506
  flush,
504
507
  navigation: (event) => Effect_exports.sync(() => {
508
+ if (event.type === "load") return;
505
509
  if (event.type === "end") {
506
- if (navigation !== void 0) Deferred_exports.doneUnsafe(navigation, Effect_exports.void);
510
+ if (navigation !== void 0) Deferred_exports.doneUnsafe(navigation.done, Effect_exports.void);
507
511
  navigation = void 0;
508
512
  return;
509
513
  }
510
- if (navigation !== void 0) Deferred_exports.doneUnsafe(navigation, Effect_exports.interrupt);
511
- navigation = Deferred_exports.makeUnsafe();
514
+ if (navigation !== void 0)
515
+ Deferred_exports.doneUnsafe(navigation.done, Effect_exports.interrupt);
516
+ const current = {
517
+ done: Deferred_exports.makeUnsafe(),
518
+ hidden: document.visibilityState === "hidden"
519
+ };
520
+ navigation = current;
512
521
  run(
513
- Deferred_exports.await(navigation).pipe(
522
+ Deferred_exports.await(current.done).pipe(
523
+ // Record visibility however the navigation ends, including when a later one interrupts it.
524
+ Effect_exports.ensuring(
525
+ Effect_exports.suspend(
526
+ () => Effect_exports.annotateCurrentSpan("executor.navigation.hidden", current.hidden)
527
+ )
528
+ ),
514
529
  Effect_exports.withSpan("ui.navigation", {
515
530
  root: true,
516
531
  attributes: { "url.path": event.path }
@@ -520,7 +535,7 @@ var browserTelemetryLayer = (settings) => Layer_exports.unwrap(
520
535
  );
521
536
  }).pipe(
522
537
  Effect_exports.andThen(
523
- event.type === "start" ? performance.navigation(event.path) : Effect_exports.void
538
+ event.type === "end" ? Effect_exports.void : performance.navigation(event.path)
524
539
  )
525
540
  )
526
541
  };
@@ -793,12 +808,39 @@ var makeOptimisticClient = (transport) => {
793
808
  };
794
809
 
795
810
  // src/implementation/ui-client.ts
811
+ var resubscribeDelay = Schedule_exports.min([
812
+ Schedule_exports.exponential("1 second"),
813
+ Schedule_exports.spaced("1 minute")
814
+ ]).pipe(Schedule_exports.jittered);
815
+ var appFailure = (error) => Schema_exports.is(UiFailed)(error) && error.reason === "operation_failed";
816
+ var resubscribes = (error) => HttpClientError_exports.isHttpClientError(error) || Cause_exports.isTimeoutError(error) || Schema_exports.is(UiFailed)(error) && error.reason !== "account_required";
817
+ var Retrying = class {
818
+ constructor(error, previous) {
819
+ this.error = error;
820
+ this.previous = previous;
821
+ }
822
+ error;
823
+ previous;
824
+ };
825
+ var visibleResult = (result) => {
826
+ const current = AsyncResult_exports.value(result);
827
+ if (Option_exports.isNone(current) || !(current.value instanceof Retrying)) {
828
+ return result;
829
+ }
830
+ const previous = Option_exports.map(
831
+ Option_exports.fromUndefinedOr(current.value.previous),
832
+ AsyncResult_exports.success
833
+ );
834
+ return AsyncResult_exports.isSuccess(result) ? AsyncResult_exports.failureWithPrevious(Cause_exports.fail(current.value.error), { previous, waiting: true }) : AsyncResult_exports.failureWithPrevious(AsyncResult_exports.isFailure(result) ? result.cause : Cause_exports.empty, {
835
+ previous
836
+ });
837
+ };
796
838
  var createAppClient = () => {
797
839
  const { runtime, atoms } = makeBrowserTelemetry(
798
840
  browserSettings("/_executor/api/telemetry", "executor-app-web")
799
841
  );
800
842
  const browser = atoms(Layer_exports.empty);
801
- const deploymentChanged = Effect_exports.sync(() => {
843
+ const versionChanged = Effect_exports.sync(() => {
802
844
  window.dispatchEvent(new Event("executor:deployment-changed"));
803
845
  });
804
846
  let pendingWrites = 0;
@@ -840,14 +882,15 @@ var createAppClient = () => {
840
882
  const value = yield* api.ui[kind]({ payload: yield* payload(name, input) });
841
883
  return yield* Schema_exports.decodeUnknownEffect(decoderOf(output))(value);
842
884
  }).pipe(
843
- Effect_exports.tapErrorTag("UiDeploymentChanged", () => deploymentChanged),
885
+ Effect_exports.tapErrorTag("UiDeploymentChanged", () => versionChanged),
844
886
  Effect_exports.withSpan(`ui.app.${kind}`, { attributes: { "executor.operation.name": name } })
845
887
  );
846
888
  const source = (name, input, output) => browser.atom(
847
889
  Stream_exports.suspend(() => {
848
890
  let previous;
849
891
  let attempts = 0;
850
- return Stream_exports.unwrap(
892
+ let latest;
893
+ const subscription = Stream_exports.unwrap(
851
894
  Effect_exports.gen(function* () {
852
895
  const attempt = attempts++;
853
896
  const first = yield* pendingSpan("ui.app.first_result", {
@@ -895,73 +938,94 @@ var createAppClient = () => {
895
938
  Stream_exports.timeout("45 seconds"),
896
939
  Stream_exports.concat(Stream_exports.fail(new UiFailed({ reason: "unavailable" }))),
897
940
  Stream_exports.filter((frame) => frame.type !== "heartbeat"),
898
- Stream_exports.mapEffect((frame) => {
899
- if (frame.type === "failure") return Effect_exports.fail(frame.error);
900
- const server = externalTrace(frame.trace);
901
- return Effect_exports.gen(function* () {
902
- const value = yield* Schema_exports.decodeUnknownEffect(decoderOf(output))(
903
- frame.value
904
- ).pipe(Effect_exports.mapError(() => new UiFailed({ reason: "operation_failed" })));
905
- const received = yield* Effect_exports.currentSpan;
906
- const receivedAt = clock.currentTimeMillisUnsafe();
907
- const currentRevision = revision++;
908
- yield* Effect_exports.annotateCurrentSpan({
909
- "executor.operation.name": name,
910
- "executor.snapshot.revision": currentRevision,
911
- "browser.query.elapsed_ms": receivedAt - started,
912
- "executor.trace.context_valid": Option_exports.isSome(server)
913
- });
914
- yield* first.finish(Exit_exports.void);
915
- let committed = false;
916
- return {
917
- value,
918
- commit: () => {
919
- if (committed) return;
920
- committed = true;
921
- const committedAt = clock.currentTimeMillisUnsafe();
922
- runtime.runFork(
923
- Effect_exports.void.pipe(
924
- Effect_exports.withSpan("ui.app.result.commit", {
925
- parent: received,
926
- attributes: {
927
- "executor.operation.name": name,
928
- "executor.snapshot.revision": currentRevision,
929
- "browser.query.elapsed_ms": committedAt - started,
930
- "browser.query.receive_to_commit_ms": committedAt - receivedAt,
931
- "browser.page.hidden": document.visibilityState === "hidden"
932
- }
933
- })
934
- )
935
- );
936
- }
937
- };
938
- }).pipe(
939
- Effect_exports.withSpan("ui.app.result.receive", {
940
- parent: Option_exports.isSome(server) ? server.value : first.span,
941
- kind: "consumer"
942
- })
943
- );
944
- }),
941
+ Stream_exports.mapEffect(
942
+ (frame) => {
943
+ if (frame.type === "failure") return Effect_exports.fail(frame.error);
944
+ const server = externalTrace(frame.trace);
945
+ return Effect_exports.gen(function* () {
946
+ const value = yield* Schema_exports.decodeUnknownEffect(decoderOf(output))(
947
+ frame.value
948
+ ).pipe(Effect_exports.mapError(() => new AppQueryFailed()));
949
+ const received = yield* Effect_exports.currentSpan;
950
+ const receivedAt = clock.currentTimeMillisUnsafe();
951
+ const currentRevision = revision++;
952
+ yield* Effect_exports.annotateCurrentSpan({
953
+ "executor.operation.name": name,
954
+ "executor.snapshot.revision": currentRevision,
955
+ "browser.query.elapsed_ms": receivedAt - started,
956
+ "executor.trace.context_valid": Option_exports.isSome(server)
957
+ });
958
+ yield* first.finish(Exit_exports.void);
959
+ let committed = false;
960
+ return {
961
+ value,
962
+ commit: () => {
963
+ if (committed) return;
964
+ committed = true;
965
+ const committedAt = clock.currentTimeMillisUnsafe();
966
+ runtime.runFork(
967
+ Effect_exports.void.pipe(
968
+ Effect_exports.withSpan("ui.app.result.commit", {
969
+ parent: received,
970
+ attributes: {
971
+ "executor.operation.name": name,
972
+ "executor.snapshot.revision": currentRevision,
973
+ "browser.query.elapsed_ms": committedAt - started,
974
+ "browser.query.receive_to_commit_ms": committedAt - receivedAt,
975
+ "browser.page.hidden": document.visibilityState === "hidden"
976
+ }
977
+ })
978
+ )
979
+ );
980
+ }
981
+ };
982
+ }).pipe(
983
+ Effect_exports.withSpan("ui.app.result.receive", {
984
+ parent: Option_exports.isSome(server) ? server.value : first.span,
985
+ kind: "consumer"
986
+ })
987
+ );
988
+ }
989
+ ),
945
990
  Stream_exports.onExit(finish),
946
991
  Stream_exports.provideService(Tracer_exports.ParentSpan, first.span)
947
992
  );
948
993
  })
949
994
  ).pipe(
950
995
  // Keep the last snapshot while the watcher replaces the document.
951
- // Unmount or client disposal interrupts the deployment-change wait.
996
+ // Unmount or client disposal interrupts the version-change wait.
952
997
  Stream_exports.catch(
953
- (error) => Schema_exports.is(UiDeploymentChanged)(error) ? Stream_exports.unwrap(deploymentChanged.pipe(Effect_exports.as(Stream_exports.never))) : Stream_exports.fail(error)
998
+ (error) => Schema_exports.is(UiVersionChanged)(error) ? Stream_exports.unwrap(versionChanged.pipe(Effect_exports.as(Stream_exports.never))) : Stream_exports.fail(error)
954
999
  ),
955
- Stream_exports.retry(
956
- Schedule_exports.spaced("1 second").pipe(
957
- Schedule_exports.while(
958
- ({ input: input2 }) => HttpClientError_exports.isHttpClientError(input2) || Cause_exports.isTimeoutError(input2) || Schema_exports.is(UiFailed)(input2)
959
- )
960
- )
1000
+ Stream_exports.tap(
1001
+ (value) => Effect_exports.sync(() => {
1002
+ latest = value;
1003
+ })
961
1004
  )
962
1005
  );
1006
+ return Stream_exports.unwrap(
1007
+ Effect_exports.gen(function* () {
1008
+ const retrying = yield* Queue_exports.unbounded();
1009
+ return Stream_exports.merge(
1010
+ subscription.pipe(
1011
+ Stream_exports.retry(
1012
+ resubscribeDelay.pipe(
1013
+ Schedule_exports.while(
1014
+ ({ input: input2 }) => !resubscribes(input2) ? false : appFailure(input2) ? Queue_exports.offer(retrying, new Retrying(input2, latest)).pipe(
1015
+ Effect_exports.as(true)
1016
+ ) : true
1017
+ )
1018
+ )
1019
+ )
1020
+ ),
1021
+ // Shown outside the retried stream, so they do not reset its delay.
1022
+ Stream_exports.fromQueue(retrying),
1023
+ { haltStrategy: "left" }
1024
+ );
1025
+ })
1026
+ );
963
1027
  })
964
- ).pipe(Atom_exports.map(queryResult));
1028
+ ).pipe(Atom_exports.map((result) => queryResult(visibleResult(result))));
965
1029
  const optimistic = makeOptimisticClient({
966
1030
  source,
967
1031
  read: (name, input, output) => request("query", name, input, output),