apps 0.0.1-beta.1 → 0.0.1-beta.100

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 (211) hide show
  1. package/README.md +112 -72
  2. package/framework-reference.json +1 -1
  3. package/js/browser-XIPJGLH2.js +65 -0
  4. package/js/chunk-2CURR5Y7.js +264 -0
  5. package/js/chunk-2LSGC7XY.js +42 -0
  6. package/js/{chunk-YEJOQEII.js → chunk-4PIQKACY.js} +65 -10
  7. package/js/chunk-4UPC36ZL.js +5185 -0
  8. package/js/{chunk-4LPG6RCH.js → chunk-4X2UI4R2.js} +7 -27
  9. package/js/chunk-5C6RAGAS.js +335 -0
  10. package/js/chunk-62NVUKED.js +39 -0
  11. package/js/chunk-74H25C4X.js +95 -0
  12. package/js/chunk-7HG422GB.js +90 -0
  13. package/js/chunk-7STIP5CS.js +171 -0
  14. package/js/{chunk-QKHR7BMF.js → chunk-ACQXVKVQ.js} +87 -51
  15. package/js/{chunk-OHRT55C4.js → chunk-DILSCQPJ.js} +226 -265
  16. package/js/chunk-ILYCJ3HV.js +449 -0
  17. package/js/chunk-K6TSCYAO.js +712 -0
  18. package/js/{chunk-EVJUVWN2.js → chunk-KLSEU35Y.js} +463 -218
  19. package/js/chunk-OD3KFKZD.js +1617 -0
  20. package/js/chunk-OWN3DP2W.js +88 -0
  21. package/js/{chunk-ZTFQHGEB.js → chunk-PBGPES67.js} +3 -5
  22. package/js/chunk-QI66R4FP.js +786 -0
  23. package/js/chunk-RN4YB4JT.js +1922 -0
  24. package/js/{chunk-ZCAMUXSG.js → chunk-URKOTNDA.js} +795 -177
  25. package/js/{chunk-NCYXZN2G.js → chunk-UVL56Z6E.js} +390 -23
  26. package/js/{chunk-2HHMABB6.js → chunk-VAI3EVCS.js} +700 -78
  27. package/js/chunk-VCYWAA4N.js +49 -0
  28. package/js/{chunk-HDJH3RPR.js → chunk-YDW7DX3A.js} +4 -4
  29. package/js/chunk-YWVISRZD.js +268 -0
  30. package/js/{chunk-FW5HBOIK.js → chunk-ZKDXML77.js} +19272 -18299
  31. package/js/client.js +148 -100
  32. package/js/contracts.js +208 -24
  33. package/js/effect.js +18 -19
  34. package/js/es-DIULA3ZF.js +39371 -0
  35. package/js/graphql.js +62 -58
  36. package/js/host.js +83 -60
  37. package/js/index.js +381 -263
  38. package/js/mcp/effect.js +21 -21
  39. package/js/mcp.js +117 -74
  40. package/js/openapi.js +4613 -42691
  41. package/js/react.js +2 -3
  42. package/js/skills/effect.js +6 -4
  43. package/js/skills.js +233 -70
  44. package/js/storage/facet.js +1 -540
  45. package/js/ui/auth/contracts.js +8 -9
  46. package/js/ui/auth.js +16 -14
  47. package/js/ui/contracts.js +9 -8
  48. package/js/ui/serving.js +8609 -227
  49. package/package.json +3 -8
  50. package/runtime.json +1 -1
  51. package/types/app-cache/src/contracts/cache.d.ts +60 -2
  52. package/types/app-cache/src/index.d.ts +92 -2
  53. package/types/app-data/src/contracts/database.d.ts +33 -6
  54. package/types/apps/src/contracts/api-response-error.d.ts +4 -0
  55. package/types/apps/src/contracts/app.d.ts +63 -17
  56. package/types/apps/src/contracts/cache.d.ts +24 -1
  57. package/types/apps/src/contracts/context.d.ts +60 -17
  58. package/types/apps/src/contracts/elicitation.d.ts +23 -7
  59. package/types/apps/src/contracts/events.d.ts +94 -0
  60. package/types/apps/src/contracts/failure.d.ts +54 -0
  61. package/types/apps/src/contracts/graphql.d.ts +2 -1
  62. package/types/apps/src/contracts/host.d.ts +1325 -534
  63. package/types/apps/src/contracts/icons.d.ts +28 -0
  64. package/types/apps/src/contracts/live.d.ts +2 -0
  65. package/types/apps/src/contracts/mcp.d.ts +97 -20
  66. package/types/apps/src/contracts/network.d.ts +120 -0
  67. package/types/apps/src/contracts/openapi-compile.d.ts +82 -3
  68. package/types/apps/src/contracts/openapi-document.d.ts +1 -1
  69. package/types/apps/src/contracts/openapi.d.ts +51 -9
  70. package/types/apps/src/contracts/operations.d.ts +14 -12
  71. package/types/apps/src/contracts/placement.d.ts +102 -0
  72. package/types/apps/src/contracts/protocol-version.d.ts +6 -0
  73. package/types/apps/src/contracts/protocols/1.d.ts +2241 -0
  74. package/types/apps/src/contracts/protocols/10.d.ts +1450 -0
  75. package/types/apps/src/contracts/protocols/11.d.ts +1149 -0
  76. package/types/apps/src/contracts/protocols/12.d.ts +3310 -0
  77. package/types/apps/src/contracts/protocols/2.d.ts +711 -0
  78. package/types/apps/src/contracts/protocols/3.d.ts +776 -0
  79. package/types/apps/src/contracts/protocols/4.d.ts +1306 -0
  80. package/types/apps/src/contracts/protocols/5.d.ts +1200 -0
  81. package/types/apps/src/contracts/protocols/6.d.ts +1629 -0
  82. package/types/apps/src/contracts/protocols/7.d.ts +1785 -0
  83. package/types/apps/src/contracts/protocols/8.d.ts +1182 -0
  84. package/types/apps/src/contracts/protocols/9.d.ts +1104 -0
  85. package/types/apps/src/contracts/protocols/current.d.ts +6857 -0
  86. package/types/apps/src/contracts/protocols/oauth-6.d.ts +74 -0
  87. package/types/apps/src/contracts/protocols/oauth.d.ts +134 -0
  88. package/types/apps/src/contracts/provider-error.d.ts +9 -0
  89. package/types/apps/src/contracts/provider.d.ts +140 -10
  90. package/types/apps/src/contracts/router.d.ts +59 -0
  91. package/types/apps/src/contracts/schedules.d.ts +7 -1
  92. package/types/apps/src/contracts/schema.d.ts +21 -0
  93. package/types/apps/src/contracts/shared-catalog.d.ts +11 -0
  94. package/types/apps/src/contracts/skills.d.ts +60 -14
  95. package/types/apps/src/contracts/sql.d.ts +63 -0
  96. package/types/apps/src/contracts/ui-auth.d.ts +6 -14
  97. package/types/apps/src/contracts/ui.d.ts +70 -30
  98. package/types/apps/src/contracts/webhooks.d.ts +24 -7
  99. package/types/apps/src/contracts/workflows.d.ts +89 -36
  100. package/types/apps/src/facet.d.ts +4 -5
  101. package/types/apps/src/graphql.d.ts +1 -3
  102. package/types/apps/src/host.d.ts +5 -0
  103. package/types/apps/src/implementation/account-router.d.ts +13 -0
  104. package/types/apps/src/implementation/app.d.ts +44 -16
  105. package/types/apps/src/implementation/authoring.d.ts +25 -5
  106. package/types/apps/src/implementation/browser-scripts.gen.d.ts +6 -0
  107. package/types/apps/src/implementation/cache.d.ts +32 -3
  108. package/types/apps/src/implementation/catalog-cache.d.ts +43 -5
  109. package/types/apps/src/implementation/elicitation.d.ts +18 -15
  110. package/types/apps/src/implementation/events.d.ts +64 -0
  111. package/types/apps/src/implementation/failure-detail.d.ts +48 -0
  112. package/types/apps/src/implementation/graphql-catalog.d.ts +4 -7
  113. package/types/apps/src/implementation/graphql.d.ts +4 -3
  114. package/types/apps/src/implementation/input-problems.d.ts +6 -2
  115. package/types/apps/src/implementation/invocation-timing.d.ts +18 -0
  116. package/types/apps/src/implementation/live.d.ts +2 -2
  117. package/types/apps/src/implementation/mcp-call.d.ts +6 -5
  118. package/types/apps/src/implementation/mcp-catalog.d.ts +7 -8
  119. package/types/apps/src/implementation/mcp-client.d.ts +49 -25
  120. package/types/apps/src/implementation/mcp-tools.d.ts +2 -1
  121. package/types/apps/src/implementation/mcp.d.ts +52 -25
  122. package/types/apps/src/implementation/network.d.ts +16 -0
  123. package/types/apps/src/implementation/openapi-compile.d.ts +30 -8
  124. package/types/apps/src/implementation/openapi-document.d.ts +46 -21
  125. package/types/apps/src/implementation/openapi-names.d.ts +23 -0
  126. package/types/apps/src/implementation/openapi-request.d.ts +10 -3
  127. package/types/apps/src/implementation/openapi-source.d.ts +30 -8
  128. package/types/apps/src/implementation/openapi-upgrade.d.ts +4 -0
  129. package/types/apps/src/implementation/operations.d.ts +84 -10
  130. package/types/apps/src/implementation/optimistic.d.ts +1 -1
  131. package/types/apps/src/implementation/placement.d.ts +60 -0
  132. package/types/apps/src/implementation/protocol-operations.d.ts +6 -4
  133. package/types/apps/src/implementation/provider-error.d.ts +28 -1
  134. package/types/apps/src/implementation/provider.d.ts +26 -6
  135. package/types/apps/src/implementation/query-commit.d.ts +1 -1
  136. package/types/apps/src/implementation/router-catalog.d.ts +227 -0
  137. package/types/apps/src/implementation/router.d.ts +78 -0
  138. package/types/apps/src/implementation/runtime-yield.d.ts +7 -0
  139. package/types/apps/src/implementation/schedules.d.ts +39 -8
  140. package/types/apps/src/implementation/schema.d.ts +111 -15
  141. package/types/apps/src/implementation/skills.d.ts +18 -24
  142. package/types/apps/src/implementation/sql.d.ts +71 -0
  143. package/types/apps/src/implementation/swagger-client.d.ts +28 -0
  144. package/types/apps/src/implementation/ui-account-notice.d.ts +9 -0
  145. package/types/apps/src/implementation/ui-auth.d.ts +12 -6
  146. package/types/apps/src/implementation/ui-client.d.ts +3 -3
  147. package/types/apps/src/implementation/ui-document.d.ts +5 -0
  148. package/types/apps/src/implementation/ui-errors.d.ts +1 -1
  149. package/types/apps/src/implementation/ui-serving.d.ts +31 -12
  150. package/types/apps/src/implementation/ui-watch.d.ts +1 -1
  151. package/types/apps/src/implementation/upstream-error.d.ts +7 -0
  152. package/types/apps/src/implementation/webhooks.d.ts +15 -6
  153. package/types/apps/src/implementation/workflow-context.d.ts +17 -5
  154. package/types/apps/src/implementation/workflows.d.ts +11 -4
  155. package/types/apps/src/index.d.ts +71 -21
  156. package/types/apps/src/mcp.d.ts +25 -5
  157. package/types/apps/src/openapi.d.ts +11 -6
  158. package/types/apps/src/react.d.ts +1 -1
  159. package/types/apps/src/skills.d.ts +13 -8
  160. package/types/apps/src/ui-auth.d.ts +2 -2
  161. package/types/apps/src/ui-serving.d.ts +1 -1
  162. package/types/telemetry/src/app-records.d.ts +42 -0
  163. package/types/telemetry/src/browser-operations.d.ts +7 -4
  164. package/types/telemetry/src/browser.d.ts +8 -3
  165. package/types/telemetry/src/config.d.ts +2 -2
  166. package/types/telemetry/src/index.d.ts +2 -1
  167. package/types/telemetry/src/layer.d.ts +10 -4
  168. package/types/telemetry/src/measurements.d.ts +1 -1
  169. package/types/telemetry/src/ownership.d.ts +60 -0
  170. package/types/telemetry/src/recorded-failure.d.ts +29 -0
  171. package/types/telemetry/src/relay.d.ts +16 -6
  172. package/types/telemetry/src/span-attributes.d.ts +17 -1
  173. package/types/telemetry/src/transport.d.ts +8 -1
  174. package/types/utils/src/api-error.d.ts +55 -0
  175. package/types/utils/src/connection-failure.d.ts +33 -0
  176. package/types/utils/src/legacy-keys.d.ts +20 -0
  177. package/types/utils/src/recorded-message.d.ts +18 -0
  178. package/types/utils/src/schema-definitions.d.ts +13 -0
  179. package/types/utils/src/user-facing-error.d.ts +83 -0
  180. package/js/chunk-6IIO4NPI.js +0 -29
  181. package/js/chunk-6YBRWRK3.js +0 -160
  182. package/js/chunk-BMOIAIVR.js +0 -138
  183. package/js/chunk-FZJOYIZO.js +0 -19
  184. package/js/chunk-G7IE6BKC.js +0 -224
  185. package/js/chunk-IHQ4ML7K.js +0 -2193
  186. package/js/chunk-KOXMLKTM.js +0 -1288
  187. package/js/chunk-M6ZRRIBI.js +0 -877
  188. package/js/chunk-PLCMJREA.js +0 -590
  189. package/js/chunk-PZ36XMXW.js +0 -93
  190. package/js/chunk-RBAC33PQ.js +0 -267
  191. package/js/chunk-SATWJKN6.js +0 -34
  192. package/js/chunk-SWPD52J7.js +0 -35
  193. package/js/chunk-TE4KO4HI.js +0 -47
  194. package/js/chunk-W7D7WVSY.js +0 -18
  195. package/js/chunk-X7SFGU4Q.js +0 -280
  196. package/js/chunk-ZJWDMTE3.js +0 -63
  197. package/js/mcp/stdio.js +0 -128
  198. package/types/app-data/src/implementation/cursor.d.ts +0 -10
  199. package/types/app-data/src/implementation/index-key.d.ts +0 -7
  200. package/types/app-data/src/implementation/promise.d.ts +0 -68
  201. package/types/app-data/src/implementation/range.d.ts +0 -8
  202. package/types/app-data/src/implementation/schema.d.ts +0 -33
  203. package/types/app-data/src/implementation/sqlite.d.ts +0 -11
  204. package/types/app-data/src/index.d.ts +0 -4
  205. package/types/apps/src/contracts/dynamic-tools.d.ts +0 -13
  206. package/types/apps/src/contracts/storage.d.ts +0 -68
  207. package/types/apps/src/implementation/account-operations.d.ts +0 -151
  208. package/types/apps/src/implementation/dynamic-tools.d.ts +0 -8
  209. package/types/apps/src/implementation/mcp-stdio.d.ts +0 -4
  210. package/types/apps/src/implementation/storage.d.ts +0 -13
  211. package/types/apps/src/mcp-stdio.d.ts +0 -8
