apps 0.0.1-beta.8 → 0.0.1-beta.81

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 (180) hide show
  1. package/README.md +25 -22
  2. package/framework-reference.json +1 -1
  3. package/js/{chunk-72JNVHPK.js → chunk-4NFSABEA.js} +4 -3
  4. package/js/chunk-5FHWNLCI.js +88 -0
  5. package/js/chunk-5WGONRKQ.js +426 -0
  6. package/js/{chunk-M3B3DE4K.js → chunk-74YVXBKY.js} +463 -218
  7. package/js/chunk-CDXQDN7W.js +92 -0
  8. package/js/{chunk-UK573G7W.js → chunk-EOPQ727L.js} +87 -51
  9. package/js/{chunk-27F7W2LG.js → chunk-H2CJWXA3.js} +2 -2
  10. package/js/{chunk-JU7VHODU.js → chunk-H72MEDMN.js} +65 -10
  11. package/js/{chunk-FL2QR3XW.js → chunk-HJG4RBYM.js} +333 -69
  12. package/js/chunk-I6Q7ZPKJ.js +49 -0
  13. package/js/{chunk-CDL5PM2Q.js → chunk-IFJU5SYQ.js} +19082 -18402
  14. package/js/{chunk-VFZKSM3T.js → chunk-JPEUKEV4.js} +3 -3
  15. package/js/{chunk-5T57N25Q.js → chunk-KGCTYL2S.js} +511 -63
  16. package/js/{chunk-KUMBKVJD.js → chunk-KLYSEHUD.js} +2 -2
  17. package/js/{chunk-WLE7WX2U.js → chunk-NG56RPCA.js} +2348 -472
  18. package/js/chunk-OD3KFKZD.js +1617 -0
  19. package/js/{chunk-Z5M2LQOZ.js → chunk-OY47QPQY.js} +67 -55
  20. package/js/{chunk-57RKNWL2.js → chunk-PD6I2SDG.js} +4 -4
  21. package/js/chunk-PL5KOEZD.js +334 -0
  22. package/js/chunk-Q4IZAUIF.js +285 -0
  23. package/js/{chunk-RJDDBDSN.js → chunk-QWQM3CLH.js} +795 -177
  24. package/js/{chunk-RFVIONFX.js → chunk-TE25A7D6.js} +123 -44
  25. package/js/{chunk-IJX4CYZO.js → chunk-TUMGL2OC.js} +228 -264
  26. package/js/chunk-W6XCQAXP.js +171 -0
  27. package/js/chunk-WCGAO3X5.js +348 -0
  28. package/js/{chunk-IPI4MFSN.js → chunk-XBG7HHXC.js} +2 -2
  29. package/js/{chunk-CMYUWAX7.js → chunk-YQUG4CES.js} +126 -31
  30. package/js/{chunk-UESPOTUI.js → chunk-Z2SWTZCF.js} +861 -231
  31. package/js/client.js +142 -94
  32. package/js/contracts.js +127 -26
  33. package/js/effect.js +19 -19
  34. package/js/{es-APDZKREY.js → es-DIULA3ZF.js} +62 -1659
  35. package/js/graphql.js +50 -40
  36. package/js/host.js +83 -58
  37. package/js/index.js +131 -46
  38. package/js/mcp/effect.js +23 -21
  39. package/js/mcp/stdio.js +44 -34
  40. package/js/mcp.js +76 -53
  41. package/js/openapi.js +4071 -1357
  42. package/js/react.js +2 -3
  43. package/js/skills/effect.js +6 -3
  44. package/js/skills.js +208 -81
  45. package/js/storage/facet.js +1 -540
  46. package/js/ui/auth/contracts.js +2 -2
  47. package/js/ui/auth.js +5 -5
  48. package/js/ui/contracts.js +5 -4
  49. package/js/ui/serving.js +8604 -223
  50. package/package.json +3 -4
  51. package/runtime.json +1 -1
  52. package/types/app-cache/src/contracts/cache.d.ts +18 -0
  53. package/types/app-cache/src/index.d.ts +34 -2
  54. package/types/apps/src/contracts/api-response-error.d.ts +4 -0
  55. package/types/apps/src/contracts/app.d.ts +7 -3
  56. package/types/apps/src/contracts/cache.d.ts +20 -0
  57. package/types/apps/src/contracts/context.d.ts +19 -11
  58. package/types/apps/src/contracts/elicitation.d.ts +23 -7
  59. package/types/apps/src/contracts/events.d.ts +93 -0
  60. package/types/apps/src/contracts/failure.d.ts +30 -1
  61. package/types/apps/src/contracts/graphql.d.ts +2 -1
  62. package/types/apps/src/contracts/host.d.ts +649 -17
  63. package/types/apps/src/contracts/live.d.ts +2 -0
  64. package/types/apps/src/contracts/mcp.d.ts +80 -10
  65. package/types/apps/src/contracts/network.d.ts +120 -0
  66. package/types/apps/src/contracts/openapi-compile.d.ts +82 -3
  67. package/types/apps/src/contracts/openapi.d.ts +41 -9
  68. package/types/apps/src/contracts/operations.d.ts +8 -4
  69. package/types/apps/src/contracts/placement.d.ts +102 -0
  70. package/types/apps/src/contracts/protocol-version.d.ts +2 -2
  71. package/types/apps/src/contracts/protocols/1.d.ts +733 -81
  72. package/types/apps/src/contracts/protocols/10.d.ts +1450 -0
  73. package/types/apps/src/contracts/protocols/2.d.ts +69 -26
  74. package/types/apps/src/contracts/protocols/3.d.ts +133 -33
  75. package/types/apps/src/contracts/protocols/4.d.ts +122 -45
  76. package/types/apps/src/contracts/protocols/5.d.ts +157 -47
  77. package/types/apps/src/contracts/protocols/6.d.ts +1629 -0
  78. package/types/apps/src/contracts/protocols/7.d.ts +1785 -0
  79. package/types/apps/src/contracts/protocols/8.d.ts +1182 -0
  80. package/types/apps/src/contracts/protocols/9.d.ts +1104 -0
  81. package/types/apps/src/contracts/protocols/current.d.ts +3843 -0
  82. package/types/apps/src/contracts/protocols/oauth-6.d.ts +74 -0
  83. package/types/apps/src/contracts/protocols/oauth.d.ts +134 -0
  84. package/types/apps/src/contracts/provider-error.d.ts +9 -0
  85. package/types/apps/src/contracts/provider.d.ts +90 -6
  86. package/types/apps/src/contracts/skills.d.ts +50 -13
  87. package/types/apps/src/contracts/sql.d.ts +63 -0
  88. package/types/apps/src/contracts/ui.d.ts +37 -3
  89. package/types/apps/src/contracts/workflows.d.ts +6 -0
  90. package/types/apps/src/facet.d.ts +4 -5
  91. package/types/apps/src/host.d.ts +5 -0
  92. package/types/apps/src/implementation/account-router.d.ts +4 -3
  93. package/types/apps/src/implementation/authoring.d.ts +25 -5
  94. package/types/apps/src/implementation/browser-scripts.gen.d.ts +6 -0
  95. package/types/apps/src/implementation/cache.d.ts +28 -1
  96. package/types/apps/src/implementation/catalog-cache.d.ts +35 -4
  97. package/types/apps/src/implementation/elicitation.d.ts +18 -15
  98. package/types/apps/src/implementation/events.d.ts +59 -0
  99. package/types/apps/src/implementation/failure-detail.d.ts +25 -3
  100. package/types/apps/src/implementation/graphql-catalog.d.ts +3 -3
  101. package/types/apps/src/implementation/graphql.d.ts +4 -3
  102. package/types/apps/src/implementation/input-problems.d.ts +6 -2
  103. package/types/apps/src/implementation/invocation-timing.d.ts +18 -0
  104. package/types/apps/src/implementation/live.d.ts +2 -2
  105. package/types/apps/src/implementation/mcp-call.d.ts +6 -5
  106. package/types/apps/src/implementation/mcp-catalog.d.ts +6 -4
  107. package/types/apps/src/implementation/mcp-client.d.ts +17 -9
  108. package/types/apps/src/implementation/mcp-stdio.d.ts +1 -1
  109. package/types/apps/src/implementation/mcp-tools.d.ts +2 -1
  110. package/types/apps/src/implementation/mcp.d.ts +20 -9
  111. package/types/apps/src/implementation/network.d.ts +16 -0
  112. package/types/apps/src/implementation/openapi-compile.d.ts +26 -6
  113. package/types/apps/src/implementation/openapi-document.d.ts +46 -19
  114. package/types/apps/src/implementation/openapi-names.d.ts +9 -4
  115. package/types/apps/src/implementation/openapi-request.d.ts +10 -2
  116. package/types/apps/src/implementation/openapi-source.d.ts +18 -0
  117. package/types/apps/src/implementation/openapi-upgrade.d.ts +4 -0
  118. package/types/apps/src/implementation/operations.d.ts +17 -2
  119. package/types/apps/src/implementation/optimistic.d.ts +1 -1
  120. package/types/apps/src/implementation/placement.d.ts +60 -0
  121. package/types/apps/src/implementation/protocol-operations.d.ts +3 -0
  122. package/types/apps/src/implementation/provider-error.d.ts +28 -1
  123. package/types/apps/src/implementation/provider.d.ts +18 -3
  124. package/types/apps/src/implementation/query-commit.d.ts +1 -1
  125. package/types/apps/src/implementation/router-catalog.d.ts +11 -13
  126. package/types/apps/src/implementation/router.d.ts +16 -5
  127. package/types/apps/src/implementation/runtime-yield.d.ts +7 -0
  128. package/types/apps/src/implementation/schema.d.ts +90 -10
  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 +28 -9
  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/workflows.d.ts +1 -1
  141. package/types/apps/src/index.d.ts +55 -13
  142. package/types/apps/src/mcp.d.ts +20 -1
  143. package/types/apps/src/openapi.d.ts +1 -1
  144. package/types/apps/src/react.d.ts +1 -1
  145. package/types/apps/src/skills.d.ts +10 -8
  146. package/types/apps/src/ui-serving.d.ts +1 -1
  147. package/types/telemetry/src/app-records.d.ts +42 -0
  148. package/types/telemetry/src/browser-operations.d.ts +2 -2
  149. package/types/telemetry/src/browser.d.ts +8 -3
  150. package/types/telemetry/src/config.d.ts +2 -2
  151. package/types/telemetry/src/index.d.ts +2 -1
  152. package/types/telemetry/src/layer.d.ts +10 -4
  153. package/types/telemetry/src/measurements.d.ts +1 -1
  154. package/types/telemetry/src/ownership.d.ts +60 -0
  155. package/types/telemetry/src/recorded-failure.d.ts +29 -0
  156. package/types/telemetry/src/relay.d.ts +16 -6
  157. package/types/telemetry/src/span-attributes.d.ts +17 -1
  158. package/types/telemetry/src/transport.d.ts +8 -1
  159. package/types/utils/src/api-error.d.ts +55 -0
  160. package/types/utils/src/connection-failure.d.ts +33 -0
  161. package/types/utils/src/recorded-message.d.ts +18 -0
  162. package/types/utils/src/user-facing-error.d.ts +83 -0
  163. package/js/chunk-MKWZPDR6.js +0 -63
  164. package/js/chunk-N7YDVXYJ.js +0 -186
  165. package/js/chunk-NKLWZJLE.js +0 -172
  166. package/js/chunk-OCYUEU47.js +0 -224
  167. package/js/chunk-PJJ24GU7.js +0 -877
  168. package/js/chunk-PZB6T6KU.js +0 -19
  169. package/js/chunk-R3EV5FTO.js +0 -97
  170. package/js/chunk-YXQHV65J.js +0 -242
  171. package/js/chunk-ZQINWV4W.js +0 -630
  172. package/types/app-data/src/implementation/cursor.d.ts +0 -10
  173. package/types/app-data/src/implementation/index-key.d.ts +0 -7
  174. package/types/app-data/src/implementation/promise.d.ts +0 -68
  175. package/types/app-data/src/implementation/range.d.ts +0 -8
  176. package/types/app-data/src/implementation/schema.d.ts +0 -18
  177. package/types/app-data/src/implementation/sqlite.d.ts +0 -11
  178. package/types/app-data/src/index.d.ts +0 -4
  179. package/types/apps/src/contracts/storage.d.ts +0 -68
  180. package/types/apps/src/implementation/storage.d.ts +0 -15
