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.
- package/README.md +60 -42
- package/framework-reference.json +1 -1
- package/js/chunk-2RGJMA7N.js +5186 -0
- package/js/chunk-3BI34I5S.js +449 -0
- package/js/chunk-3BOEMXAJ.js +713 -0
- package/js/{chunk-JU7VHODU.js → chunk-4PIQKACY.js} +65 -10
- package/js/{chunk-VFZKSM3T.js → chunk-4X2UI4R2.js} +3 -3
- package/js/{chunk-KUMBKVJD.js → chunk-62NVUKED.js} +2 -2
- package/js/chunk-74H25C4X.js +95 -0
- package/js/chunk-7HG422GB.js +90 -0
- package/js/{chunk-UK573G7W.js → chunk-ACQXVKVQ.js} +87 -51
- package/js/chunk-BKIQCV72.js +994 -0
- package/js/{chunk-IJX4CYZO.js → chunk-DILSCQPJ.js} +228 -264
- package/js/chunk-HLMJBE4T.js +49 -0
- package/js/{chunk-RELFXUOO.js → chunk-JCX2K2SI.js} +931 -289
- package/js/{chunk-M3B3DE4K.js → chunk-KLSEU35Y.js} +463 -218
- package/js/chunk-OD3KFKZD.js +1617 -0
- package/js/chunk-OIH73VFM.js +175 -0
- package/js/chunk-OWN3DP2W.js +88 -0
- package/js/{chunk-IPI4MFSN.js → chunk-PBGPES67.js} +2 -2
- package/js/{chunk-WVVV4TX2.js → chunk-RIV62DRM.js} +4 -3
- package/js/{chunk-RFVIONFX.js → chunk-SXQVVXJE.js} +123 -44
- package/js/chunk-UPTAFF6L.js +335 -0
- package/js/{chunk-ODEIDRGW.js → chunk-URKOTNDA.js} +795 -176
- package/js/{chunk-5T57N25Q.js → chunk-VAI3EVCS.js} +643 -69
- package/js/{chunk-57RKNWL2.js → chunk-YDW7DX3A.js} +4 -4
- package/js/{chunk-CDL5PM2Q.js → chunk-ZKDXML77.js} +19239 -18404
- package/js/{chunk-GPFVWWDZ.js → chunk-ZXG7RMCB.js} +113 -58
- package/js/client.js +148 -84
- package/js/contracts.js +150 -21
- package/js/effect.js +18 -19
- package/js/{es-APDZKREY.js → es-DIULA3ZF.js} +62 -1659
- package/js/graphql.js +231 -188
- package/js/host.js +116 -78
- package/js/index.js +213 -98
- package/js/mcp/effect.js +21 -21
- package/js/mcp.js +91 -57
- package/js/openapi.js +4349 -1415
- package/js/react.js +2 -3
- package/js/skills/effect.js +6 -3
- package/js/skills.js +208 -81
- package/js/storage/facet.js +1 -540
- package/js/ui/auth/contracts.js +2 -2
- package/js/ui/auth.js +5 -5
- package/js/ui/contracts.js +9 -8
- package/js/ui/serving.js +8609 -228
- package/package.json +3 -8
- package/runtime.json +1 -1
- package/types/app-cache/src/contracts/cache.d.ts +18 -0
- package/types/app-cache/src/index.d.ts +34 -2
- package/types/apps/src/contracts/api-response-error.d.ts +4 -0
- package/types/apps/src/contracts/app.d.ts +56 -11
- package/types/apps/src/contracts/cache.d.ts +20 -0
- package/types/apps/src/contracts/context.d.ts +60 -17
- package/types/apps/src/contracts/elicitation.d.ts +23 -7
- package/types/apps/src/contracts/events.d.ts +94 -0
- package/types/apps/src/contracts/failure.d.ts +30 -1
- package/types/apps/src/contracts/graphql.d.ts +40 -2
- package/types/apps/src/contracts/host.d.ts +1456 -20
- package/types/apps/src/contracts/icons.d.ts +28 -0
- package/types/apps/src/contracts/live.d.ts +2 -0
- package/types/apps/src/contracts/mcp.d.ts +81 -20
- package/types/apps/src/contracts/network.d.ts +120 -0
- package/types/apps/src/contracts/openapi-compile.d.ts +82 -3
- package/types/apps/src/contracts/openapi-document.d.ts +1 -1
- package/types/apps/src/contracts/openapi.d.ts +41 -9
- package/types/apps/src/contracts/operations.d.ts +14 -7
- package/types/apps/src/contracts/placement.d.ts +102 -0
- package/types/apps/src/contracts/protocol-version.d.ts +2 -2
- package/types/apps/src/contracts/protocols/1.d.ts +733 -81
- package/types/apps/src/contracts/protocols/10.d.ts +1450 -0
- package/types/apps/src/contracts/protocols/11.d.ts +1149 -0
- package/types/apps/src/contracts/protocols/12.d.ts +3310 -0
- package/types/apps/src/contracts/protocols/2.d.ts +69 -26
- package/types/apps/src/contracts/protocols/3.d.ts +133 -33
- package/types/apps/src/contracts/protocols/4.d.ts +122 -45
- package/types/apps/src/contracts/protocols/5.d.ts +157 -47
- package/types/apps/src/contracts/protocols/6.d.ts +1629 -0
- package/types/apps/src/contracts/protocols/7.d.ts +1785 -0
- package/types/apps/src/contracts/protocols/8.d.ts +1182 -0
- package/types/apps/src/contracts/protocols/9.d.ts +1104 -0
- package/types/apps/src/contracts/protocols/current.d.ts +6869 -0
- package/types/apps/src/contracts/protocols/oauth-6.d.ts +74 -0
- package/types/apps/src/contracts/protocols/oauth.d.ts +134 -0
- package/types/apps/src/contracts/provider-error.d.ts +9 -0
- package/types/apps/src/contracts/provider.d.ts +85 -6
- package/types/apps/src/contracts/router.d.ts +2 -1
- package/types/apps/src/contracts/schedules.d.ts +7 -1
- package/types/apps/src/contracts/schema.d.ts +21 -0
- package/types/apps/src/contracts/shared-catalog.d.ts +11 -0
- package/types/apps/src/contracts/skills.d.ts +50 -13
- package/types/apps/src/contracts/sql.d.ts +63 -0
- package/types/apps/src/contracts/ui.d.ts +70 -30
- package/types/apps/src/contracts/webhooks.d.ts +24 -7
- package/types/apps/src/contracts/workflows.d.ts +56 -34
- package/types/apps/src/facet.d.ts +4 -5
- package/types/apps/src/host.d.ts +5 -0
- package/types/apps/src/implementation/account-router.d.ts +4 -3
- package/types/apps/src/implementation/app.d.ts +41 -14
- package/types/apps/src/implementation/authoring.d.ts +25 -5
- package/types/apps/src/implementation/browser-scripts.gen.d.ts +6 -0
- package/types/apps/src/implementation/cache.d.ts +29 -2
- package/types/apps/src/implementation/catalog-cache.d.ts +35 -4
- package/types/apps/src/implementation/elicitation.d.ts +18 -15
- package/types/apps/src/implementation/events.d.ts +64 -0
- package/types/apps/src/implementation/failure-detail.d.ts +28 -5
- package/types/apps/src/implementation/graphql-catalog.d.ts +3 -3
- package/types/apps/src/implementation/graphql.d.ts +4 -3
- package/types/apps/src/implementation/input-problems.d.ts +6 -2
- package/types/apps/src/implementation/invocation-timing.d.ts +18 -0
- package/types/apps/src/implementation/live.d.ts +2 -2
- package/types/apps/src/implementation/mcp-call.d.ts +6 -5
- package/types/apps/src/implementation/mcp-catalog.d.ts +6 -4
- package/types/apps/src/implementation/mcp-client.d.ts +17 -9
- package/types/apps/src/implementation/mcp-tools.d.ts +2 -1
- package/types/apps/src/implementation/mcp.d.ts +20 -9
- package/types/apps/src/implementation/network.d.ts +16 -0
- package/types/apps/src/implementation/openapi-compile.d.ts +38 -7
- package/types/apps/src/implementation/openapi-document.d.ts +50 -20
- package/types/apps/src/implementation/openapi-names.d.ts +9 -4
- package/types/apps/src/implementation/openapi-request.d.ts +10 -2
- package/types/apps/src/implementation/openapi-source.d.ts +23 -1
- package/types/apps/src/implementation/openapi-upgrade.d.ts +4 -0
- package/types/apps/src/implementation/operations.d.ts +58 -7
- package/types/apps/src/implementation/optimistic.d.ts +1 -1
- package/types/apps/src/implementation/placement.d.ts +60 -0
- package/types/apps/src/implementation/protocol-operations.d.ts +3 -0
- package/types/apps/src/implementation/provider-error.d.ts +28 -1
- package/types/apps/src/implementation/provider.d.ts +19 -4
- package/types/apps/src/implementation/query-commit.d.ts +1 -1
- package/types/apps/src/implementation/router-catalog.d.ts +24 -18
- package/types/apps/src/implementation/router.d.ts +26 -6
- package/types/apps/src/implementation/runtime-yield.d.ts +7 -0
- package/types/apps/src/implementation/schedules.d.ts +39 -8
- package/types/apps/src/implementation/schema.d.ts +108 -11
- package/types/apps/src/implementation/skills.d.ts +18 -24
- package/types/apps/src/implementation/sql.d.ts +71 -0
- package/types/apps/src/implementation/ui-account-notice.d.ts +9 -0
- package/types/apps/src/implementation/ui-auth.d.ts +1 -1
- package/types/apps/src/implementation/ui-client.d.ts +3 -3
- package/types/apps/src/implementation/ui-document.d.ts +5 -0
- package/types/apps/src/implementation/ui-errors.d.ts +1 -1
- package/types/apps/src/implementation/ui-serving.d.ts +28 -11
- package/types/apps/src/implementation/ui-watch.d.ts +1 -1
- package/types/apps/src/implementation/upstream-error.d.ts +17 -0
- package/types/apps/src/implementation/webhooks.d.ts +15 -6
- package/types/apps/src/implementation/workflow-context.d.ts +6 -2
- package/types/apps/src/implementation/workflows.d.ts +11 -4
- package/types/apps/src/index.d.ts +51 -16
- package/types/apps/src/mcp.d.ts +20 -1
- package/types/apps/src/openapi.d.ts +22 -1
- package/types/apps/src/react.d.ts +1 -1
- package/types/apps/src/skills.d.ts +10 -8
- package/types/apps/src/ui-serving.d.ts +1 -1
- package/types/telemetry/src/app-records.d.ts +42 -0
- package/types/telemetry/src/browser-operations.d.ts +2 -2
- package/types/telemetry/src/browser.d.ts +8 -3
- package/types/telemetry/src/config.d.ts +2 -2
- package/types/telemetry/src/index.d.ts +2 -1
- package/types/telemetry/src/layer.d.ts +10 -4
- package/types/telemetry/src/measurements.d.ts +1 -1
- package/types/telemetry/src/ownership.d.ts +60 -0
- package/types/telemetry/src/recorded-failure.d.ts +29 -0
- package/types/telemetry/src/relay.d.ts +16 -6
- package/types/telemetry/src/span-attributes.d.ts +17 -1
- package/types/telemetry/src/transport.d.ts +8 -1
- package/types/utils/src/api-error.d.ts +55 -0
- package/types/utils/src/connection-failure.d.ts +33 -0
- package/types/utils/src/legacy-keys.d.ts +20 -0
- package/types/utils/src/recorded-message.d.ts +18 -0
- package/types/utils/src/schema-definitions.d.ts +13 -0
- package/types/utils/src/user-facing-error.d.ts +83 -0
- package/js/chunk-27F7W2LG.js +0 -34
- package/js/chunk-EFAPIRVB.js +0 -299
- package/js/chunk-KRSCJDTW.js +0 -2668
- package/js/chunk-MKWZPDR6.js +0 -63
- package/js/chunk-N7YDVXYJ.js +0 -186
- package/js/chunk-NKLWZJLE.js +0 -172
- package/js/chunk-PJJ24GU7.js +0 -877
- package/js/chunk-PZB6T6KU.js +0 -19
- package/js/chunk-R3EV5FTO.js +0 -97
- package/js/chunk-TYVDBQSI.js +0 -242
- package/js/chunk-YBRC463S.js +0 -224
- package/js/chunk-Z2QY3YTF.js +0 -507
- package/js/chunk-ZQINWV4W.js +0 -630
- package/js/mcp/stdio.js +0 -128
- package/types/app-data/src/implementation/cursor.d.ts +0 -10
- package/types/app-data/src/implementation/index-key.d.ts +0 -7
- package/types/app-data/src/implementation/promise.d.ts +0 -68
- package/types/app-data/src/implementation/range.d.ts +0 -8
- package/types/app-data/src/implementation/schema.d.ts +0 -18
- package/types/app-data/src/implementation/sqlite.d.ts +0 -11
- package/types/app-data/src/index.d.ts +0 -4
- package/types/apps/src/contracts/storage.d.ts +0 -68
- package/types/apps/src/implementation/mcp-stdio.d.ts +0 -4
- package/types/apps/src/implementation/storage.d.ts +0 -15
- package/types/apps/src/mcp-stdio.d.ts +0 -5
|
@@ -4,10 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { Effect, Schema } from "effect";
|
|
6
6
|
import { HostDeclarationInvalid, HostEvaluationFailed, type HostRouterError } from "../contracts/host.js";
|
|
7
|
-
import { McpError } from "../contracts/mcp.js";
|
|
8
7
|
import type { AppOperation } from "../contracts/operations.js";
|
|
9
8
|
import type { AppRouter, DynamicRouter, RouterMeta } from "../contracts/router.js";
|
|
10
|
-
import { SkillLoadFailed } from "../contracts/skills.js";
|
|
11
9
|
import type { OperationSchedule } from "../contracts/schedules.js";
|
|
12
10
|
/**
|
|
13
11
|
* Keep only a failure's safe fields. Anything unrecognized becomes an evaluation failure with the
|
|
@@ -29,8 +27,9 @@ export declare const routerSkillPrefix = "tools";
|
|
|
29
27
|
export declare const routerSkillName: (path: string) => string;
|
|
30
28
|
/** A declared operation's catalog entry without schemas. `router` is its owning router's path. */
|
|
31
29
|
export declare const operationSummary: (name: string, router: string, operation: AppOperation, schedules?: readonly OperationSchedule[]) => Effect.Effect<{
|
|
32
|
-
readonly name: string;
|
|
33
30
|
readonly description: string;
|
|
31
|
+
readonly name: string;
|
|
32
|
+
readonly router?: string;
|
|
34
33
|
readonly title?: string;
|
|
35
34
|
readonly annotations?: {
|
|
36
35
|
readonly title?: string;
|
|
@@ -52,21 +51,23 @@ export declare const operationSummary: (name: string, router: string, operation:
|
|
|
52
51
|
};
|
|
53
52
|
};
|
|
54
53
|
readonly input: Schema.Json;
|
|
54
|
+
readonly scope?: "app";
|
|
55
55
|
}[];
|
|
56
56
|
readonly readOnly?: boolean;
|
|
57
|
-
readonly router?: string;
|
|
58
57
|
readonly tags?: readonly string[];
|
|
58
|
+
readonly kindConfirmed?: boolean;
|
|
59
59
|
}, HostDeclarationInvalid, never>;
|
|
60
60
|
/** A declared operation's full description, including rendered schemas. */
|
|
61
61
|
export declare const operationDescription: (name: string, router: string, operation: AppOperation, schedules?: readonly OperationSchedule[]) => Effect.Effect<{
|
|
62
|
-
readonly name: string;
|
|
63
62
|
readonly description: string;
|
|
63
|
+
readonly name: string;
|
|
64
64
|
readonly inputSchema: {
|
|
65
65
|
readonly [x: string]: Schema.Json;
|
|
66
66
|
};
|
|
67
67
|
readonly _meta?: {
|
|
68
68
|
readonly [x: string]: Schema.Json;
|
|
69
69
|
};
|
|
70
|
+
readonly router?: string;
|
|
70
71
|
readonly title?: string;
|
|
71
72
|
readonly annotations?: {
|
|
72
73
|
readonly title?: string;
|
|
@@ -91,14 +92,15 @@ export declare const operationDescription: (name: string, router: string, operat
|
|
|
91
92
|
};
|
|
92
93
|
};
|
|
93
94
|
readonly input: Schema.Json;
|
|
95
|
+
readonly scope?: "app";
|
|
94
96
|
}[];
|
|
95
97
|
readonly readOnly?: boolean;
|
|
96
|
-
readonly router?: string;
|
|
97
98
|
readonly tags?: readonly string[];
|
|
99
|
+
readonly kindConfirmed?: boolean;
|
|
98
100
|
}, HostDeclarationInvalid, never>;
|
|
99
101
|
/**
|
|
100
|
-
* A dynamic router over operations already discovered, such as an eager OpenAPI document
|
|
101
|
-
*
|
|
102
|
+
* A dynamic router over operations already discovered, such as an eager OpenAPI document.
|
|
103
|
+
* Upstream names can contain dots, which static router keys cannot.
|
|
102
104
|
*/
|
|
103
105
|
export declare const fixedRouter: (operations: Readonly<Record<string, AppOperation>>, meta?: RouterMeta) => DynamicRouter;
|
|
104
106
|
export interface CatalogOptions {
|
|
@@ -122,14 +124,15 @@ export interface CatalogOptions {
|
|
|
122
124
|
*/
|
|
123
125
|
export declare const readCatalog: (root: AppRouter | DynamicRouter | undefined, options: CatalogOptions) => Effect.Effect<{
|
|
124
126
|
tools: ({
|
|
125
|
-
readonly name: string;
|
|
126
127
|
readonly description: string;
|
|
128
|
+
readonly name: string;
|
|
127
129
|
readonly inputSchema: {
|
|
128
130
|
readonly [x: string]: Schema.Json;
|
|
129
131
|
};
|
|
130
132
|
readonly _meta?: {
|
|
131
133
|
readonly [x: string]: Schema.Json;
|
|
132
134
|
};
|
|
135
|
+
readonly router?: string;
|
|
133
136
|
readonly title?: string;
|
|
134
137
|
readonly annotations?: {
|
|
135
138
|
readonly title?: string;
|
|
@@ -154,13 +157,15 @@ export declare const readCatalog: (root: AppRouter | DynamicRouter | undefined,
|
|
|
154
157
|
};
|
|
155
158
|
};
|
|
156
159
|
readonly input: Schema.Json;
|
|
160
|
+
readonly scope?: "app";
|
|
157
161
|
}[];
|
|
158
162
|
readonly readOnly?: boolean;
|
|
159
|
-
readonly router?: string;
|
|
160
163
|
readonly tags?: readonly string[];
|
|
164
|
+
readonly kindConfirmed?: boolean;
|
|
161
165
|
} | {
|
|
162
|
-
readonly name: string;
|
|
163
166
|
readonly description: string;
|
|
167
|
+
readonly name: string;
|
|
168
|
+
readonly router?: string;
|
|
164
169
|
readonly title?: string;
|
|
165
170
|
readonly annotations?: {
|
|
166
171
|
readonly title?: string;
|
|
@@ -182,36 +187,37 @@ export declare const readCatalog: (root: AppRouter | DynamicRouter | undefined,
|
|
|
182
187
|
};
|
|
183
188
|
};
|
|
184
189
|
readonly input: Schema.Json;
|
|
190
|
+
readonly scope?: "app";
|
|
185
191
|
}[];
|
|
186
192
|
readonly readOnly?: boolean;
|
|
187
|
-
readonly router?: string;
|
|
188
193
|
readonly tags?: readonly string[];
|
|
194
|
+
readonly kindConfirmed?: boolean;
|
|
189
195
|
})[];
|
|
190
196
|
routers: {
|
|
191
197
|
readonly path: string;
|
|
192
|
-
readonly error?: import("../index.js").ProviderError | SkillLoadFailed | McpError | HostDeclarationInvalid | HostEvaluationFailed;
|
|
193
198
|
readonly description?: string;
|
|
199
|
+
readonly error?: import("../index.js").ProviderError | import("../contracts/host.js").McpError | import("../contracts/host.js").SkillLoadFailed | HostDeclarationInvalid | HostEvaluationFailed;
|
|
194
200
|
readonly title?: string;
|
|
195
|
-
readonly tags?: {
|
|
196
|
-
readonly [x: string]: string;
|
|
197
|
-
};
|
|
198
201
|
readonly icons?: readonly {
|
|
199
202
|
readonly src: string;
|
|
200
203
|
readonly mimeType?: string;
|
|
201
204
|
readonly sizes?: readonly string[];
|
|
202
205
|
readonly theme?: "light" | "dark";
|
|
203
206
|
}[];
|
|
207
|
+
readonly tags?: {
|
|
208
|
+
readonly [x: string]: string;
|
|
209
|
+
};
|
|
204
210
|
readonly skill?: string;
|
|
205
211
|
}[];
|
|
206
|
-
}, import("../index.js").ProviderError |
|
|
212
|
+
}, import("../index.js").ProviderError | import("../contracts/host.js").McpError | import("../contracts/host.js").SkillLoadFailed | HostDeclarationInvalid | HostEvaluationFailed, never>;
|
|
207
213
|
/**
|
|
208
214
|
* One skill for each router with instructions. Skills and tools fail independently: a dynamic
|
|
209
215
|
* router whose metadata cannot be read, including the root, contributes no skill and does not
|
|
210
216
|
* fail the others. Metadata comes through each source's catalog cache, like a tool listing.
|
|
211
217
|
*/
|
|
212
218
|
export declare const routerSkills: (root: AppRouter | DynamicRouter | undefined) => Effect.Effect<{
|
|
213
|
-
readonly name: string;
|
|
214
219
|
readonly description: string;
|
|
220
|
+
readonly name: string;
|
|
215
221
|
readonly files: readonly {
|
|
216
222
|
readonly path: string;
|
|
217
223
|
readonly content: string;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { HostedTool } from "../contracts/host.js";
|
|
2
2
|
import type { AppOperation } from "../contracts/operations.js";
|
|
3
3
|
import { RouterMeta, type AppRouter, type DynamicRouter, type RouterIcon } from "../contracts/router.js";
|
|
4
|
-
import
|
|
5
|
-
|
|
4
|
+
import type { Approval } from "../approval.js";
|
|
5
|
+
import { type OperationChild, type OperationDeclaration, type RouterChild, type RouterDeclaration } from "./operations.js";
|
|
6
|
+
export type { OperationChild, OperationDeclaration, RouterChild, RouterDeclaration, } from "./operations.js";
|
|
6
7
|
/** Author metadata for a router. Instructions become a skill named after the router's path. */
|
|
7
8
|
export interface RouterOptions {
|
|
8
9
|
readonly title?: string;
|
|
@@ -26,13 +27,16 @@ export declare function router<Query = unknown, Mutation = unknown>(children: Re
|
|
|
26
27
|
export declare function router<Query, Mutation>(source: RouterDeclaration<Query, Mutation>, options: RouterOptions): RouterDeclaration<Query, Mutation>;
|
|
27
28
|
/**
|
|
28
29
|
* Declare a router whose tools are discovered when read. `list` returns tools with names relative
|
|
29
|
-
* to this router; mark queries with `readOnly: true
|
|
30
|
+
* to this router; mark queries with `readOnly: true`, and add `kindConfirmed: true` when your code,
|
|
31
|
+
* not an upstream service's claim, decides the kind. `resolve` receives one of those names.
|
|
32
|
+
* The router carries the handler contexts of the operations `resolve` returns, so `defineApp`
|
|
33
|
+
* checks them like a static router's.
|
|
30
34
|
*/
|
|
31
|
-
export declare const dynamicRouter: (source: {
|
|
35
|
+
export declare const dynamicRouter: <Query = unknown, Mutation = unknown>(source: {
|
|
32
36
|
readonly meta?: () => RouterOptions | Promise<RouterOptions>;
|
|
33
37
|
readonly list: () => readonly HostedTool[] | Promise<readonly HostedTool[]>;
|
|
34
|
-
readonly resolve: (name: string) =>
|
|
35
|
-
}) => RouterDeclaration
|
|
38
|
+
readonly resolve: (name: string) => OperationChild<Query, Mutation> | undefined | Promise<OperationChild<Query, Mutation> | undefined>;
|
|
39
|
+
}) => RouterDeclaration<Query, Mutation>;
|
|
36
40
|
/** Join a router path and a relative name. The root router's path is "". */
|
|
37
41
|
export declare const joinPath: (path: string, name: string) => string;
|
|
38
42
|
/** Where a full tool name points: a declared operation, or a name inside a dynamic router. */
|
|
@@ -57,3 +61,19 @@ export declare const declaredOperations: (root: AppRouter | undefined, path?: st
|
|
|
57
61
|
readonly router: string;
|
|
58
62
|
readonly operation: AppOperation;
|
|
59
63
|
}>;
|
|
64
|
+
/**
|
|
65
|
+
* Choose an approval for each operation a router contains, including tools a dynamic router
|
|
66
|
+
* resolves later. `policy` receives the operation and its name relative to this router; returning
|
|
67
|
+
* undefined keeps the operation's own approval. Read hints with `toolAnnotations(operation)`.
|
|
68
|
+
* Apply it to each account's router before `accountRouter` combines them, so every account keeps
|
|
69
|
+
* its own tools' hints.
|
|
70
|
+
*/
|
|
71
|
+
export declare const withApprovals: <Query, Mutation>(source: RouterDeclaration<Query, Mutation>, policy: (operation: OperationDeclaration<"query" | "mutation", never>, name: string) => Approval | undefined) => RouterDeclaration<Query, Mutation>;
|
|
72
|
+
/**
|
|
73
|
+
* Expose a protocol router's tools under other names, such as the names an earlier client used.
|
|
74
|
+
* `rename` receives each tool's name relative to this router and returns the name to expose, or
|
|
75
|
+
* undefined to leave the tool out. When two tools would share a name, the first listed keeps it.
|
|
76
|
+
* Calls and descriptions find a tool by its exposed name. Works on routers that discover their
|
|
77
|
+
* tools, such as `mcpRouter`, `graphqlRouter` and `liveOpenapiRouter`.
|
|
78
|
+
*/
|
|
79
|
+
export declare const renameTools: <Query, Mutation>(source: RouterDeclaration<Query, Mutation>, rename: (name: string) => string | undefined) => RouterDeclaration<Query, Mutation>;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Let the runtime run its own tasks between long synchronous steps. In a Worker, a large OpenAPI
|
|
3
|
+
* compilation that never yields leaves the garbage collector only long, full pauses; yielding
|
|
4
|
+
* between steps measurably shortens it. A timer is used because a resolved promise would continue
|
|
5
|
+
* without leaving the current task.
|
|
6
|
+
*/
|
|
7
|
+
export declare const yieldToRuntime: () => Promise<void>;
|
|
@@ -1,16 +1,47 @@
|
|
|
1
1
|
import { Interval, ScheduleTiming } from "../contracts/schedules.js";
|
|
2
2
|
import { JsonValue } from "../contracts/schema.js";
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
import type { AccountScope } from "../contracts/app.js";
|
|
4
|
+
import { type Operation, type OperationDeclaration, type WithoutApproval } from "./operations.js";
|
|
5
|
+
/**
|
|
6
|
+
* The app adapter resolves this operation handle to its declared mutation name. A `"user"`
|
|
7
|
+
* schedule has one copy per member who enables it, run as them with their linked accounts. An
|
|
8
|
+
* `"app"` schedule is one schedule, enabled by an app manager, run without a caller with the app's
|
|
9
|
+
* accounts only.
|
|
10
|
+
*/
|
|
11
|
+
export interface ScheduleDeclaration<Context = never, Scope extends AccountScope = AccountScope> {
|
|
12
|
+
readonly scope: Scope;
|
|
6
13
|
readonly operation: OperationDeclaration<"mutation", Context>;
|
|
7
14
|
readonly timing: ScheduleTiming;
|
|
8
15
|
readonly input: JsonValue;
|
|
9
16
|
}
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Refuses, with a message the type error shows, a mutation whose handler context has the caller's
|
|
19
|
+
* `user`, such as one that declares a context without a type.
|
|
20
|
+
*/
|
|
21
|
+
type RunsAsApp<Context> = [Context] extends [{
|
|
22
|
+
readonly user: unknown;
|
|
23
|
+
}] ? {
|
|
24
|
+
readonly 'An app schedule runs without a caller: type the handler\'s context as MutationContext<typeof requirements, "app">, pass it as the third type argument, or declare no parameters and pass no type arguments': never;
|
|
25
|
+
} : unknown;
|
|
26
|
+
/** Run an existing mutation at a fixed interval, once per member who enables it, as them. */
|
|
27
|
+
export declare const userInterval: <Input, Output, Context>(duration: Interval, operation: Operation<Input, Output, "mutation", Context>, input: NoInfer<Input>) => ScheduleDeclaration<Context, "user">;
|
|
28
|
+
/**
|
|
29
|
+
* Calendar alternative for wall-clock schedules, once per member who enables it, as them. UTC is the
|
|
30
|
+
* explicit default when timezone is omitted.
|
|
31
|
+
*/
|
|
32
|
+
export declare const userCron: <Input, Output, Context>(calendar: {
|
|
14
33
|
readonly expression: string;
|
|
15
34
|
readonly timezone?: string;
|
|
16
|
-
}, operation: Operation<Input, Output, "mutation", Context>, input: NoInfer<Input>) => ScheduleDeclaration<Context>;
|
|
35
|
+
}, operation: Operation<Input, Output, "mutation", Context>, input: NoInfer<Input>) => ScheduleDeclaration<Context, "user">;
|
|
36
|
+
/**
|
|
37
|
+
* Run an existing mutation at a fixed interval as the app: one schedule an app manager enables, run
|
|
38
|
+
* without a caller with the app's accounts. The mutation takes a context of the `"app"` scope and
|
|
39
|
+
* declares no approval.
|
|
40
|
+
*/
|
|
41
|
+
export declare const appInterval: <Input, Output, Context>(duration: Interval, operation: Operation<Input, Output, "mutation", Context> & WithoutApproval & RunsAsApp<Context>, input: NoInfer<Input>) => ScheduleDeclaration<Context, "app">;
|
|
42
|
+
/** Calendar alternative to `appInterval`. UTC is the explicit default when timezone is omitted. */
|
|
43
|
+
export declare const appCron: <Input, Output, Context>(calendar: {
|
|
44
|
+
readonly expression: string;
|
|
45
|
+
readonly timezone?: string;
|
|
46
|
+
}, operation: Operation<Input, Output, "mutation", Context> & WithoutApproval & RunsAsApp<Context>, input: NoInfer<Input>) => ScheduleDeclaration<Context, "app">;
|
|
47
|
+
export {};
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/** Author schema facade. Internals use the native decoder retained by each value. */
|
|
2
2
|
import { Effect, Schema as EffectSchema } from "effect";
|
|
3
|
-
import { JsonObject, ValidationError } from "../contracts/schema.js";
|
|
4
|
-
import type {
|
|
5
|
-
declare const StorageField: unique symbol;
|
|
3
|
+
import { DeclarationInvalid, JsonObject, ValidationError } from "../contracts/schema.js";
|
|
4
|
+
import type { FieldExposure } from "../contracts/provider.js";
|
|
6
5
|
declare const Decoder: unique symbol;
|
|
7
6
|
/** An author-facing value schema. Effect is never required in author code. */
|
|
8
7
|
export interface Schema<T, Optional extends boolean = false> {
|
|
9
|
-
readonly [StorageField]?: Field;
|
|
10
8
|
readonly [Decoder]: EffectSchema.Decoder<T>;
|
|
11
9
|
readonly optionalValue: Optional;
|
|
12
10
|
/** Parse an unknown value; invalid input throws a safe ValidationError. */
|
|
@@ -37,10 +35,22 @@ export interface ObjectSchema<F extends Fields> extends Schema<ObjectValue<F>> {
|
|
|
37
35
|
export declare const decoderOf: <T>(schema: Schema<T, boolean>) => EffectSchema.Decoder<T>;
|
|
38
36
|
/** Recognize schemas made by this author facade when adapting a definition. */
|
|
39
37
|
export declare const isSchema: (value: unknown) => value is Schema<unknown, boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Source that skipped type checking can pass any value where a schema belongs, such as `string`
|
|
40
|
+
* for `string()`. Name the argument and the mistake before a native constructor reads it.
|
|
41
|
+
*/
|
|
42
|
+
export declare const schemaArgument: <S extends Schema<unknown, boolean>>(value: S, role: string) => S;
|
|
40
43
|
/** Decode within an Effect program. Invalid input is omitted from the failure. */
|
|
41
44
|
export declare const parse: <T>(decoder: EffectSchema.Decoder<T>, input: unknown) => Effect.Effect<T, ValidationError>;
|
|
45
|
+
/**
|
|
46
|
+
* Decode an author's declaration, naming every failing path. A declaration with several forms,
|
|
47
|
+
* such as `oauth2()`'s discovered, declared and client credentials endpoints, is explained by the
|
|
48
|
+
* form its author chose (`intended`), so the problems are that form's, including the options it
|
|
49
|
+
* lacks, rather than every other form's objections. Messages never include the supplied values.
|
|
50
|
+
*/
|
|
51
|
+
export declare const parseDeclaration: <T>(decoder: EffectSchema.Decoder<T>, input: unknown, declaration: string, intended?: (input: unknown) => EffectSchema.Decoder<unknown>) => Effect.Effect<T, DeclarationInvalid>;
|
|
42
52
|
/** Present a native decoder through the synchronous author API. */
|
|
43
|
-
export declare function wrap<T, Optional extends boolean>(decoder: EffectSchema.Decoder<T>, optionalValue: Optional
|
|
53
|
+
export declare function wrap<T, Optional extends boolean>(decoder: EffectSchema.Decoder<T>, optionalValue: Optional): Schema<T, Optional>;
|
|
44
54
|
/** A string, optionally with a minimum length. No coercion. */
|
|
45
55
|
export declare function string(options?: {
|
|
46
56
|
readonly minLength?: number;
|
|
@@ -59,6 +69,44 @@ export declare function literal<const T extends string | number | boolean | null
|
|
|
59
69
|
export declare const array: <T>(item: Schema<T, boolean>) => Schema<readonly T[]>;
|
|
60
70
|
/** Parse declared fields and omit undeclared fields. */
|
|
61
71
|
export declare function object<const F extends Fields>(fields: F): ObjectSchema<F>;
|
|
72
|
+
declare const Exposure: unique symbol;
|
|
73
|
+
/** A schema marked with how app code sees the field in a provider that declares hosts. */
|
|
74
|
+
export type Exposed<S, E extends FieldExposure = FieldExposure> = S & {
|
|
75
|
+
readonly [Exposure]: E;
|
|
76
|
+
};
|
|
77
|
+
/** The marking of one account field, if any. */
|
|
78
|
+
export declare const exposureOf: (schema: Schema<unknown, boolean>) => FieldExposure | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* A field that is not secret, such as a subdomain or region. App code reads its real value and
|
|
81
|
+
* the connect form shows it.
|
|
82
|
+
*/
|
|
83
|
+
export declare const plain: <S extends Schema<unknown, boolean>>(schema: S) => Exposed<S, "plain">;
|
|
84
|
+
/**
|
|
85
|
+
* A secret field that app code reads as its real value, for request signing and similar uses.
|
|
86
|
+
* The connect form warns that the app can read it. Prefer an unmarked field, which app code
|
|
87
|
+
* receives as a handle that only reaches the provider's declared hosts.
|
|
88
|
+
*/
|
|
89
|
+
export declare const raw: <S extends Schema<unknown, boolean>>(schema: S) => Exposed<S, "raw">;
|
|
90
|
+
/** Marked fields of an account object, by name. */
|
|
91
|
+
export declare const fieldExposure: (fields: Fields) => Readonly<Record<string, FieldExposure>>;
|
|
92
|
+
declare const Secret: unique symbol;
|
|
93
|
+
/**
|
|
94
|
+
* A secret account value. In a provider that declares hosts it is a handle, which the host's
|
|
95
|
+
* outbound network replaces with the real value only on requests to those hosts. Pass it to
|
|
96
|
+
* clients and headers as an ordinary string; do not decode or transform it.
|
|
97
|
+
*/
|
|
98
|
+
export type SecretString = string & {
|
|
99
|
+
readonly [Secret]: true;
|
|
100
|
+
};
|
|
101
|
+
type Sealed<T> = T extends string ? SecretString : T;
|
|
102
|
+
/** Account fields as app code receives them: unmarked string fields are secret. */
|
|
103
|
+
export type SecretFields<F extends Fields> = {
|
|
104
|
+
readonly [Key in keyof ObjectValue<F>]: Key extends keyof F ? F[Key] extends Exposed<unknown> ? ObjectValue<F>[Key] : Sealed<ObjectValue<F>[Key]> : ObjectValue<F>[Key];
|
|
105
|
+
};
|
|
106
|
+
/** An account object without declared fields, such as a default OAuth projection. */
|
|
107
|
+
export type SecretObject<T> = {
|
|
108
|
+
readonly [Key in keyof T]: Sealed<T[Key]>;
|
|
109
|
+
};
|
|
62
110
|
declare const ImportedJsonSchema: unique symbol;
|
|
63
111
|
/** Read the original document for an imported decoder without a lossy schema round trip. */
|
|
64
112
|
export declare const importedJsonSchema: (decoder: EffectSchema.Decoder<unknown>) => unknown | undefined;
|
|
@@ -72,8 +120,55 @@ export declare const withLazyJsonSchemaDocument: <S extends EffectSchema.Decoder
|
|
|
72
120
|
* Relocate a self-contained JSON Schema under a document pointer. Resolve references
|
|
73
121
|
* before nesting so account schemas can reuse definition names, IDs and anchors.
|
|
74
122
|
* Only schema nodes are rewritten; examples and ordinary property values stay intact.
|
|
123
|
+
* A `$recursiveRef` becomes the pointer to its static target, such as the relocated root. The
|
|
124
|
+
* patched validator applies it like `"#"` was: the recursive anchor in scope, else that target.
|
|
75
125
|
*/
|
|
76
126
|
export declare const nestJsonSchema: (input: JsonObject, pointer: string) => JsonObject;
|
|
127
|
+
/**
|
|
128
|
+
* Self-contained schemas placed side by side in one document, such as the branches of a union.
|
|
129
|
+
* A schema whose references all name its root `$defs` gives those entries to the document's root
|
|
130
|
+
* `$defs` when no entry of the same name differs, so definitions stay where listings share them
|
|
131
|
+
* among tools. Any other schema is relocated with `nestJsonSchema` under `pointer(index)`.
|
|
132
|
+
*/
|
|
133
|
+
export declare const combineJsonSchemas: (schemas: readonly JsonObject[], pointer: (index: number) => string) => {
|
|
134
|
+
readonly $defs?: JsonObject;
|
|
135
|
+
readonly schemas: readonly JsonObject[];
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* Whether an input key may be named in a validation problem. Other keys can carry supplied data,
|
|
139
|
+
* so problems locate them without echoing them.
|
|
140
|
+
*/
|
|
141
|
+
export declare const echoableKey: (key: string) => boolean;
|
|
142
|
+
/**
|
|
143
|
+
* The keys an object accepts, as `object {name, optional?}`. `...` marks an object that also
|
|
144
|
+
* accepts other keys. Names come from the schema, never from supplied input.
|
|
145
|
+
*/
|
|
146
|
+
export declare const objectShape: (keys: readonly {
|
|
147
|
+
readonly name: string;
|
|
148
|
+
readonly optional: boolean;
|
|
149
|
+
}[], open: boolean, limit?: number) => string;
|
|
150
|
+
/**
|
|
151
|
+
* The values a schema fixes, as `"v1"` or `one of "a", "b" and 3 more`. Agents already read
|
|
152
|
+
* these values in the tool's signature, so problems list them, up to {@link maxListedValues}
|
|
153
|
+
* values and {@link maxValuesText} characters. They come from the schema, never from input.
|
|
154
|
+
*/
|
|
155
|
+
export declare const allowedValues: (values: readonly unknown[]) => string;
|
|
156
|
+
/** Keys listed for each union alternative, so several alternatives fit in one problem. */
|
|
157
|
+
export declare const maxAlternativeKeys = 8;
|
|
158
|
+
/**
|
|
159
|
+
* The alternatives a union accepts, as `string or object {id}`, and the key whose value tells
|
|
160
|
+
* them apart. Shapes, values and the key come from the schema, never from supplied input.
|
|
161
|
+
*/
|
|
162
|
+
export declare const unionShape: (alternatives: readonly string[], selector: string | undefined) => string;
|
|
163
|
+
/** The problem for a required key the input omits, with what its schema expects when stated. */
|
|
164
|
+
export declare const missingKey: (expected: string | undefined) => string;
|
|
165
|
+
/** The text every missing-key problem starts with, so the caller can add where the input has it. */
|
|
166
|
+
export declare const missingKeyText = "Missing key";
|
|
167
|
+
/**
|
|
168
|
+
* Whether the imported schema whose check failed may accept a key as an object's own key, for a
|
|
169
|
+
* failure's check; undefined when the check is not an imported schema's.
|
|
170
|
+
*/
|
|
171
|
+
export declare const importedSchemaKeys: (check: object) => ((key: string) => boolean) | undefined;
|
|
77
172
|
/** Prepare an interpreted validator. No eval or generated JavaScript runs in any host. */
|
|
78
173
|
export declare const compileJsonSchemaDecoder: (document: JsonObject) => Effect.Effect<EffectSchema.Codec<EffectSchema.Json, EffectSchema.Json, never, never> & {
|
|
79
174
|
[ImportedJsonSchema]: {
|
|
@@ -81,16 +176,18 @@ export declare const compileJsonSchemaDecoder: (document: JsonObject) => Effect.
|
|
|
81
176
|
};
|
|
82
177
|
}, ValidationError, never>;
|
|
83
178
|
export declare const lazyJsonSchemaDecoder: (document: () => JsonObject) => Effect.Effect<EffectSchema.declareConstructor<EffectSchema.Json, EffectSchema.Json, readonly [], EffectSchema.Json>, never, never>;
|
|
179
|
+
/**
|
|
180
|
+
* A lazy decoder and the compilation it decodes with. Running `compile` first lets a caller
|
|
181
|
+
* reject an unsupported schema before a side effect whose result the decoder will check.
|
|
182
|
+
*/
|
|
183
|
+
export declare const preparedJsonSchemaDecoder: (document: JsonObject) => {
|
|
184
|
+
decoder: EffectSchema.declareConstructor<EffectSchema.Json, EffectSchema.Json, readonly [], EffectSchema.Json>;
|
|
185
|
+
compile: Effect.Effect<EffectSchema.Decoder<EffectSchema.Json, never>, ValidationError, never>;
|
|
186
|
+
};
|
|
84
187
|
/** Preserve the JSON document; compile its validator only when a value is first decoded. */
|
|
85
188
|
export declare const jsonSchemaDecoder: (input: unknown) => Effect.Effect<EffectSchema.declareConstructor<EffectSchema.Json, EffectSchema.Json, readonly [], EffectSchema.Json>, ValidationError, never>;
|
|
86
189
|
/** Import JSON metadata now; unsupported schemas and invalid values fail when parsed. */
|
|
87
190
|
export declare const jsonSchema: (input: unknown) => Schema<EffectSchema.Json>;
|
|
88
|
-
/** Database declaration retained by primitive constructors; nested payload schemas are not database fields. */
|
|
89
|
-
export declare const storageFieldOf: (schema: Schema<unknown, boolean>) => Field | undefined;
|
|
90
|
-
/** A row reference records the target table; existence is not a foreign-key constraint. */
|
|
91
|
-
export declare const id: (table: string) => Schema<string>;
|
|
92
|
-
/** A host user identifier, stored as a string without imposing a product auth model. */
|
|
93
|
-
export declare const userId: () => Schema<string>;
|
|
94
191
|
/** Render a decoder as a JSON Schema document, keeping an imported upstream document as-is. */
|
|
95
192
|
export declare const jsonSchemaDocument: (decoder: EffectSchema.Decoder<unknown>) => Effect.Effect<{
|
|
96
193
|
readonly [x: string]: EffectSchema.Json;
|
|
@@ -1,35 +1,28 @@
|
|
|
1
1
|
/** Remote skill readers return complete portable bundles, never installed host files. */
|
|
2
2
|
import { Effect } from "effect";
|
|
3
|
-
import {
|
|
3
|
+
import { NetworkRefused } from "../contracts/network.js";
|
|
4
|
+
import { ProviderError } from "../contracts/provider-error.js";
|
|
5
|
+
import { AppSkills, SkillLoadFailed, type GitHubSkillsOptions, type WellKnownSkillsOptions, type SkillTransport } from "../contracts/skills.js";
|
|
4
6
|
/** Give every failure without a message one that names the service. */
|
|
5
|
-
export declare const withService: (service: string | undefined) => <A, R>(effect: Effect.Effect<A, SkillLoadFailed, R>) => Effect.Effect<A, SkillLoadFailed, R>;
|
|
7
|
+
export declare const withService: (service: string | undefined) => <A, R>(effect: Effect.Effect<A, SkillLoadFailed | NetworkRefused, R>) => Effect.Effect<A, NetworkRefused | SkillLoadFailed, R>;
|
|
8
|
+
interface ReadRequest {
|
|
9
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
10
|
+
/** Describe a refusal by Executor's app network; defaults to the refusal itself. */
|
|
11
|
+
readonly refused?: (refused: NetworkRefused) => SkillLoadFailed | NetworkRefused;
|
|
12
|
+
}
|
|
6
13
|
/** One loader invocation owns its byte budget and all of its network requests. */
|
|
7
14
|
export declare const reader: (transport: SkillTransport) => Effect.Effect<{
|
|
8
|
-
fetchBytes: (url: string,
|
|
9
|
-
readonly body
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
json: (url: string) => Effect.Effect<unknown, SkillLoadFailed, never>;
|
|
15
|
+
fetchBytes: (url: string, request?: ReadRequest & {
|
|
16
|
+
readonly body?: Uint8Array;
|
|
17
|
+
}) => Effect.Effect<Uint8Array<ArrayBuffer>, NetworkRefused | SkillLoadFailed, never>;
|
|
18
|
+
read: (url: string, request?: ReadRequest) => Effect.Effect<string, NetworkRefused | SkillLoadFailed, never>;
|
|
19
|
+
json: (url: string) => Effect.Effect<unknown, NetworkRefused | SkillLoadFailed, never>;
|
|
14
20
|
}, never, never>;
|
|
15
|
-
export declare const githubSkillsEffect: (options: GitHubSkillsOptions) => Effect.Effect<
|
|
16
|
-
readonly name: string;
|
|
17
|
-
readonly description: string;
|
|
18
|
-
readonly files: readonly {
|
|
19
|
-
readonly path: string;
|
|
20
|
-
readonly content: string;
|
|
21
|
-
}[];
|
|
22
|
-
readonly license?: string;
|
|
23
|
-
readonly compatibility?: string;
|
|
24
|
-
readonly metadata?: {
|
|
25
|
-
readonly [x: string]: string;
|
|
26
|
-
};
|
|
27
|
-
readonly "allowed-tools"?: string;
|
|
28
|
-
}[], SkillLoadFailed, never>;
|
|
21
|
+
export declare const githubSkillsEffect: (options: GitHubSkillsOptions) => Effect.Effect<typeof AppSkills.Type, SkillLoadFailed | NetworkRefused | ProviderError>;
|
|
29
22
|
/** Fetch all indexed files and reject a publication whose index changes during the read. */
|
|
30
23
|
export declare const wellKnownSkillsEffect: (options: WellKnownSkillsOptions) => Effect.Effect<readonly {
|
|
31
|
-
readonly name: string;
|
|
32
24
|
readonly description: string;
|
|
25
|
+
readonly name: string;
|
|
33
26
|
readonly files: readonly {
|
|
34
27
|
readonly path: string;
|
|
35
28
|
readonly content: string;
|
|
@@ -40,4 +33,5 @@ export declare const wellKnownSkillsEffect: (options: WellKnownSkillsOptions) =>
|
|
|
40
33
|
readonly [x: string]: string;
|
|
41
34
|
};
|
|
42
35
|
readonly "allowed-tools"?: string;
|
|
43
|
-
}[], SkillLoadFailed, never>;
|
|
36
|
+
}[], NetworkRefused | SkillLoadFailed, never>;
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ctx.sql` over a data facet's SQLite storage, and the deploy-time migrator.
|
|
3
|
+
*
|
|
4
|
+
* Every statement runs inside a synchronous SQLite transaction: alone, or inside the author's
|
|
5
|
+
* `transaction`. Nothing here can wait on another call, so no lock or transaction outlives the
|
|
6
|
+
* statement that needs it. What a statement may do is decided by SQLite, not by reading the SQL:
|
|
7
|
+
* a query runs in a transaction that is always rolled back.
|
|
8
|
+
*/
|
|
9
|
+
import { Effect, Schema } from "effect";
|
|
10
|
+
import { type AppSqlStorage, type Sql, type SqlReader } from "../contracts/sql.js";
|
|
11
|
+
import type { SkillFile } from "../contracts/skills.js";
|
|
12
|
+
export declare const noDatabase: Sql;
|
|
13
|
+
/** A workflow step mutation's identity, from the host's replay record. */
|
|
14
|
+
export interface StepReplay {
|
|
15
|
+
readonly key: string;
|
|
16
|
+
readonly fingerprint: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* One invocation's SQL. Once the invocation ends or `signal` aborts, every statement is refused, so
|
|
20
|
+
* code still running after a timeout or cancellation cannot write late.
|
|
21
|
+
*/
|
|
22
|
+
export declare const authorSql: (storage: AppSqlStorage, options: {
|
|
23
|
+
readonly signal: AbortSignal;
|
|
24
|
+
readonly step?: StepReplay;
|
|
25
|
+
/**
|
|
26
|
+
* The invocation's emitted events. A transaction that rolls back also discards the events its
|
|
27
|
+
* callback emitted, so subscribers never hear of writes that did not commit.
|
|
28
|
+
*/
|
|
29
|
+
readonly emitted?: unknown[];
|
|
30
|
+
}) => {
|
|
31
|
+
reader: SqlReader;
|
|
32
|
+
writer: Sql;
|
|
33
|
+
close: () => void;
|
|
34
|
+
};
|
|
35
|
+
declare const MigrationFileInvalid_base: Schema.Class<MigrationFileInvalid, Schema.TaggedStruct<"MigrationFileInvalid", {
|
|
36
|
+
readonly path: Schema.String;
|
|
37
|
+
readonly reason: Schema.String;
|
|
38
|
+
}>, import("effect/Cause").YieldableError>;
|
|
39
|
+
/** A file in `migrations/` that is not a migration the host can order. */
|
|
40
|
+
export declare class MigrationFileInvalid extends MigrationFileInvalid_base {
|
|
41
|
+
get message(): string;
|
|
42
|
+
}
|
|
43
|
+
declare const MigrationHistoryChanged_base: Schema.Class<MigrationHistoryChanged, Schema.TaggedStruct<"MigrationHistoryChanged", {
|
|
44
|
+
readonly reason: Schema.String;
|
|
45
|
+
}>, import("effect/Cause").YieldableError>;
|
|
46
|
+
/** The build's migrations no longer start with the ones already applied to the database. */
|
|
47
|
+
export declare class MigrationHistoryChanged extends MigrationHistoryChanged_base {
|
|
48
|
+
get message(): string;
|
|
49
|
+
}
|
|
50
|
+
declare const MigrationFailed_base: Schema.Class<MigrationFailed, Schema.TaggedStruct<"MigrationFailed", {
|
|
51
|
+
readonly path: Schema.String;
|
|
52
|
+
readonly reason: Schema.String;
|
|
53
|
+
}>, import("effect/Cause").YieldableError>;
|
|
54
|
+
/** SQLite rejected a migration. Every migration of the deploy rolled back. */
|
|
55
|
+
export declare class MigrationFailed extends MigrationFailed_base {
|
|
56
|
+
get message(): string;
|
|
57
|
+
}
|
|
58
|
+
/** Whether a build's files give the app a database: any `.sql` file in `migrations/`. */
|
|
59
|
+
export declare const hasMigrations: (files: readonly {
|
|
60
|
+
readonly path: string;
|
|
61
|
+
}[]) => boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Apply the build's pending migrations and report which ran. Every pending migration runs in one
|
|
64
|
+
* transaction, so a failing one leaves the database exactly as the active version knows it. The
|
|
65
|
+
* migrations already applied must still be the build's first ones, byte for byte.
|
|
66
|
+
*/
|
|
67
|
+
export declare const migrate: (storage: AppSqlStorage, files: readonly SkillFile[]) => Effect.Effect<{
|
|
68
|
+
readonly id: number;
|
|
69
|
+
readonly name: string;
|
|
70
|
+
}[], MigrationFileInvalid | MigrationHistoryChanged | MigrationFailed, never>;
|
|
71
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Host-rendered account notices; no authored app code or provider responses enter them. */
|
|
2
|
+
import type { UiAccountNotice, UiAccountProblem } from "../contracts/ui.js";
|
|
3
|
+
/** Missing, removed, incompatible, or rejected accounts stop the app; other failed checks are advisory. */
|
|
4
|
+
export declare const accountProblemBlocks: (problem: UiAccountProblem) => boolean;
|
|
5
|
+
export declare const accountProblemText: (problem: UiAccountProblem) => string;
|
|
6
|
+
/** Full page shown instead of the app while an account problem stops it from working. */
|
|
7
|
+
export declare const accountBlockedPage: (notice: UiAccountNotice) => string;
|
|
8
|
+
/** Inline card for advisory problems; the app still loads underneath. */
|
|
9
|
+
export declare const accountNoticeBootstrap: (notice: UiAccountNotice) => string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Host responses around app sign-in. They carry no script and never contain product credentials. */
|
|
2
|
-
import { HttpServerResponse } from "effect/
|
|
2
|
+
import { HttpServerResponse } from "effect/http";
|
|
3
3
|
import { type AppSignInId } from "../contracts/ui-auth.js";
|
|
4
4
|
/** Private app responses must not leak authentication URLs through caches or referrers. */
|
|
5
5
|
export declare const appPrivateHeaders: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Atom } from "effect/
|
|
1
|
+
import { AsyncResult, Atom } from "effect/reactivity";
|
|
2
2
|
import { type OperationReference } from "../contracts/live.js";
|
|
3
3
|
import { type Schema } from "./schema.js";
|
|
4
|
-
/** A scoped page client. Host-injected context carries only the
|
|
4
|
+
/** A scoped page client. Host-injected context carries only the version, never credentials. */
|
|
5
5
|
export declare const createAppClient: () => {
|
|
6
6
|
/** Close this client when its page or embedding owner is removed. */
|
|
7
7
|
dispose: () => Promise<void>;
|
|
@@ -12,5 +12,5 @@ export declare const createAppClient: () => {
|
|
|
12
12
|
/** Create a callable mutation with optional withOptimisticUpdate projections over mounted queries. */
|
|
13
13
|
mutation: <Input, Output>(reference: OperationReference<Input, Output, "mutation">, output: Schema<NoInfer<Output>, boolean>) => import("../client.js").AppMutation<Input, Output>;
|
|
14
14
|
/** Share a live query across mounts and reconcile optimistic changes against fresh server reads. */
|
|
15
|
-
queryAtom: <Input, Output>(reference: OperationReference<Input, Output, "query">, input: NoInfer<Input>, output: Schema<NoInfer<Output>, boolean>) => Atom.Atom<
|
|
15
|
+
queryAtom: <Input, Output>(reference: OperationReference<Input, Output, "query">, input: NoInfer<Input>, output: Schema<NoInfer<Output>, boolean>) => Atom.Atom<AsyncResult.AsyncResult<Output, unknown>>;
|
|
16
16
|
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retained files sit at the version's asset root. Resolving path-relative resource URLs there,
|
|
3
|
+
* instead of with `<base>`, leaves the document base as the page URL for links, history and forms.
|
|
4
|
+
*/
|
|
5
|
+
export declare const versionDocument: (html: string, version: string) => string;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Inline host script: no app dependencies, credentials, or authored HTML enter its source. */
|
|
2
|
-
export declare const appFailureBootstrap:
|
|
2
|
+
export declare const appFailureBootstrap = "<script>\"use strict\";(()=>{var M=()=>{let d,w=Date.now(),m=0,g=0,f=new Map,v=/^(?:chrome|moz|safari-web)-extension:/,A=new Set([\"ResizeObserver loop completed with undelivered notifications.\",\"ResizeObserver loop limit exceeded\"]),V=new Set([\"Error\",\"TypeError\",\"ReferenceError\",\"SyntaxError\",\"RangeError\",\"URIError\",\"EvalError\",\"AggregateError\"]),b=(e,t=0,i=0)=>{let r=[];if(!URL.canParse(e))return r;let a=new URL(e);return a.origin!==location.origin||!a.pathname.startsWith(\"/_executor/assets/\")||!a.pathname.endsWith(\".js\")||(r.push({key:\"code.file.path\",value:{stringValue:a.pathname}}),Number.isSafeInteger(t)&&t>0&&r.push({key:\"code.line.number\",value:{intValue:String(t)}}),Number.isSafeInteger(i)&&i>0&&r.push({key:\"code.column.number\",value:{intValue:String(i)}})),r},h=(e,t,i=[])=>{let r=Date.now();r-w>=6e4&&(w=r,m=0,f.clear());let a=`${e}:${t.slice(0,2e3)}`,x=f.get(a);if(x!==void 0&&r-x<1e3||m>=20){g++;return}f.set(a,r),m++,i.push({key:\"executor.ui.failure.suppressed\",value:{intValue:String(g)}}),g=0;let E=Array.from(crypto.getRandomValues(new Uint8Array(16)),s=>s.toString(16).padStart(2,\"0\")).join(\"\"),S=`${Date.now()}000000`,n,l=\"Sending error report\\u2026\",k=()=>{if(d?.open)return;let s=document.createElement(\"div\"),D=s.attachShadow({mode:\"open\"}),o=document.createElement(\"dialog\");d=o,o.setAttribute(\"aria-labelledby\",\"executor-failure-title\");let y=document.createElement(\"h2\");y.id=\"executor-failure-title\",y.textContent=e===\"script\"?\"This app could not load\":\"This app stopped working\";let C=document.createElement(\"p\");C.textContent=e===\"script\"?\"A file needed by this page did not load. Reload the page to try again.\":\"The app encountered an unexpected error. Reload the page to try again.\";let L=document.createElement(\"p\");L.textContent=\"Copy any unsaved work before reloading.\";let R=document.createElement(\"details\"),T=document.createElement(\"summary\");T.textContent=\"Error details\";let c=document.createElement(\"textarea\");c.readOnly=!0,c.rows=10,c.cols=36,c.setAttribute(\"aria-label\",\"Error details\"),c.value=`${t.slice(0,12e3)}\n\nDiagnostic ID: ${E}`,R.append(T,c),n=document.createElement(\"p\"),n.setAttribute(\"role\",\"status\"),n.textContent=l;let u=document.createElement(\"button\");u.type=\"button\",u.textContent=\"Reload page\",u.addEventListener(\"click\",()=>location.reload());let p=document.createElement(\"button\");p.type=\"button\",p.textContent=\"Close\",p.addEventListener(\"click\",()=>o.close()),o.addEventListener(\"close\",()=>{d===o&&(d=void 0),s.remove()}),o.append(y,C,L,R,n,u,p),D.append(o),document.documentElement.append(s),o.showModal()};document.readyState===\"loading\"?document.addEventListener(\"DOMContentLoaded\",k,{once:!0}):k(),fetch(\"/_executor/api/telemetry/traces\",{method:\"POST\",headers:{\"content-type\":\"application/json\"},credentials:\"same-origin\",keepalive:!0,body:JSON.stringify({resourceSpans:[{scopeSpans:[{spans:[{traceId:E,spanId:E.slice(0,16),name:\"ui.app.failure\",kind:1,startTimeUnixNano:S,endTimeUnixNano:S,status:{code:2},attributes:[{key:\"executor.ui.failure.kind\",value:{stringValue:e}},...i]}]}]}]})}).then(s=>{l=s.ok?\"Error report sent.\":\"Could not send the error report. You can copy the error details.\",n&&(n.textContent=l)},()=>{l=\"Could not send the error report. You can copy the error details.\",n&&(n.textContent=l)})};window.addEventListener(\"error\",e=>{if(e instanceof ErrorEvent){if(v.test(e.filename)||e.error===null&&e.lineno===0&&A.has(e.message))return;let t=b(e.filename,e.lineno,e.colno);e.error instanceof Error&&V.has(e.error.name)&&t.push({key:\"exception.type\",value:{stringValue:e.error.name}}),h(\"runtime\",e.error instanceof Error?e.error.stack??e.message:e.message,t)}else e.target instanceof HTMLScriptElement&&h(\"script\",`Could not load script: ${e.target.src}`,b(e.target.src))},!0),window.addEventListener(\"unhandledrejection\",e=>{let t=e.reason;h(\"rejection\",t instanceof Error?t.stack??t.message:\"An app operation failed without handling its error.\")})};M();})();</script>";
|