@@ -1,21 +1,13 @@
1
- import {
2
- HttpApiEndpoint_exports,
3
- HttpApiGroup_exports,
4
- HttpApi_exports,
5
- UiFailed,
6
- UiForbidden,
7
- UiUnauthorized
8
- } from "./chunk-OHRT55C4.js";
9
1
  import {
10
2
  Schema_exports
11
- } from "./chunk-FW5HBOIK.js";
3
+ } from "./chunk-ZKDXML77.js";
12
4
 
13
5
  // src/contracts/ui-auth.ts
14
- var AppSignInId = Schema_exports.String.check(Schema_exports.isPattern(/^[a-f0-9]{64}$/)).pipe(
6
+ var AppSignInId = Schema_exports.String.check(Schema_exports.isPattern(/^[a-f0-9]{64}$/u)).pipe(
15
7
  Schema_exports.brand("AppSignInId")
16
8
  );
17
9
  var AppSignInCode = Schema_exports.RedactedFromValue(
18
- Schema_exports.String.check(Schema_exports.isPattern(/^[a-f0-9]{64}$/))
10
+ Schema_exports.String.check(Schema_exports.isPattern(/^[a-f0-9]{64}$/u))
19
11
  );
20
12
  var AppReturnPath = Schema_exports.String.check(
21
13
  Schema_exports.isMaxLength(8192),
@@ -31,26 +23,14 @@ var AppReturnPath = Schema_exports.String.check(
31
23
  })
32
24
  ).pipe(Schema_exports.brand("AppReturnPath"));
