gemi 0.100.0 → 0.102.0
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/dist/ai/Schema.d.ts +59 -5
- package/dist/ai/Schema.d.ts.map +1 -1
- package/dist/ai/index.d.ts +1 -1
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +13 -13
- package/dist/ai/index.js.map +3 -3
- package/dist/chunk-23mpa8t7.js +5 -0
- package/dist/{chunk-jv38q9n7.js.map → chunk-23mpa8t7.js.map} +3 -3
- package/dist/chunk-4x41cmg3.js +9 -0
- package/dist/chunk-4x41cmg3.js.map +31 -0
- package/dist/chunk-9hs7prvj.js +17 -0
- package/dist/{chunk-rc4z7ykq.js.map → chunk-9hs7prvj.js.map} +4 -4
- package/dist/{chunk-q2r6b35k.js → chunk-hr0m35tr.js} +1 -1
- package/dist/{chunk-kgckt396.js → chunk-mb8chren.js} +2 -2
- package/dist/{chunk-kgckt396.js.map → chunk-mb8chren.js.map} +1 -1
- package/dist/{chunk-vdynb16s.js → chunk-md8hmejq.js} +1 -1
- package/dist/facades/index.js +1 -1
- package/dist/http/McpRouter.d.ts +126 -11
- package/dist/http/McpRouter.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/kernel/index.js +1 -1
- package/dist/server/index.js +1 -1
- package/dist/services/index.d.ts +2 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -1
- package/dist/services/mcp/McpRegistry.d.ts +56 -3
- package/dist/services/mcp/McpRegistry.d.ts.map +1 -1
- package/dist/services/mcp/toAgentTools.d.ts +57 -1
- package/dist/services/mcp/toAgentTools.d.ts.map +1 -1
- package/dist/services/router/ApiRouteDispatcher.d.ts +27 -1
- package/dist/services/router/ApiRouteDispatcher.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-h15bd9vn.js +0 -9
- package/dist/chunk-h15bd9vn.js.map +0 -31
- package/dist/chunk-jv38q9n7.js +0 -5
- package/dist/chunk-rc4z7ykq.js +0 -17
- /package/dist/{chunk-q2r6b35k.js.map → chunk-hr0m35tr.js.map} +0 -0
- /package/dist/{chunk-vdynb16s.js.map → chunk-md8hmejq.js.map} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { ToolContext } from "../../ai/Agent";
|
|
2
2
|
import { ToolError } from "../../ai/redact";
|
|
3
|
-
import { type Schema } from "../../ai/Schema";
|
|
3
|
+
import { type AnySchema, type Schema } from "../../ai/Schema";
|
|
4
4
|
import type { RouteSource } from "../../http/ApiRouter";
|
|
5
5
|
import type { HttpRequest } from "../../http/HttpRequest";
|
|
6
6
|
import type { McpMethod, McpRouter } from "../../http/McpRouter";
|
|
7
|
-
import type { ApiRouteDispatcher } from "../router/ApiRouteDispatcher";
|
|
7
|
+
import type { ApiRouteDispatcher, DispatchCredentials } from "../router/ApiRouteDispatcher";
|
|
8
8
|
/**
|
|
9
9
|
* Who a tool call runs as. Always an argument to the registry, never read from
|
|
10
10
|
* ambient state by it.
|
|
@@ -37,6 +37,29 @@ export type McpCaller = {
|
|
|
37
37
|
kind: "remote";
|
|
38
38
|
token: string;
|
|
39
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* One tool call, as the app's hooks see it: who is calling, the request their
|
|
42
|
+
* identity comes from, which tool, its parsed arguments, and — for a call an
|
|
43
|
+
* agent run makes — the run's tool context.
|
|
44
|
+
*
|
|
45
|
+
* `req` is `caller.req`, repeated so a hook that only wants the request does
|
|
46
|
+
* not have to narrow the caller. `ctx` is absent when `McpRegistry.execute` is
|
|
47
|
+
* called without one (a test, a script dispatching a tool directly).
|
|
48
|
+
*/
|
|
49
|
+
export type McpCallContext = {
|
|
50
|
+
caller: Extract<McpCaller, {
|
|
51
|
+
kind: "local";
|
|
52
|
+
}>;
|
|
53
|
+
req: HttpRequest<any, any>;
|
|
54
|
+
tool: McpToolDescriptor;
|
|
55
|
+
input: Record<string, unknown>;
|
|
56
|
+
ctx?: ToolContext;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* What `McpRouter.credentials` answers for a call: the app's own headers and
|
|
60
|
+
* cookies, sent beside gemi's access token. See `DispatchCredentials`.
|
|
61
|
+
*/
|
|
62
|
+
export type McpCredentials = DispatchCredentials;
|
|
40
63
|
/**
|
|
41
64
|
* MCP's tool annotations, from the verb. They drive confirmation prompts in
|
|
42
65
|
* remote clients, which is why they are set now rather than when v2 lands:
|
|
@@ -72,6 +95,12 @@ export interface McpToolDescriptor {
|
|
|
72
95
|
* bound files are not in it at all.
|
|
73
96
|
*/
|
|
74
97
|
readonly inputSchema: Schema<Record<string, unknown>>;
|
|
98
|
+
/**
|
|
99
|
+
* The route meta's `output`: the shape of what the tool answers, after
|
|
100
|
+
* `result`. Absent when the meta declares none. v2's `tools/list` emits it
|
|
101
|
+
* as `outputSchema`.
|
|
102
|
+
*/
|
|
103
|
+
readonly outputSchema?: AnySchema;
|
|
75
104
|
readonly annotations: McpToolAnnotations;
|
|
76
105
|
readonly tags: readonly string[];
|
|
77
106
|
readonly requiresApproval: boolean;
|
|
@@ -114,6 +143,7 @@ export declare class McpToolError extends ToolError {
|
|
|
114
143
|
* and is the shorter path for exactly that reason.
|
|
115
144
|
*/
|
|
116
145
|
export declare class McpRegistry {
|
|
146
|
+
private readonly router;
|
|
117
147
|
private readonly dispatcher;
|
|
118
148
|
static token: string;
|
|
119
149
|
private readonly plans;
|
|
@@ -133,6 +163,11 @@ export declare class McpRegistry {
|
|
|
133
163
|
/**
|
|
134
164
|
* Calls the tool `name` as `caller`, and answers the route's JSON.
|
|
135
165
|
*
|
|
166
|
+
* Before dispatching, the router's `credentials` hook, when it has one, is
|
|
167
|
+
* asked for the app's own headers and cookies for this call; they ride
|
|
168
|
+
* beside the access token (see `McpRouter.credentials`). A throw from it is a
|
|
169
|
+
* server failure, logged for the app, like a binder's.
|
|
170
|
+
*
|
|
136
171
|
* `ctx` is the tool context of the agent call, and only files need it:
|
|
137
172
|
* `"input"` files resolve through `ctx.attachments`, the handle already
|
|
138
173
|
* scoped to the caller, and bound files are chosen by a binder given `ctx`.
|
|
@@ -140,7 +175,9 @@ export declare class McpRegistry {
|
|
|
140
175
|
* unscoped lookup, and this must not become one.
|
|
141
176
|
*
|
|
142
177
|
* A 2xx answers its JSON, or its text, cut at `MAX_RESULT_BODY`; a body
|
|
143
|
-
* that is neither — a file a route serves — is described, not shown.
|
|
178
|
+
* that is neither — a file a route serves — is described, not shown. A tool
|
|
179
|
+
* whose meta has a `result` or an `output` answers its JSON put through
|
|
180
|
+
* them instead, and is cut after that, not before (see `project`).
|
|
144
181
|
* A 4xx throws an `McpToolError` carrying the route's body, so a validation
|
|
145
182
|
* error reaches the model word for word. Anything else, or a route that
|
|
146
183
|
* throws, throws an `McpToolError` that says only that the server failed.
|
|
@@ -152,6 +189,22 @@ export declare class McpRegistry {
|
|
|
152
189
|
private plan;
|
|
153
190
|
private fillPath;
|
|
154
191
|
private formData;
|
|
192
|
+
/**
|
|
193
|
+
* A 2xx put through the meta's `result` and `output`, for a tool that has
|
|
194
|
+
* either.
|
|
195
|
+
*
|
|
196
|
+
* The whole body is parsed and projected before anything is cut: trimming a
|
|
197
|
+
* large answer down is what a projection is for, and cutting first would
|
|
198
|
+
* hand `result` half a JSON document. The projected value is then held to
|
|
199
|
+
* `MAX_RESULT_BODY` the way any answer is.
|
|
200
|
+
*
|
|
201
|
+
* Every failure here is the app's, not the model's — a route that answered
|
|
202
|
+
* something other than JSON, a `result` that threw, an answer `output` does
|
|
203
|
+
* not describe — so each is logged and the model is told only that the
|
|
204
|
+
* tool failed. Telling it more would invite a retry of a call that already
|
|
205
|
+
* did what it does.
|
|
206
|
+
*/
|
|
207
|
+
private project;
|
|
155
208
|
/**
|
|
156
209
|
* Runs an app's binder. Its failure is the server's, not the model's, so the
|
|
157
210
|
* model is told only that; the app gets the error in its log.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpRegistry.d.ts","sourceRoot":"","sources":["../../../services/mcp/McpRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"McpRegistry.d.ts","sourceRoot":"","sources":["../../../services/mcp/McpRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,35 @@
|
|
|
1
|
-
import { type AnyAgentTool } from "../../ai/Agent";
|
|
1
|
+
import { type AnyAgentTool, type ToolEntry } from "../../ai/Agent";
|
|
2
2
|
import type { McpRegistry, McpToolFilter } from "./McpRegistry";
|
|
3
|
+
/** One namespace `toAgentTools` groups a tag's tools into. */
|
|
4
|
+
export type McpToolNamespaceOptions = {
|
|
5
|
+
/**
|
|
6
|
+
* What the model reads when deciding whether anything inside is worth
|
|
7
|
+
* loading — the only description the group has. Required.
|
|
8
|
+
*/
|
|
9
|
+
description: string;
|
|
10
|
+
/** Overrides the top-level `deferred` for this namespace. */
|
|
11
|
+
deferred?: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type ToAgentToolsOptions = {
|
|
14
|
+
/** Narrows the tools, as `McpRegistry.descriptors` does. */
|
|
15
|
+
filter?: McpToolFilter;
|
|
16
|
+
/**
|
|
17
|
+
* Withholds the tools' parameter schemas until the model searches for them
|
|
18
|
+
* (`ToolNamespace.deferred` for a namespace, `AgentTool.deferred` for a bare
|
|
19
|
+
* tool). The default for every namespace and every bare tool; a namespace
|
|
20
|
+
* may override it. Purely a prompt optimization: a provider without tool
|
|
21
|
+
* search is sent every schema inline, and the agent behaves the same.
|
|
22
|
+
*/
|
|
23
|
+
deferred?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Groups the tools into `ToolNamespace`s by tag: each key is a tag, and the
|
|
26
|
+
* namespace's name. A tool goes into the namespace of the first of its tags
|
|
27
|
+
* declared here, in the order the keys are written — tool names are unique
|
|
28
|
+
* within an agent, so it cannot be in two. A tool with none of these tags
|
|
29
|
+
* stays a bare tool.
|
|
30
|
+
*/
|
|
31
|
+
namespaces?: Record<string, McpToolNamespaceOptions>;
|
|
32
|
+
};
|
|
3
33
|
/**
|
|
4
34
|
* The registry's tools as `AgentTool`s, for an agent running in this server —
|
|
5
35
|
* v1's only projection.
|
|
@@ -24,6 +54,32 @@ import type { McpRegistry, McpToolFilter } from "./McpRegistry";
|
|
|
24
54
|
* A failure the model should read — a 4xx, a missing file, a bad argument —
|
|
25
55
|
* throws a `ToolError` (`McpToolError` is one), whose message is shown, and the agent loop turns a throw into a `tool_error` result the model
|
|
26
56
|
* sees and can correct on its next step.
|
|
57
|
+
*
|
|
58
|
+
* Grouped (#758): with `namespaces`, the tools come back as `ToolNamespace`s
|
|
59
|
+
* by tag, followed by the bare tools left over, ready for `Agent.create`'s
|
|
60
|
+
* `tools`:
|
|
61
|
+
*
|
|
62
|
+
* ```ts
|
|
63
|
+
* toAgentTools(registry, {
|
|
64
|
+
* namespaces: {
|
|
65
|
+
* pages: { description: "Read and edit the pages of the site" },
|
|
66
|
+
* files: { description: "Upload, list and delete files" },
|
|
67
|
+
* },
|
|
68
|
+
* deferred: true,
|
|
69
|
+
* });
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* The second argument is read as options when it has `filter`, `deferred` or
|
|
73
|
+
* `namespaces`, and as a filter otherwise, so `toAgentTools(registry, filter)`
|
|
74
|
+
* is unchanged.
|
|
27
75
|
*/
|
|
28
76
|
export declare function toAgentTools(registry: McpRegistry, filter?: McpToolFilter): AnyAgentTool[];
|
|
77
|
+
export declare function toAgentTools(registry: McpRegistry, options: ToAgentToolsOptions & {
|
|
78
|
+
namespaces: Record<string, McpToolNamespaceOptions>;
|
|
79
|
+
}): ToolEntry[];
|
|
80
|
+
export declare function toAgentTools(registry: McpRegistry, options: ToAgentToolsOptions & {
|
|
81
|
+
namespaces?: undefined;
|
|
82
|
+
}): AnyAgentTool[];
|
|
83
|
+
/** Options whose `namespaces` is not known statically: either shape. */
|
|
84
|
+
export declare function toAgentTools(registry: McpRegistry, options: ToAgentToolsOptions): ToolEntry[];
|
|
29
85
|
//# sourceMappingURL=toAgentTools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toAgentTools.d.ts","sourceRoot":"","sources":["../../../services/mcp/toAgentTools.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"toAgentTools.d.ts","sourceRoot":"","sources":["../../../services/mcp/toAgentTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG7F,OAAO,KAAK,EAAE,WAAW,EAAqB,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnF,8DAA8D;AAC9D,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;CACtD,CAAC;AAKF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,YAAY,EAAE,CAAC;AAC5F,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,mBAAmB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAA;CAAE,GACrF,SAAS,EAAE,CAAC;AACf,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,mBAAmB,GAAG;IAAE,UAAU,CAAC,EAAE,SAAS,CAAA;CAAE,GACxD,YAAY,EAAE,CAAC;AAClB,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,mBAAmB,GAAG,SAAS,EAAE,CAAC"}
|
|
@@ -3,6 +3,22 @@ import { type CarriedContext } from "../../http/requestContext";
|
|
|
3
3
|
import { type ApiRouteConfig } from "./config";
|
|
4
4
|
import { type FlatApiRoutes } from "./createFlatApiRoutes";
|
|
5
5
|
export type InProcessMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
|
|
6
|
+
/**
|
|
7
|
+
* Credentials of the app's own that a `dispatchAs` request carries beside
|
|
8
|
+
* gemi's access token: a cookie an app middleware reads (an anonymous owner's
|
|
9
|
+
* id), or a header the app signed for this call (a short-lived grant).
|
|
10
|
+
*
|
|
11
|
+
* A `null` or `undefined` value is skipped, so `req.cookies.get("x")` can be
|
|
12
|
+
* passed as it is. The values are sent as given — a cookie value is not
|
|
13
|
+
* encoded, the same as `HttpRequest.cookies` reads it.
|
|
14
|
+
*/
|
|
15
|
+
export type DispatchCredentials = {
|
|
16
|
+
headers?: Record<string, string | null | undefined>;
|
|
17
|
+
cookies?: Record<string, string | null | undefined>;
|
|
18
|
+
};
|
|
19
|
+
export type DispatchAsOptions = {
|
|
20
|
+
credentials?: DispatchCredentials;
|
|
21
|
+
};
|
|
6
22
|
/**
|
|
7
23
|
* A RequestBreakerError's `api` payload as a Response, from a middleware or a
|
|
8
24
|
* handler.
|
|
@@ -123,7 +139,17 @@ export declare class ApiRouteDispatcher {
|
|
|
123
139
|
* routes are the framework's, and a tool call that signed out the session
|
|
124
140
|
* that started the run, or signed in to a cookie nobody keeps, is never what
|
|
125
141
|
* a model meant.
|
|
142
|
+
*
|
|
143
|
+
* `options.credentials` adds the app's own credentials to the request — a
|
|
144
|
+
* cookie or a signed header its middleware reads — beside the access token,
|
|
145
|
+
* never instead of it. Nothing is copied from the initiator on the app's
|
|
146
|
+
* behalf: the app names each value, so an app that wants a cookie of the
|
|
147
|
+
* initiator's forwarded reads it and passes it. The names that would swap
|
|
148
|
+
* the identity or the framing are refused with a throw (see
|
|
149
|
+
* `RESERVED_HEADERS`). The app's middleware still decides what a credential
|
|
150
|
+
* is worth, so this grants nothing a direct request carrying the same
|
|
151
|
+
* values would not get.
|
|
126
152
|
*/
|
|
127
|
-
dispatchAs(initiator: HttpRequest<any, any>, method: InProcessMethod, path: string, body?: FormData | Record<string, unknown
|
|
153
|
+
dispatchAs(initiator: HttpRequest<any, any>, method: InProcessMethod, path: string, body?: FormData | Record<string, unknown>, options?: DispatchAsOptions): Promise<Response>;
|
|
128
154
|
}
|
|
129
155
|
//# sourceMappingURL=ApiRouteDispatcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiRouteDispatcher.d.ts","sourceRoot":"","sources":["../../../services/router/ApiRouteDispatcher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,WAAW,EAAE,MAAM,YAAY,CAAC;AAIpD,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,2BAA2B,CAAC;AAIhF,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAsChF,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"ApiRouteDispatcher.d.ts","sourceRoot":"","sources":["../../../services/router/ApiRouteDispatcher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,WAAW,EAAE,MAAM,YAAY,CAAC;AAIpD,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,2BAA2B,CAAC;AAIhF,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAsChF,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1E;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACnC,CAAC;AAiIF;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,YAOA;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,YA6CrB;AAED,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,KAAK,SAAgB;IAE5B,UAAU,EAAE,aAAa,CAAM;IAE/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgD;IAC/E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA8C;IAC3E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+C;gBAEjE,MAAM,EAAE,cAAc;IAiB3B,wBAAwB,CAAC,GAAG,EAAE,OAAO;;;;IAuBtC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;IA+BzD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAkC9C;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;;;;;;;;;;;;;;;;;OAkBG;YACW,UAAU;IAgCxB;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO,CAAC,eAAe;IAMjB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI;IA0GpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;IACG,UAAU,CACd,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,EAChC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,QAAQ,CAAC;CA4ErB"}
|
package/package.json
CHANGED
package/dist/chunk-h15bd9vn.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{Af as e,Bf as m,zf as B}from"./chunk-9xf2fx98.js";import{Ef as C}from"./chunk-eqtsfvvd.js";import{Kg as _H}from"./chunk-48dek9s7.js";import{Wg as S}from"./chunk-n63xjrck.js";import{bh as Q0}from"./chunk-68zf43ah.js";class WH{static kind="controller";constructor(){}}class wH extends WH{}function o(H){let G=new Map;if(!H)return G;for(let Q of H.split(";")){let Z=Q.indexOf("=");if(Z===-1)continue;let X=Q.slice(0,Z).trim();if(!X)continue;G.set(X,Q.slice(Z+1).trim())}return G}function Y0(H){return o(H.headers.get("cookie"))}function j(H){if(!/^\d+$/.test(H))return null;let G=Number(H);return Number.isSafeInteger(G)?G:null}function KH(H){if(!H)return null;let G=H.trim();if(!/^bytes=/i.test(G))return null;let Z=G.slice(6).split(",").map((D)=>D.trim()).filter((D)=>D!=="");if(Z.length!==1)return null;let X=Z[0],$=X.indexOf("-");if($===-1)return null;let U=X.slice(0,$),W=X.slice($+1);if(U===""){let D=j(W);if(D===null)return null;return{kind:"suffix",suffixLength:D}}let K=j(U);if(K===null)return null;if(W==="")return{kind:"offset",start:K,end:null};let M=j(W);if(M===null||M<K)return null;return{kind:"offset",start:K,end:M}}function MH(H,G){if(!Number.isFinite(G)||G<=0)return null;let Q,Z;if(H.kind==="suffix"){if(H.suffixLength<=0)return null;Q=Math.max(0,G-H.suffixLength),Z=G-1}else{if(H.start>=G)return null;if(Q=H.start,Z=H.end===null?G-1:Math.min(H.end,G-1),Z<Q)return null}return{start:Q,end:Z,length:Z-Q+1}}function R0(H){if(H.kind==="suffix")return`bytes=-${H.suffixLength}`;return H.end===null?`bytes=${H.start}-`:`bytes=${H.start}-${H.end}`}function P0(H){if(!H)return null;let G=/^bytes\s+(\d+)-(\d+)\/(\d+)$/i.exec(H.trim());if(!G)return null;let Q=j(G[1]),Z=j(G[2]),X=j(G[3]);if(Q===null||Z===null||X===null||Z<Q)return null;return{start:Q,end:Z,total:X}}function B0(H,G,Q){return`bytes ${H}-${G}/${Q}`}function TH(H){return`bytes */${H}`}class w extends B{errors={};constructor(H){super("Validation error");this.name="ValidationError",this.errors=H,this.payload={api:{status:400,data:{error:{kind:"validation_error",messages:H,status:400}},headers:{"Content-Type":"application/json"}},view:{status:400}}}}function EH(H){let[G,Q]=H.match(/\d+|\D+/g)??[];if(!G||!Q)return 0;let Z=Number.parseInt(G);switch(Q){case"B":return Z;case"KB":return Z*1024;case"MB":return Z*1024*1024;case"GB":return Z*1024*1024*1024;case"TB":return Z*1024*1024*1024*1024;default:return 0}}function NH(H){switch(H){case"image":return"image";case"png":return"image/png";case"jpg":return"image/jpeg";case"jpeg":return"image/jpeg";case"ttf":return"font/ttf";case"excel":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case"csv":return"text/csv";case"word":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case"pdf":return"application/pdf";case"json":return"application/json";default:return H}}function YH(H){if(typeof H==="string"||Array.isArray(H))return H.length;return}function n(H){return typeof H==="number"&&!Number.isNaN(H)}var SH=["required","string","boolean","number","email","password","min","max","gte","lte","file","fileType","fileSize","array","object","in"];class J extends Error{name="InvalidValidationRuleError"}function y(H,G){let Q=G===void 0||G.trim()===""?Number.NaN:Number(G);if(Number.isNaN(Q))throw new J(`Validation rule "${H}:${G??""}" needs a number, e.g. "${H}:3"`);return Q}function DH(H){let G=H.indexOf(":"),Q=G===-1?H:H.slice(0,G),Z=G===-1?void 0:H.slice(G+1);switch(Q){case"required":return(X)=>{if(X instanceof Blob)return X.size>0;if(X===null||X===void 0)return!1;if(typeof X==="string"||Array.isArray(X))return X.length>0;return!0};case"string":return(X)=>typeof X==="string";case"boolean":return(X)=>typeof X==="boolean";case"number":return(X)=>n(X);case"password":return(X)=>{return typeof X==="string"&&/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{8,}$/.test(X)};case"min":{let X=y(Q,Z);return($)=>{let U=YH($);return U!==void 0&&U>=X}}case"max":{let X=y(Q,Z);return($)=>{let U=YH($);return U!==void 0&&U<=X}}case"gte":{let X=y(Q,Z);return($)=>n($)&&$>=X}case"lte":{let X=y(Q,Z);return($)=>n($)&&$<=X}case"email":return(X)=>{return typeof X==="string"&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(X)};case"file":return(X)=>{return X instanceof Blob};case"fileType":{if(!Z)throw new J('Validation rule "fileType" needs a type, e.g. "fileType:png" or "fileType:image"');let X=NH(Z);return($)=>$ instanceof Blob&&$.type.startsWith(X)}case"fileSize":{let X=EH(Z??"");if(X===0&&!/^0+(B|KB|MB|GB|TB)$/.test(Z??""))throw new J(`Validation rule "fileSize:${Z??""}" needs a whole size in B, KB, MB, GB or TB, e.g. "fileSize:5MB"`);return($)=>$ instanceof Blob&&$.size<=X}case"array":return(X)=>Array.isArray(X);case"object":return(X)=>typeof X==="object"&&X!==null&&!Array.isArray(X)&&!(X instanceof Blob);case"in":{let X=(Z??"").split(",").filter(($)=>$!=="");if(X.length===0)throw new J('Validation rule "in" needs a comma-separated list, e.g. "in:draft,published"');return($)=>typeof $==="string"&&X.includes($)}default:throw new J(`Unknown validation rule "${H}". Known rules: ${SH.join(", ")}`)}}var d=new WeakMap;function PH(H){return typeof H==="object"&&H!==null&&d.has(H)}function i(H){let G=d.get(H);if(!G)throw Error("gemi/ai: expected a schema built with `s`, got a foreign object");return G}function b(H){let G=(H.optional||H.nullable)&&H.node.kind!=="json",Q=kH(yH(H.node),G),Z=[H.description,gH(H.node)].filter(Boolean).join(" ");return Z?{description:Z,...Q}:Q}function gH(H){let G=[];if(H.kind==="string"||H.kind==="enum"){let Q=H.checks;if(Q?.format)G.push(`Format: ${Q.format.name}.`);if(Q?.minLength!==void 0)G.push(`At least ${Q.minLength} characters.`);if(Q?.maxLength!==void 0)G.push(`At most ${Q.maxLength} characters.`)}else if(H.kind==="number"){let Q=H.checks;if(Q?.minimum!==void 0)G.push(`Minimum ${Q.minimum}.`);if(Q?.exclusiveMinimum!==void 0)G.push(`Greater than ${Q.exclusiveMinimum}.`);if(Q?.maximum!==void 0)G.push(`Maximum ${Q.maximum}.`);if(Q?.exclusiveMaximum!==void 0)G.push(`Less than ${Q.exclusiveMaximum}.`)}else if(H.kind==="array"){let Q=H.checks;if(Q?.minItems!==void 0)G.push(`At least ${Q.minItems} items.`);if(Q?.maxItems!==void 0)G.push(`At most ${Q.maxItems} items.`)}return G.join(" ")}function yH(H){switch(H.kind){case"string":return{type:"string"};case"number":return{type:H.checks?.integer?"integer":"number"};case"boolean":return{type:"boolean"};case"literal":return{type:typeof H.value,const:H.value};case"enum":return{type:"string",enum:H.values};case"array":return{type:"array",items:b(H.item)};case"object":return{type:"object",properties:Object.fromEntries(Object.entries(H.shape).map(([G,Q])=>[G,b(Q)])),required:Object.keys(H.shape),additionalProperties:!1};case"union":return{anyOf:H.members.map(b)};case"json":return{}}}function kH(H,G){if(!G)return H;if(H.anyOf)return{...H,anyOf:[...H.anyOf,{type:"null"}]};if(H.enum||H.const!==void 0)return{anyOf:[H,{type:"null"}]};if(typeof H.type==="string")return{...H,type:[H.type,"null"]};return{anyOf:[H,{type:"null"}]}}function bH(H){if(H===null)return"null";if(Array.isArray(H))return"array";return typeof H}function fH(H,G){if(typeof G==="number"&&!Number.isFinite(G))return String(G);if(H.kind==="literal"||H.kind==="enum"){if(typeof G==="string"||typeof G==="number"||typeof G==="boolean")return JSON.stringify(G)}return bH(G)}function cH(H){let G=H.node,Q=(()=>{switch(G.kind){case"number":return G.checks?.integer?"integer":"number";case"string":case"boolean":return G.kind;case"literal":return JSON.stringify(G.value);case"enum":return`one of ${G.values.map((Z)=>JSON.stringify(Z)).join(" | ")}`;case"array":return"array";case"object":return"object";case"union":return"one of the variants";case"json":return"a JSON value"}})();return H.optional||H.nullable?`${Q} or null`:Q}function vH(H){let G="";for(let Q of H)G+=typeof Q==="number"?`[${Q}]`:G?`.${Q}`:Q;return G}function pH(H){let G=vH(H);return G?`${G}: `:""}function t(H){return`${pH(H.path)}${H.message}`}function r(H,G){if(G===null||G===void 0)return H.optional||H.nullable?1:0;let Q=H.node;switch(Q.kind){case"string":return typeof G==="string"?1:0;case"number":return typeof G==="number"?1:0;case"boolean":return typeof G==="boolean"?1:0;case"literal":return G===Q.value?10:0;case"enum":return typeof G==="string"&&Q.values.includes(G)?10:0;case"array":return Array.isArray(G)?1:0;case"object":{if(typeof G!=="object"||Array.isArray(G))return 0;let Z=G,X=1;for(let[$,U]of Object.entries(Q.shape))X+=r(U,Z[$]);return X}case"union":return Q.members.reduce((Z,X)=>Math.max(Z,r(X,G)),0);case"json":return 1}}function x(H,G,Q,Z){if(H.optional&&(G===null||G===void 0))return{drop:!0,value:void 0};if(H.nullable&&G===null)return{drop:!1,value:null};return{drop:!1,value:hH(H,G,Q,Z)}}function hH(H,G,Q,Z){let X=H.node,$=()=>{let U=G===void 0?"required":X.kind==="literal"?"const":X.kind==="enum"&&typeof G==="string"?"enum":"type",W=U==="const"?{allowedValue:X.value}:U==="enum"?{allowedValues:X.values}:{};Z.push({path:Q,code:U,message:`expected ${cH(H)}, got ${fH(X,G)}`,params:W});return};switch(X.kind){case"string":if(typeof G!=="string")return $();return RH(X.checks,G,Q,Z),G;case"number":if(typeof G!=="number"||!Number.isFinite(G))return $();if(X.checks?.integer&&!Number.isInteger(G))return $();return mH(X.checks,G,Q,Z),G;case"boolean":return typeof G==="boolean"?G:$();case"literal":return G===X.value?G:$();case"enum":if(typeof G!=="string"||!X.values.includes(G))return $();return RH(X.checks,G,Q,Z),G;case"array":{if(!Array.isArray(G))return $();let U=G.map((M,D)=>{let q=x(X.item,M,[...Q,D],Z);return q.drop?void 0:q.value}),{minItems:W,maxItems:K}=X.checks??{};if(W!==void 0&&G.length<W)Z.push({path:Q,code:"minItems",message:`expected at least ${W} items, got ${G.length}`,params:{limit:W}});if(K!==void 0&&G.length>K)Z.push({path:Q,code:"maxItems",message:`expected at most ${K} items, got ${G.length}`,params:{limit:K}});return U}case"object":{if(typeof G!=="object"||G===null||Array.isArray(G))return $();let U=G,W={};for(let[K,M]of Object.entries(X.shape)){let D=x(M,U[K],[...Q,K],Z);if(!D.drop)W[K]=D.value}return W}case"union":{let U;for(let W of X.members){let K=[],M=x(W,G,Q,K);if(K.length===0)return M.drop?void 0:M.value;let D=r(W,G);if(!U||D>U.score)U={issues:K,score:D}}Z.push({path:Q,code:"anyOf",message:`no matching variant; closest: ${U.issues.map(t).join("; ")}`,params:{closest:U.issues}});return}case"json":if(G===void 0)return $();return f(G,Q,Z,new Set),G}}function dH(H){let G=0;for(let Q of H)G++;return G}function RH(H,G,Q,Z){if(!H)return;let{minLength:X,maxLength:$,format:U}=H;if(X!==void 0||$!==void 0){let W=dH(G);if(X!==void 0&&W<X)Z.push({path:Q,code:"minLength",message:`expected at least ${X} characters, got ${W}`,params:{limit:X}});if($!==void 0&&W>$)Z.push({path:Q,code:"maxLength",message:`expected at most ${$} characters, got ${W}`,params:{limit:$}})}if(U){let W=!1;try{W=U.test(G)===!0}catch{}if(!W)Z.push({path:Q,code:"format",message:`expected a string in format "${U.name}"`,params:{format:U.name}})}}function mH(H,G,Q,Z){if(!H)return;let X=($,U,W,K)=>{if(U===void 0||W(U))return;Z.push({path:Q,code:$,message:`expected ${K} ${U}, got ${G}`,params:{limit:U}})};X("minimum",H.minimum,($)=>G>=$,"at least"),X("exclusiveMinimum",H.exclusiveMinimum,($)=>G>$,"more than"),X("maximum",H.maximum,($)=>G<=$,"at most"),X("exclusiveMaximum",H.exclusiveMaximum,($)=>G<$,"less than")}function f(H,G,Q,Z,X=!0){let $=(W)=>{Q.push({path:G,code:"type",message:`expected a JSON value, got ${W}`,params:{}})};switch(typeof H){case"undefined":case"string":case"boolean":return;case"number":if(!Number.isFinite(H))$(String(H));return;case"bigint":return $("a bigint");case"function":return $("a function");case"symbol":return $("a symbol")}if(H===null)return;let U=H;if(Z.has(U))return $("a circular reference");Z.add(U);try{let W=X?U.toJSON:void 0;if(typeof W==="function"){let K;try{K=W.call(U)}catch{return $("a toJSON that threw")}if(K===void 0)return $("a toJSON that returns undefined");return f(K,G,Q,Z,!1)}if(Array.isArray(H))H.forEach((K,M)=>f(K,[...G,M],Q,Z));else for(let[K,M]of Object.entries(U))f(M,[...G,K],Q,Z)}finally{Z.delete(U)}}function z(H){return c(H)}function c(H){let G={toJSONSchema:()=>b(H),parse(Q){let Z=[],X=x(H,Q,[],Z);if(Z.length>0)throw Error(Z.map(t).join("; "));return X.drop?void 0:X.value},safeParse(Q){let Z=[],X=x(H,Q,[],Z);if(Z.length>0)return{ok:!1,errors:Z.map(t)};return{ok:!0,value:X.drop?void 0:X.value}},validate(Q){let Z=[],X=x(H,Q,[],Z);if(Z.length>0)return{ok:!1,issues:Z};return{ok:!0,value:X.drop?void 0:X.value}},describe:(Q)=>c({...H,description:Q}),optional:()=>c({...H,optional:!0}),nullable:()=>c({...H,nullable:!0,optional:!1})};return d.set(G,H),G}function L(H){return{node:H,optional:!1,nullable:!1}}class BH extends Error{problems;constructor(H){super(`gemi/ai: s.fromJSONSchema cannot model this schema:
|
|
3
|
-
${H.map((G)=>`- ${G}`).join(`
|
|
4
|
-
`)}`);this.name="JSONSchemaError",this.problems=H}}var uH=new Set(["title","$schema","$id","$comment","examples","default","deprecated","readOnly","writeOnly"]),E={string:["minLength","maxLength","format"],number:["minimum","maximum","exclusiveMinimum","exclusiveMaximum"],integer:["minimum","maximum","exclusiveMinimum","exclusiveMaximum"],boolean:[],object:["properties","required","additionalProperties"],array:["items","minItems","maxItems"]};function k(H){return typeof H==="object"&&H!==null&&!Array.isArray(H)}function v(H,G,Q,Z){let X=(T,Y=Q)=>{Z.push(Y?`${Y}: ${T}`:T);return},$=(T)=>Q?`${Q}.${T}`:T;if(!k(H))return X("expected a schema object");let U=new Set(G.ignoreKeywords??[]),W=(T)=>uH.has(T)||T.startsWith("x-")||U.has(T),K=!1,M=H.type;if(Array.isArray(M)){let T=M.filter((Y)=>Y!=="null");if(T.length!==1)return X(`type ${JSON.stringify(M)} is not supported; only one type, optionally with "null". Use anyOf for alternatives`,$("type"));K=T.length<M.length,M=T[0]}if(M!==void 0&&(typeof M!=="string"||!(M in E)))return X(`type ${JSON.stringify(M)} is not supported; expected one of ${Object.keys(E).join(", ")}`,$("type"));let D=new Set(["type","description","enum","const","anyOf",...M?E[M]:[]]),q=!1;for(let T of Object.keys(H)){if(D.has(T)||W(T))continue;q=!0;let Y=Object.entries(E).find(([,P])=>P.includes(T));X(Y&&Y[0]!==M?`"${T}" applies to type ${Y[0]}, and this schema is ${M?`type ${M}`:"untyped"}`:`"${T}" is not supported by s.fromJSONSchema`,$(T))}if(q)return;if(H.description!==void 0&&typeof H.description!=="string")return X("expected a string",$("description"));let g=H.description,F=(T)=>({node:T,optional:!1,nullable:K,...g?{description:g}:{}});if(H.anyOf!==void 0){if(M!==void 0||H.enum!==void 0||H.const!==void 0)return X("anyOf cannot be combined with type, enum or const here",$("anyOf"));if(!Array.isArray(H.anyOf)||H.anyOf.length===0)return X("expected a non-empty array",$("anyOf"));let T=[],Y=!1;if(H.anyOf.forEach((P,R)=>{if(k(P)&&P.type==="null"&&Object.keys(P).length===1){K=!0;return}let A=v(P,G,$(`anyOf[${R}]`),Z);if(A)T.push(A);else Y=!0}),Y)return;if(T.length===0)return X("anyOf has only null in it",$("anyOf"));if(T.length===1){let P=T[0];return{...P,nullable:P.nullable||K,...g?{description:g}:{}}}return F({kind:"union",members:T})}if(H.const!==void 0){let T=H.const;if(typeof T!=="string"&&typeof T!=="number"&&typeof T!=="boolean")return X("only a string, number or boolean const is supported",$("const"));if(M!==void 0&&typeof T!==(M==="integer"?"number":M))return X(`const ${JSON.stringify(T)} is not of type ${M}`,$("const"));return F({kind:"literal",value:T})}let O;if(M==="string"){if(O=oH(H,G,$,Z),O===null)return}if(H.enum!==void 0){if(!Array.isArray(H.enum)||H.enum.length===0)return X("expected a non-empty array",$("enum"));let T=H.enum.filter((R)=>R!==null);if(T.length<H.enum.length)K=!0;let Y=T.find((R)=>!(typeof R==="string"||typeof R==="number"||typeof R==="boolean")||M!==void 0&&typeof R!==(M==="integer"?"number":M));if(Y!==void 0||T.length===0)return X(M?`every value must be of type ${M}${T.length===0?", and there must be one":`; ${JSON.stringify(Y)} is not`}`:"only strings, numbers and booleans are supported",$("enum"));if(T.every((R)=>typeof R==="string"))return F({kind:"enum",values:[...new Set(T)],...O?{checks:O}:{}});let P=[...new Set(T)];if(P.length===1)return F({kind:"literal",value:P[0]});return F({kind:"union",members:P.map((R)=>L({kind:"literal",value:R}))})}switch(M){case void 0:return X("a schema needs a type, an enum, a const or an anyOf");case"string":return F({kind:"string",...O?{checks:O}:{}});case"number":case"integer":{let T=M==="integer"?{integer:!0}:{},Y=!1;for(let P of E.number){let R=H[P];if(R===void 0)continue;if(typeof R!=="number"||!Number.isFinite(R)){X("expected a number",$(P)),Y=!0;continue}T[P]=R}if(Y)return;return F({kind:"number",...Object.keys(T).length>0?{checks:T}:{}})}case"boolean":return F({kind:"boolean"});case"array":{if(!k(H.items))return X('an array needs "items" to be one schema (tuples are not supported)',$("items"));let T={},Y=!1;for(let R of["minItems","maxItems"]){let A=H[R];if(A===void 0)continue;if(typeof A!=="number"||!Number.isInteger(A)||A<0){X("expected a non-negative integer",$(R)),Y=!0;continue}T[R]=A}let P=v(H.items,G,$("items"),Z);if(!P||Y)return;return F({kind:"array",item:P,...Object.keys(T).length>0?{checks:T}:{}})}case"object":{let T=H.properties??{};if(!k(T))return X("expected an object",$("properties"));if(H.additionalProperties!==void 0&&H.additionalProperties!==!1)return X("only false is supported; a record with arbitrary keys has no strict-mode form (use s.json())",$("additionalProperties"));let Y=H.required??[];if(!Array.isArray(Y)||!Y.every((V)=>typeof V==="string"))return X("expected an array of property names",$("required"));let P=Y.filter((V)=>!Object.hasOwn(T,V));if(P.length>0)return X(`lists properties the schema doesn't have: ${P.join(", ")}`,$("required"));let R={},A=!1;for(let[V,qH]of Object.entries(T)){let u=v(qH,G,$(`properties.${V}`),Z);if(!u){A=!0;continue}R[V]=Y.includes(V)?u:{...u,optional:!0}}if(A)return;return F({kind:"object",shape:R})}}return}function oH(H,G,Q,Z){let X={},$=!1;for(let U of["minLength","maxLength"]){let W=H[U];if(W===void 0)continue;if(typeof W!=="number"||!Number.isInteger(W)||W<0){Z.push(`${Q(U)}: expected a non-negative integer`),$=!0;continue}X[U]=W}if(H.format!==void 0){let U=H.format,W=typeof U==="string"?G.formats?.[U]:void 0;if(typeof U!=="string")Z.push(`${Q("format")}: expected a string`),$=!0;else if(!W||!Object.hasOwn(G.formats,U))Z.push(`${Q("format")}: unknown format ${JSON.stringify(U)}; pass a check for it in the formats option`),$=!0;else X.format={name:U,test:nH(W)}}if($)return null;return Object.keys(X).length>0?X:void 0}function nH(H){if(H===!0)return()=>!0;if(H instanceof RegExp)return(G)=>{return H.lastIndex=0,H.test(G)};return H}var J0={string:()=>z(L({kind:"string"})),number:()=>z(L({kind:"number"})),boolean:()=>z(L({kind:"boolean"})),literal:(H)=>z(L({kind:"literal",value:H})),enum:(H)=>z(L({kind:"enum",values:H})),object:(H)=>z(L({kind:"object",shape:Object.fromEntries(Object.entries(H).map(([G,Q])=>[G,i(Q)]))})),array:(H)=>z(L({kind:"array",item:i(H)})),union:(H)=>z(L({kind:"union",members:H.map(i)})),json:()=>z(L({kind:"json"})),fromJSONSchema:(H,G={})=>{let Q=[],Z=v(H,G,"",Q);if(!Z||Q.length>0)throw new BH(Q.length>0?Q:["unreadable schema"]);return z(Z)}};function C0(H){let G=d.get(H);if(G)return h(G.node);return p(H.toJSONSchema())}function p(H){if(!(H.type!==void 0||H.enum!==void 0||H.const!==void 0||H.anyOf!==void 0||H.properties!==void 0||H.items!==void 0))return!1;for(let Q of Object.values(H.properties??{}))if(!p(Q))return!1;if(H.items&&!p(H.items))return!1;for(let Q of H.anyOf??[])if(!p(Q))return!1;return!0}function h(H){switch(H.kind){case"string":case"number":case"boolean":case"literal":case"enum":return!0;case"object":return Object.values(H.shape).every((G)=>h(G.node));case"array":return h(H.item.node);case"union":return H.members.every((G)=>h(G.node));case"json":return!1}}function AH(H){if(typeof H!=="string")return null;let[G]=H.split(";",1),Q=G.trim().toLowerCase();return Q===""?null:Q}function FH(H){if(H===null)return!1;if(H==="application/json")return!0;let G=H.indexOf("/");return G>0&&H.endsWith("+json")&&H.length>G+1+5}var l=new WeakMap;function O0(H,G){l.set(H,{clientAddress:G})}function zH(H){return l.has(H)}function j0(H){return l.get(H)?.clientAddress}var LH=new WeakMap;function I0(H,G){LH.set(H,G)}function JH(H){return LH.get(H)??null}var s=new WeakMap;function q0(H,G){let Q=s.get(H)??[];if(!Q.includes(G))s.set(H,[...Q,G])}function w0(H){return s.get(H)??[]}class I{data;constructor(H){this.data=H}get(H){return this.data[H]}has(H){return this.data[H]!==void 0}toJSON(){return this.data}}function CH(H){return typeof H==="object"&&H!==null&&!(H instanceof Blob)}function iH(H,G){if(!G.includes(".")||Object.hasOwn(H,G))return[{path:[G],value:H[G]}];let Q=[{path:[],value:H}];for(let Z of G.split(".")){let X=[];for(let{path:$,value:U}of Q){if(Z==="*"){if(Array.isArray(U))U.forEach((W,K)=>X.push({path:[...$,K],value:W}));else if(CH(U))for(let[W,K]of Object.entries(U))X.push({path:[...$,W],value:K});continue}if(Array.isArray(U)&&/^\d+$/.test(Z)){X.push({path:[...$,Number(Z)],value:U[Number(Z)]});continue}X.push({path:[...$,Z],value:CH(U)&&Object.hasOwn(U,Z)?U[Z]:void 0})}Q=X}return Q}function VH(H){return H.join(".")}class tH{kind;rawRequest;headers;cookies;search;schema={};routePath;params;domain;constructor(H,G,Q,Z){if(!H){let K=C.getStore().req;this.params=K.params,this.rawRequest=K.rawRequest,this.kind=K.kind,this.routePath=K.routePath,this.domain=K.domain??null}else this.params=G,this.rawRequest=H,this.routePath=Z,this.kind=Q??"api",this.domain=JH(H);this.headers=this.rawRequest.headers;let X=o(this.rawRequest.headers.get("Cookie")),$=new URL(this.rawRequest.url),U=new Map;for(let[K,M]of $.searchParams)if(U.has(K)){let D=U.get(K);if(Array.isArray(D))D.push(M),U.set(K,D);else U.set(K,[D,M])}else U.set(K,M);let W=Object.fromEntries(U.entries());this.search=new I(W),this.cookies=X}locale(){return C.getStore().locale}ctx(){return C.getStore()}isModelOriginated(){return zH(this.rawRequest)}get signal(){return this.rawRequest.signal}range(){return KH(this.rawRequest.headers.get("Range"))}refine(H){return{}}async parseBody(){let H=AH(this.rawRequest.headers.get("Content-Type"));if(FH(H))return new I(await this.parseJsonBody());if(H==="application/x-www-form-urlencoded"||H==="multipart/form-data"){let G;try{G=await this.rawRequest.formData()}catch{throw new B("The request body could not be read as a form.")}let Q=new Map;for(let[Z,X]of G.entries())if(Q.has(Z)){let $=Q.get(Z);if(Array.isArray($))$.push(X);else Q.set(Z,[$,X])}else Q.set(Z,X);return new I(Object.fromEntries(Q.entries()))}return new I({})}async parseJsonBody(){if(!this.rawRequest.body)return{};let H;try{H=await this.rawRequest.text()}catch{throw new B("The request body could not be read.")}if(H.trim()==="")return{};let G;try{G=JSON.parse(H)}catch{throw new B("The request body is not valid JSON.")}if(G===null||typeof G!=="object")throw new B("The request body must be a JSON object.");return G}validateInput(H){if(PH(this.schema))return this.validateWithSchema(H);let G=H.toJSON()??{},Q={},Z=Object.entries(this.schema).map(([X,$])=>({key:X,rules:Object.entries($).map(([U,W])=>({rule:U,message:W,check:typeof W==="function"?null:this.ruleFor(X,U)}))}));for(let{key:X,rules:$}of Z)for(let{path:U,value:W}of iH(G,X)){let K=this.checkField(W,$);if(K.length>0){let M=Q[VH(U)]??=[];for(let D of K)if(!M.includes(D))M.push(D)}}if(this.addRefinements(Q,G),Object.keys(Q).length>0)throw new w(Q);return H}checkField(H,G){let Q=G.some(({rule:$})=>$==="required"),Z=H===void 0||H===null||H==="",X=[];for(let{rule:$,message:U,check:W}of G){let K=U,M=!1;if(typeof U==="function")K=U(H),M=typeof K>"u";else M=W(H);if(M)continue;if(Z&&!Q)continue;if($==="required")return[String(K)];if(!X.includes(String(K)))X.push(String(K))}return X}validateWithSchema(H){let G=this.schema.validate(H.toJSON()),Q={};if("issues"in G)for(let X of G.issues){let $=VH(X.path),U=Q[$]??=[];if(!U.includes(X.message))U.push(X.message)}let Z="value"in G?new I(G.value):H;if(this.addRefinements(Q,Z.toJSON()),Object.keys(Q).length>0)throw new w(Q);return Z}addRefinements(H,G){for(let[Q,Z]of Object.entries(this.refine(G)??{})){let X=H[Q]??[];H[Q]=X.includes(Z)?X:[...X,Z]}}ruleFor(H,G){try{return DH(G)}catch(Q){if(Q instanceof J)throw new J(`${this.constructor.name}.schema.${H}: ${Q.message}`);throw Q}}async input(){return this.validateInput(await this.parseBody())}async safeInput(){let H=await this.parseBody();try{return{isValid:!0,errors:{},input:this.validateInput(H)}}catch(G){if(!(G instanceof w))throw G;return{isValid:!1,errors:G.errors,input:H}}}}class rH extends B{error;constructor(H="Not authorized"){super(H);this.name="AuthorizationError",this.error=H,this.payload={api:{status:401,data:{error:m("authorization",this.error,401)}},view:{}}}}class a extends B{static apiStatus=403;error;constructor(H="Insufficient permissions"){super(H);this.name="InsufficientPermissionsError",this.error=H,this.payload={api:{status:a.apiStatus,data:{error:m("permission",this.error,a.apiStatus)}},view:{status:403}}}}class HH extends B{total;constructor(H){super("Range not satisfiable");this.total=H;this.name="RangeNotSatisfiableError",this.payload={api:{status:416,data:{error:e("range_not_satisfiable","Range not satisfiable",416)},headers:{"Content-Range":TH(H),"Accept-Ranges":"bytes","Cache-Control":"no-store"}},view:{}}}}class _ extends B{fileName;constructor(H){super("File not found");this.fileName=H;this.name="FileNotFoundError",this.payload={api:{status:404,data:{error:e("not_found","Not found",404)},headers:{"Cache-Control":"no-store"}},view:{}}}}class lH extends B{constructor(H={}){super("Authentication error");this.name="AuthenticationError";let G=H.redirectTo??"/auth/sign-in";this.payload={api:{status:401,data:{error:m("authentication","Authentication error",401)}},viewData:{status:200,data:{},headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate"},directive:{kind:"Redirect",path:G}},view:{status:302,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:G}}}}}class N{static getFacadeAccessor(){throw Error(`Facade [${this.name}] does not implement getFacadeAccessor().`)}static getFacadeRoot(){return _H(this.getFacadeAccessor())}}class GH{async delete(H){throw Error(`${this.constructor.name} does not implement delete(). Override it to remove objects from this backend.`)}async read(H){let G=typeof H==="string"?{name:H}:H,Q=await this.fetch({name:G.name,bucket:G.bucket});if(!Q.ok)throw new _(G.name);let Z=Q.headers.get("Content-Type")??"application/octet-stream",X=Q.headers.get("ETag")??void 0,$=Q.headers.get("Last-Modified"),U=$?new Date($):void 0;if(G.range){let M=await Q.blob();return{body:M,start:0,end:M.size-1,total:M.size,partial:!1,type:Z,etag:X,lastModified:U,name:G.name}}let W=Number(Q.headers.get("Content-Length")),K=Number.isFinite(W)?W:0;return{body:Q.body,start:0,end:K-1,total:K,partial:!1,type:Z,etag:X,lastModified:U,name:G.name}}async size(H){let G=typeof H==="string"?H:H.name,Q=typeof H==="string"?void 0:H.bucket,Z=await this.fetch({name:G,bucket:Q});if(!Z.ok)throw new _(G);let X=Number(Z.headers.get("Content-Length"));if(Number.isFinite(X))return await Z.body?.cancel(),X;return(await Z.blob()).size}}function OH(H,G){if(!G)return H;let Q=H.getReader(),Z=!1,X,$=()=>{if(Z=!0,X)G.removeEventListener("abort",X)};return new ReadableStream({start(U){if(X=()=>{if(Z)return;$(),U.error(G.reason),Q.cancel(G.reason).catch(()=>{})},G.aborted)X();else G.addEventListener("abort",X,{once:!0})},async pull(U){let W;try{W=await Q.read()}catch(K){if(Z)return;$(),U.error(K);return}if(Z)return;if(W.done){$(),U.close();return}U.enqueue(W.value)},cancel(U){return $(),Q.cancel(U)}},{highWaterMark:0})}import{readdir as sH,unlink as aH}from"fs/promises";import{isAbsolute as eH,relative as H0,resolve as jH,sep as G0}from"path";class QH extends GH{configured;constructor(H){super();this.configured=H}get folderPath(){return this.configured??`${S()}/storage`}async put(H,{signal:G}={}){G?.throwIfAborted();let Q,Z;if(H instanceof Blob)Q=H,Z=`${Bun.randomUUIDv7()}.${H.type.split("/")[1].split(";")[0]}`;else Q=H.body,Z=H.name;let X=Q instanceof Buffer?Q:Q instanceof Blob||Q instanceof File?Buffer.from(await Q.arrayBuffer()):"",$=`${this.folderPath}/${Z}`;return G?.throwIfAborted(),await Bun.write($,X),Z}async fetch(H,{signal:G}={}){G?.throwIfAborted();let Q=process.env.BUCKET_NAME,Z;if(typeof H==="string")Z=H;else Q=H.bucket??Q,Z=H.name;if(!Z)throw Error("Object name has to be specified");let X=`${this.folderPath}/${Z}`,$=Bun.file(X),U=OH(Bun.file(X).stream(),G),W=new Date($.lastModified).toUTCString();return new Response(U,{headers:{"Content-Type":$.type,"Content-Length":String($.size),"Cache-Control":"private, max-age=12000, must-revalidate","Last-Modified":W}})}async read(H){let G=typeof H==="string"?{name:H}:H,{name:Q,range:Z=null}=G;if(!Q)throw Error("Object name has to be specified");let X=Bun.file(`${this.folderPath}/${Q}`);if(!await X.exists())throw new _(Q);let $=X.size,U=Z?MH(Z,$):null;if(Z&&!U)throw new HH($);let W=U?.start??0,K=U?U.end:$-1;return{body:U?X.slice(W,K+1):X,start:W,end:K,total:$,partial:Boolean(U),type:X.type||"application/octet-stream",lastModified:new Date(X.lastModified),name:Q}}async size(H){let G=typeof H==="string"?H:H.name,Q=Bun.file(`${this.folderPath}/${G}`);if(!await Q.exists())throw new _(G);return Q.size}async delete(H){let G=typeof H==="string"?H:H.name;if(!G)throw Error("Object name has to be specified");let Q=jH(this.folderPath),Z=jH(Q,G),X=H0(Q,Z);if(!X||X===".."||X.startsWith(`..${G0}`)||eH(X))throw Error(`Refusing to delete "${G}": it is outside the storage folder`);try{await aH(Z)}catch($){if($?.code==="ENOENT")return;throw $}}async list(){return await sH(this.folderPath)}}function $4(H){return H}function xH(){return{driver:new QH}}class XH{static token="filesystem";driver;constructor(H={}){this.driver=H.driver??xH().driver}}import{Buffer as X0}from"buffer";async function IH(H){try{return(await import("sharp")).default}catch(G){throw Error(`${H} requires the 'sharp' package. Install it with \`bun add sharp\`.`,{cause:G})}}class Z0 extends N{static getFacadeAccessor(){return XH}static async put(H,G={}){return this.getFacadeRoot().driver.put(H,G)}static async metadata(H){let G=X0.from(await H.arrayBuffer()),Q=await IH("Storage.metadata()");try{return await Q(G).metadata()}catch{return{}}}static async fetch(H,G={}){return G.signal?.throwIfAborted(),this.getFacadeRoot().driver.fetch(H,G)}static async read(H,G={}){let Q=typeof H==="string"?{name:H}:{...H},Z="range"in G?G.range??null:Q.range!==void 0?Q.range:C.getStore()?.rangeRequest??null;return this.getFacadeRoot().driver.read({...Q,range:Z})}static list(H){return this.getFacadeRoot().driver.list(H)}static async delete(H){return this.getFacadeRoot().driver.delete(H)}}import{mkdir as ZH,readdir as $0,access as U0}from"fs/promises";async function $H(H){try{return await U0(H),!0}catch{return!1}}class UH{config;static token="log";writer;isReady=!1;flushTimeout;fileSize=0;writerSize=0;isCreatingFile=!1;bootPromise=null;currentLogFilePath;get logsDirPath(){return`${S()}/storage/logs`}constructor(H){this.config=H}boot(){if(!this.bootPromise)this.bootPromise=this.createStorage().catch((H)=>{console.error("Log storage unavailable, file logging disabled",H)}).then(()=>{this.isReady=!0});return this.bootPromise}async createStorage(){let H=`${S()}/storage`;if(!await $H(H))await ZH(H);if(!await $H(this.logsDirPath))await ZH(this.logsDirPath);await this.newLogFile()}async newLogFile(){if(!await $H(this.logsDirPath))await ZH(this.logsDirPath);if(this.isCreatingFile=!0,this.currentLogFilePath){this.writer.flush(),this.writer.end(),this.writer=null;let Q=new File([await Bun.file(this.currentLogFilePath).arrayBuffer()],this.currentLogFilePath.split("/").pop(),{type:"text/plain"});this.config.onLogFileClosed(Q),this.fileSize=0,this.writerSize=0}let G=(await $0(this.logsDirPath)).sort().reverse()[0];if(G){let Q=Bun.file(`${this.logsDirPath}/${G}`);if(Q.size<this.config.maxFileSize)this.currentLogFilePath=`${this.logsDirPath}/${G}`,this.writer=Q.writer(),this.writer.write(await Q.text()),this.writer.write(`
|
|
5
|
-
`),this.writer.flush(),this.fileSize=Q.size}if(!this.writer){let Q=`${new Date(Date.now()).toISOString()}.log`.replaceAll(":","-");this.currentLogFilePath=`${this.logsDirPath}/${Q}`;let Z=Bun.file(`${this.logsDirPath}/${Q}`);this.writer=Z.writer(),this.fileSize=0,this.writerSize=0}this.isCreatingFile=!1}async log(H,G,Q={}){if(!this.isReady)await this.boot();let Z=C.getStore(),X={};if(Z)X={url:Z.req.rawRequest.url,method:Z.req.rawRequest.method,headers:Z.req.rawRequest.headers,body:Z.req.rawRequest.body};let $={timestamp:new Date(Date.now()).toISOString(),env:Bun.env.NODE_ENV,level:H,message:G,metadata:{...X,...Q}},U="";try{U=JSON.stringify($)}catch(W){console.log("Error parsing log object",W)}try{let W=this.config.onLogCreated($);if(W instanceof Promise)W.catch((K)=>console.error("Error in onLogCreated",K))}catch(W){console.error("Error in onLogCreated",W)}if(!this.writer)return;this.writerSize+=U.length,this.fileSize+=U.length;try{this.writer.write(U),this.writer.write(`
|
|
6
|
-
`),this.tryFlush()}catch(W){console.error("Error writing log",W)}}async tryFlush(){if(this.fileSize>this.config.maxFileSize){if(!this.isCreatingFile)await this.newLogFile()}if(this.writerSize>this.config.maxFileSize/2)await this.writer.flush(),this.writerSize=0,await this.newLogFile();else clearTimeout(this.flushTimeout),this.flushTimeout=setTimeout(async()=>{await this.writer.flush(),this.writerSize=0},100)}}class W0 extends N{static getFacadeAccessor(){return UH}static debug(H,G){this.getFacadeRoot().log("debug",H,G)}static info(H,G){this.getFacadeRoot().log("info",H,G)}static notice(H,G){this.getFacadeRoot().log("notice",H,G)}static warning(H,G){this.getFacadeRoot().log("warning",H,G)}static error(H,G){this.getFacadeRoot().log("error",H,G)}static critical(H,G){this.getFacadeRoot().log("critical",H,G)}static alert(H,G){this.getFacadeRoot().log("alert",H,G)}static emergency(H,G){this.getFacadeRoot().log("emergency",H,G)}}class K0{config;static token="redis";instance=null;constructor(H={}){this.config=H}get client(){return this.instance??=new(M0())(this.config.url,this.config.options)}set client(H){this.instance=H}close(){let H=this.instance;this.instance=null,H?.close()}}function M0(){let H=globalThis.Bun?.RedisClient;if(typeof H!=="function")throw Error("Redis requires Bun's built-in Redis client, which this runtime does not provide. Run the app under Bun, or bind your own client for the 'redis' token.");return H}
|
|
7
|
-
export{WH as Me,wH as Ne,Y0 as Oe,AH as Pe,O0 as Qe,j0 as Re,KH as Se,MH as Te,R0 as Ue,P0 as Ve,B0 as We,TH as Xe,I0 as Ye,JH as Ze,q0 as _e,w0 as $e,w as af,J as bf,BH as cf,J0 as df,C0 as ef,tH as ff,rH as gf,a as hf,HH as if,_ as jf,lH as kf,N as lf,IH as mf,GH as nf,OH as of,QH as pf,$4 as qf,xH as rf,XH as sf,Z0 as tf,UH as uf,W0 as vf,K0 as wf};
|
|
8
|
-
|
|
9
|
-
//# debugId=7E9BF6B66E88523664756E2164756E21
|