@@ -0,0 +1,33 @@
1
+ /** Requests the browser could not complete because no response reached it. */
2
+ import { Cause } from "effect";
3
+ import { HttpClientError } from "effect/http";
4
+ import { UserFacingError } from "./user-facing-error.js";
5
+ /**
6
+ * Fetch rejects with a `TypeError` when no response arrives: the device is offline, the page
7
+ * navigated away first, the connection was reset before a response, or the browser blocked the
8
+ * request. The server may still have completed the request and records its own outcome. Failures Executor constructs itself, such as a batch reply
9
+ * that ended without an answer, carry no such cause and stay unexpected.
10
+ */
11
+ export declare const isConnectionFailure: (error: unknown) => error is HttpClientError.HttpClientError;
12
+ /** Typed API clients may surface a lost connection as a failure or, after narrowing, a defect. */
13
+ export declare const hasConnectionFailure: (cause: Cause.Cause<unknown>) => boolean;
14
+ /** The browser could not reach Executor. Nothing on the server needs fixing. */
15
+ export declare const ConnectionFailed: import("effect/Schema").Class<{} & UserFacingError & {
16
+ readonly _tag: "ConnectionFailed";
17
+ }, Omit<import("effect/Schema").TaggedStruct<"ConnectionFailed", {
18
+ readonly message: typeof import("./api-error.js").MessageField;
19
+ readonly recovery: import("effect/Schema").decodeTo<import("effect/Schema").optionalKey<import("effect/Schema").Struct<{
20
+ readonly action: import("effect/Schema").String;
21
+ readonly instructions: import("effect/Schema").String;
22
+ }>>, import("effect/Schema").Struct<{
23
+ readonly action: import("effect/Schema").String;
24
+ readonly instructions: import("effect/Schema").String;
25
+ }>, never, never>;
26
+ }>, "~type.make.in"> & {
27
+ readonly "~type.make.in": {
28
+ readonly _tag?: "ConnectionFailed";
29
+ };
30
+ }, UserFacingError>;
31
+ export type ConnectionFailed = typeof ConnectionFailed.Type;
32
+ /** What to show for a failure no contract declares: a lost connection, or an unexpected error. */
33
+ export declare const undeclaredError: (cause: Cause.Cause<unknown>) => UserFacingError;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The fixed sentence traces and error reports record for a tagged error, beside its tag. Telemetry
3
+ * records no other text from a tagged error: one that declares no sentence is recorded by its tag
4
+ * alone (`@executor-js/telemetry/recorded-failure`). Declare one from fixed text and closed fields
5
+ * only, never from a value the caller supplied (a slug, a name, a tool name, an argument's key),
6
+ * an app's own text or a service's reply. That text still reaches the caller the error is for.
7
+ * `ApiError` and `UserFacingError` declare a fixed message for you; a message derived from fields
8
+ * declares `recorded`.
9
+ */
10
+ export declare const RecordedMessage: unique symbol;
11
+ /** The fixed sentence an error declares for telemetry, if it declares one. */
12
+ export declare const recordedMessage: (error: unknown) => string | undefined;
13
+ /**
14
+ * Declare a recorded message on one error that Executor did not define the text of, such as an
15
+ * error decoded from an app's reply. An error class's own declaration is kept. The error's fields
16
+ * and wire encoding are unchanged.
17
+ */
18
+ export declare const recordAs: <E>(error: E, message: string) => E;
@@ -0,0 +1,83 @@
1
+ import { Schema, type Cause } from "effect";
2
+ import "effect/http-api";
3
+ import { MessageField } from "./api-error.js";
4
+ /** Curated explanation and recovery. Never include raw diagnostics, credentials, or form values. */
5
+ export interface ErrorPresentation {
6
+ readonly title: string;
7
+ readonly description: string;
8
+ readonly recovery: {
9
+ readonly action: string;
10
+ readonly instructions: string;
11
+ };
12
+ /** Repeating the failed operation can help. Configuration changes are not retries. */
13
+ readonly retryable?: boolean;
14
+ /** False when the user's agent cannot act on the fix prompt, so hosts do not offer it. */
15
+ readonly agentFixable?: boolean;
16
+ /** One safe value the user needs for recovery, such as a URL to send to the service. */
17
+ readonly detail?: {
18
+ readonly label: string;
19
+ readonly value: string;
20
+ };
21
+ /**
22
+ * Present only when the Executor team must fix the problem. Safe evidence for a public
23
+ * report: fixed codes and statuses, never user data, URLs, or upstream text.
24
+ */
25
+ readonly report?: string;
26
+ }
27
+ type PresentationProperties = Required<Omit<ErrorPresentation, "detail" | "report">> & {
28
+ readonly detail: ErrorPresentation["detail"];
29
+ readonly report: ErrorPresentation["report"];
30
+ readonly code: string;
31
+ readonly fixPrompt: string;
32
+ };
33
+ /** A yieldable error that owns its safe user explanation and agent recovery task. */
34
+ export interface UserFacingError extends Cause.YieldableError, PresentationProperties {
35
+ readonly _tag: string;
36
+ }
37
+ type Header<Tag extends string> = {
38
+ readonly tag: Tag;
39
+ readonly status: number;
40
+ };
41
+ type Definition<Tag extends string, Fields extends Schema.Struct.Fields> = Header<Tag> & {
42
+ readonly fields: Fields & {
43
+ readonly [Key in keyof PresentationProperties | "_tag" | "message"]?: never;
44
+ };
45
+ /**
46
+ * What traces and error reports record beside the tag. A fixed description is recorded as is; a
47
+ * presentation derived from fields is recorded only through this, from fixed text and closed
48
+ * fields, never a value the caller chose, an app's text or a service's reply. Without it the
49
+ * error is recorded by its tag alone.
50
+ */
51
+ readonly recorded?: (fields: Schema.Struct.Type<Fields>) => string;
52
+ } & (ErrorPresentation | {
53
+ readonly presentation: (fields: Schema.Struct.Type<Fields>) => ErrorPresentation;
54
+ });
55
+ declare const RecoveryField: Schema.decodeTo<Schema.optionalKey<Schema.Struct<{
56
+ readonly action: Schema.String;
57
+ readonly instructions: Schema.String;
58
+ }>>, Schema.Struct<{
59
+ readonly action: Schema.String;
60
+ readonly instructions: Schema.String;
61
+ }>, never, never>;
62
+ type DerivedFields = {
63
+ readonly message: typeof MessageField;
64
+ readonly recovery: typeof RecoveryField;
65
+ };
66
+ type ErrorFields<Tag extends string, Fields extends Schema.Struct.Fields> = Omit<Schema.TaggedStruct<Tag, Fields & DerivedFields>, "~type.make.in"> & {
67
+ readonly "~type.make.in": Schema.TaggedStruct<Tag, Fields>["~type.make.in"];
68
+ };
69
+ type ErrorClass<Tag extends string, Fields extends Schema.Struct.Fields> = Schema.Class<Schema.Struct.Type<Fields> & UserFacingError & {
70
+ readonly _tag: Tag;
71
+ }, ErrorFields<Tag, Fields>, UserFacingError>;
72
+ /** Define a schema-backed error with no payload. Its tag becomes its public error code. */
73
+ declare function define<const Tag extends string>(definition: Header<Tag> & ErrorPresentation): ErrorClass<Tag, {}>;
74
+ /** Define a schema-backed error whose safe presentation can depend on its parsed fields. */
75
+ declare function define<const Tag extends string, const Fields extends Schema.Struct.Fields>(definition: Definition<Tag, Fields>): ErrorClass<Tag, Fields>;
76
+ /** Define the schema, error constructor, user copy, and agent recovery together. */
77
+ export declare const UserFacingError: {
78
+ define: typeof define;
79
+ is: (value: unknown) => value is UserFacingError;
80
+ };
81
+ /** Defects get a safe explanation without exposing an arbitrary cause. */
82
+ export declare const UnexpectedError: ErrorClass<"UnexpectedError", {}>;
83
+ export {};
@@ -1,63 +0,0 @@
1
- import {
2
- ProviderError
3
- } from "./chunk-R3EV5FTO.js";
4
- import {
5
- AccountId
6
- } from "./chunk-27F7W2LG.js";
7
- import {
8
- Option_exports,
9
- Schema_exports
10
- } from "./chunk-CDL5PM2Q.js";
11
-
12
- // src/implementation/provider-error.ts
13
- function parseProviderError(error) {
14
- return Schema_exports.decodeUnknownOption(ProviderError)(error).pipe(
15
- Option_exports.map(({ reason, status, accountId }) => new ProviderError({ reason, status, accountId }))
16
- );
17
- }
18
- function httpProviderError(status, headers = {}) {
19
- if (status >= 500 && status <= 599) return new ProviderError({ reason: "unavailable", status });
20
- if (status === 401) return new ProviderError({ reason: "unauthorized", status });
21
- if (status === 429) return new ProviderError({ reason: "rate_limited", status });
22
- if (status !== 403) return void 0;
23
- const retry = headers["retry-after"];
24
- if (headers["x-ratelimit-remaining"] === "0" || retry !== void 0 && (/^\d+$/.test(retry) || Number.isFinite(Date.parse(retry))))
25
- return new ProviderError({ reason: "rate_limited", status });
26
- if (/\bBearer\b.*\berror="insufficient_scope"/i.test(headers["www-authenticate"] ?? ""))
27
- return new ProviderError({ reason: "forbidden", status });
28
- return new ProviderError({ reason: "rejected", status });
29
- }
30
- function accountProviderError(error, accountId) {
31
- const parsed = parseProviderError(error);
32
- const account = Schema_exports.decodeUnknownOption(AccountId)(accountId);
33
- if (Option_exports.isNone(parsed) || Option_exports.isNone(account)) return error;
34
- return new ProviderError({
35
- reason: parsed.value.reason,
36
- status: parsed.value.status,
37
- accountId: account.value
38
- });
39
- }
40
- function graphqlProviderError(errors, status) {
41
- const codes = errors.flatMap((error) => {
42
- const parsed = Schema_exports.decodeUnknownOption(
43
- Schema_exports.Struct({
44
- type: Schema_exports.optional(Schema_exports.String),
45
- extensions: Schema_exports.optional(Schema_exports.Struct({ code: Schema_exports.optional(Schema_exports.String) }))
46
- })
47
- )(error);
48
- return Option_exports.isSome(parsed) ? [parsed.value.type, parsed.value.extensions?.code] : [];
49
- });
50
- if (codes.includes("RATE_LIMITED") || codes.includes("TOO_MANY_REQUESTS"))
51
- return new ProviderError({ reason: "rate_limited", status });
52
- if (codes.includes("UNAUTHENTICATED"))
53
- return new ProviderError({ reason: "unauthorized", status });
54
- if (codes.includes("FORBIDDEN")) return new ProviderError({ reason: "forbidden", status });
55
- return void 0;
56
- }
57
-
58
- export {
59
- parseProviderError,
60
- httpProviderError,
61
- accountProviderError,
62
- graphqlProviderError
63
- };
@@ -1,186 +0,0 @@
1
- import {
2
- Schema_exports
3
- } from "./chunk-CDL5PM2Q.js";
4
-
5
- // ../app-data/src/contracts/database.ts
6
- var DataName = Schema_exports.String.check(
7
- Schema_exports.makeFilter((value) => /^[A-Za-z][A-Za-z0-9_]*$/.test(value) && value.length <= 128)
8
- );
9
- var Scalar = Schema_exports.Union([Schema_exports.String, Schema_exports.Finite, Schema_exports.Boolean]);
10
- var Field = Schema_exports.Struct({
11
- kind: Schema_exports.Literals(["string", "number", "boolean", "id", "userId"]),
12
- optional: Schema_exports.optional(Schema_exports.Boolean),
13
- default: Schema_exports.optional(Scalar),
14
- references: Schema_exports.optional(DataName)
15
- });
16
- var Index = Schema_exports.Struct({ name: DataName, fields: Schema_exports.NonEmptyArray(DataName) });
17
- var Table = Schema_exports.Struct({
18
- fields: Schema_exports.Record(DataName, Field),
19
- indexes: Schema_exports.Array(Index)
20
- });
21
- var DatabaseSchema = Schema_exports.Record(DataName, Table);
22
- var Row = Schema_exports.Record(Schema_exports.String, Scalar);
23
- var RowMetadata = Schema_exports.Struct({
24
- id: Schema_exports.NonEmptyString,
25
- createdAt: Schema_exports.String,
26
- updatedAt: Schema_exports.String
27
- });
28
- var Patch = Schema_exports.Record(DataName, Schema_exports.NullOr(Scalar));
29
- var RangeClause = Schema_exports.Struct({
30
- field: DataName,
31
- op: Schema_exports.Literals(["eq", "gt", "gte", "lt", "lte"]),
32
- value: Schema_exports.NullOr(Scalar)
33
- });
34
- var QueryPlan = Schema_exports.Struct({
35
- table: DataName,
36
- index: DataName,
37
- order: Schema_exports.Literals(["asc", "desc"]),
38
- clauses: Schema_exports.Array(RangeClause)
39
- });
40
- var QueryTerminal = Schema_exports.Union([
41
- Schema_exports.Struct({ kind: Schema_exports.Literal("collect") }),
42
- Schema_exports.Struct({ kind: Schema_exports.Literal("count") }),
43
- Schema_exports.Struct({ kind: Schema_exports.Literal("first") }),
44
- Schema_exports.Struct({
45
- kind: Schema_exports.Literal("take"),
46
- count: Schema_exports.Int.check(Schema_exports.isGreaterThanOrEqualTo(0))
47
- }),
48
- Schema_exports.Struct({
49
- kind: Schema_exports.Literal("paginate"),
50
- cursor: Schema_exports.NullOr(Schema_exports.String),
51
- numItems: Schema_exports.Int.check(Schema_exports.isGreaterThan(0))
52
- })
53
- ]);
54
- var DatabaseOperation = Schema_exports.Union([
55
- Schema_exports.Struct({ kind: Schema_exports.Literal("get"), table: DataName, id: Schema_exports.NonEmptyString }),
56
- Schema_exports.Struct({ kind: Schema_exports.Literal("insert"), table: DataName, value: Patch }),
57
- Schema_exports.Struct({
58
- kind: Schema_exports.Literal("update"),
59
- table: DataName,
60
- id: Schema_exports.NonEmptyString,
61
- patch: Patch
62
- }),
63
- Schema_exports.Struct({ kind: Schema_exports.Literal("delete"), table: DataName, id: Schema_exports.NonEmptyString }),
64
- Schema_exports.Struct({ kind: Schema_exports.Literal("query"), plan: QueryPlan, terminal: QueryTerminal })
65
- ]);
66
- var PaginationResult = Schema_exports.Struct({
67
- page: Schema_exports.Array(Row),
68
- continueCursor: Schema_exports.NullOr(Schema_exports.String),
69
- isDone: Schema_exports.Boolean
70
- });
71
- var OperationResult = Schema_exports.Union([
72
- Row,
73
- Schema_exports.Array(Row),
74
- PaginationResult,
75
- Schema_exports.Boolean,
76
- Schema_exports.Finite,
77
- Schema_exports.Null
78
- ]);
79
- var AppDatabaseError = class extends Schema_exports.TaggedError()("AppDatabaseError", {
80
- reason: Schema_exports.Literals([
81
- "schema",
82
- "schema_changed",
83
- "table",
84
- "index",
85
- "range",
86
- "value",
87
- "readonly",
88
- "cursor",
89
- "limit",
90
- "closed",
91
- "storage",
92
- "replay"
93
- ])
94
- }) {
95
- };
96
- var DatabaseLimits = Schema_exports.Struct({
97
- rowsRead: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
98
- rowsReturned: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
99
- bytesRead: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
100
- writes: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
101
- scanCalls: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
102
- directGets: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
103
- valueBytes: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
104
- indexBytes: Schema_exports.Int.check(Schema_exports.isGreaterThan(0))
105
- });
106
- var defaultDatabaseLimits = {
107
- rowsRead: 5e3,
108
- rowsReturned: 1e3,
109
- bytesRead: 4 * 1024 * 1024,
110
- writes: 1e3,
111
- scanCalls: 100,
112
- directGets: 1e3,
113
- valueBytes: 64 * 1024,
114
- indexBytes: 2048
115
- };
116
- var DatabaseLimit = Schema_exports.Literals([
117
- "scanCalls",
118
- "directGets",
119
- "rowsRead",
120
- "rowsReturned",
121
- "pageSize",
122
- "bytesRead",
123
- "writes",
124
- "valueBytes"
125
- ]);
126
- var count = (value) => value.toLocaleString("en-US");
127
- var limitMessages = {
128
- scanCalls: (maximum, requested) => `This invocation made ${count(requested)} index queries; the limit is ${count(maximum)}. Each first(), take(), collect(), count() or paginate() call on withIndex(...) counts once. Read related rows with one take() or paginate() over a shared index prefix instead of one first() per item, use get(id) for known IDs, or split the work across workflow steps.`,
129
- directGets: (maximum, requested) => `This invocation made ${count(requested)} get(id) calls, including those made by update and delete; the limit is ${count(maximum)}. Split the work across workflow steps or mutations.`,
130
- rowsRead: (maximum, requested) => `This invocation scanned ${count(requested)} rows; the limit is ${count(maximum)}. Narrow the index range, or page with paginate() across calls or workflow steps.`,
131
- rowsReturned: (maximum, requested) => `This invocation returned ${count(requested)} rows; the limit is ${count(maximum)}. collect() fails rather than truncating. Page with paginate() across calls or workflow steps.`,
132
- pageSize: (maximum, requested) => `One call asked for ${count(requested)} rows; take(n) and paginate({ numItems }) accept at most ${count(maximum)}. Page with paginate() across calls or workflow steps.`,
133
- bytesRead: (maximum, requested) => `This invocation read ${count(requested)} bytes; the limit is ${count(maximum)}. Read fewer or smaller rows per call, or page with paginate() across calls or workflow steps.`,
134
- writes: (maximum, requested) => `This mutation made ${count(requested)} writes; the limit is ${count(maximum)}. Split large ingests into batches, one batch per mutation or workflow step.`,
135
- valueBytes: (maximum, requested) => `A row encodes to ${count(requested)} bytes; each row may use at most ${count(maximum)}. Store large content outside the row or split it across rows.`
136
- };
137
- var DatabaseLimitExceeded = class extends Schema_exports.TaggedError()(
138
- "DatabaseLimitExceeded",
139
- {
140
- limit: DatabaseLimit,
141
- maximum: Schema_exports.Int,
142
- requested: Schema_exports.Int
143
- }
144
- ) {
145
- get message() {
146
- return limitMessages[this.limit](this.maximum, this.requested);
147
- }
148
- };
149
- var reservedFieldNames = ["id", "createdAt", "updatedAt"];
150
- var DatabaseFieldReserved = class extends Schema_exports.TaggedError()(
151
- "DatabaseFieldReserved",
152
- {
153
- table: Schema_exports.String,
154
- field: Schema_exports.Literals(reservedFieldNames)
155
- }
156
- ) {
157
- get message() {
158
- return `Table "${this.table}" declares "${this.field}", which is reserved: the host adds id, createdAt and updatedAt to every row. Rename the field, or use the row's own ${this.field}.`;
159
- }
160
- };
161
- var DatabaseRuntimeLimits = Schema_exports.Struct({
162
- maxCursorChars: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
163
- connectionCacheCapacity: Schema_exports.Int.check(Schema_exports.isGreaterThan(0)),
164
- connectionCacheTtlMs: Schema_exports.Int.check(Schema_exports.isGreaterThan(0))
165
- });
166
- var defaultDatabaseRuntimeLimits = DatabaseRuntimeLimits.make({
167
- maxCursorChars: 8192,
168
- connectionCacheCapacity: 64,
169
- connectionCacheTtlMs: 5 * 60 * 1e3
170
- });
171
-
172
- export {
173
- DatabaseSchema,
174
- Row,
175
- RowMetadata,
176
- RangeClause,
177
- DatabaseOperation,
178
- PaginationResult,
179
- AppDatabaseError,
180
- DatabaseLimits,
181
- defaultDatabaseLimits,
182
- DatabaseLimitExceeded,
183
- reservedFieldNames,
184
- DatabaseFieldReserved,
185
- defaultDatabaseRuntimeLimits
186
- };
@@ -1,172 +0,0 @@
1
- import {
2
- CacheAcquired,
3
- CacheEntry,
4
- CacheError,
5
- cacheLimits
6
- } from "./chunk-R3EV5FTO.js";
7
- import {
8
- Clock_exports,
9
- Duration_exports,
10
- Effect_exports,
11
- Exit_exports,
12
- Schema_exports
13
- } from "./chunk-CDL5PM2Q.js";
14
-
15
- // ../app-cache/src/index.ts
16
- var canonical = (value) => {
17
- if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
18
- if (value !== null && typeof value === "object")
19
- return `{${Object.entries(value).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([key, item]) => `${JSON.stringify(key)}:${canonical(item)}`).join(",")}}`;
20
- return JSON.stringify(value);
21
- };
22
- var cacheKey = (key) => Effect_exports.gen(function* () {
23
- const parsed = yield* Schema_exports.decodeUnknownEffect(Schema_exports.Json)(key).pipe(
24
- Effect_exports.mapError(() => new CacheError({ reason: "invalid" }))
25
- );
26
- const bytes = new TextEncoder().encode(canonical(parsed));
27
- if (bytes.byteLength > cacheLimits.keyBytes)
28
- return yield* new CacheError({ reason: "capacity" });
29
- const hash = yield* Effect_exports.tryPromise({
30
- try: () => crypto.subtle.digest("SHA-256", bytes),
31
- catch: () => new CacheError({ reason: "invalid" })
32
- });
33
- return [...new Uint8Array(hash)].map((byte) => byte.toString(16).padStart(2, "0")).join("");
34
- });
35
- var makeCache = (host, background, scope = "shared", deadline) => {
36
- const transport = (command) => host(command).pipe(
37
- Effect_exports.withSpan("app.cache.command", {
38
- attributes: { "cache.operation": command.operation }
39
- })
40
- );
41
- const keyOf = (key) => cacheKey([scope, key]);
42
- const readKeys = (keys) => transport({ operation: "read", keys }).pipe(
43
- Effect_exports.flatMap(Schema_exports.decodeUnknownEffect(Schema_exports.Array(Schema_exports.NullOr(CacheEntry)))),
44
- Effect_exports.mapError(() => new CacheError({ reason: "storage" }))
45
- );
46
- const durations = (freshFor, staleFor = 0) => Effect_exports.try({
47
- try: () => {
48
- const fresh = Duration_exports.toMillis(Duration_exports.fromInputUnsafe(freshFor));
49
- const stale = Duration_exports.toMillis(Duration_exports.fromInputUnsafe(staleFor));
50
- if (![fresh, stale].every((value) => Number.isFinite(value) && value >= 0) || fresh + stale > cacheLimits.retentionMs)
51
- throw new CacheError({ reason: "invalid" });
52
- return { fresh, stale };
53
- },
54
- catch: () => new CacheError({ reason: "invalid" })
55
- });
56
- const get = (options, refresh) => Effect_exports.gen(function* () {
57
- const key = yield* keyOf(options.key);
58
- const { fresh, stale } = yield* durations(options.freshFor, options.staleFor);
59
- const decode = (value) => Schema_exports.decodeUnknownEffect(options.schema)(value);
60
- const load = (lease) => Effect_exports.gen(function* () {
61
- const value = yield* options.load.pipe(Effect_exports.flatMap(decode));
62
- const json = yield* Schema_exports.decodeUnknownEffect(Schema_exports.Json)(value).pipe(
63
- Effect_exports.mapError(() => new CacheError({ reason: "invalid" }))
64
- );
65
- const now = yield* Clock_exports.currentTimeMillis;
66
- const published = yield* transport({
67
- operation: "publish",
68
- key,
69
- lease,
70
- entry: {
71
- value: json,
72
- version: crypto.randomUUID(),
73
- freshUntil: now + fresh,
74
- staleUntil: now + fresh + stale
75
- }
76
- }).pipe(Effect_exports.withSpan("app.cache.publish"));
77
- if (published !== true) return yield* new CacheError({ reason: "unavailable" });
78
- return value;
79
- }).pipe(
80
- Effect_exports.withSpan("app.cache.load"),
81
- Effect_exports.timeout(cacheLimits.loadTimeoutMs),
82
- // Publishing clears the lease in the same transaction. Only an unpublished load releases it.
83
- Effect_exports.onExit(
84
- (exit) => Exit_exports.isSuccess(exit) ? Effect_exports.void : transport({ operation: "release", key, lease }).pipe(
85
- Effect_exports.catch(() => Effect_exports.void)
86
- )
87
- )
88
- );
89
- const waitUntil = Math.min(
90
- (yield* Clock_exports.currentTimeMillis) + cacheLimits.waitMs,
91
- deadline ?? Number.POSITIVE_INFINITY
92
- );
93
- let initialVersion;
94
- while (true) {
95
- const { entry, lease } = yield* transport({
96
- operation: "acquire",
97
- key,
98
- refresh,
99
- ...initialVersion === void 0 ? {} : { version: initialVersion }
100
- }).pipe(
101
- Effect_exports.flatMap(
102
- (reply) => Schema_exports.decodeUnknownEffect(CacheAcquired)(reply).pipe(
103
- Effect_exports.mapError(() => new CacheError({ reason: "storage" }))
104
- )
105
- )
106
- );
107
- const now = yield* Clock_exports.currentTimeMillis;
108
- if (initialVersion === void 0) initialVersion = entry?.version ?? null;
109
- const refreshed = refresh && entry !== null && entry.version !== initialVersion;
110
- if (entry !== null && (refreshed || !refresh && lease === null && now < entry.freshUntil)) {
111
- yield* Effect_exports.annotateCurrentSpan("cache.result", "fresh");
112
- return yield* decode(entry.value);
113
- }
114
- if (!refresh && entry !== null && now < entry.staleUntil) {
115
- yield* Effect_exports.annotateCurrentSpan("cache.result", "stale");
116
- if (lease !== null) yield* background(load(lease).pipe(Effect_exports.asVoid));
117
- return yield* decode(entry.value);
118
- }
119
- if (lease !== null) {
120
- yield* Effect_exports.annotateCurrentSpan("cache.result", "miss");
121
- return yield* load(lease);
122
- }
123
- if (now >= waitUntil) {
124
- yield* Effect_exports.annotateCurrentSpan("cache.result", "local");
125
- return yield* options.load.pipe(
126
- Effect_exports.flatMap(decode),
127
- Effect_exports.timeout(cacheLimits.loadTimeoutMs),
128
- Effect_exports.withSpan("app.cache.load", { attributes: { "cache.load.leased": false } })
129
- );
130
- }
131
- yield* Effect_exports.sleep("100 millis");
132
- }
133
- }).pipe(Effect_exports.withSpan("app.cache.get"));
134
- return {
135
- /** Read arbitrary retained JSON entries without initiating a refresh. Missing and null are distinct. */
136
- read: (keys) => Effect_exports.forEach(keys, keyOf).pipe(Effect_exports.flatMap(readKeys)),
137
- /** Publish bounded immutable parts before publishing the manifest that references them. */
138
- write: (entries, retention) => Effect_exports.gen(function* () {
139
- const { fresh } = yield* durations(retention);
140
- const now = yield* Clock_exports.currentTimeMillis;
141
- const values = yield* Effect_exports.forEach(
142
- entries,
143
- ({ key, value }) => Effect_exports.gen(function* () {
144
- return {
145
- key: yield* keyOf(key),
146
- entry: {
147
- value,
148
- version: crypto.randomUUID(),
149
- freshUntil: now + fresh,
150
- staleUntil: now + fresh
151
- }
152
- };
153
- })
154
- );
155
- yield* transport({ operation: "write", entries: values });
156
- }),
157
- /** Revoke retained data and any loader's right to publish its in-flight result. */
158
- invalidate: (key) => keyOf(key).pipe(
159
- Effect_exports.flatMap((key2) => transport({ operation: "invalidate", key: key2 })),
160
- Effect_exports.asVoid
161
- ),
162
- /** Read fresh data, refresh stale data in the background, or wait for the lease owner. */
163
- get: (options) => get(options, false),
164
- /** Force one awaited refresh without removing the retained value. Concurrent refreshes share a load. */
165
- revalidate: (options) => get(options, true)
166
- };
167
- };
168
-
169
- export {
170
- cacheKey,
171
- makeCache
172
- };