33
25
  var AppSignInCallback = Schema_exports.Struct({ request: AppSignInId, code: AppSignInCode });
34
- var AppSignInApi = HttpApi_exports.make("app-sign-in").add(
35
- HttpApiGroup_exports.make("appSignIn").add(
36
- HttpApiEndpoint_exports.post("start", "/_executor/auth/start", {
37
- payload: Schema_exports.Struct({ returnTo: AppReturnPath }),
38
- success: Schema_exports.Struct({ url: Schema_exports.String }),
39
- error: [UiForbidden, UiFailed]
40
- })
41
- ).add(
42
- HttpApiEndpoint_exports.post("complete", "/_executor/auth/complete", {
43
- payload: AppSignInCallback,
44
- success: Schema_exports.Struct({ returnTo: AppReturnPath }),
45
- error: [UiUnauthorized, UiForbidden, UiFailed]
46
- })
47
- )
48
- );
26
+ var appSignInCallbackPath = "/_executor/auth/callback";
27
+ var AppSignInFailure = Schema_exports.Literals(["ended", "forbidden", "unavailable"]);
49
28
 
50
29
  export {
51
30
  AppSignInId,
52
31
  AppSignInCode,
53
32
  AppReturnPath,
54
33
  AppSignInCallback,
55
- AppSignInApi
34
+ appSignInCallbackPath,
35
+ AppSignInFailure
56
36
  };
@@ -0,0 +1,335 @@
1
+ import {
2
+ appInvocationFetch
3
+ } from "./chunk-VCYWAA4N.js";
4
+ import {
5
+ fromPromise,
6
+ method,
7
+ toPromise
8
+ } from "./chunk-7STIP5CS.js";
9
+ import {
10
+ CacheAcquired,
11
+ CacheEntry,
12
+ CacheError,
13
+ cacheLimits,
14
+ scopedSlots
15
+ } from "./chunk-4UPC36ZL.js";
16
+ import {
17
+ decoderOf
18
+ } from "./chunk-VAI3EVCS.js";
19
+ import {
20
+ captureTelemetry,
21
+ owned,
22
+ ownedBy
23
+ } from "./chunk-URKOTNDA.js";
24
+ import {
25
+ Clock_exports,
26
+ Duration_exports,
27
+ Effect_exports,
28
+ Exit_exports,
29
+ Schema_exports
30
+ } from "./chunk-ZKDXML77.js";
31
+
32
+ // ../app-cache/src/index.ts
33
+ var canonical = (value) => {
34
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
35
+ if (value !== null && typeof value === "object")
36
+ return `{${Object.entries(value).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([key, item]) => `${JSON.stringify(key)}:${canonical(item)}`).join(",")}}`;
37
+ return JSON.stringify(value);
38
+ };
39
+ var cacheKey = (key) => Effect_exports.gen(function* () {
40
+ const parsed = yield* Schema_exports.decodeUnknownEffect(Schema_exports.Json)(key).pipe(
41
+ Effect_exports.mapError(() => new CacheError({ reason: "invalid" }))
42
+ );
43
+ const bytes = new TextEncoder().encode(canonical(parsed));
44
+ if (bytes.byteLength > cacheLimits.keyBytes)
45
+ return yield* new CacheError({ reason: "capacity", limit: "keyBytes" });
46
+ const hash = yield* Effect_exports.tryPromise({
47
+ try: () => crypto.subtle.digest("SHA-256", bytes),
48
+ catch: () => new CacheError({ reason: "invalid" })
49
+ });
50
+ return [...new Uint8Array(hash)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
51
+ });
52
+ var makeCache = (host, background, scope = "shared", deadline, leaseWait = (effect) => effect) => {
53
+ const transport = (command) => host(command).pipe(
54
+ Effect_exports.withSpan("app.cache.command", {
55
+ attributes: { "cache.operation": command.operation }
56
+ })
57
+ );
58
+ const keyOf = (key) => cacheKey([scope, key]);
59
+ const readKeys = (keys) => transport({ operation: "read", keys }).pipe(
60
+ Effect_exports.flatMap(Schema_exports.decodeUnknownEffect(Schema_exports.Array(Schema_exports.NullOr(CacheEntry)))),
61
+ Effect_exports.mapError(() => new CacheError({ reason: "storage" }))
62
+ );
63
+ const durations = (freshFor, staleFor = 0) => Effect_exports.try({
64
+ try: () => ({
65
+ fresh: Duration_exports.toMillis(Duration_exports.fromInputUnsafe(freshFor)),
66
+ stale: Duration_exports.toMillis(Duration_exports.fromInputUnsafe(staleFor))
67
+ }),
68
+ catch: () => new CacheError({ reason: "invalid" })
69
+ }).pipe(
70
+ Effect_exports.flatMap(
71
+ ({ fresh, stale }) => ![fresh, stale].every((value) => Number.isFinite(value) && value >= 0) ? Effect_exports.fail(new CacheError({ reason: "invalid" })) : (
72
+ // The cache keeps nothing past its retention: a longer lifetime loses staleness first.
73
+ Effect_exports.succeed({
74
+ fresh: Math.min(fresh, cacheLimits.retentionMs),
75
+ stale: Math.max(0, Math.min(stale, cacheLimits.retentionMs - fresh))
76
+ })
77
+ )
78
+ )
79
+ );
80
+ const get = (options, refresh, also = () => []) => Effect_exports.gen(function* () {
81
+ const key = yield* keyOf(options.key);
82
+ const extra = also(key);
83
+ const reads = extra.length === 0 ? void 0 : yield* Effect_exports.forEach(extra, keyOf);
84
+ const withReads = (value, entries) => ({
85
+ value,
86
+ key,
87
+ reads: entries
88
+ });
89
+ const loaded = (value) => ({ value, key, reads: void 0 });
90
+ const { fresh, stale } = yield* durations(options.freshFor, options.staleFor);
91
+ const decode = (value) => Schema_exports.decodeUnknownEffect(options.schema)(value);
92
+ const load = (lease) => Effect_exports.gen(function* () {
93
+ const value = yield* options.load.pipe(Effect_exports.flatMap(decode));
94
+ const json = yield* Schema_exports.decodeUnknownEffect(Schema_exports.Json)(value).pipe(
95
+ Effect_exports.mapError(() => new CacheError({ reason: "invalid" }))
96
+ );
97
+ const now = yield* Clock_exports.currentTimeMillis;
98
+ const published = yield* transport({
99
+ operation: "publish",
100
+ key,
101
+ lease,
102
+ entry: {
103
+ value: json,
104
+ version: crypto.randomUUID(),
105
+ freshUntil: now + fresh,
106
+ staleUntil: now + fresh + stale
107
+ }
108
+ }).pipe(Effect_exports.withSpan("app.cache.publish"));
109
+ if (published !== true) return yield* new CacheError({ reason: "unavailable" });
110
+ return value;
111
+ }).pipe(
112
+ Effect_exports.withSpan("app.cache.load"),
113
+ Effect_exports.timeout(cacheLimits.loadTimeoutMs),
114
+ // Publishing clears the lease in the same transaction. Only an unpublished load releases it.
115
+ Effect_exports.onExit(
116
+ (exit) => Exit_exports.isSuccess(exit) ? Effect_exports.void : transport({ operation: "release", key, lease }).pipe(
117
+ Effect_exports.catch(() => Effect_exports.void)
118
+ )
119
+ )
120
+ );
121
+ const waitUntil = Math.min(
122
+ (yield* Clock_exports.currentTimeMillis) + cacheLimits.waitMs,
123
+ deadline ?? Number.POSITIVE_INFINITY
124
+ );
125
+ let initialVersion;
126
+ const attempt = Effect_exports.gen(function* () {
127
+ const acquired = yield* transport({
128
+ operation: "acquire",
129
+ key,
130
+ refresh,
131
+ ...initialVersion === void 0 ? {} : { version: initialVersion },
132
+ ...reads === void 0 ? {} : { reads }
133
+ }).pipe(
134
+ Effect_exports.flatMap(
135
+ (reply) => Schema_exports.decodeUnknownEffect(CacheAcquired)(reply).pipe(
136
+ Effect_exports.mapError(() => new CacheError({ reason: "storage" }))
137
+ )
138
+ )
139
+ );
140
+ const { entry, lease } = acquired;
141
+ const together = acquired.reads?.length === reads?.length ? acquired.reads : void 0;
142
+ const now = yield* Clock_exports.currentTimeMillis;
143
+ if (initialVersion === void 0) initialVersion = entry?.version ?? null;
144
+ const refreshed = refresh && entry !== null && entry.version !== initialVersion;
145
+ if (entry !== null && (refreshed || !refresh && lease === null && now < entry.freshUntil))
146
+ return { next: "fresh", entry, together };
147
+ const kept = !refresh && entry !== null && now < entry.staleUntil;
148
+ if (kept && options.stale !== "revalidate")
149
+ return { next: "stale", entry, lease, together };
150
+ if (lease !== null) return { next: "load", lease, kept };
151
+ if (now >= waitUntil) return { next: "local" };
152
+ return { next: "wait" };
153
+ });
154
+ let decided = yield* attempt;
155
+ if (decided.next === "wait")
156
+ decided = yield* Effect_exports.gen(function* () {
157
+ while (true) {
158
+ yield* Effect_exports.sleep("100 millis");
159
+ const next = yield* attempt;
160
+ if (next.next !== "wait") return next;
161
+ }
162
+ }).pipe(leaseWait);
163
+ switch (decided.next) {
164
+ case "fresh":
165
+ yield* Effect_exports.annotateCurrentSpan("cache.result", "fresh");
166
+ return withReads(yield* decode(decided.entry.value), decided.together);
167
+ case "stale":
168
+ yield* Effect_exports.annotateCurrentSpan("cache.result", "stale");
169
+ if (decided.lease !== null) yield* background(load(decided.lease).pipe(Effect_exports.asVoid));
170
+ return withReads(yield* decode(decided.entry.value), decided.together);
171
+ case "load":
172
+ yield* Effect_exports.annotateCurrentSpan("cache.result", decided.kept ? "revalidated" : "miss");
173
+ return loaded(yield* load(decided.lease));
174
+ case "local":
175
+ yield* Effect_exports.annotateCurrentSpan("cache.result", "local");
176
+ return loaded(
177
+ yield* options.load.pipe(
178
+ Effect_exports.flatMap(decode),
179
+ Effect_exports.timeout(cacheLimits.loadTimeoutMs),
180
+ Effect_exports.withSpan("app.cache.load", { attributes: { "cache.load.leased": false } })
181
+ )
182
+ );
183
+ }
184
+ }).pipe(Effect_exports.withSpan("app.cache.get"));
185
+ return {
186
+ /** Read arbitrary retained JSON entries without initiating a refresh. Missing and null are distinct. */
187
+ read: (keys) => Effect_exports.forEach(keys, keyOf).pipe(Effect_exports.flatMap(readKeys)),
188
+ /** Publish bounded immutable parts before publishing the manifest that references them. */
189
+ write: (entries, retention) => Effect_exports.gen(function* () {
190
+ const { fresh } = yield* durations(retention);
191
+ const now = yield* Clock_exports.currentTimeMillis;
192
+ const values = yield* Effect_exports.forEach(
193
+ entries,
194
+ ({ key, value }) => Effect_exports.gen(function* () {
195
+ return {
196
+ key: yield* keyOf(key),
197
+ entry: {
198
+ value,
199
+ version: crypto.randomUUID(),
200
+ freshUntil: now + fresh,
201
+ staleUntil: now + fresh
202
+ }
203
+ };
204
+ })
205
+ );
206
+ yield* transport({ operation: "write", entries: values });
207
+ }),
208
+ /** Revoke retained data and any loader's right to publish its in-flight result. */
209
+ invalidate: (key) => keyOf(key).pipe(
210
+ Effect_exports.flatMap((key2) => transport({ operation: "invalidate", key: key2 })),
211
+ Effect_exports.asVoid
212
+ ),
213
+ /**
214
+ * Read fresh data, refresh stale data in the background (or first, with `stale: "revalidate"`),
215
+ * or wait for the lease owner.
216
+ */
217
+ get: (options) => get(options, false).pipe(Effect_exports.map(({ value }) => value)),
218
+ /**
219
+ * `get`, also reading the keys of this scope that `keys` names in the same round trip. `keys`
220
+ * gets the entry's store key, which is unique to this scope and key, so a caller can remember
221
+ * what it read under it. `reads` holds their entries, undecoded and in order, when the value
222
+ * was read from the store; it is undefined when the value was loaded or the store did not read
223
+ * them, and the caller then reads what it still needs.
224
+ */
225
+ getWith: (options, keys) => get(options, false, keys),
226
+ /** Force one awaited refresh without removing the retained value. Concurrent refreshes share a load. */
227
+ revalidate: (options) => get(options, true).pipe(Effect_exports.map(({ value }) => value))
228
+ };
229
+ };
230
+
231
+ // src/implementation/cache.ts
232
+ var getWithReads = /* @__PURE__ */ Symbol("executor.cache.getWithReads");
233
+ var unavailableCache = {
234
+ transport: () => Effect_exports.fail(new CacheError({ reason: "unavailable" })),
235
+ background: () => Effect_exports.die(new Error("Cache background runner is unavailable"))
236
+ };
237
+ var authorCache = (host, accounts, signal, telemetry, deadline) => {
238
+ const scoped = (scope, callerSignal = signal, services = telemetry) => {
239
+ const cache = makeCache(
240
+ host.transport,
241
+ // A refresh handed to the background runs beside the caller, which does not wait on it.
242
+ (task) => host.background(task.pipe(owned("background", "app.cache.refresh"))),
243
+ scope,
244
+ deadline,
245
+ // Waiting on another caller's load is waiting, not Executor's work.
246
+ (wait) => wait.pipe(Effect_exports.withSpan("app.cache.lease.wait", ownedBy("lease")))
247
+ );
248
+ const getOptions = (options) => ({
249
+ key: options.key,
250
+ schema: decoderOf(options.schema),
251
+ freshFor: options.freshFor,
252
+ ...options.staleFor === void 0 ? {} : { staleFor: options.staleFor },
253
+ ...options.stale === void 0 ? {} : { stale: options.stale },
254
+ load: Effect_exports.acquireUseRelease(
255
+ Effect_exports.sync(() => new AbortController()),
256
+ (controller) => Effect_exports.all([appInvocationFetch(controller.signal), captureTelemetry]).pipe(
257
+ Effect_exports.flatMap(
258
+ ([fetch, loading]) => fromPromise(
259
+ method(options, "load"),
260
+ "loader"
261
+ )({
262
+ fetch,
263
+ signal: controller.signal,
264
+ cache: scoped(scope, controller.signal, loading.context)
265
+ })
266
+ )
267
+ ),
268
+ (controller) => Effect_exports.sync(() => controller.abort())
269
+ )
270
+ });
271
+ const load = (read, given) => cache[read](getOptions(given));
272
+ const decodeEntries = (entries, schema) => Effect_exports.forEach(
273
+ entries,
274
+ (entry) => entry === null ? Effect_exports.succeed(void 0) : Schema_exports.decodeUnknownEffect(decoderOf(schema))(entry.value)
275
+ );
276
+ const service = (method2, operation) => toPromise(
277
+ (...args) => operation(...args).pipe(
278
+ owned("executor", "app.cache.call", { attributes: { "cache.method": method2 } })
279
+ ),
280
+ callerSignal,
281
+ services
282
+ );
283
+ const authored = {
284
+ get: service("get", (options) => load("get", options)),
285
+ revalidate: service(
286
+ "revalidate",
287
+ (options) => load("revalidate", options)
288
+ ),
289
+ read: service(
290
+ "read",
291
+ (key, schema) => cache.read([key]).pipe(
292
+ Effect_exports.flatMap((entries) => {
293
+ const entry = entries[0];
294
+ return entry === void 0 || entry === null ? Effect_exports.succeed(void 0) : Schema_exports.decodeUnknownEffect(decoderOf(schema))(entry.value);
295
+ })
296
+ )
297
+ ),
298
+ readMany: service(
299
+ "readMany",
300
+ (keys, schema) => cache.read(keys).pipe(Effect_exports.flatMap((entries) => decodeEntries(entries, schema)))
301
+ ),
302
+ write: service("write", cache.write),
303
+ invalidate: service("invalidate", cache.invalidate),
304
+ forAccount: (account) => {
305
+ const bound = scopedSlots(accounts).flatMap(([, value]) => Array.isArray(value) ? value : [value]).find((value) => value.id === account.id);
306
+ if (bound === void 0) throw new CacheError({ reason: "invalid" });
307
+ return scoped(
308
+ { account: bound.id, method: bound.method, generation: bound.generation },
309
+ callerSignal,
310
+ services
311
+ );
312
+ }
313
+ };
314
+ return Object.defineProperty(authored, getWithReads, {
315
+ value: service(
316
+ "get",
317
+ (given, keys) => cache.getWith(getOptions(given), keys).pipe(
318
+ Effect_exports.map(({ value, key, reads }) => ({
319
+ value,
320
+ key,
321
+ reads: reads?.map((entry) => entry === null ? void 0 : entry.value)
322
+ }))
323
+ )
324
+ )
325
+ });
326
+ };
327
+ return scoped("shared");
328
+ };
329
+
330
+ export {
331
+ cacheKey,
332
+ getWithReads,
333
+ unavailableCache,
334
+ authorCache
335
+ };
@@ -0,0 +1,39 @@
1
+ import {
2
+ appSignInCallbackPath
3
+ } from "./chunk-4X2UI4R2.js";
4
+ import {
5
+ HttpServerResponse_exports
6
+ } from "./chunk-ACQXVKVQ.js";
7
+
8
+ // src/implementation/ui-auth.ts
9
+ var appPrivateHeaders = {
10
+ "cache-control": "no-store",
11
+ "referrer-policy": "no-referrer",
12
+ "x-content-type-options": "nosniff",
13
+ "content-security-policy": "frame-ancestors 'none'"
14
+ };
15
+ var appRedirect = (url) => HttpServerResponse_exports.redirect(url, { status: 302, headers: appPrivateHeaders });
16
+ var appSignInCallback = (origin, request, code) => {
17
+ const callback = new URL(appSignInCallbackPath, origin);
18
+ callback.searchParams.set("request", request);
19
+ callback.searchParams.set("code", code);
20
+ return callback.href;
21
+ };
22
+ var appSignInFailed = () => HttpServerResponse_exports.text(
23
+ `<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Could not open app</title></head><body><p>Could not sign in to this app. Try opening it again.</p><a href="/">Try again</a></body></html>`,
24
+ {
25
+ status: 401,
26
+ contentType: "text/html",
27
+ headers: {
28
+ ...appPrivateHeaders,
29
+ "content-security-policy": "default-src 'none'; frame-ancestors 'none'; base-uri 'none'"
30
+ }
31
+ }
32
+ );
33
+
34
+ export {
35
+ appPrivateHeaders,
36
+ appRedirect,
37
+ appSignInCallback,
38
+ appSignInFailed
39
+ };
@@ -0,0 +1,95 @@
1
+ import {
2
+ JsonValue,
3
+ withLegacyKeys
4
+ } from "./chunk-7HG422GB.js";
5
+ import {
6
+ HttpApiEndpoint_exports,
7
+ HttpApiGroup_exports,
8
+ HttpApiSchema_exports,
9
+ HttpApi_exports
10
+ } from "./chunk-DILSCQPJ.js";
11
+ import {
12
+ Schema_exports
13
+ } from "./chunk-ZKDXML77.js";
14
+
15
+ // src/contracts/ui.ts
16
+ var UiContextFields = Schema_exports.Struct({
17
+ version: Schema_exports.NonEmptyString,
18
+ accounts: Schema_exports.optional(
19
+ Schema_exports.Record(Schema_exports.NonEmptyString, Schema_exports.Array(Schema_exports.NonEmptyString))
20
+ )
21
+ });
22
+ var UiContext = UiContextFields.pipe(withLegacyKeys({ version: "deployment" }));
23
+ var UiOperation = Schema_exports.Struct({
24
+ ...UiContextFields.fields,
25
+ name: Schema_exports.NonEmptyString,
26
+ input: JsonValue
27
+ }).pipe(withLegacyKeys({ version: "deployment" }));
28
+ var UiUnauthorized = class extends Schema_exports.TaggedError()(
29
+ "UiUnauthorized",
30
+ {},
31
+ { httpApiStatus: 401 }
32
+ ) {
33
+ };
34
+ var UiForbidden = class extends Schema_exports.TaggedError()(
35
+ "UiForbidden",
36
+ {},
37
+ { httpApiStatus: 403 }
38
+ ) {
39
+ };
40
+ var UiVersionChanged = class extends Schema_exports.TaggedError()(
41
+ "UiDeploymentChanged",
42
+ {},
43
+ { httpApiStatus: 409 }
44
+ ) {
45
+ };
46
+ var UiFailed = class extends Schema_exports.TaggedError()(
47
+ "UiFailed",
48
+ {
49
+ reason: Schema_exports.Literals(["unavailable", "operation_failed", "account_required"])
50
+ },
51
+ { httpApiStatus: 422 }
52
+ ) {
53
+ };
54
+ var UiSnapshot = Schema_exports.Union([
55
+ Schema_exports.Struct({
56
+ type: Schema_exports.Literal("snapshot"),
57
+ value: JsonValue,
58
+ trace: Schema_exports.optional(Schema_exports.Unknown)
59
+ }),
60
+ Schema_exports.Struct({ type: Schema_exports.Literal("failure"), error: UiFailed }),
61
+ Schema_exports.Struct({ type: Schema_exports.Literal("heartbeat") })
62
+ ]);
63
+ var errors = [UiUnauthorized, UiForbidden, UiVersionChanged, UiFailed];
64
+ var AppUiApi = HttpApi_exports.make("app-ui").add(
65
+ HttpApiGroup_exports.make("ui").add(
66
+ HttpApiEndpoint_exports.post("query", "/_executor/api/query", {
67
+ payload: UiOperation,
68
+ success: JsonValue,
69
+ error: errors
70
+ })
71
+ ).add(
72
+ HttpApiEndpoint_exports.post("mutate", "/_executor/api/mutate", {
73
+ payload: UiOperation,
74
+ success: JsonValue,
75
+ error: errors
76
+ })
77
+ ).add(
78
+ HttpApiEndpoint_exports.post("subscribe", "/_executor/api/subscribe", {
79
+ payload: UiOperation,
80
+ success: HttpApiSchema_exports.StreamSse({ data: UiSnapshot, error: Schema_exports.Union(errors) }),
81
+ error: errors
82
+ })
83
+ )
84
+ );
85
+
86
+ export {
87
+ UiContext,
88
+ UiOperation,
89
+ UiUnauthorized,
90
+ UiForbidden,
91
+ UiVersionChanged,
92
+ UiFailed,
93
+ UiSnapshot,
94
+ AppUiApi
95
+ };
@@ -0,0 +1,90 @@
1
+ import {
2
+ SchemaTransformation_exports,
3
+ Schema_exports
4
+ } from "./chunk-ZKDXML77.js";
5
+
6
+ // src/contracts/schema.ts
7
+ var JsonValue = Schema_exports.Json;
8
+ var JsonObject = Schema_exports.Record(Schema_exports.String, JsonValue);
9
+ var AccountId = Schema_exports.String.pipe(
10
+ Schema_exports.check(Schema_exports.isStartingWith("acc_"), Schema_exports.isMinLength(5)),
11
+ Schema_exports.brand("acc")
12
+ );
13
+ var HttpUrl = Schema_exports.String.check(
14
+ Schema_exports.makeFilter((value) => {
15
+ try {
16
+ const url = new URL(value);
17
+ return url.protocol === "https:" || url.protocol === "http:";
18
+ } catch {
19
+ return false;
20
+ }
21
+ })
22
+ );
23
+ var DeclarationIssue = Schema_exports.Struct({
24
+ path: Schema_exports.Array(Schema_exports.String),
25
+ message: Schema_exports.String
26
+ });
27
+ var DeclarationInvalid = class extends Schema_exports.TaggedError()(
28
+ "DeclarationInvalid",
29
+ { declaration: Schema_exports.String, issues: Schema_exports.Array(DeclarationIssue) }
30
+ ) {
31
+ get message() {
32
+ const problems = this.issues.map(
33
+ (issue) => issue.path.length === 0 ? issue.message : `${issue.path.join(".")}: ${issue.message}`
34
+ );
35
+ return `The ${this.declaration} declaration is invalid. ${problems.join("; ")}`;
36
+ }
37
+ };
38
+ var ValidationError = class extends Schema_exports.TaggedError()("ValidationError", {}) {
39
+ get message() {
40
+ return "Value did not match the schema";
41
+ }
42
+ };
43
+
44
+ // ../utils/src/legacy-keys.ts
45
+ var withLegacyKeys = (mapping) => (self) => {
46
+ const renamed = Object.entries(mapping).filter(
47
+ (entry) => typeof entry[1] === "string"
48
+ );
49
+ const fields = {};
50
+ for (const key of Object.keys(self.fields)) {
51
+ const encoded = Schema_exports.toEncoded(self.fields[key]);
52
+ const legacy = mapping[key];
53
+ fields[key] = typeof legacy === "string" ? Schema_exports.optionalKey(encoded) : encoded;
54
+ if (typeof legacy === "string") fields[legacy] = Schema_exports.optionalKey(encoded);
55
+ }
56
+ return Schema_exports.Struct(fields).pipe(
57
+ Schema_exports.decodeTo(
58
+ self,
59
+ SchemaTransformation_exports.transform({
60
+ decode: (input) => {
61
+ const output = { ...input };
62
+ for (const [key, legacy] of renamed) {
63
+ if (!Object.hasOwn(output, key) && Object.hasOwn(output, legacy)) {
64
+ output[key] = output[legacy];
65
+ }
66
+ delete output[legacy];
67
+ }
68
+ return output;
69
+ },
70
+ encode: (input) => {
71
+ const output = { ...input };
72
+ for (const [key, legacy] of renamed) {
73
+ if (Object.hasOwn(output, key)) output[legacy] = output[key];
74
+ }
75
+ return output;
76
+ }
77
+ })
78
+ )
79
+ );
80
+ };
81
+
82
+ export {
83
+ JsonValue,
84
+ JsonObject,
85
+ AccountId,
86
+ HttpUrl,
87
+ DeclarationInvalid,
88
+ ValidationError,
89
+ withLegacyKeys
90
+ };