@vercel/board 0.26.2 → 0.28.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/{a2-D6TOZNV2.mjs → a2-B0_VlbtC.mjs} +1 -1
- package/dist/backend-a2.mjs +1 -1
- package/dist/{backend-http-CDu_eapz.mjs → backend-http-BvNFrvcY.mjs} +2 -2
- package/dist/{backend-http-DApbemsm.mjs → backend-http-CfLVYqmj.mjs} +1 -1
- package/dist/backend-http.mjs +1 -1
- package/dist/backend-http.node.mjs +1 -1
- package/dist/{backend-vercel-C2YcUuyT.mjs → backend-vercel-D87pIp2k.mjs} +2 -2
- package/dist/{backend-vercel-QuUJ3dW_.mjs → backend-vercel-DTrDiSk5.mjs} +5 -3
- package/dist/backend-vercel.mjs +1 -1
- package/dist/backend-vercel.node.mjs +1 -1
- package/dist/cli-commands.mjs +1 -1
- package/dist/cli-embedded.d.mts +7 -5
- package/dist/cli-embedded.mjs +7 -5
- package/dist/cli.mjs +4 -4
- package/dist/{commands-nEG47RM_.mjs → commands-BFookFtn.mjs} +1 -1
- package/dist/{exports-T-ART7P7.mjs → exports-CCzw2Vdw.mjs} +1 -1
- package/dist/{index.default-_e7u6Z-I.mjs → index.default-DmKxH_E6.mjs} +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.node.mjs +1 -1
- package/dist/inspect/app.js +1 -1
- package/dist/{main-Ci7R6qkK.mjs → main-eci7w-aP.mjs} +9 -8
- package/dist/{node-Ybi9E6bO.mjs → node-Zd_C-gxP.mjs} +34 -17
- package/dist/{serve-CNklIudj.mjs → serve-B09an9DQ.mjs} +3 -3
- package/dist/{server-DMNfPSAZ.mjs → server-DTX0prGr.mjs} +2 -2
- package/dist/{watchers-hash-C10qKYPa.mjs → watchers-hash-7DJU9b-n.mjs} +2 -2
- package/docs/01-board/05-reading.md +2 -2
- package/docs/01-quickstart.md +3 -2
- package/docs/03-guides/01-coding-agents.md +4 -3
- package/docs/03-guides/03-ci.md +1 -1
- package/docs/03-guides/04-triage.md +3 -3
- package/docs/04-reference/01-cli.md +7 -4
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { n as DIRECT_UPLOAD_BYTES_MAX, r as IMPORT_BYTES_MAX, t as ATTACHMENT_BYTES_MAX } from "./files-SniSmeEr.mjs";
|
|
2
2
|
import { _ as RemoteWatcherId, b as actorKind, i as Attachment, x as platformAvatar } from "./schemas-Be08nyfW.mjs";
|
|
3
3
|
import "./external-BV_cUncs.mjs";
|
|
4
|
-
import { a as METHODS, d as VERSION, f as SYNC, n as compileWatcher, r as hasCriteria, t as canonicalWatchers } from "./watchers-hash-
|
|
4
|
+
import { a as METHODS, d as VERSION, f as SYNC, n as compileWatcher, r as hasCriteria, t as canonicalWatchers } from "./watchers-hash-7DJU9b-n.mjs";
|
|
5
5
|
import { r as duration, t as BoardError } from "./client-D0Px7KzF.mjs";
|
|
6
6
|
import { i as isKeyIdOf, r as derivedId, t as waitUntil } from "./wait-until-Dw4XrIDQ.mjs";
|
|
7
7
|
import { a as forbidden, c as toErrorResponse, i as duplicateId, r as badRequest, s as notFound, t as HttpError } from "./errors-CusN4x2l.mjs";
|
package/dist/backend-a2.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as fsBlob, r as memoryBlob, t as a2 } from "./a2-
|
|
1
|
+
import { n as fsBlob, r as memoryBlob, t as a2 } from "./a2-B0_VlbtC.mjs";
|
|
2
2
|
export { a2, fsBlob, memoryBlob };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { r as createHttp } from "./backend-http-
|
|
2
|
-
import {
|
|
1
|
+
import { r as createHttp } from "./backend-http-CfLVYqmj.mjs";
|
|
2
|
+
import { i as environmentProfile, n as boardUrl, r as connect } from "./node-Zd_C-gxP.mjs";
|
|
3
3
|
//#region src/backend-http/index.ts
|
|
4
4
|
const environment = {
|
|
5
5
|
url: boardUrl,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "./files-SniSmeEr.mjs";
|
|
2
2
|
import "./schemas-Be08nyfW.mjs";
|
|
3
|
-
import { K as routes, O as RegisterBody, a as METHODS, n as compileWatcher, t as canonicalWatchers } from "./watchers-hash-
|
|
3
|
+
import { K as routes, O as RegisterBody, a as METHODS, n as compileWatcher, t as canonicalWatchers } from "./watchers-hash-7DJU9b-n.mjs";
|
|
4
4
|
import { n as createBoardClient, t as BoardError } from "./client-D0Px7KzF.mjs";
|
|
5
5
|
import { a as keyId, n as DERIVED_ID, o as sha256, r as derivedId, t as waitUntil } from "./wait-until-Dw4XrIDQ.mjs";
|
|
6
6
|
import { a as forbidden, o as json, t as HttpError } from "./errors-CusN4x2l.mjs";
|
package/dist/backend-http.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as http } from "./index.default-
|
|
1
|
+
import { t as http } from "./index.default-DmKxH_E6.mjs";
|
|
2
2
|
export { http };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as http } from "./backend-http-
|
|
1
|
+
import { t as http } from "./backend-http-BvNFrvcY.mjs";
|
|
2
2
|
export { http };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { _ as RemoteWatcherId } from "./schemas-Be08nyfW.mjs";
|
|
2
|
-
import { O as RegisterBody, a as METHODS, d as VERSION, n as compileWatcher, t as canonicalWatchers } from "./watchers-hash-
|
|
2
|
+
import { O as RegisterBody, a as METHODS, d as VERSION, n as compileWatcher, t as canonicalWatchers } from "./watchers-hash-7DJU9b-n.mjs";
|
|
3
3
|
import { o as sha256, r as derivedId } from "./wait-until-Dw4XrIDQ.mjs";
|
|
4
4
|
import { a as forbidden, o as json, s as notFound, t as HttpError } from "./errors-CusN4x2l.mjs";
|
|
5
|
-
import { a as wakePath, i as registrant, n as callerProfile, t as PROJECTS_OWN } from "./backend-http-
|
|
5
|
+
import { a as wakePath, i as registrant, n as callerProfile, t as PROJECTS_OWN } from "./backend-http-CfLVYqmj.mjs";
|
|
6
6
|
//#region src/server/backend-vercel.ts
|
|
7
7
|
const PROFILE = /^[A-Za-z][A-Za-z0-9-]{0,31}$/;
|
|
8
8
|
const SESSION = /^[A-Za-z0-9_.:-]{1,128}$/;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as HttpError } from "./errors-CusN4x2l.mjs";
|
|
2
|
-
import { c as
|
|
3
|
-
import { t as createVercel } from "./backend-vercel-
|
|
2
|
+
import { c as loginHanded, d as vercelProjectFile, i as environmentProfile, t as asYou, u as vercelLogin } from "./node-Zd_C-gxP.mjs";
|
|
3
|
+
import { t as createVercel } from "./backend-vercel-D87pIp2k.mjs";
|
|
4
4
|
import { readFile } from "node:fs/promises";
|
|
5
5
|
import { decodeJwt } from "jose";
|
|
6
6
|
import { getVercelOidcToken } from "@vercel/oidc";
|
|
@@ -62,8 +62,10 @@ async function team() {
|
|
|
62
62
|
}
|
|
63
63
|
const environment = {
|
|
64
64
|
fetch: () => async (input, init = {}) => {
|
|
65
|
+
const credential = await token();
|
|
66
|
+
if (!process.env.VERCEL_TOKEN && !deployed()) return asYou(input, init, credential);
|
|
65
67
|
const headers = new Headers(init.headers);
|
|
66
|
-
headers.set("authorization", `Bearer ${
|
|
68
|
+
headers.set("authorization", `Bearer ${credential}`);
|
|
67
69
|
return globalThis.fetch(input, {
|
|
68
70
|
...init,
|
|
69
71
|
headers
|
package/dist/backend-vercel.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as createVercel } from "./backend-vercel-
|
|
1
|
+
import { t as createVercel } from "./backend-vercel-D87pIp2k.mjs";
|
|
2
2
|
//#region src/backend-vercel/index.default.ts
|
|
3
3
|
/**
|
|
4
4
|
* Your team's board, in Vercel's API. Outside Node there's no environment to find credentials or
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as handTeam, r as vercel, t as credentialSource } from "./backend-vercel-
|
|
1
|
+
import { n as handTeam, r as vercel, t as credentialSource } from "./backend-vercel-DTrDiSk5.mjs";
|
|
2
2
|
export { credentialSource, handTeam, vercel };
|
package/dist/cli-commands.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as option, i as groups, n as filters, o as options, r as globalOptions, s as usage, t as commands } from "./commands-
|
|
1
|
+
import { a as option, i as groups, n as filters, o as options, r as globalOptions, s as usage, t as commands } from "./commands-BFookFtn.mjs";
|
|
2
2
|
export { commands, filters, globalOptions, groups, option, options, usage };
|
package/dist/cli-embedded.d.mts
CHANGED
|
@@ -2,8 +2,8 @@ import { d as Board } from "./backend-ZKYTe3xa.mjs";
|
|
|
2
2
|
import "./index-C05it0mC.mjs";
|
|
3
3
|
//#region src/cli/failure.d.ts
|
|
4
4
|
/**
|
|
5
|
-
* What kind of failure it is, which fixes the exit code: 2 for `usage` and `missing_input`,
|
|
6
|
-
* for `
|
|
5
|
+
* What kind of failure it is, which fixes the exit code: 2 for `usage` and `missing_input`, 130
|
|
6
|
+
* for `canceled`, and 1 for the rest, `timeout` included, as the Vercel CLI's waits exit.
|
|
7
7
|
*/
|
|
8
8
|
type FailureClass = 'usage' | 'missing_input' | 'auth' | 'permission' | 'not_found' | 'conflict' | 'limit' | 'rate_limit' | 'network' | 'platform' | 'timeout' | 'canceled' | 'unknown';
|
|
9
9
|
/** One way out: what to do, and the command that does it, whole (`['vb', 'read', 'dev', '--scope', '<TEAM>']`). */
|
|
@@ -55,14 +55,15 @@ export declare function commandWord(argv: string[]): string | undefined;
|
|
|
55
55
|
* Board's CLI as `appName` names it in help, usage, and errors (`vercel board`). With no board
|
|
56
56
|
* URL anywhere, it talks to the team's board in Vercel's API: `VERCEL_ORG_ID`'s, the nearest linked
|
|
57
57
|
* project's team's (`.vercel`), your login's, or `--scope`'s. `run` takes what follows the name, and answers the exit code:
|
|
58
|
-
* 0 success, 1 error
|
|
58
|
+
* 0 success, 1 error (a `wait` that timed out included), 2 misuse, 130 when Ctrl-C stops it. It never exits the process itself. One `run`
|
|
59
59
|
* at a time: a run's flags are the CLI's while it runs.
|
|
60
60
|
*
|
|
61
61
|
* A failure goes to `onError`, with whether the run asked for `--json`, to show as the app shows
|
|
62
62
|
* its own, and a warning to `onWarning` (with `--json`, it's in the result). Without them, the CLI
|
|
63
63
|
* prints its own on stderr. `login` is the app's Vercel login and `team` the team it resolves
|
|
64
64
|
* (`--scope` still wins): board asks for each only when a request needs it, so help, a typo, or
|
|
65
|
-
* misuse never refreshes a login or looks a team up.
|
|
65
|
+
* misuse never refreshes a login or looks a team up. With `fetch`, board's requests to Vercel's API
|
|
66
|
+
* with that login go through the app's own, which adds its credentials (a DPoP proof, say).
|
|
66
67
|
*/
|
|
67
68
|
export declare function createApp(options: {
|
|
68
69
|
appName: string;
|
|
@@ -72,6 +73,7 @@ export declare function createApp(options: {
|
|
|
72
73
|
onWarning?: (warning: Warning) => void;
|
|
73
74
|
login?: () => Promise<string>;
|
|
74
75
|
team?: () => Promise<string | null>;
|
|
76
|
+
fetch?: typeof globalThis.fetch;
|
|
75
77
|
}): {
|
|
76
78
|
run(args: string[]): Promise<number>;
|
|
77
79
|
};
|
|
@@ -88,7 +90,7 @@ export type VbOptions = {
|
|
|
88
90
|
/** Commands this caller doesn't run, which answer 2: `['tail', 'wait']` for an agent's tool. */
|
|
89
91
|
refuse?: string[];
|
|
90
92
|
};
|
|
91
|
-
/** What a `vb()` command printed, and its exit code: 0, 1 for an error
|
|
93
|
+
/** What a `vb()` command printed, and its exit code: 0, 1 for an error (a `wait` that timed out included), 2 for misuse. */
|
|
92
94
|
export type VbResult = {
|
|
93
95
|
code: number;
|
|
94
96
|
stdout: string;
|
package/dist/cli-embedded.mjs
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
import { a as commandLine, c as failureLines, i as mainWith, l as formatFailure, n as commandWord, o as exitCode, r as main, s as failureDocument, t as Failed } from "./main-
|
|
1
|
+
import { a as commandLine, c as failureLines, i as mainWith, l as formatFailure, n as commandWord, o as exitCode, r as main, s as failureDocument, t as Failed } from "./main-eci7w-aP.mjs";
|
|
2
2
|
//#region src/cli/embedded.ts
|
|
3
3
|
/**
|
|
4
4
|
* Board's CLI as `appName` names it in help, usage, and errors (`vercel board`). With no board
|
|
5
5
|
* URL anywhere, it talks to the team's board in Vercel's API: `VERCEL_ORG_ID`'s, the nearest linked
|
|
6
6
|
* project's team's (`.vercel`), your login's, or `--scope`'s. `run` takes what follows the name, and answers the exit code:
|
|
7
|
-
* 0 success, 1 error
|
|
7
|
+
* 0 success, 1 error (a `wait` that timed out included), 2 misuse, 130 when Ctrl-C stops it. It never exits the process itself. One `run`
|
|
8
8
|
* at a time: a run's flags are the CLI's while it runs.
|
|
9
9
|
*
|
|
10
10
|
* A failure goes to `onError`, with whether the run asked for `--json`, to show as the app shows
|
|
11
11
|
* its own, and a warning to `onWarning` (with `--json`, it's in the result). Without them, the CLI
|
|
12
12
|
* prints its own on stderr. `login` is the app's Vercel login and `team` the team it resolves
|
|
13
13
|
* (`--scope` still wins): board asks for each only when a request needs it, so help, a typo, or
|
|
14
|
-
* misuse never refreshes a login or looks a team up.
|
|
14
|
+
* misuse never refreshes a login or looks a team up. With `fetch`, board's requests to Vercel's API
|
|
15
|
+
* with that login go through the app's own, which adds its credentials (a DPoP proof, say).
|
|
15
16
|
*/
|
|
16
17
|
function createApp(options) {
|
|
17
|
-
const { appName, onError, onWarning, login, team } = options;
|
|
18
|
+
const { appName, onError, onWarning, login, team, fetch } = options;
|
|
18
19
|
return { run: (args) => main(args, {
|
|
19
20
|
name: appName,
|
|
20
21
|
commands: {},
|
|
@@ -22,7 +23,8 @@ function createApp(options) {
|
|
|
22
23
|
...onError ? { onError } : {},
|
|
23
24
|
...onWarning ? { onWarning } : {},
|
|
24
25
|
...login ? { login } : {},
|
|
25
|
-
...team ? { team } : {}
|
|
26
|
+
...team ? { team } : {},
|
|
27
|
+
...fetch ? { fetch } : {}
|
|
26
28
|
}) };
|
|
27
29
|
}
|
|
28
30
|
const lacking = (what, option) => async () => {
|
package/dist/cli.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { t as ATTACHMENT_BYTES_MAX } from "./files-SniSmeEr.mjs";
|
|
3
3
|
import "./schemas-Be08nyfW.mjs";
|
|
4
|
-
import { a as option } from "./commands-
|
|
5
|
-
import {
|
|
6
|
-
import { r as main, u as who } from "./main-
|
|
4
|
+
import { a as option } from "./commands-BFookFtn.mjs";
|
|
5
|
+
import { l as projectDir } from "./node-Zd_C-gxP.mjs";
|
|
6
|
+
import { r as main, u as who } from "./main-eci7w-aP.mjs";
|
|
7
7
|
import { randomBytes, timingSafeEqual } from "node:crypto";
|
|
8
8
|
import { appendFile, readFile } from "node:fs/promises";
|
|
9
9
|
import { join } from "node:path";
|
|
@@ -661,7 +661,7 @@ const local = {
|
|
|
661
661
|
if (args.length > 0) throw usage("serve takes no arguments: pass its port with --port, and its directory with --dir.");
|
|
662
662
|
const port = portFlag();
|
|
663
663
|
const root = projectDir();
|
|
664
|
-
const { localHandle, serveLocal } = await import("./serve-
|
|
664
|
+
const { localHandle, serveLocal } = await import("./serve-B09an9DQ.mjs");
|
|
665
665
|
const handle = flags.handle ?? process.env.BOARD_HANDLE;
|
|
666
666
|
const local = await serveLocal({
|
|
667
667
|
dir: flags.dir ?? join(root, ".board"),
|
|
@@ -695,7 +695,7 @@ const commands = [
|
|
|
695
695
|
{
|
|
696
696
|
group: "live",
|
|
697
697
|
name: "wait",
|
|
698
|
-
description: "block for the next match
|
|
698
|
+
description: "block for the next match and print it",
|
|
699
699
|
arguments: [{
|
|
700
700
|
name: "channel",
|
|
701
701
|
required: false,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as ATTACHMENT_BYTES_MAX } from "./files-SniSmeEr.mjs";
|
|
2
2
|
import "./schemas-Be08nyfW.mjs";
|
|
3
|
-
import { A as SchedulesQuery, B as SyncReceiptBody, C as MatchesQuery, D as Ref, E as ReactBody, F as SyncBody, G as UploadStartBody, H as SyncUnlinkBody, I as SyncCodeBody, L as SyncCopiesQuery, M as SourceJoinBody, N as SourceReadQuery, O as RegisterBody, P as SyncAccountBody, R as SyncFindQuery, S as LinkedQuery, T as PostBody, U as ThreadsQuery, V as SyncRootsQuery, W as TypingBody, _ as InboxAckBody, a as METHODS, b as InboxQuery, c as queryObject, d as VERSION, f as SYNC, g as IdentityUnlinkBody, h as EventsQuery, j as SignInQuery, k as ScheduleBody, l as readCapped, m as EditBody, o as createRouter, p as AckBody, s as openapi, u as readJson, v as InboxNextQuery, w as MessagesQuery, x as LabelBody, y as InboxPushBody, z as SyncImportBody } from "./watchers-hash-
|
|
3
|
+
import { A as SchedulesQuery, B as SyncReceiptBody, C as MatchesQuery, D as Ref, E as ReactBody, F as SyncBody, G as UploadStartBody, H as SyncUnlinkBody, I as SyncCodeBody, L as SyncCopiesQuery, M as SourceJoinBody, N as SourceReadQuery, O as RegisterBody, P as SyncAccountBody, R as SyncFindQuery, S as LinkedQuery, T as PostBody, U as ThreadsQuery, V as SyncRootsQuery, W as TypingBody, _ as InboxAckBody, a as METHODS, b as InboxQuery, c as queryObject, d as VERSION, f as SYNC, g as IdentityUnlinkBody, h as EventsQuery, j as SignInQuery, k as ScheduleBody, l as readCapped, m as EditBody, o as createRouter, p as AckBody, s as openapi, u as readJson, v as InboxNextQuery, w as MessagesQuery, x as LabelBody, y as InboxPushBody, z as SyncImportBody } from "./watchers-hash-7DJU9b-n.mjs";
|
|
4
4
|
import { n as createBoardClient, t as BoardError } from "./client-D0Px7KzF.mjs";
|
|
5
5
|
import { r as derivedId } from "./wait-until-Dw4XrIDQ.mjs";
|
|
6
6
|
import { a as forbidden, c as toErrorResponse, l as unauthorized, n as RejectedError, o as json, r as badRequest, s as notFound, t as HttpError } from "./errors-CusN4x2l.mjs";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as createHttp } from "./backend-http-
|
|
1
|
+
import { r as createHttp } from "./backend-http-CfLVYqmj.mjs";
|
|
2
2
|
//#region src/backend-http/index.default.ts
|
|
3
3
|
/**
|
|
4
4
|
* The board at `url`, which keeps the log. Outside Node there's no environment to find it or a
|
package/dist/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { r as duration, t as BoardError } from "./client-D0Px7KzF.mjs";
|
|
2
2
|
import { t as HttpError } from "./errors-CusN4x2l.mjs";
|
|
3
|
-
import { t as http } from "./index.default-
|
|
4
|
-
import { t as createBoard } from "./exports-
|
|
3
|
+
import { t as http } from "./index.default-DmKxH_E6.mjs";
|
|
4
|
+
import { t as createBoard } from "./exports-CCzw2Vdw.mjs";
|
|
5
5
|
import { t as DroppedError } from "./middleware-ChKM1zuu.mjs";
|
|
6
6
|
//#region src/server/index.default.ts
|
|
7
7
|
/**
|
package/dist/index.node.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as duration, t as BoardError } from "./client-D0Px7KzF.mjs";
|
|
2
2
|
import { t as HttpError } from "./errors-CusN4x2l.mjs";
|
|
3
3
|
import { t as DroppedError } from "./middleware-ChKM1zuu.mjs";
|
|
4
|
-
import { t as board } from "./server-
|
|
4
|
+
import { t as board } from "./server-DTX0prGr.mjs";
|
|
5
5
|
export { BoardError, DroppedError, HttpError, board, duration };
|
package/dist/inspect/app.js
CHANGED
|
@@ -342,7 +342,7 @@ function jo(e,t){let n=/* @__PURE__ */ Mo(t=>(t.addIssue=e=>{if(typeof e==`strin
|
|
|
342
342
|
function Mo(e,t){let n=new sr({check:`custom`,...U(t)});return n._zod.check=e,n}function No(e,...t){for(let n of t)for(let t of Reflect.ownKeys(n))Object.prototype.propertyIsEnumerable.call(n,t)&&Ge(e,t,n[t]);return e}function Po(e){let t=e?.target??`draft-2020-12`;return t===`draft-4`&&(t=`draft-04`),t===`draft-7`&&(t=`draft-07`),{processors:e.processors??{},metadataRegistry:e?.metadata??wa,target:t,unrepresentable:e?.unrepresentable??`throw`,override:e?.override??(()=>{}),io:e?.io??`output`,counter:0,seen:/* @__PURE__ */ new Map,sharedDefsExtractedFor:void 0,sharedEmitDoneFor:void 0,cycles:e?.cycles??`ref`,reused:e?.reused??`inline`,intersections:[],deferred:[],external:e?.external??void 0}}function Fo(e,t,n,r,i){let a=typeof t.unrepresentable==`function`?t.unrepresentable({zodSchema:e,path:r.path,message:i}):t.unrepresentable;if(a===`any`)return!1;if(a===void 0||a===`throw`)throw Error(i);return Object.assign(n,a),!0}function Io(e,t,n={path:[],schemaPath:[]}){var r;let i=e._zod.def,a=t.seen.get(e);if(a)return a.count++,n.schemaPath.includes(e)&&(a.cycle=n.path),a.schema;let o={schema:{},count:1,cycle:void 0,path:n.path};t.seen.set(e,o),t.sharedDefsExtractedFor=void 0,t.sharedEmitDoneFor=void 0;let s=e._zod.toJSONSchema?.();if(s)o.schema=s;else{let r={...n,schemaPath:[...n.schemaPath,e],path:n.path};if(e._zod.processJSONSchema)e._zod.processJSONSchema(t,o.schema,r);else{let n=o.schema,a=t.processors[i.type];if(!a)throw Error(`[toJSONSchema]: Non-representable type encountered: ${i.type}`);a(e,t,n,r)}let a=e._zod.parent;a&&(o.ref||=a,Io(a,t,r),t.seen.get(a).isParent=!0)}let c=t.metadataRegistry.get(e);return c&&No(o.schema,c),t.io===`input`&&Ko(e)&&(delete o.schema.examples,delete o.schema.default),t.io===`input`&&`_prefault`in o.schema&&((r=o.schema).default??(r.default=o.schema._prefault)),delete o.schema._prefault,t.seen.get(e).schema}function Lo(e){return e.replace(/~/g,`~0`).replace(/\//g,`~1`)}function Ro(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);if(e.external&&e.sharedDefsExtractedFor===e.external)return;let r=/* @__PURE__ */ new Map;for(let t of e.seen.entries()){let n=e.metadataRegistry.get(t[0])?.id;if(n){let e=r.get(n);if(e&&e!==t[0])throw Error(`Duplicate schema id "${n}" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);r.set(n,t[0])}}let i=t=>{let r=e.target===`draft-2020-12`?`$defs`:`definitions`;if(e.external){let n=e.external.registry.get(t[0])?.id,i=e.external.uri??(e=>e);if(n)return{ref:i(n)};let a=t[1].defId??t[1].schema.id??`schema${e.counter++}`;return t[1].defId=a,{defId:a,ref:`${i(`__shared`)}#/${r}/${Lo(a)}`}}let i=`#/${r}/`;if(t[1]===n&&!t[1].schema.id)return{ref:`#`};let a=t[1].schema.id??`__schema${e.counter++}`;return{defId:a,ref:i+Lo(a)}},a=e=>{if(e[1].schema.$ref)return;let t=e[1],{ref:n,defId:r}=i(e);t.def={...t.schema},r&&(t.defId=r);let a=t.schema;for(let e in a)delete a[e];a.$ref=n};if(e.cycles===`throw`)for(let t of e.seen.entries()){let e=t[1];if(e.cycle)throw Error(`Cycle detected: #/${e.cycle?.join(`/`)}/<root>
|
|
343
343
|
|
|
344
344
|
Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){a(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}if(e.metadataRegistry.get(n[0])?.id){a(n);continue}if(r.cycle){a(n);continue}r.count>1&&e.reused===`ref`&&a(n)}e.external&&(e.sharedDefsExtractedFor=e.external)}function zo(e){let t=e.anyOf;if(!Array.isArray(t)||t.length===0||e.type!==void 0)return;let n=[];for(let e of t){if(!e||typeof e!=`object`)return;zo(e);let t=Object.keys(e);if(t.length!==1||t[0]!==`type`)return;let r=e.type;for(let e of Array.isArray(r)?r:[r]){if(typeof e!=`string`)return;n.includes(e)||n.push(e)}}delete e.anyOf,e.type=n.length===1?n[0]:n}const Bo=/* @__PURE__ */ new Set([`type`,`properties`,`required`,`additionalProperties`]),Vo=[`oneOf`,`anyOf`];function Ho(e){let t=e.additionalProperties;return t===void 0||t===!1||typeof t!=`object`||!t?null:Object.keys(t).length?t:null}function Uo(e){let t=[];for(let n of e){if(typeof n!=`object`||n.type!==`object`)return null;for(let e in n)if(!Bo.has(e))return null;t.push(n)}let n={},r=/* @__PURE__ */ new Set;for(let e of t){for(let r in e.properties){if(Object.prototype.hasOwnProperty.call(n,r))continue;let e=[];for(let n of t){let t=n.properties?.[r]??Ho(n);t!=null&&(e.some(e=>JSON.stringify(e)===JSON.stringify(t))||e.push(t))}Ge(n,r,e.length===1?e[0]:Uo(e)??{allOf:e})}for(let t of e.required??[])r.add(t)}let i={type:`object`,properties:n};if(r.size&&(i.required=[...r]),t.every(e=>e.additionalProperties===!1))i.additionalProperties=!1;else{let e=[];for(let n of t){let t=Ho(n);t&&!e.some(e=>JSON.stringify(e)===JSON.stringify(t))&&e.push(t)}e.length===1?i.additionalProperties=e[0]:e.length>1&&(i.additionalProperties={allOf:e})}return i}function Wo(e){let t=e.allOf;if(!Array.isArray(t)||t.length<2)return;for(let t of Bo)if(t in e)return;let n=t.filter(e=>Vo.some(t=>Array.isArray(e[t]))),r=null;if(!n.length)r=Uo(t);else{let e=n[0],i=Vo.find(t=>Array.isArray(e[t]));if(Object.keys(e).length!==1)return;let a=t.filter(t=>t!==e),o=e[i].map(e=>Uo([...a,e]));if(o.some(e=>!e))return;r={[i]:o}}r&&(delete e.allOf,No(e,r))}function Go(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):No(i,s),No(i,a),t._zod.parent===o)for(let e in i)e!==`$ref`&&e!==`allOf`&&(e in a||delete i[e]);if(s.$ref&&n.def)for(let e in i)e!==`$ref`&&e!==`allOf`&&e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e!==`$ref`&&e!==`allOf`&&e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};if(!e.external||e.sharedEmitDoneFor!==e.external){for(let t of[...e.seen.entries()].reverse())r(t[0]);if(e.target!==`openapi-3.0`)for(let t of e.seen.entries())zo(t[1].def??t[1].schema);for(let t of e.deferred)t();if(e.intersections.length){let t=/* @__PURE__ */ new Map;for(let n of e.seen.values())for(let e of[n.schema,n.def]){let n=e?.allOf;if(!Array.isArray(n))continue;let r=t.get(n);r?r.push(e):t.set(n,[e])}for(let n of e.intersections)for(let e of t.get(n)??[])Wo(e)}}let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}No(i,n.defId?n.schema:n.def??n.schema);let a=e.metadataRegistry.get(t)?.id;a!==void 0&&i.id===a&&delete i.id;let o=e.external?.defs??{};if(!e.external||e.sharedEmitDoneFor!==e.external)for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(e.def.id===e.defId&&delete e.def.id,Ge(o,e.defId,e.def))}e.external&&(e.sharedEmitDoneFor=e.external),e.external||Object.keys(o).length>0&&(e.target===`draft-2020-12`?i.$defs=o:i.definitions=o);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,"~standard",{value:{...t[`~standard`],jsonSchema:{input:Jo(t,`input`,e.processors),output:Jo(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function Ko(e,t){let n=t??{seen:/* @__PURE__ */ new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return Ko(r.element,n);if(r.type===`set`)return Ko(r.valueType,n);if(r.type===`lazy`)return Ko(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type==="default"||r.type===`prefault`||r.type===`catch`)return Ko(r.innerType,n);if(r.type===`intersection`)return Ko(r.left,n)||Ko(r.right,n);if(r.type===`record`||r.type===`map`)return Ko(r.keyType,n)||Ko(r.valueType,n);if(r.type===`pipe`)return e._zod.traits.has(`$ZodCodec`)?!0:Ko(r.in,n)||Ko(r.out,n);if(r.type===`object`){for(let e in r.shape)if(Ko(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(Ko(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(Ko(e,n))return!0;return!!(r.rest&&Ko(r.rest,n))}return!1}const qo=(e,t={})=>n=>{let r=Po({...n,processors:t});return Io(e,r),Ro(r,e),Go(r,e)},Jo=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=Po({...i??{},target:a,io:t,processors:n});return Io(e,o),Ro(o,e),Go(o,e)},Yo=(e,t,n)=>{(e[t]===void 0||n>e[t])&&(e[t]=n)},Xo=(e,t,n)=>{(e[t]===void 0||n<e[t])&&(e[t]=n)},Zo=(e,t)=>{Yo(e,`minimum`,t),Xo(e,`maximum`,t)},Qo=(e,t)=>{e.multipleOf??=[],e.multipleOf.includes(t)||e.multipleOf.push(t)},$o=(e,t)=>{e.patterns??=/* @__PURE__ */ new Set,e.patterns.add(t)},es=(e,t)=>{e.mime=e.mime?e.mime.filter(e=>t.includes(e)):[...t]},ts=(e,t)=>{e.format=t,t.includes(`int`)&&(e.isInt=!0)},ns=(e,t)=>Yo(e,`minimum`,t.minimum),rs=(e,t)=>Xo(e,`maximum`,t.maximum),is=e=>(t,n)=>{ts(t,n.format);let[r,i]=e[n.format];Yo(t,`minimum`,r),Xo(t,`maximum`,i)},as={greater_than:(e,t)=>Yo(e,t.inclusive?`minimum`:`exclusiveMinimum`,t.value),less_than:(e,t)=>Xo(e,t.inclusive?`maximum`:`exclusiveMaximum`,t.value),multiple_of:(e,t)=>Qo(e,t.value),number_format:is(ut),bigint_format:is(dt),min_length:ns,max_length:rs,length_equals:(e,t)=>Zo(e,t.length),min_size:ns,max_size:rs,size_equals:(e,t)=>Zo(e,t.size),string_format:(e,t)=>{ts(e,t.format),t.pattern&&$o(e,t.pattern),(t.format===`base64`||t.format===`base64url`)&&(e.contentEncoding=t.format),(t.local||t.precision===-1)&&(e.laxFormat=!0)},mime_type:(e,t)=>es(e,t.mime)};function os(e){let t={},n=e._zod.def,r=e._zod.traits.has(`$ZodCheck`)?[e,...n.checks??[]]:n.checks??[];for(let e of r)as[e._zod.def.check]?.(t,e._zod.def);let i=e._zod.bag;i.minimum!==void 0&&Yo(t,`minimum`,i.minimum),i.exclusiveMinimum!==void 0&&Yo(t,`exclusiveMinimum`,i.exclusiveMinimum),i.maximum!==void 0&&Xo(t,`maximum`,i.maximum),i.exclusiveMaximum!==void 0&&Xo(t,`exclusiveMaximum`,i.exclusiveMaximum),i.multipleOf!==void 0&&Qo(t,i.multipleOf),i.format!==void 0&&(t.format??=i.format,i.format.includes(`int`)&&(t.isInt=!0)),i.mime&&es(t,i.mime);for(let e of i.patterns??[])$o(t,e);return t}const ss={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},cs=/* @__PURE__ */ new Map([[li,Wn],[di,Gn]]),ls=e=>cs.get(e)??e,us=(e,t,n,r)=>{let i=n;i.type=`string`;let{minimum:a,maximum:o,format:s,patterns:c,contentEncoding:l,laxFormat:u}=os(e);if(typeof a==`number`&&(i.minLength=a),typeof o==`number`&&(i.maxLength=o),s&&(i.format=ss[s]??s,i.format===``&&delete i.format,(s===`time`||u)&&delete i.format),l&&(i.contentEncoding=l),c&&c.size>0){let e=[...c].map(ls);e.length===1?i.pattern=e[0].source:e.length>1&&(i.allOf=[...e.map(e=>({...t.target===`draft-07`||t.target===`draft-04`||t.target===`openapi-3.0`?{type:`string`}:{},pattern:e.source}))])}},ds=(e,t,n,r)=>{let i=n,{minimum:a,maximum:o,multipleOf:s,exclusiveMaximum:c,exclusiveMinimum:l,isInt:u}=os(e);i.type=u?`integer`:`number`;let d=typeof l==`number`&&l>=(a??-1/0),f=typeof c==`number`&&c<=(o??1/0),p=t.target===`draft-04`||t.target===`openapi-3.0`;if(d?p?(i.minimum=l,i.exclusiveMinimum=!0):i.exclusiveMinimum=l:typeof a==`number`&&(i.minimum=a),f?p?(i.maximum=c,i.exclusiveMaximum=!0):i.exclusiveMaximum=c:typeof o==`number`&&(i.maximum=o),s){let n=/* @__PURE__ */ new Set;for(let a of s)Number.isFinite(a)&&a!==0?n.add(Math.abs(a)):Fo(e,t,i,r,`A multipleOf divisor of ${a} cannot be represented in JSON Schema`);let[a,...o]=n;a!==void 0&&(i.multipleOf=a),o.length&&(i.allOf=[...i.allOf??[],...o.map(e=>({multipleOf:e}))])}},fs=(e,t,n,r)=>{n.type=`boolean`},ps=(e,t,n,r)=>{Fo(e,t,n,r,`BigInt cannot be represented in JSON Schema`)},ms=(e,t,n,r)=>{Fo(e,t,n,r,`Symbols cannot be represented in JSON Schema`)},hs=(e,t,n,r)=>{t.target===`openapi-3.0`?(n.type=`string`,n.nullable=!0,n.enum=[null]):n.type=`null`},gs=(e,t,n,r)=>{Fo(e,t,n,r,`Undefined cannot be represented in JSON Schema`)},_s=(e,t,n,r)=>{Fo(e,t,n,r,`Void cannot be represented in JSON Schema`)},vs=(e,t,n,r)=>{n.not={}},ys=(e,t,n,r)=>{},bs=(e,t,n,r)=>{},xs=(e,t,n,r)=>{Fo(e,t,n,r,`Date cannot be represented in JSON Schema`)},Ss=(e,t,n,r)=>{let i=e._zod.def,a=Le(i.entries);if(a.length===0){n.not={};return}a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},Cs=(e,t,n,r)=>{let i=e._zod.def;if(i.values.length===0){n.not={};return}let a=[];for(let o of i.values)if(o===void 0){if(Fo(e,t,n,r,"Literal `undefined` cannot be represented in JSON Schema"))return}else if(typeof o==`bigint`){if(Fo(e,t,n,r,`BigInt literals cannot be represented in JSON Schema`))return;a.push(Number(o))}else a.push(o);if(a.length!==0){if(a.length===1){let e=a[0];n.type=e===null?`null`:typeof e,t.target===`draft-04`||t.target===`openapi-3.0`?n.enum=[e]:n.const=e}else a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),a.every(e=>typeof e==`boolean`)&&(n.type=`boolean`),a.every(e=>e===null)&&(n.type=`null`),n.enum=a}},ws=(e,t,n,r)=>{Fo(e,t,n,r,`NaN cannot be represented in JSON Schema`)},Ts=(e,t,n,r)=>{let i=n,a=e._zod.pattern;if(!a)throw Error(`Pattern not found in template literal`);i.type=`string`,i.pattern=a.source},Es=(e,t,n,r)=>{let i=n;i.type=`string`,i.format=`binary`,i.contentEncoding=`binary`;let{minimum:a,maximum:o,mime:s}=os(e);a!==void 0&&(i.minLength=a),o!==void 0&&(i.maxLength=o),s&&(s.length===0?i.not={}:s.length===1?i.contentMediaType=s[0]:i.anyOf=s.map(e=>({contentMediaType:e})))},Ds=(e,t,n,r)=>{n.type=`boolean`},Os=(e,t,n,r)=>{Fo(e,t,n,r,`Custom types cannot be represented in JSON Schema`)},ks=(e,t,n,r)=>{Fo(e,t,n,r,`Function types cannot be represented in JSON Schema`)},As=(e,t,n,r)=>{Fo(e,t,n,r,`Transforms cannot be represented in JSON Schema`)},js=(e,t,n,r)=>{Fo(e,t,n,r,`Map cannot be represented in JSON Schema`)},Ms=(e,t,n,r)=>{Fo(e,t,n,r,`Set cannot be represented in JSON Schema`)},Ns=(e,t,n,r)=>{let i=n,a=e._zod.def,{minimum:o,maximum:s}=os(e);typeof o==`number`&&(i.minItems=o),typeof s==`number`&&(i.maxItems=s),i.type=`array`,i.items=Io(a.element,t,{...r,path:[...r.path,`items`]})};function Ps(e){let t=e._zod.def;return t.type===`pipe`&&t.in._zod.traits.has(`$ZodTransform`)?Ps(t.out):t.type===`catch`?Ps(t.innerType):e._zod.optin}const Fs=(e,t,n,r)=>{let i=n,a=e._zod.def,o=a.shape;if(Object.getOwnPropertySymbols(o).length&&Fo(e,t,i,r,`Symbol keys cannot be represented in JSON Schema`))return;i.type=`object`,i.properties={};for(let e in o)Ge(i.properties,e,Io(o[e],t,{...r,path:[...r.path,`properties`,e]}));let s=[];for(let e of Object.keys(o)){let n=a.shape[e];(t.io===`input`?Ps(n)===void 0:n._zod.optout===void 0)&&s.push(e)}s.length>0&&(i.required=s),a.catchall?._zod.def.type===`never`?i.additionalProperties=!1:a.catchall?a.catchall&&(i.additionalProperties=Io(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},Is=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>Io(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},Ls=(e,t,n,r)=>{let i=e._zod.def,a=Io(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=Io(i.right,t,{...r,path:[...r.path,`allOf`,1]}),s=e=>`allOf`in e&&Object.keys(e).length===1,c=[...s(a)?a.allOf:[a],...s(o)?o.allOf:[o]];n.allOf=c,t.intersections.push(c)},Rs=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`array`;let o=t.target===`draft-2020-12`?`prefixItems`:`items`,s=t.target===`draft-2020-12`||t.target===`openapi-3.0`?`items`:`additionalItems`,c=a.items.map((e,n)=>Io(e,t,{...r,path:[...r.path,o,n]})),l=a.rest?Io(a.rest,t,{...r,path:[...r.path,s,...t.target===`openapi-3.0`?[a.items.length]:[]]}):null,u=a.items.length;for(;u>0;){let e=a.items[u-1];if(!(t.io===`input`?Ps(e)!==void 0:e._zod.optout===`optional`))break;u--}let d=a.items.length,f=!a.rest;t.target===`draft-2020-12`?(i.prefixItems=c,f?i.items=!1:l&&(i.items=l),u>0&&(i.minItems=u),f&&(i.maxItems=d)):t.target===`openapi-3.0`?(i.items={anyOf:c},l&&i.items.anyOf.push(l),u>0&&(i.minItems=u),f&&(i.maxItems=d)):(i.items=c,f?i.additionalItems=!1:l&&(i.additionalItems=l),u>0&&(i.minItems=u),f&&(i.maxItems=d));let{minimum:p,maximum:m}=os(e);typeof p==`number`&&(i.minItems=p),typeof m==`number`&&(i.maxItems=m)};function zs(e,t,n){if(t.$ref){if(n.has(t))return t;n.add(t);let r=e.get(t)?.def;if(!r)return t;let i=zs(e,r,n);return i===r?t:i}for(let r of[`anyOf`,`oneOf`]){let i=t[r];if(!Array.isArray(i))continue;let a=i.map(t=>zs(e,t,n));a.some((e,t)=>e!==i[t])&&(t={...t,[r]:a})}let r=Array.isArray(t.type)?t.type:[t.type],i=!r.includes(`string`)&&r.some(e=>e===`number`||e===`integer`),a=t.enum??(t.const===void 0?void 0:[t.const]);if(!i&&!a?.some(e=>typeof e==`number`))return t;let{minimum:o,maximum:s,exclusiveMinimum:c,exclusiveMaximum:l,multipleOf:u,format:d,id:f,...p}=t;return p.enum?p.enum=p.enum.map(e=>typeof e==`number`?String(e):e):typeof p.const==`number`&&(p.const=String(p.const)),i?(p.type=`string`,a||(p.pattern=(r.includes(`number`)?nr:tr).source),p):p}const Bs=/* @__PURE__ */ new WeakMap;function Vs(e){let t=/* @__PURE__ */ new Map;for(let n of e.seen.values())n.def&&!t.has(n.schema)&&t.set(n.schema,n);let n=/* @__PURE__ */ new Map;for(let r of Bs.get(e)??[]){let i=e.seen.get(r),a=(i?.def??i?.schema)?.propertyNames;if(!a||a===!0||n.has(a))continue;let o=zs(t,a,/* @__PURE__ */ new Set);o!==a&&n.set(a,o)}if(n.size)for(let t of e.seen.values())for(let e of[t.schema,t.def]){let t=e&&n.get(e.propertyNames);t&&(e.propertyNames=t)}}const Hs=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`;let o=a.keyType,s=os(o).patterns;if(a.mode===`loose`&&s&&s.size>0){let e=Io(a.valueType,t,{...r,path:[...r.path,`patternProperties`,`*`]});i.patternProperties={};for(let t of s)Ge(i.patternProperties,ls(t).source,e)}else{if(t.target===`draft-07`||t.target===`draft-2020-12`){i.propertyNames=Io(a.keyType,t,{...r,path:[...r.path,`propertyNames`]});let n=Bs.get(t);n||(n=[],Bs.set(t,n),t.deferred.push(()=>Vs(t))),n.push(e)}i.additionalProperties=Io(a.valueType,t,{...r,path:[...r.path,`additionalProperties`]})}let c=o._zod.values,l=t.io===`input`&&Ps(a.valueType)!==void 0;if(c&&!a.partial&&!l){let e=[...c].filter(e=>typeof e==`string`||typeof e==`number`);e.length>0&&(i.required=e.map(String))}},Us=(e,t,n,r)=>{let i=e._zod.def,a=Io(i.innerType,t,r),o=t.seen.get(e);t.target===`openapi-3.0`?(o.ref=i.innerType,n.nullable=!0):n.anyOf=[a,{type:`null`}]},Ws=(e,t,n,r)=>{let i=e._zod.def;Io(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},Gs=Symbol();function Ks(e,t,n,r,i){let a=!1,o=JSON.stringify(e,(e,t)=>typeof t==`bigint`?(a=!0,null):t);return a?(Fo(t,n,r,i,`BigInt defaults cannot be represented in JSON Schema`),Gs):JSON.parse(o)}const qs=(e,t,n,r)=>{let i=e._zod.def;Io(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o=Ks(i.defaultValue,e,t,n,r);o!==Gs&&(n.default=o)},Js=(e,t,n,r)=>{let i=e._zod.def;Io(i.innerType,t,r);let a=t.seen.get(e);if(a.ref=i.innerType,t.io!==`input`)return;let o=Ks(i.defaultValue,e,t,n,r);o!==Gs&&(n._prefault=o)},Ys=(e,t,n,r)=>{let i=e._zod.def;Io(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o;try{o=i.catchValue(void 0)}catch{Fo(e,t,n,r,`Dynamic catch values are not supported in JSON Schema`);return}n.default=o},Xs=(e,t,n,r)=>{let i=e._zod.def,a=i.in._zod.traits.has(`$ZodTransform`),o=t.io===`input`?a?i.out:i.in:i.out;Io(o,t,r);let s=t.seen.get(e);s.ref=o},Zs=(e,t,n,r)=>{let i=e._zod.def;Io(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},Qs=(e,t,n,r)=>{let i=e._zod.def;Io(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},$s=(e,t,n,r)=>{let i=e._zod.def;Io(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},ec={string:us,number:ds,boolean:fs,bigint:ps,symbol:ms,null:hs,undefined:gs,void:_s,never:vs,any:ys,unknown:bs,date:xs,enum:Ss,literal:Cs,nan:ws,template_literal:Ts,file:Es,success:Ds,custom:Os,function:ks,transform:As,map:js,set:Ms,array:Ns,object:Fs,union:Is,intersection:Ls,tuple:Rs,record:Hs,nullable:Us,nonoptional:Ws,default:qs,prefault:Js,catch:Ys,pipe:Xs,readonly:Zs,promise:Qs,optional:$s,lazy:(e,t,n,r)=>{let i=e._zod.innerType;Io(i,t,r);let a=t.seen.get(e);a.ref=i}};function tc(e,t){if(`_idmap`in e){let n=e,r=Po({...t,processors:ec}),i={};for(let e of n._idmap.entries()){let[t,n]=e;Io(n,r)}let a={};r.external={registry:n,uri:t?.uri,defs:i};for(let e of n._idmap.entries()){let[t,n]=e;Ro(r,n),Ge(a,t,Go(r,n))}return Object.keys(i).length>0&&(a.__shared={[r.target===`draft-2020-12`?`$defs`:`definitions`]:i}),{schemas:a}}let n=Po({...t,processors:ec});return Io(e,n),Ro(n,e),Go(n,e)}const nc=/* @__PURE__ */ new WeakSet([Object.prototype,Error.prototype]);function rc(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!1,get(){let e=n(this);return Object.defineProperty(this,t,{value:e,configurable:!0,writable:!0}),e},set(e){Object.defineProperty(this,t,{value:e,configurable:!0,writable:!0})}})}const ic=(e,t)=>{an.init(e,t),e.name=`ZodError`;let n=Object.getPrototypeOf(e);nc.has(n)||(nc.add(n),rc(n,`format`,e=>t=>cn(e,t)),rc(n,`flatten`,e=>t=>sn(e,t)),rc(n,`addIssue`,e=>t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,ze,2)}),rc(n,`addIssues`,e=>t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,ze,2)}),Object.defineProperty(n,"isEmpty",{configurable:!0,enumerable:!1,get(){return this.issues.length===0}}))},ac=/*@__PURE__*/ G(`ZodError`,ic),oc=/*@__PURE__*/ G(`ZodError`,ic,void 0,{Parent:Error}),sc=/* @__PURE__ */ un(oc),cc=/* @__PURE__ */ dn(oc),lc=/* @__PURE__ */ fn(oc),uc=/* @__PURE__ */ mn(oc),dc=/* @__PURE__ */ bn(oc),fc=/* @__PURE__ */ xn(oc),pc=/* @__PURE__ */ Sn(oc),mc=/* @__PURE__ */ Cn(oc),hc=/* @__PURE__ */ wn(oc),gc=/* @__PURE__ */ Tn(oc),_c=/* @__PURE__ */ En(oc),vc=/* @__PURE__ */ Dn(oc);function yc(){Xt.localeError||Zt(ba())}function bc(){Xt.memoizer||Zt({memoizer:_a()})}const xc=/*@__PURE__*/ G(`ZodType`,(e,t)=>(yc(),Dr.init(e,t),e.def=t,e.type=t.type,e),{check(...e){let t=this.def;return this.clone(Qe(t,{checks:[...t.checks??[],...e.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]}),{parent:!0})},with(...e){return this.check(...e)},clone(e,t){return ct(this,e,t)},brand(){return this},register(e,t){return e.add(this,t),this},refine(e,t){return this.check(Ul(e,t))},superRefine(e,t){return this.check(Wl(e,t))},overwrite(e){return this.check(/* @__PURE__ */ So(e))},optional(){return wl(this)},exactOptional(){return El(this)},nullable(){return Ol(this)},nullish(){return wl(Ol(this))},nonoptional(e){return Pl(this,e)},array(){return sl(this)},or(e){return ul([this,e])},and(e){return ml(this,e)},transform(e){return Rl(this,Sl(e))},default(e){return Al(this,e)},prefault(e){return Ml(this,e)},catch(e){return Il(this,e)},pipe(e){return Rl(this,e)},readonly(){return Bl(this)},describe(e){let t=this.clone();return wa.add(t,{description:e}),t},meta(...e){if(e.length===0)return wa.get(this);let t=this.clone();return wa.add(t,e[0]),t},isOptional(){return this.safeParse(void 0).success},isNullable(){return this.safeParse(null).success},apply(e,...t){return t.length===0?e(this):e(this,...t)},get"~standard"(){return Pt(this,`~standard`,{...Ar(this),jsonSchema:{input:Jo(this,`input`),output:Jo(this,`output`)}})},set"~standard"(e){Nt(this,`~standard`,e)},parse:function e(t,n){return sc(this,t,n,{callee:e})},parseAsync:async function e(t,n){return await cc(this,t,n,{callee:e})},safeParse(e,t){return lc(this,e,t)},async safeParseAsync(e,t){return uc(this,e,t)},get spa(){return this?.safeParseAsync},set spa(e){Nt(this,`spa`,e)},validate(e,t){return _n(this,e,t)},validateAsync(e,t){return yn(this,e,t)},encode:function e(t,n){return dc(this,t,n,{callee:e})},decode:function e(t,n){return fc(this,t,n,{callee:e})},encodeAsync:async function e(t,n){return await pc(this,t,n,{callee:e})},decodeAsync:async function e(t,n){return await mc(this,t,n,{callee:e})},safeEncode(e,t){return hc(this,e,t)},safeDecode(e,t){return gc(this,e,t)},async safeEncodeAsync(e,t){return _c(this,e,t)},async safeDecodeAsync(e,t){return vc(this,e,t)},toJSONSchema(e){return qo(this,{})(e)},get description(){return wa.get(this)?.description},get _def(){return this._zod.def}}),Sc=/*@__PURE__*/ G(`_ZodString`,(e,t)=>{jr.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>us(e,t,n,r)},/*@__PURE__*/ Ft({format:e=>os(e).format??null,minLength:e=>os(e).minimum??null,maxLength:e=>os(e).maximum??null},{regex(...e){return this.check(/* @__PURE__ */ go(...e))},includes(...e){return this.check(/* @__PURE__ */ yo(...e))},startsWith(...e){return this.check(/* @__PURE__ */ bo(...e))},endsWith(...e){return this.check(/* @__PURE__ */ xo(...e))},min(...e){return this.check(/* @__PURE__ */ mo(...e))},max(...e){return this.check(/* @__PURE__ */ po(...e))},length(...e){return this.check(/* @__PURE__ */ ho(...e))},nonempty(...e){return this.check(/* @__PURE__ */ mo(1,...e))},lowercase(e){return this.check(/* @__PURE__ */ _o(e))},uppercase(e){return this.check(/* @__PURE__ */ vo(e))},trim(){return this.check(/* @__PURE__ */ wo())},normalize(...e){return this.check(/* @__PURE__ */ Co(...e))},toLowerCase(){return this.check(/* @__PURE__ */ To())},toUpperCase(){return this.check(/* @__PURE__ */ Eo())},slugify(){return this.check(/* @__PURE__ */ Do())}})),Cc=/*@__PURE__*/ G(`ZodString`,(e,t)=>{jr.init(e,t),Sc.init(e,t)},{email(e){return this.check(/* @__PURE__ */ Da(kc,e))},url(e){return this.check(/* @__PURE__ */ Na(Mc,e))},jwt(e){return this.check(/* @__PURE__ */ Ja(qc,e))},emoji(e){return this.check(/* @__PURE__ */ Pa(Nc,e))},guid(e){return this.check(/* @__PURE__ */ Oa(Ac,e))},uuid(e){return this.check(/* @__PURE__ */ ka(jc,e))},uuidv4(e){return this.check(/* @__PURE__ */ Aa(jc,e))},uuidv6(e){return this.check(/* @__PURE__ */ ja(jc,e))},uuidv7(e){return this.check(/* @__PURE__ */ Ma(jc,e))},nanoid(e){return this.check(/* @__PURE__ */ Fa(Pc,e))},cuid(e){return this.check(/* @__PURE__ */ Ia(Fc,e))},cuid2(e){return this.check(/* @__PURE__ */ La(Ic,e))},ulid(e){return this.check(/* @__PURE__ */ Ra(Lc,e))},base64(e){return this.check(/* @__PURE__ */ Ga(Wc,e))},base64url(e){return this.check(/* @__PURE__ */ Ka(Gc,e))},xid(e){return this.check(/* @__PURE__ */ za(Rc,e))},ksuid(e){return this.check(/* @__PURE__ */ Ba(zc,e))},ipv4(e){return this.check(/* @__PURE__ */ Va(Bc,e))},ipv6(e){return this.check(/* @__PURE__ */ Ha(Vc,e))},cidrv4(e){return this.check(/* @__PURE__ */ Ua(Hc,e))},cidrv6(e){return this.check(/* @__PURE__ */ Wa(Uc,e))},e164(e){return this.check(/* @__PURE__ */ qa(Kc,e))},datetime(e){return this.check(/* @__PURE__ */ Ya(Tc,e))},date(e){return this.check(/* @__PURE__ */ Xa(Ec,e))},time(e){return this.check(/* @__PURE__ */ Za(Dc,e))},duration(e){return this.check(/* @__PURE__ */ Qa(Oc,e))}});function K(e){return/* @__PURE__ */ Ea(Cc,e)}const wc=/*@__PURE__*/ G(`ZodStringFormat`,(e,t)=>{Mr.init(e,t),Sc.init(e,t)}),Tc=/*@__PURE__*/ G(`ZodISODateTime`,(e,t)=>{Zr.init(e,t),wc.init(e,t)}),Ec=/*@__PURE__*/ G(`ZodISODate`,(e,t)=>{Qr.init(e,t),wc.init(e,t)}),Dc=/*@__PURE__*/ G(`ZodISOTime`,(e,t)=>{$r.init(e,t),wc.init(e,t)}),Oc=/*@__PURE__*/ G(`ZodISODuration`,(e,t)=>{ei.init(e,t),wc.init(e,t)}),kc=/*@__PURE__*/ G(`ZodEmail`,(e,t)=>{Fr.init(e,t),wc.init(e,t)}),Ac=/*@__PURE__*/ G(`ZodGUID`,(e,t)=>{Nr.init(e,t),wc.init(e,t)}),jc=/*@__PURE__*/ G(`ZodUUID`,(e,t)=>{Pr.init(e,t),wc.init(e,t)}),Mc=/*@__PURE__*/ G(`ZodURL`,(e,t)=>{Ur.init(e,t),wc.init(e,t)}),Nc=/*@__PURE__*/ G(`ZodEmoji`,(e,t)=>{Wr.init(e,t),wc.init(e,t)}),Pc=/*@__PURE__*/ G(`ZodNanoID`,(e,t)=>{Gr.init(e,t),wc.init(e,t)}),Fc=/*@__PURE__*/ G(`ZodCUID`,(e,t)=>{Kr.init(e,t),wc.init(e,t)}),Ic=/*@__PURE__*/ G(`ZodCUID2`,(e,t)=>{qr.init(e,t),wc.init(e,t)}),Lc=/*@__PURE__*/ G(`ZodULID`,(e,t)=>{Jr.init(e,t),wc.init(e,t)}),Rc=/*@__PURE__*/ G(`ZodXID`,(e,t)=>{Yr.init(e,t),wc.init(e,t)}),zc=/*@__PURE__*/ G(`ZodKSUID`,(e,t)=>{Xr.init(e,t),wc.init(e,t)}),Bc=/*@__PURE__*/ G(`ZodIPv4`,(e,t)=>{ti.init(e,t),wc.init(e,t)}),Vc=/*@__PURE__*/ G(`ZodIPv6`,(e,t)=>{ii.init(e,t),wc.init(e,t)}),Hc=/*@__PURE__*/ G(`ZodCIDRv4`,(e,t)=>{ai.init(e,t),wc.init(e,t)}),Uc=/*@__PURE__*/ G(`ZodCIDRv6`,(e,t)=>{si.init(e,t),wc.init(e,t)}),Wc=/*@__PURE__*/ G(`ZodBase64`,(e,t)=>{ui.init(e,t),wc.init(e,t)}),Gc=/*@__PURE__*/ G(`ZodBase64URL`,(e,t)=>{pi.init(e,t),wc.init(e,t)}),Kc=/*@__PURE__*/ G(`ZodE164`,(e,t)=>{mi.init(e,t),wc.init(e,t)}),qc=/*@__PURE__*/ G(`ZodJWT`,(e,t)=>{gi.init(e,t),wc.init(e,t)}),Jc=/*@__PURE__*/ G(`ZodNumber`,(e,t)=>{_i.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ds(e,t,n,r),e.isFinite=!0},/*@__PURE__*/ Ft({minValue:e=>{let{minimum:t,exclusiveMinimum:n}=os(e);return Math.max(t??-1/0,n??-1/0)},maxValue:e=>{let{maximum:t,exclusiveMaximum:n}=os(e);return Math.min(t??1/0,n??1/0)},isInt:e=>{let{isInt:t,multipleOf:n}=os(e);return!!t||!!n?.some(Number.isSafeInteger)},format:e=>os(e).format??null},{gt(e,t){return this.check(/* @__PURE__ */ lo(e,t))},gte(e,t){return this.check(/* @__PURE__ */ uo(e,t))},min(e,t){return this.check(/* @__PURE__ */ uo(e,t))},lt(e,t){return this.check(/* @__PURE__ */ so(e,t))},lte(e,t){return this.check(/* @__PURE__ */ co(e,t))},max(e,t){return this.check(/* @__PURE__ */ co(e,t))},int(e){return this.check(Zc(e))},safe(e){return this.check(Zc(e))},positive(e){return this.check(/* @__PURE__ */ lo(0,e))},nonnegative(e){return this.check(/* @__PURE__ */ uo(0,e))},negative(e){return this.check(/* @__PURE__ */ so(0,e))},nonpositive(e){return this.check(/* @__PURE__ */ co(0,e))},multipleOf(e,t){return this.check(/* @__PURE__ */ fo(e,t))},step(e,t){return this.check(/* @__PURE__ */ fo(e,t))},finite(){return this}}));function Yc(e){return/* @__PURE__ */ $a(Jc,e)}const Xc=/*@__PURE__*/ G(`ZodNumberFormat`,(e,t)=>{vi.init(e,t),Jc.init(e,t)});function Zc(e){return/* @__PURE__ */ to(Xc,e)}const Qc=/*@__PURE__*/ G(`ZodBoolean`,(e,t)=>{yi.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>fs(e,t,n,r)});function $c(e){return/* @__PURE__ */ no(Qc,e)}const el=/*@__PURE__*/ G(`ZodNull`,(e,t)=>{bi.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>hs(e,t,n,r)});function tl(e){return/* @__PURE__ */ io(el,e)}const nl=/*@__PURE__*/ G(`ZodUnknown`,(e,t)=>{xi.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function rl(){return/* @__PURE__ */ ao(nl)}const il=/*@__PURE__*/ G(`ZodNever`,(e,t)=>{Si.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>vs(e,t,n,r)});function al(e){return/* @__PURE__ */ oo(il,e)}const ol=/*@__PURE__*/ G(`ZodArray`,(e,t)=>{bc(),wi.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ns(e,t,n,r),e.element=t.element},{min(e,t){return this.check(/* @__PURE__ */ mo(e,t))},nonempty(e){return this.check(/* @__PURE__ */ mo(1,e))},max(e,t){return this.check(/* @__PURE__ */ po(e,t))},length(e,t){return this.check(/* @__PURE__ */ ho(e,t))},unwrap(){return this.element}});function sl(e,t){return/* @__PURE__ */ Oo(ol,e,t)}const cl=/*@__PURE__*/ G(`ZodObject`,(e,t)=>{bc(),Ai.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Fs(e,t,n,r),Ht(e,`shape`,e=>e._zod.def.shape,!1)},{keyof(){return vl(Object.keys(this._zod.def.shape))},catchall(e){return this.clone(Qe(this._zod.def,{catchall:e}))},passthrough(){return this.clone(Qe(this._zod.def,{catchall:rl()}))},loose(){return this.clone(Qe(this._zod.def,{catchall:rl()}))},strict(){return this.clone(Qe(this._zod.def,{catchall:al()}))},strip(){return this.clone(Qe(this._zod.def,{catchall:void 0}))},extend(e){return ht(this,e)},safeExtend(e){return _t(this,e)},merge(e){return vt(this,e)},pick(e){return ft(this,e)},omit(e){return mt(this,e)},partial(...e){return yt(Cl,this,e[0])},exactPartial(...e){return yt(Tl,this,e[0],`exactPartial`)},required(...e){return bt(Nl,this,e[0])}});function q(e,t){let n={type:`object`,shape:e??{},...U(t)};return new cl(n)}const ll=/*@__PURE__*/ G(`ZodUnion`,(e,t)=>{Mi.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Is(e,t,n,r),e.options=t.options});function ul(e,t){return new ll({type:`union`,options:e,...U(t)})}const dl=/*@__PURE__*/ G(`ZodDiscriminatedUnion`,(e,t)=>{ll.init(e,t),Pi.init(e,t)});function fl(e,t,n){return new dl({type:`union`,options:t,discriminator:e,...U(n)})}const pl=/*@__PURE__*/ G(`ZodIntersection`,(e,t)=>{Fi.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ls(e,t,n,r)});function ml(e,t){return new pl({type:`intersection`,left:e,right:t})}const hl=/*@__PURE__*/ G(`ZodRecord`,(e,t)=>{bc(),Ri.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Hs(e,t,n,r),e.keyType=t.keyType,e.valueType=t.valueType});function gl(e,t,n){return!t||!t._zod?new hl({type:`record`,keyType:K(),valueType:e,...U(t)}):new hl({type:`record`,keyType:e,valueType:t,...U(n)})}const _l=/*@__PURE__*/ G(`ZodEnum`,(e,t)=>{zi.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ss(e,t,n,r),e.enum=t.entries,e.options=[...e._zod.values];let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new _l({...t,checks:[],...U(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new _l({...t,checks:[],...U(r),entries:i})}});function vl(e,t){let n=Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e;return new _l({type:`enum`,entries:n,...U(t)})}const yl=/*@__PURE__*/ G(`ZodLiteral`,(e,t)=>{Bi.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Cs(e,t,n,r),e.values=new Set(t.values),Object.defineProperty(e,"value",{get(){if(t.values.length>1)throw Error("This schema contains multiple valid literal values. Use `.values` instead.");return t.values[0]}})});function bl(e,t){return new yl({type:`literal`,values:Array.isArray(e)?e:[e],...U(t)})}const xl=/*@__PURE__*/ G(`ZodTransform`,(e,t)=>{bc(),Vi.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>As(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Yt(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(jt(r,n.value,t));else{let t=r;t.fatal&&(t.continue=!1),t.code??=`custom`,`input`in t||(t.input=n.value),t.inst??=e,n.issues.push(jt(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function Sl(e){return new xl({type:`transform`,transform:e})}const Cl=/*@__PURE__*/ G(`ZodOptional`,(e,t)=>{Ui.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>$s(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function wl(e){return new Cl({type:`optional`,innerType:e})}const Tl=/*@__PURE__*/ G(`ZodExactOptional`,(e,t)=>{Wi.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>$s(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function El(e){return new Tl({type:`optional`,innerType:e})}const Dl=/*@__PURE__*/ G(`ZodNullable`,(e,t)=>{Gi.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Us(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Ol(e){return new Dl({type:`nullable`,innerType:e})}const kl=/*@__PURE__*/ G(`ZodDefault`,(e,t)=>{Ki.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>qs(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function Al(e,t){return new kl({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():at(t)}})}const jl=/*@__PURE__*/ G(`ZodPrefault`,(e,t)=>{Ji.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Js(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Ml(e,t){return new jl({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():at(t)}})}const Nl=/*@__PURE__*/ G(`ZodNonOptional`,(e,t)=>{Yi.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ws(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Pl(e,t){return new Nl({type:`nonoptional`,innerType:e,...U(t)})}const Fl=/*@__PURE__*/ G(`ZodCatch`,(e,t)=>{Qi.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Ys(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function Il(e,t){return new Fl({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:Ut(t)})}const Ll=/*@__PURE__*/ G(`ZodPipe`,(e,t)=>{$i.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Xs(e,t,n,r),e.in=t.in,e.out=t.out});function Rl(e,t){return new Ll({type:`pipe`,in:e,out:t})}const zl=/*@__PURE__*/ G(`ZodReadonly`,(e,t)=>{ta.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Zs(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Bl(e){return new zl({type:`readonly`,innerType:e})}const Vl=/*@__PURE__*/ G(`ZodCustom`,(e,t)=>{ra.init(e,t),xc.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Os(e,t,n,r)});function Hl(e,t){return/* @__PURE__ */ ko(Vl,e??(()=>!0),t)}function Ul(e,t={}){return/* @__PURE__ */ Ao(Vl,e,t)}function Wl(e,t){return/* @__PURE__ */ jo(e,t)}function Gl(e){return/* @__PURE__ */ eo(Jc,e)}function Kl(e){return/* @__PURE__ */ ro(Qc,e)}const ql=1e4,Jl=`[a-z0-9][a-z0-9_-]*`,Yl=K().max(80).regex(RegExp(`^${Jl}(?:/${Jl})*$`),`invalid channel path`),Xl=e=>!e.includes(`\0`)&&e.isWellFormed(),Zl=e=>e.replaceAll(`\0`,``).toWellFormed(),Ql=K().max(ql).refine(e=>e.trim().length>0,`message text is empty`).refine(Xl,`message text has a NUL character or a lone surrogate`),$l=Yc().int().positive(),eu=/* @__PURE__ */ new Set([...Object.getOwnPropertyNames(Object.prototype),`prototype`]),tu=e=>!eu.has(e),nu=K().max(64).regex(/^[a-z0-9][a-z0-9_.-]*$/,`invalid label key`).refine(tu,`label key is a reserved name`),ru=gl(nu,K().max(256).refine(Xl,`label value has a NUL character or a lone surrogate`)),iu=K().max(64).regex(/^[a-z0-9_+-]+$/,`invalid emoji name`).refine(tu,`emoji name is a reserved name`),au=K().min(1).max(256);ul([vl([`person`,`agent`,`deployment`,`workflow`,`external`]),bl(`profile`)]);const ou=e=>e===`profile`?`agent`:e;K().min(1).max(128).refine(Xl,`handle has a NUL character or a lone surrogate`);function su(e){if(e===null)return null;try{return new URL(e).protocol===`https:`?e:null}catch{return null}}q({actor:au,principal:K().min(1),profile:K().nullable(),session:K().nullable()});const cu=K().regex(/^[A-Za-z0-9_-]{22}$/,`invalid attachment id`);q({id:cu,name:K().min(1).max(255),type:K().min(1).max(255),size:Yc().int().nonnegative()}),K().regex(/^[A-Za-z][A-Za-z0-9-]{0,31}$/,`ids start with a letter and use up to 32 letters, numbers, and hyphens`);const lu=K().min(3).max(300),uu=q({channel:lu.optional(),thread:lu,subthread:lu.nullable(),message:K().min(1).max(300),context:K().max(300).nullable()}),du=q({author:K().min(1).max(256),text:K().max(ql),createdAt:K().max(64).nullable(),files:sl(q({name:K().min(1).max(1e3),url:K().max(4e3).nullable()})).max(20)}),fu=q({url:K().min(1).max(4e3),message:$l.nullable(),snapshot:du.nullable(),unavailable:K().max(300).nullable()}),pu=q({id:K().min(1),handle:K().min(1),name:K().min(1),avatar:K().nullable(),isBot:$c()}),mu=q({type:vl([`image`,`file`,`video`,`audio`]),name:K().max(1e3).optional(),mimeType:K().max(255).optional(),size:Yc().int().nonnegative().optional(),url:K().max(4e3).optional(),fetchMetadata:gl(K(),K().max(4e3)).optional()}),hu=q({url:K().min(1).max(4e3),thread:lu,message:K().min(1).max(300),snapshot:du.nullable()}),gu=q({channel:lu,thread:lu,subthread:lu.nullable()}),_u=fl(`kind`,[q({kind:bl(`message`),...gu.shape,message:K(),isRoot:$c(),text:K(),context:K().nullable(),author:pu,files:sl(mu).max(20).optional(),links:sl(hu).max(10).optional()}),q({kind:bl(`edited`),...gu.shape,message:K(),text:K(),author:pu,links:sl(hu).max(10).optional(),linksOnly:$c().optional()}),q({kind:bl(`deleted`),...gu.shape,message:K()}),q({kind:bl(`reaction`),...gu.shape,message:K(),emoji:K(),added:$c(),author:pu}),q({kind:bl(`lifecycle`),...gu.omit({subthread:!0}).shape,type:K(),title:K(),url:K().nullable(),labels:gl(K(),K()),unset:sl(K()),owns:sl(K()).optional(),reply:K().nullable(),createRoot:$c(),retitled:$c().optional(),author:pu})]),vu=e=>e.slice(e.indexOf(`:`)+1).includes(`:`),yu=e=>{let t=e.indexOf(`:`),n=e.slice(t+1).indexOf(`:`);return n===-1?e:e.slice(0,t+1+n)},bu=(e,t)=>`${e}|${t}`,xu=K().min(1).max(128),Su=xu,Cu=ul([K(),sl(K())]).transform(e=>Array.isArray(e)?e:[e]),wu=K().regex(/^[a-z0-9][a-z0-9_.-]*(=.*)?$/,`label filters look like key, key=value, or key=a|b`).transform(e=>{let t=e.indexOf(`=`);return t===-1?[e,null]:[e.slice(0,t),e.slice(t+1).split(`|`)]}),Tu=q({target:lu,kind:vl([`channel`,`thread`])}),Eu=q({channel:K().optional(),re:Su.optional(),by:K().optional(),mentions:K().optional(),label:Cu.pipe(sl(wu)).optional(),from:K().min(1).max(64).optional(),text:K().min(1).max(200).optional()}),Du=Eu.extend({after:xu.optional(),before:Su.optional(),limit:Gl().int().min(1).max(500).optional()}),Ou=Eu.extend({after:xu.optional(),limit:Gl().int().min(1).max(500).optional()}),ku=Eu.extend({after:xu.optional(),wait:Gl().min(0).max(300).optional(),all:Kl().optional()}),Au=q({channel:Yl.optional(),re:xu.optional(),text:K().max(ql).default(``),labels:ru.optional(),noSync:$c().optional(),sync:sl(ul([K().min(3).max(300),Tu])).max(10).optional(),id:K().min(1).max(200).refine(Xl,`id has a NUL character or a lone surrogate`).optional(),attachments:sl(cu).max(10).optional()}).refine(e=>e.text.trim().length>0||(e.attachments?.length??0)>0,{message:`message text is empty`,path:[`text`]}).refine(e=>e.channel===void 0!=(e.re===void 0),{message:"a post needs `channel`; a reply needs `re`"}).refine(e=>!(e.noSync&&e.sync?.length),{message:"`noSync` and `sync` contradict each other"}),ju=K().regex(/^\d+(\.\d+)?(s|m|h|d)$/,`durations look like 30s, 30m, 12h, or 1d`),Mu=K().datetime({offset:!0}),Nu=q({channel:Yl.optional(),re:xu.optional(),text:K().max(ql).default(``),labels:ru.optional(),noSync:$c().optional(),attachments:sl(cu).max(10).optional(),in:ju.optional(),at:Mu.optional(),every:ju.optional(),until:Mu.optional(),for:ju.optional(),times:Yc().int().positive().optional()}).refine(e=>e.text.trim().length>0||(e.attachments?.length??0)>0,{message:`message text is empty`,path:[`text`]}).refine(e=>e.channel===void 0!=(e.re===void 0),{message:"a schedule needs `channel` for a new thread, or `re` for a reply"}).refine(e=>e.in!==void 0||e.at!==void 0||e.every!==void 0,{message:"say when: `in`, `at`, or `every`"}).refine(e=>e.in===void 0||e.at===void 0,{message:"`in` and `at` contradict each other"}).refine(e=>[e.until,e.for,e.times].filter(e=>e!==void 0).length<=1,{message:"pick one stop: `until`, `for`, or `times`"}).refine(e=>e.every!==void 0||e.until===void 0&&e.for===void 0&&e.times===void 0,{message:"`until`, `for`, and `times` stop a repeat: add `every`"}),Pu=q({re:Su.optional(),channel:K().optional(),by:K().optional(),all:Kl().optional()}),Fu=q({target:K().min(3).max(300)}),Iu=q({channel:K().optional(),limit:Gl().int().min(1).max(500).optional()}),Lu=q({watch:gl(K().max(100),q({tail:K().max(1e3),when:vl([`matches`,`enters`]).default(`matches`)})).refine(e=>Object.keys(e).length<=32,`a board registers at most 32 watchers`),sync:sl(q({key:K().min(1).max(64),platform:K().min(1).max(64),signIn:$c().default(!1)})).max(32).optional()}),Ru=ul([Lu.extend({url:K().url().max(500).refine(e=>/^https:\/\//.test(e),`wake-ups go over https`).transform(e=>e.replace(/\/+$/,``)).nullable().optional(),path:tl({error:`register a url or a path, not both`}).optional(),branch:tl({error:`a branch goes with a path`}).optional()}),Lu.extend({url:tl({error:`register a url or a path, not both`}).optional(),path:K().max(300).regex(/^\/[^?#]*$/,`a path starts with / and has no query or fragment`).transform(e=>e.replace(/(.)\/+$/,`$1`)),branch:K().min(1).max(255).nullable().optional()})]),zu=q({limit:Gl().int().min(1).max(50).optional(),wait:Gl().min(0).max(25).optional()}),Bu=q({lease:K().min(1).max(64),error:K().min(1).max(500).optional(),skip:$c().optional()}),Vu=q({target:K().min(1).max(4e3),limit:Gl().int().min(1).max(200).optional()}),Hu=q({target:K().min(1).max(4e3)}),Uu=q({url:K().url().max(4e3)}),Wu=q({actor:K().min(1).max(256)}),Gu=K().min(1).max(64),Ku=q({thread:lu,message:K().min(1).max(300).optional()}),qu=fu.extend({message:xu.nullable()}),Ju=pu.extend({avatar:K().nullable().transform(su)}),Yu={author:Ju,from:Gu.nullable()},Xu=q({key:Gu,channel:lu,thread:lu}),Zu={origin:Ku.optional(),message:xu.optional()},Qu=fl(`op`,[q({op:bl(`post`),...Yu,origin:uu.nullable().default(null),source:Xu.optional(),channel:Yl.optional(),re:xu.optional(),text:K().max(ql).default(``),labels:ru.optional(),noSync:$c().optional(),attachments:sl(cu).max(10).optional(),links:sl(qu).max(10).optional(),id:K().min(1).max(200).refine(Xl,`id has a NUL character or a lone surrogate`).optional()}),q({op:bl(`edit`),...Yu,...Zu,text:Ql,source:Xu.optional()}),q({op:bl(`delete`),...Yu,...Zu}),q({op:bl(`react`),...Yu,...Zu,emoji:iu,remove:$c().optional()}),q({op:bl(`labels`),...Yu,...Zu,set:ru.optional(),unset:sl(nu).optional()}),q({op:bl(`links`),...Yu,...Zu,links:sl(qu).max(10)}),q({op:bl(`seen`),author:Ju})]),$u=sl(K().min(1).max(300)).max(10).nullable(),ed=fl(`kind`,[q({kind:bl(`message`),message:xu,target:lu,external:q({thread:lu,message:K().min(1).max(300),asUser:bl(!0).optional()}),files:$u.optional()}),q({kind:bl(`files`),message:xu,target:lu,files:$u}),q({kind:bl(`failed`),message:xu,target:lu,error:K().min(1).max(500)}),q({kind:bl(`thread`),message:xu,target:lu,targetKind:vl([`channel`,`thread`]),cause:vl([`config`,`request`])})]),td=q({code:K().min(1).max(64).optional(),post:K().min(1).max(200).optional(),thread:lu.optional(),message:K().min(1).max(300).optional(),account:au.optional(),person:au.optional()}),nd=q({message:Cu.pipe(sl(xu).min(1).max(100))}),rd=q({by:au,since:Gl().int().nonnegative()}),id=q({events:sl(q({id:K().min(1).max(300),event:_u,raw:rl()})).min(1).max(50)}),ad=q({limit:Gl().int().min(1).max(50).optional()}),od=q({lease:K().min(1).max(64),error:K().min(1).max(500).optional()}),sd=q({sync:Gu}),cd=q({sync:Gu,account:Ju,code:K().min(1).max(64),message:K().max(1024).optional(),method:vl([`code`,`consent`]).optional()}),ld=q({sync:Gu,code:K().min(1).max(64)}),ud=q({account:au}),dd=q({name:K().max(1024).nullable().optional(),type:K().max(1024).nullable().optional(),size:Yc().int().positive().max(Ae,`direct uploads are at most ${Ae/1024/1024} MB`)}),fd=q({text:Ql}),pd=q({}).optional(),md=q({status:K().trim().min(1).max(100).optional()}).optional(),hd=q({emoji:iu,remove:$c().optional()}),gd=q({set:ru.optional(),unset:sl(nu).optional()}).refine(e=>e.set!==void 0||e.unset!==void 0,{message:"nothing to change: pass `set` or `unset`"}),_d={discovery:{method:`GET`,path:`/`},me:{method:`GET`,path:`/me`},channels:{method:`GET`,path:`/channels`},actors:{method:`GET`,path:`/actors`},messages:{method:`GET`,path:`/messages`,query:Du},message:{method:`GET`,path:`/messages/:id`},threads:{method:`GET`,path:`/threads`,query:Ou},post:{method:`POST`,path:`/messages`,body:Au},edit:{method:`POST`,path:`/messages/:id/edit`,body:fd},delete:{method:`POST`,path:`/messages/:id/delete`,body:pd},react:{method:`POST`,path:`/messages/:id/reactions`,body:hd},label:{method:`POST`,path:`/messages/:id/labels`,body:gd},sync:{method:`POST`,path:`/messages/:id/sync`,body:Fu},synced:{method:`GET`,path:`/messages/:id/sync`},linked:{method:`GET`,path:`/links`,query:Uu},typing:{method:`POST`,path:`/messages/:id/typing`,body:md},schedule:{method:`POST`,path:`/schedules`,body:Nu},schedules:{method:`GET`,path:`/schedules`,query:Pu},cancelSchedule:{method:`POST`,path:`/schedules/:id/cancel`},posted:{method:`GET`,path:`/posts/:id`},inbox:{method:`GET`,path:`/inbox/:key`,query:Iu},inboxPush:{method:`POST`,path:`/inbox/:key`,body:id},inboxNext:{method:`GET`,path:`/inbox/:key/next`,query:ad},inboxAck:{method:`POST`,path:`/inbox/:key/:id/ack`,body:od},syncImport:{method:`POST`,path:`/sync/imports`,body:Qu},syncReceipt:{method:`POST`,path:`/sync/receipts`,body:ed},syncThread:{method:`GET`,path:`/sync/threads/:thread`},syncFind:{method:`GET`,path:`/sync/find`,query:td},syncCopies:{method:`GET`,path:`/sync/copies`,query:nd},syncRoots:{method:`GET`,path:`/sync/roots`,query:rd},syncCode:{method:`POST`,path:`/sync/codes`,body:sd},syncAccount:{method:`POST`,path:`/sync/accounts`,body:cd},syncUnlink:{method:`POST`,path:`/sync/accounts/unlink`,body:ud},readSource:{method:`GET`,path:`/sources/:key/read`,query:Vu},joinSource:{method:`POST`,path:`/sources/:key/join`,body:Hu},webhook:{method:`POST`,path:`/webhooks/:key`},events:{method:`GET`,path:`/events`,query:ku},avatar:{method:`GET`,path:`/avatars/:name`},upload:{method:`POST`,path:`/attachments`},attachment:{method:`GET`,path:`/attachments/:id`},uploadStart:{method:`POST`,path:`/attachments/uploads`,body:dd},uploadFinish:{method:`POST`,path:`/attachments/uploads/:id`},openapi:{method:`GET`,path:`/openapi.json`},identity:{method:`GET`,path:`/identity`},signIn:{method:`GET`,path:`/identity/sign-in`,query:ld},signedIn:{method:`GET`,path:`/identity/signed-in`,query:ld},identityUnlink:{method:`POST`,path:`/identity/unlink`,body:Wu},watchers:{method:`GET`,path:`/watchers`},register:{method:`POST`,path:`/watchers`,body:Ru},matches:{method:`GET`,path:`/watchers/matches`,query:zu},ack:{method:`POST`,path:`/watchers/matches/:id/ack`,body:Bu},wake:{method:`POST`,path:`/wake`}};async function*vd(e,t){let n=e.getReader(),r=new TextDecoder,i=``,a=()=>void n.cancel().catch(()=>{});t?.addEventListener(`abort`,a,{once:!0});try{for(;;){let{value:e,done:t}=await n.read();if(t)return;i+=r.decode(e,{stream:!0});let a;for(;(a=i.search(/\r?\n\r?\n/))!==-1;){let e=i.slice(0,a);i=i.slice(a).replace(/^\r?\n\r?\n/,``);let t={},n=[];for(let r of e.split(/\r?\n/)){if(r===``||r.startsWith(`:`))continue;let e=r.indexOf(`:`),i=e===-1?r:r.slice(0,e),a=e===-1?``:r.slice(e+1).replace(/^ /,``);i===`data`?n.push(a):i===`id`?t.id=a:i===`event`&&(t.event=a)}n.length>0&&(t.data=n.join(`
|
|
345
|
-
`)),(t.id!==void 0||t.data!==void 0)&&(yield t)}}}finally{t?.removeEventListener(`abort`,a),n.releaseLock()}}var yd=class extends Error{code;status;hint;origin;constructor(e,t,n,r={}){super(t),this.name=`BoardError`,this.code=e,this.status=n,this.hint=r.hint,this.origin=r.origin??`handle`}};const bd=/* @__PURE__ */ new WeakSet,xd=async e=>typeof e==`function`?await e():e,Sd=e=>{let{at:t,until:n,...r}=Cd(e);return{...r,...t===void 0?{}:{at:t instanceof Date?t.toISOString():t},...n===void 0?{}:{until:n instanceof Date?n.toISOString():n}}},Cd=e=>{if(typeof e==`string`)return{text:e};let{attachments:t,...n}=e;return t?.length?{...n,attachments:t.map(e=>typeof e==`string`?e:e.id)}:n},wd={ms:1,s:1e3,m:6e4,h:36e5,d:864e5};function Td(e){if(typeof e==`number`)return e;let t=e.trim().match(/^(\d+(?:\.\d+)?)(ms|s|m|h|d)?$/);if(!t)throw new yd(`invalid_duration`,`${e} isn't a duration like 30s, 10m, or 1h.`,0);return Number(t[1])*wd[t[2]??`ms`]}const Ed=e=>encodeURIComponent(e);function Dd(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))if(r!=null){if(n===`label`){let e=Array.isArray(r)?r:typeof r==`object`?Object.entries(r).map(([e,t])=>`${e}=${String(t)}`):[r];for(let n of e)t.append(`label`,String(n))}else t.set(n,String(r))}let n=t.toString();return n?`?${n}`:``}const Od=(e,t)=>t?.length?{...e,unknownMentions:t}:e;function kd(e){let t=e.url.replace(/\/+$/,``),n=e.fetch??((e,t)=>globalThis.fetch(e,t)),r=e.storeFetch??((e,t)=>globalThis.fetch(e,t));async function i(t,n){let r={...e.headers?await xd(e.headers):{}};if(!t)return r;e.token!==void 0&&(r.authorization=`Bearer ${await xd(e.token)}`);let i=n===void 0?e.profile===void 0?null:await xd(e.profile):n;if(i!==null){let{name:e,avatar:t}=typeof i==`string`?{name:i,avatar:void 0}:i;r[`x-board-profile`]=e,t&&(r[`x-board-avatar`]=t)}else{let t=e.person===void 0?null:await xd(e.person);t?.name&&(r[`x-board-name`]=encodeURIComponent(t.name)),t?.avatar&&(r[`x-board-avatar`]=t.avatar)}let a=n===void 0?e.session===void 0?null:await xd(e.session):null;a&&(r[`x-board-session`]=a);let o=e.handle===void 0?null:await xd(e.handle);return o&&(r[`x-board-handle`]=o),r}async function a(e,r,a={}){let o=await n(`${t}${r}`,{method:e,headers:{...await i(a.auth??!0),...a.body===void 0?{}:{"content-type":`application/json`},...a.headers},...a.body===void 0?{}:{body:JSON.stringify(a.body)},...a.signal?{signal:a.signal}:{}});if(!o.ok)throw await Ad(o);return o}async function o(e,t,n){return await(await a(e,t,n)).json()}let s=(e={})=>e;async function c(e={},t){return o(`GET`,`/events${Dd(e)}`,t?{signal:t}:{})}return{url:t,request:async(e,r={})=>n(`${t}${e}`,{method:r.method??`GET`,headers:{...r.headers,...await i(!0,r.as)},...r.body?{body:r.body}:{},...r.signal?{signal:r.signal}:{}}),discovery:()=>o(`GET`,`/`,{auth:!1}),me:()=>o(`GET`,`/me`),channels:async()=>(await o(`GET`,`/channels`)).channels,actors:async()=>(await o(`GET`,`/actors`)).actors,identity:()=>o(`GET`,`/identity`),unlinkAccount:e=>o(`POST`,`/identity/unlink`,{body:{actor:e}}),messages:(e={})=>o(`GET`,`/messages${Dd(e)}`),thread:e=>o(`GET`,`/messages/${Ed(e)}`),posted:async e=>(await o(`GET`,`/posts/${Ed(e)}`)).message,threads:(e={})=>o(`GET`,`/threads${Dd(e)}`),async post(e,t){let{message:n,unknownMentions:r}=await o(`POST`,`/messages`,{body:{channel:e,...Cd(t)}});return Od(n,r)},async reply(e,t){let{message:n,unknownMentions:r}=await o(`POST`,`/messages`,{body:{re:e,...Cd(t)}});return Od(n,r)},async schedule(e,t){let{schedule:n,unknownMentions:r}=await o(`POST`,`/schedules`,{body:{...typeof e==`string`?{channel:e}:{re:e.re},...Sd(t)}});return Od(n,r)},schedules:async(e={})=>(await o(`GET`,`/schedules${Dd(e)}`)).schedules,cancelSchedule:e=>o(`POST`,`/schedules/${Ed(e)}/cancel`,{body:{}}),async upload(e){let a=e.type||(e.data instanceof Blob?e.data.type:``)||Ne(e.name),s=e.data instanceof Blob?e.data.size:e.data.byteLength;if(s>4194304){if(s>104857600)throw new yd(`too_large`,`Attachments are at most ${Ae/1024/1024} MB.`,413);let t=await o(`POST`,`/attachments/uploads`,{body:{name:e.name,type:a,size:s}}).catch(e=>{throw e instanceof yd&&e.status===404&&e.code===`not_found`?new yd(`too_large`,`This board takes files of at most ${Oe/1024/1024} MB.`,413):e}),n=await r(t.url,{method:`PUT`,headers:t.headers,body:e.data});if(!n.ok)throw new yd(`upload_failed`,`The blob store refused the file: ${n.status} ${(await n.text().catch(()=>``)).slice(0,300)||n.statusText}`,n.status);return(await o(`POST`,`/attachments/uploads/${encodeURIComponent(t.id)}`,{body:{}})).attachment}let c=await n(`${t}/attachments`,{method:`POST`,headers:{...await i(!0),"content-type":a,"x-board-filename":encodeURIComponent(e.name)},body:e.data});if(!c.ok)throw await Ad(c);return(await c.json()).attachment},download:(e,t={})=>a(`GET`,`/attachments/${encodeURIComponent(e)}`,t.signal?{signal:t.signal}:{}),edit:(e,t)=>o(`POST`,`/messages/${Ed(e)}/edit`,{body:{text:t}}),delete:e=>o(`POST`,`/messages/${Ed(e)}/delete`,{body:{}}),react:(e,t,n={})=>o(`POST`,`/messages/${Ed(e)}/reactions`,{body:{emoji:Ee(t),...n}}),label:(e,t)=>o(`POST`,`/messages/${Ed(e)}/labels`,{body:t}),typing:async(e,t)=>(await o(`POST`,`/messages/${Ed(e)}/typing`,{body:t?{status:t}:{}})).targets,sync:((e,t)=>t===void 0?o(`GET`,`/messages/${Ed(e)}/sync`):o(`POST`,`/messages/${Ed(e)}/sync`,{body:{target:t}})),linked:e=>o(`GET`,`/links${Dd({url:e})}`),inbox:async(e,t={})=>(await o(`GET`,`/inbox/${e}${Dd(t)}`)).events,register:e=>o(`POST`,`/watchers`,{body:e}),watchers:async()=>(await o(`GET`,`/watchers`)).watchers,matches:async(e={})=>{let{signal:t,...n}=e;return(await o(`GET`,`/watchers/matches${Dd(n)}`,t?{signal:t}:{})).matches},ack:(e,t)=>o(`POST`,`/watchers/matches/${encodeURIComponent(e)}/ack`,{body:t}),readSource:(e,t,n={})=>o(`GET`,`/sources/${e}/read${Dd({target:t,...n})}`),joinSource:(e,t)=>o(`POST`,`/sources/${e}/join`,{body:{target:t}}),poll:c,syncImport:e=>o(`POST`,`/sync/imports`,{body:e}),syncReceipt:e=>o(`POST`,`/sync/receipts`,{body:e}),syncThread:e=>o(`GET`,`/sync/threads/${Ed(e)}`),syncFind:(e,t={})=>o(`GET`,`/sync/find${Dd(e)}`,t.signal?{signal:t.signal}:{}),syncCopies:async e=>(await o(`GET`,`/sync/copies?${e.map(e=>`message=${encodeURIComponent(e)}`).join(`&`)}`)).copies,syncRoots:async(e,t)=>(await o(`GET`,`/sync/roots${Dd({by:e,since:t instanceof Date?t.getTime():t})}`)).roots,inboxPush:(e,t)=>o(`POST`,`/inbox/${Ed(e)}`,{body:{events:t}}),inboxNext:async(e,t={})=>(await o(`GET`,`/inbox/${Ed(e)}/next${Dd(t)}`)).items,inboxAck:(e,t,n)=>o(`POST`,`/inbox/${Ed(e)}/${Ed(t)}/ack`,{body:n}),syncCode:e=>o(`POST`,`/sync/codes`,{body:{sync:e}}),syncAccount:e=>o(`POST`,`/sync/accounts`,{body:e}),syncUnlink:e=>o(`POST`,`/sync/accounts/unlink`,{body:{account:e}}),async*events(e={},t={}){let n=e.after,r=0;for(;!t.signal?.aborted;){let i;try{i=await a(`GET`,`/events${Dd({...s(e),after:n})}`,{headers:{accept:`text/event-stream`},...t.signal?{signal:t.signal}:{}})}catch(e){if(t.signal?.aborted)return;if(e instanceof yd&&e.status>=400&&e.status<500)throw e;await new Promise(e=>setTimeout(e,Math.min(3e4,500*2**r++)));continue}r=0;try{for await(let e of vd(i.body,t.signal))e.id!==void 0&&(n=e.id),e.event===`board`&&e.data&&(yield JSON.parse(e.data))}catch{if(t.signal?.aborted)return;await new Promise(e=>setTimeout(e,Math.min(3e4,500*2**r++)))}}},async wait(e={},t={}){let n=Date.now()+Td(t.timeout??`30m`),r=e.after??(await c({...e,after:void 0,wait:0},t.signal)).cursor;for(;Date.now()<n&&!t.signal?.aborted;){let i=Math.max(0,Math.min(25,Math.ceil((n-Date.now())/1e3))),a=await c({...e,after:r,wait:i},t.signal);if(a.events.length>0)return a.events[0];r=a.cursor}return null}}}async function Ad(e){try{let t=await e.json();if(t.error?.message)return new yd(t.error.code??`error`,t.error.message,e.status,{...typeof t.error.hint==`string`?{hint:t.error.hint}:{},origin:bd.has(e)?`handle`:`board`})}catch{}return new yd(`http_error`,`The board answered ${`${e.status} ${e.statusText}`.trim()}.`,e.status)}const jd=e=>Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);async function Md(e){return jd(new Uint8Array(await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(e))))}async function Nd(...e){let t=new Uint8Array(await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(JSON.stringify(e)))).slice(0,16);t[6]=t[6]&15|128,t[8]=t[8]&63|128;let n=jd(t);return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20,32)}`}const Pd=/^[0-9a-f]{8}-[0-9a-f]{4}-8[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,Fd=async(e,t)=>`key:${e}:${(await Md(`board-key\u001f${t}`)).slice(0,32)}`;var Id=class extends Error{status;code;hint;origin;constructor(e,t,n,r={}){super(n),this.status=e,this.code=t,this.hint=r.hint,this.origin=r.origin??`board`}},Ld=class extends Id{response;constructor(e){super(e.status,`rejected`,`rejected with ${e.status}`),this.response=e}};const Rd=(e,t=`invalid_request`)=>new Id(400,t,e),zd=e=>new Id(401,`unauthorized`,e),Bd=e=>new Id(403,`forbidden`,e),Vd=(e,t=`not_found`)=>new Id(404,t,e),Hd=()=>new Id(409,`duplicate_id`,`that id was already used for a different write`),Ud=(e,t=200,n)=>new Response(JSON.stringify(e),{status:t,headers:{"content-type":`application/json`,...n}});function Wd(e){if(e.code!==`invalid_union`||e.errors.length===0)return e;let t=e.errors.reduce((e,t)=>t.length<e.length?t:e)[0];return t?Wd({...t,path:[...e.path,...t.path]}):e}function Gd(e){if(e instanceof Ld)return e.response;if(e instanceof Id){let t=Ud({error:{code:e.code,message:e.message,...e.hint===void 0?{}:{hint:e.hint}}},e.status);return e.origin===`handle`&&bd.add(t),t}if(e instanceof ac){let t=e.issues[0]&&Wd(e.issues[0]),n=t?.path.length?`${t.path.join(`.`)}: `:``;return Ud({error:{code:`invalid_request`,message:`${n}${t?.message??`invalid request`}`}},400)}let t=e?.code;return t===`INVALID_PAYLOAD`?Ud({error:{code:`invalid_request`,message:e.message}},400):t===`PARTIAL_DUPLICATE_BATCH`||t===`DUPLICATE_EVENT_ID`?Gd(Hd()):t===`STORE_UNAVAILABLE`||t===`STORE_NOT_CONFIGURED`?Ud({error:{code:`unavailable`,message:e.message}},503):(console.error(`[board]`,e),Ud({error:{code:`internal`,message:`internal error`}},500))}const Kd=`0.26.2`,qd=[`avatar`,`openapi`,`webhook`,`signIn`,`signedIn`,`identityUnlink`,`sync`],Jd=/* @__PURE__ */ `discovery.me.channels.actors.identity.messages.threads.message.post.posted.edit.delete.react.label.schedule.schedules.cancelSchedule.upload.attachment.uploadStart.uploadFinish.watchers.register.matches.ack.events.syncImport.syncReceipt.syncThread.syncFind.syncCopies.syncRoots.inboxPush.inboxNext.inboxAck.inbox.syncCode.syncAccount.syncUnlink.typing.readSource.joinSource.synced.linked`.split(`.`),Yd=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);function Xd(e,t,n,r){let i=t.split(`/`).filter(Boolean),a=i.map(e=>e.startsWith(`:`)?`/([^/]+)`:`/${Yd(e)}`).join(``);return{method:e,pattern:RegExp(`${a}$`),names:i.filter(e=>e.startsWith(`:`)).map(e=>e.slice(1)),target:n,segments:i.length,literals:i.filter(e=>!e.startsWith(`:`)).length,own:r}}function Zd(e,t){let n=[...qd.map(e=>Xd(_d[e].method,_d[e].path,{kind:`board`,name:e},!1)),...Jd.filter(e=>e!==`discovery`).map(e=>Xd(_d[e].method,_d[e].path,{kind:`protocol`,name:e},!1)),...e.map(e=>Xd(e.method,e.path,{kind:`backend`,route:e},!0))].sort((e,t)=>t.segments-e.segments||t.literals-e.literals||Number(t.own)-Number(e.own)),r=(e,t,n)=>{let r={};try{e.names.forEach((e,t)=>r[e]=decodeURIComponent(n[t]))}catch{return null}let i=e.names[0];return{target:e.target,base:t,param:i===void 0?null:r[i],params:r}},i=e=>({target:{kind:`protocol`,name:`discovery`},base:e,param:null,params:{},root:!0});return function(e,a){let o=a.length>1?a.replace(/\/+$/,``):a;if(t!==void 0){let a=t.replace(/\/+$/,``);if(o!==a&&!o.startsWith(`${a}/`))return null;let s=o.slice(a.length)||`/`;if(s===`/`)return e===`GET`?i(a):null;for(let t of n){let n=t.method===e?s.match(RegExp(`^${t.pattern.source}`)):null;if(n)return r(t,a,n.slice(1))}return null}for(let t of n){if(t.method!==e)continue;let n=o.match(t.pattern);if(n)return r(t,o.slice(0,n.index),n.slice(1))}return e===`GET`?i(o===`/`?``:o):null}}function Qd(e){let t={};for(let n of new Set(e.searchParams.keys())){let r=e.searchParams.getAll(n);t[n]=r.length>1?r:r[0]}return t}async function $d(e){let t=await e.text();if(t.trim()!==``)try{return JSON.parse(t)}catch{throw Rd(`request body is not valid JSON`)}}const ef=()=>new Id(413,`too_large`,`attachments are at most ${Oe/1024/1024} MB`);async function tf(e,t){if(Number(e.headers.get(`content-length`)??0)>t)throw ef();let n=[],r=0;for await(let i of e.body??[]){if(r+=i.byteLength,r>t)throw ef();n.push(i)}let i=new Uint8Array(r),a=0;for(let e of n)i.set(e,a),a+=e.byteLength;return i}function nf(){let e={};for(let[t,n]of Object.entries(_d)){let r=n.path.replace(/:(\w+)/g,`{$1}`),i={operationId:t};`query`in n&&(i[`x-query-schema`]=tc(n.query,{io:`input`})),`body`in n&&(i.requestBody={content:{"application/json":{schema:tc(n.body,{io:`input`})}}}),(e[r]??={})[n.method.toLowerCase()]=i}return{openapi:`3.1.0`,info:{title:`board`,version:Kd},paths:e}}const rf={re:{type:`string`,value:`id`,description:`in a thread: its root's ID`},by:{type:`string`,value:`handle`,description:`by an author: a handle, me, or an actor ID`},mentions:{type:`string`,value:`@handle`,optionalValue:!0,description:`mentioning a handle, or you without one`},label:{type:`string`,multiple:!0,value:`k[=v|w]`,description:`with a label on the message or its thread's root`},source:{type:`string`,value:`source`,description:`from a source: a sync key such as slack, or board`},text:{type:`string`,value:`words`,description:`containing these words`},after:{type:`string`,value:`id`,description:`after a message or a cursor`},url:{type:`string`,value:`url`,description:`the board at this URL, not the one the environment points at`},scope:{type:`string`,value:`team`,description:`a team's board in Vercel's API, by its slug or ID`},team:{type:`string`,value:`team`,description:`the same as --scope`,hidden:!0},as:{type:`string`,value:`profile`,description:`write as a profile, such as an agent's name`},avatar:{type:`string`,value:`url`,description:`the profile's avatar, with --as`},human:{type:`boolean`,description:`write as yourself, with no profile or session`},handle:{type:`string`,value:`h`,description:`your handle (default: your Vercel username)`},json:{type:`boolean`,description:`JSON, for programs`},help:{type:`boolean`,short:`h`,description:`this help, or a command's`},version:{type:`boolean`,short:`v`,description:`the CLI's version`},limit:{type:`string`,short:`n`,value:`N`,description:`how many`},"idempotency-key":{type:`string`,value:`key`,description:`sending the same one again posts once`},sync:{type:`string`,multiple:!0,value:`target`,description:`sync the new thread to a target too, e.g. slack:#incidents`},"no-sync":{type:`boolean`,description:`keep it on the board: sync it nowhere`},attach:{type:`string`,multiple:!0,value:`file`,description:`attach a file`},unset:{type:`string`,multiple:!0,value:`k`,description:`remove a label`},channel:{type:`string`,value:`c`,description:`in a channel`},remove:{type:`boolean`,description:`take the reaction back`},all:{type:`boolean`,short:`a`,description:`everything, not only what most want`},timeout:{type:`string`,value:`duration`,description:`how long to wait (default: 30m)`},code:{type:`boolean`,description:`post a code from your account instead of signing in`},"no-wait":{type:`boolean`,description:`start linking, and don't wait for it to finish`},"no-open":{type:`boolean`,description:`don't open the browser`},in:{type:`string`,value:`duration`,description:`once, this long from now, e.g. 1d`},at:{type:`string`,value:`time`,description:`at a time: once, or with --every, the first`},every:{type:`string`,value:`duration`,description:`repeating at this interval, e.g. 30m`},until:{type:`string`,short:`u`,value:`time`,description:`repeating until a time`},for:{type:`string`,value:`duration`,description:`repeating for this long, e.g. 24h`},times:{type:`string`,value:`N`,description:`repeating this many times`},port:{type:`string`,value:`N`,description:`the port to listen on`},dir:{type:`string`,value:`dir`,description:`where the board keeps its log (default: .board/)`},"no-inspect":{type:`boolean`,description:`don't start the inspector`},agent:{type:`string`,value:`name`,description:`the agent whose turn ended`,hidden:!0}},af=(e,t,n)=>({name:e,...rf[e],...t?{description:t}:{},...n?{value:n}:{}});[`re`,`by`,`source`,`label`,`text`,`mentions`,`after`].map(e=>af(e)),[`url`,`scope`,`team`,`as`,`avatar`,`human`,`handle`,`json`,`help`,`version`].map(e=>af(e)),af(`code`),af(`no-wait`),af(`no-open`),af(`limit`,`threads to list (default: 50)`),af(`label`,`label it`,`k=v`),af(`attach`),af(`sync`),af(`no-sync`),af(`idempotency-key`),af(`attach`),af(`idempotency-key`),af(`no-sync`),af(`in`),af(`at`),af(`every`),af(`until`),af(`for`),af(`times`),af(`label`,`label it`,`k=v`),af(`attach`),af(`no-sync`),af(`by`,`scheduled by a handle`),af(`channel`,`posting in a channel`),af(`all`,`done and canceled ones too`),af(`remove`),af(`unset`),af(`limit`,`events to list`),af(`limit`,`messages to read`),af(`channel`,`the channel to check in (default: conformance)`),af(`agent`),af(`all`,`delivery receipts too`),af(`timeout`);const of={re:rf.re,by:rf.by,mentions:rf.mentions,label:rf.label,source:rf.source,text:rf.text};function sf(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n];r===`--mentions`?e[n+1]?.startsWith(`@`)?t.push(`--mentions=${e[++n]}`):t.push(`--mentions=me`):t.push(r)}return t}function cf(e){let t=[],n=null,r=null;for(let i=0;i<e.length;i++){let a=e[i];r?a===r?r=null:a===`\\`&&r===`"`&&i+1<e.length?n+=e[++i]:n+=a:/\s/.test(a)?(n!==null&&t.push(n),n=null):a===`"`||a===`'`?(r=a,n??=``):n=a===`\\`&&i+1<e.length?(n??``)+e[++i]:(n??``)+a}if(r)throw Error(`unterminated ${r}`);return n!==null&&t.push(n),t}const lf={...of,all:{type:`boolean`}};function uf(e){let t={},n=[];for(let r=0;r<e.length;r++){let i=e[r];if(i===`--`){n.push(...e.slice(r+1));break}if(!i.startsWith(`-`)||i===`-`){n.push(i);continue}let a=i.indexOf(`=`),o=i.startsWith(`--`)?i.slice(2,a===-1?void 0:a):null,s=o!==null&&Object.hasOwn(lf,o)?lf[o]:null;if(!s)throw Error(`${o===null?i.slice(0,2):`--${o}`} isn't a filter`);if(s.type===`boolean`){if(a!==-1)throw Error(`--${o} takes no value`);t[o]=!0;continue}let c;if(a!==-1)c=i.slice(a+1);else{let t=e[r+1];if(t===void 0||t.length>1&&t.startsWith(`-`))throw Error(`--${o} needs a value`);c=t,r++}t[o]=`multiple`in s?[...t[o]??[],c]:c}return{values:t,positionals:n}}function df(e){let{values:t,positionals:n}=uf(sf(cf(e)));if(n.length>1)throw Error(`expected one channel, got: ${n.join(` `)}`);let r=n[0],i=Eu.safeParse({...r?{channel:r}:{},...t.re?{re:t.re.replace(/^#/,``)}:{},...t.by?{by:t.by.replace(/^@/,``)}:{},...t.mentions?{mentions:t.mentions.replace(/^@/,``)}:{},...t.label?.length?{label:t.label}:{},...t.source?{from:t.source}:{},...t.text?{text:t.text}:{}});if(!i.success){let e=i.error.issues[0];throw Error(`${e?.path.length?`--${String(e.path[0])}: `:``}${e?.message??`invalid filters`}`)}return{filters:i.data,all:t.all===!0}}const ff=e=>e.channel!==void 0||e.re!==void 0||e.by!==void 0||e.mentions!==void 0||e.from!==void 0||e.text!==void 0||(e.label?.length??0)>0;function pf(e,t){let n,r;try{({filters:n,all:r}=df(t.tail))}catch(t){throw Error(`watch ${e}: ${t.message}`)}if(n.mentions===`me`)throw Error(`watch ${e}: a watcher has no "me": use --mentions @handle`);let i=ff(n);if(t.when===`enters`&&!i)throw Error(`watch ${e}: \`when: enters\` needs a filter to enter`);return{filters:n,criteria:i,enters:t.when===`enters`,all:r}}function mf(e){try{Reflect.get(globalThis,Symbol.for(`@vercel/request-context`))?.get?.()?.waitUntil?.(e)}catch{}}const hf=1e4,gf=e=>((e instanceof Error?e.message:String(e))||`unknown error`).slice(0,500),_f=e=>e?.startsWith(`https://`)?e:null;function vf(e){let t=typeof process<`u`&&process.env.VERCEL===`1`?process.env:null,n=t?.VERCEL_TARGET_ENV||t?.VERCEL_ENV,r=n===`preview`&&t?.VERCEL_GIT_COMMIT_REF||null;return!e||n!==`production`&&!r?null:{path:new URL(e).pathname,...r?{branch:r}:{}}}function yf(e){let{registry:t,rethrow:n}=e,r=e.binding,i=null,a=null;async function o(n){let r=await e.hash();return i&&i.url===n&&i.result.hash===r&&Date.now()-i.at<hf?i.result:(a??=e.wakeAt(n).then(e=>t.register(e)).then(e=>(i={url:n,at:Date.now(),result:e},e)).finally(()=>{a=null}),a)}async function s(e){let n={};if(!r().subscriptions[e.watcher])n={skip:!0};else try{await r().run(e.watcher,e.event,{trigger:`watch:${e.watcher}:${e.id}`,attempt:e.attempt+1})}catch(t){console.error(`[board] watcher ${e.watcher} failed:`,t),n={error:gf(t)}}await t.ack(e.id,{lease:e.lease,...n}).catch(e=>console.error(`[board] couldn't ack a match:`,gf(e)))}async function c(){let e=0,n=Date.now()+24e4;for(;Date.now()<n;){let n=await t.matches({limit:10});if(n.length===0)break;await Promise.all(n.map(s)),e+=n.length}return e+await r().pull()}let l=null;function u(){if(l)return;let n=l=new AbortController;(async()=>{for(let i=1e3;!n.signal.aborted;)try{await o(null);let e=await t.matches({limit:10,wait:25,signal:n.signal});await Promise.all(e.map(s)),await r().pull(),i=1e3}catch(t){if(n.signal.aborted)break;console.error(`[board] couldn't pull matches from ${e.remote}:`,gf(t)),await new Promise(e=>setTimeout(e,i)),i=Math.min(i*2,6e4)}})()}let d=null,f=0;function p(){if(d)return d;if(!e.hasWork()||Date.now()-f<hf)return Promise.resolve();let t=_f(r().url());return!t&&typeof process<`u`&&process.env.VERCEL===`1`?Promise.resolve():(d=o(t).then(()=>{},t=>{d=null,f=Date.now(),console.error(`[board] couldn't register with ${e.remote}:`,gf(t))}),t||u(),d)}return{start:p,routes:[{method:`POST`,path:`/wake`,async handle(t){d??=Promise.resolve();let i=t.headers.get(`x-board-watchers`)!==await e.hash(),a=(async()=>(i&&await o(_f(r().url())),c()))();mf(a.catch(e=>console.error(`[board] couldn't run what woke it:`,gf(e))));let s,l=new Promise(e=>s=setTimeout(()=>e(null),2e3));try{let e=await Promise.race([a.catch(n),l]);return e===null?new Response(null,{status:202}):Ud({ran:e})}finally{clearTimeout(s)}}},{method:`POST`,path:`/watchers`,async handle(t,{caller:i}){if(i)return e.registerFor(i,t);d??=Promise.resolve();let a=_f(r().url()),s=await o(a).catch(n);return a||u(),Ud(s)}}],registerNow:()=>o(_f(r().url())),close:()=>{l?.abort(),l=null}}}const bf=(e,t)=>e<t?-1:+(e>t);function xf(e,t=[]){let n=Object.keys(e).sort(bf).map(t=>[t,e[t].tail,e[t].when]);return t.length>0&&n.push([`sync`,[...t].sort((e,t)=>bf(e.key,t.key)).map(e=>[e.key,e.platform,e.signIn])]),JSON.stringify(n)}const Sf=/^[A-Za-z][A-Za-z0-9-]{0,31}$/,Cf=/* @__PURE__ */ new Set([`identity`,`edit`,`delete`,`schedule`,`cancelSchedule`,`upload`,`uploadStart`,`uploadFinish`,`watchers`,`register`,`matches`,`ack`,`syncImport`,`syncReceipt`,`syncThread`,`syncFind`,`syncCopies`,`syncRoots`,`inboxPush`,`inboxNext`,`inboxAck`,`inbox`,`syncCode`,`syncAccount`,`syncUnlink`]);function wf(e){let t=e.replace(/[^A-Za-z0-9-]+/g,`-`).replace(/^-+|-+$/g,``);return/^[A-Za-z]/.test(t)||(t=`u-${t}`),t.slice(0,32).replace(/-+$/,``)}function Tf(e,t){let n=new Set([...t,`middleware`,`client`].map(e=>e.toLowerCase())),r=wf(e),i=r;for(let e=2;n.has(i.toLowerCase());e++)i=`${r.slice(0,31-String(e).length)}-${e}`;return i}function Ef(e){let{access:t}=e.principal;if(t.everywhere(`manage`))return null;let n=Object.entries(t.summary()).map(([e,t])=>`${e}=${t.join(`,`)}`);return n.length>0?n.join(`;`):`*=`}const Df=e=>((e instanceof Error?e.message:String(e))||`unknown error`).slice(0,500),Of=e=>{throw e instanceof yd?new Id(e.status>=400?e.status:502,e.code,e.message,{...e.hint===void 0?{}:{hint:e.hint},origin:e.origin}):e instanceof Id||e instanceof Error&&e.name===`AbortError`?e:new Id(502,`unreachable`,`the board didn't answer: ${Df(e)}`)};function kf(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))if(r!=null&&r!==!1){if(n===`label`&&Array.isArray(r))for(let[e,n]of r)t.append(`label`,n===null?e:`${e}=${n.join(`|`)}`);else if(Array.isArray(r))for(let e of r)t.append(n,String(e));else t.set(n,String(r))}let n=t.toString();return n?`?${n}`:``}function Af(e,t){let n=(t.headers.get(`content-disposition`)??``).match(/filename\*=UTF-8''([^;]+)/)?.[1],r=`file`;try{n&&(r=decodeURIComponent(n))}catch{}return{attachment:{id:e,name:r,type:t.headers.get(`content-type`)??`application/octet-stream`,size:Number(t.headers.get(`content-length`)??0)},data:t.body??/* @__PURE__ */ new Uint8Array}}function jf(e,t,n){if(e!==void 0&&!/^https?:\/\/[^/]/.test(e))throw Error(`http: ${e} isn't a URL: pass the board's, like https://board.example.com/api/board`);if(e===void 0&&!n)throw Error(`http: pass the board's URL: outside Node there's no environment to find it in`);let r=(e??n.url()).replace(/\/+$/,``),i=t.fetch??n?.fetch(r)??((e,t)=>globalThis.fetch(e,t)),a=null,o={},s=[],c=null,l=()=>c??=Md(xf(o,s)).then(e=>e.slice(0,32)),u=()=>{if(!a)throw Error(`http: this backend isn't serving a board yet: pass it to board({ backend })`);return a},d=(e,t)=>kd({url:r,fetch:i,profile:e===void 0?()=>n?.profile().profile??null:e,session:t||e===null?null:()=>n?.profile().session??null}),f=d(null,!0),p=/* @__PURE__ */ new Map;function m(e){if(!Sf.test(e))throw new Id(400,`invalid_request`,`as: ${e}: profiles start with a letter and use up to 32 letters, numbers, and hyphens`);let t=p.get(e);return t||p.set(e,t=d(e,!0)),t}let h=/* @__PURE__ */ new Map;function g(e){let t=JSON.stringify(e??(e===null?null:`\0`)),n=h.get(t);return n||h.set(t,n=d(e,!1)),n}function _(e){return e.origin.via?.kind===`engine`?f:e.origin.via?.kind===`client`?(e.self!==null&&m(e.self),g(`profile`in e?e.profile:e.self??void 0)):m(e.self??`client`)}let v=null,y=()=>(v??=i(r).then(async e=>{if(!e.ok)throw new Id(e.status>=400?e.status:502,`no_board`,`There's no board at ${r}: it answered ${e.status}.`,{origin:`handle`});return await e.json()},Of)).catch(e=>{throw v=null,e}),b=null,x=()=>b??=f.me().then(e=>e.principal).catch(e=>{throw b=null,e}),S=async e=>Fd(await x(),e);async function C(e,t,n,i){let a=_d[t],o={...n},s=a.path.replace(/:(\w+)/g,(e,t)=>{let n=o[t];return delete o[t],encodeURIComponent(String(n))}),c;if(t===`upload`){let{data:t,name:r,type:a}=n;if(t.byteLength>4194304){let n=await e.upload({data:t,name:r??`file`,...a?{type:a}:{}}).catch(Of);return Response.json({attachment:n})}c=await e.request(s,{method:`POST`,body:t,headers:{...a?{"content-type":a}:{},...r===null?{}:{"x-board-filename":encodeURIComponent(r)}},signal:i}).catch(Of)}else c=a.method===`GET`?await e.request(`${s}${kf(o)}`,{signal:i}).catch(Of):await e.request(s,{method:`POST`,body:new TextEncoder().encode(JSON.stringify(o)),headers:{"content-type":`application/json`},signal:i}).catch(Of);if(c.ok)return c;try{let e=await c.json();if(e.error?.message)throw new Id(c.status,e.error.code??`error`,e.error.message,typeof e.error.hint==`string`?{hint:e.error.hint}:{})}catch(e){if(e instanceof Id)throw e}throw new Id(502,`remote_error`,`${r} answered ${c.status}`)}async function w(e,t,n,a){if(e===`me`){let{principal:e,author:n,actor:r}=t;return{actor:r.id,principal:e.id,kind:r.kind,handle:r.handle,name:r.name,avatar:r.avatar,profile:n.profile,session:n.session,expiresAt:e.expiresAt?.toISOString()??null,can:e.access.summary()}}if(Cf.has(e))throw Bd(`this board's callers act as its project on ${r}, which can't tell them apart: ${e} is the project's own to do there`);let s=Ef(t),c=t.actor.avatar?.startsWith(`https://`)?t.actor.avatar:void 0,l=kd({url:r,fetch:i,profile:{name:Tf(t.actor.handle,Object.keys(o)),...c?{avatar:c}:{}},session:null,...s===null?{}:{headers:{"x-board-scope":s}}});(e===`post`||e===`posted`)&&typeof n.id==`string`&&(n={...n,id:await S(await Nd(`board-gateway`,t.principal.id,n.id)).catch(Of)});let u=await C(l,e,n,a);return e===`attachment`?Af(String(n.id),u):u.json()}async function T(e,t,n,r){let i=k();if(`identity`in t)return w(e,t.identity,n,r);let a=_(t);`self`in t&&t.origin.via?.kind===`engine`&&await i,(e===`post`||e===`posted`)&&`self`in t&&typeof n.id==`string`&&Pd.test(n.id)&&(n={...n,id:await S(n.id).catch(Of)});let o=await C(a,e,n,r);return e===`attachment`?Af(String(n.id),o):o.json()}let E={...Object.fromEntries(Jd.map(e=>[e,(t,n,r)=>T(e,t,n,r)])),async discovery(){return y()},async readSource(e,t,n){return`self`in e&&u().sync.some(e=>e.key===t.key)?u().readSource(t.key,t.target,t.limit??50):T(`readSource`,e,t,n)},async joinSource(e,t,n){return`self`in e&&u().sync.some(e=>e.key===t.key)?u().joinSource(t.key,t.target):T(`joinSource`,e,t,n)},async synced(e,t,n){let{targets:r}=await T(`synced`,e,t,n);return{targets:await Promise.all(r.map(async e=>({...e,url:e.url??(e.thread!==null&&e.message!==null?await u().linkOf(e.key,e.thread,e.message):null)})))}},async linked(e,t,n){let r=()=>new Id(404,`message_not_found`,`no message on this board for that link`),i=await(async()=>{for(let{platform:e,thread:r,message:i}of u().locate(t.url))for(let t of u().sync.filter(t=>t.platform===e)){let e=await f.syncFind({thread:`${t.key}:${r}`,...i===null?{}:{message:i}},{signal:n}).catch(Of),a=i===null?e.thread===null?null:(await f.syncThread(e.thread).catch(Of)).root:e.message;if(a!==null)return a}return null})();if(i===null)return T(`linked`,e,t,n);try{return await E.message(e,{id:i},n)}catch(e){throw e instanceof Id&&e.status===404?r():e}},async typing(e,t,n){let{targets:r}=await T(`typing`,e,t,n);if(!(`self`in e)||u().sync.length===0)return{targets:r};let{message:i,replies:a}=await E.message(e,{id:t.id},n),o=await u().typing([i,...a],t.status).catch(e=>(console.warn(`[board] skipped typing where this board syncs:`,Df(e)),[]));return{targets:[...r,...o]}}};async function D(e){let t=vf(e);return t&&(await y()).wake_by_path?t:{url:e}}let O=yf({remote:r,registry:{register:e=>f.register({...e,watch:o,...s.length>0?{sync:s}:{}}),matches:e=>f.matches(e),ack:(e,t)=>f.ack(e,t)},wakeAt:D,binding:u,hash:l,hasWork:()=>Object.keys(o).length>0||s.length>0,rethrow:Of,registerFor:async(e,t)=>Ud(await E.register(e,Ru.parse(await t.json()),t.signal))}),k=O.start;return{...E,routes:O.routes,keeps:!1,bind(e){if(a)throw Error(`http: this backend already serves a board: create one http() per board()`);for(let[t,n]of Object.entries(e.subscriptions)){if(n.kind===`sync`){t===`@sync`&&(s=e.sync.map(e=>({...e})));continue}if(!Sf.test(t))throw Error(`watch ${t}: ids start with a letter and use up to 32 letters, numbers, and hyphens`);pf(t,n),o[t]={tail:n.tail,when:n.when}}c=null,a=e},registerWatchers:O.registerNow,close:O.close}}function Mf(e,t={}){return jf(e,t,null)}const Nf=/```[\s\S]*?```/g,Pf=/`[^`\n]*`/g,Ff=`[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?`,If=RegExp(`(?<![\\w@.-])@(${Ff}(?:/${Ff})?)(?!:|[a-z0-9_/-]|\\.(?=[a-z0-9]))`,`gi`),Lf=/(?<![\w@.-])@\[([^\]\s]+)\]/g,Rf=e=>e.replace(Nf,e=>` `.repeat(e.length)).replace(Pf,e=>` `.repeat(e.length));function zf(e){let t=Rf(e),n=[];for(let e of t.matchAll(Lf)){let t=e[1];t!==void 0&&n.push({index:e.index,token:{kind:`actor`,actor:t},key:`actor:${t}`})}for(let e of t.replace(Lf,e=>` `.repeat(e.length)).matchAll(If)){let t=e[1]?.toLowerCase();t!==void 0&&n.push({index:e.index,token:{kind:`handle`,handle:t},key:`handle:${t}`})}let r=/* @__PURE__ */ new Set;return n.sort((e,t)=>e.index-t.index).filter(({key:e})=>!r.has(e)&&r.add(e)).map(({token:e})=>e)}function Bf(e,t){let n=Rf(e),r=[];for(let e of n.matchAll(Lf))r.push({index:e.index,length:e[0].length,token:{kind:`actor`,actor:e[1]}});for(let e of n.replace(Lf,e=>` `.repeat(e.length)).matchAll(If))r.push({index:e.index,length:e[0].length,token:{kind:`handle`,handle:e[1].toLowerCase()}});let i=``,a=0;for(let{index:n,length:o,token:s}of r.sort((e,t)=>e.index-t.index)){let r=e.slice(n,n+o);i+=e.slice(a,n)+(t(s,r)??r),a=n+o}return i+e.slice(a)}const Vf=[`read`,`post`,`react`,`label`,`sync`,`manage`],Hf={read:[],post:[],react:[`read`],label:[`read`],sync:[`read`],manage:[`read`,`post`,`react`,`label`,`sync`]},Uf=new Map(Vf.map((e,t)=>[e,t])),Wf=`write *, a channel, or a channel and its subtree (feedback/)`;function Gf(e){if(e===`*`)return{kind:`all`};if(e.includes(`*`)){let t=e.slice(0,e.indexOf(`*`)).replace(/\/+$/,``),n=t===``?`write * for every channel`:Yl.safeParse(t).success?`write ${t}/ for ${t} and its subtree`:Wf;throw Error(`invalid channel pattern ${e}: ${n}`)}let t=e.endsWith(`/`),n=t?e.slice(0,-1):e;if(!Yl.safeParse(n).success)throw Error(`invalid channel pattern ${e||`(empty)`}: ${Wf}`);return t?{kind:`subtree`,path:n}:{kind:`exact`,path:n}}const Kf=e=>e.kind===`all`?`*`:e.kind===`subtree`?`${e.path}/`:e.path;function qf(e){let t=/* @__PURE__ */ new Set,n=e=>{if(!Uf.has(e))throw Error(`unknown permission ${String(e)}: use ${Vf.join(`, `)}`);if(!t.has(e)){t.add(e);for(let t of Hf[e])n(t)}};for(let t of e===`all`?Vf:e)n(t);return t}const Jf=/* @__PURE__ */ new Set;function Yf(e){let t=null,n=/* @__PURE__ */ new Map,r=[];for(let[i,a]of e)i.kind===`all`?t=a:i.kind===`exact`?n.set(i.path,a):r.push([i.path,a]);return r.sort((e,t)=>t[0].length-e[0].length),{all:t,exact:n,subtrees:r}}const Xf=(e,t)=>e===t||e.startsWith(`${t}/`);function Zf(e,t,n=!1){if(!n){let n=e.exact.get(t);if(n)return n}for(let[n,r]of e.subtrees)if(Xf(t,n))return r;return e.all??Jf}const Qf=(e,t)=>t.kind===`all`?e.all??Jf:Zf(e,t.path,t.kind===`subtree`),$f=(e,t)=>e.size===t.size&&[...e].every(e=>t.has(e));function ep(e,t){if(t.kind===`exact`)return Zf(e,t.path,!0);if(t.kind===`subtree`){for(let[n,r]of e.subtrees)if(n!==t.path&&Xf(t.path,n))return r}return e.all??Jf}function tp(e){let t=Yf(e);return Yf(e.filter(([e,n])=>e.kind===`all`?n.size>0:!$f(n,ep(t,e))))}function np(e){return e===`all`||Array.isArray(e)?[[{kind:`all`},qf(e)]]:Object.entries(e).map(([e,t])=>[Gf(e),qf(t)])}const rp=e=>[...e.all?[[{kind:`all`},e.all]]:[],...e.subtrees.map(([e,t])=>[{kind:`subtree`,path:e},t]),...[...e.exact].map(([e,t])=>[{kind:`exact`,path:e},t])],ip=Symbol(`board.access`),ap=e=>typeof e==`object`&&ip in e;function op(e){let t=rp(e),n=n=>(e.all?.has(n)??!1)&&t.every(([,e])=>e.has(n)),r=/* @__PURE__ */ new Map;return{[ip]:e,can:(t,n)=>Zf(e,n).has(t),readable(t){let n=r.get(t);return n===void 0&&r.set(t,n=Zf(e,t).has(`read`)),n},readsAll:n(`read`),everywhere:n,anywhere:e=>t.some(([,t])=>t.has(e)),narrow(n){let r=ap(n)?n[ip]:tp(np(n)),i=/* @__PURE__ */ new Map([[`*`,{kind:`all`}]]);for(let[e]of[...t,...rp(r)])i.set(Kf(e),e);return op(tp([...i.values()].map(t=>{let n=Qf(r,t);return[t,new Set([...Qf(e,t)].filter(e=>n.has(e)))]})))},summary(){let e=t.map(([e,t])=>[Kf(e),t]);e.sort(([e],[t])=>e===`*`?-1:t===`*`?1:e.localeCompare(t));let n={};for(let[t,r]of e)n[t]=[...r].sort((e,t)=>Uf.get(e)-Uf.get(t));return n}}}function sp(e){return op(tp(np(e)))}const cp=sp(`all`);function lp(e){if(e.length>4e3)throw Error(`x-board-scope is longer than 4000 characters`);let t={},n=e.split(`;`).map(e=>e.trim());if(n.every(e=>e===``))throw Error(`x-board-scope is empty: write pattern=permissions, like dev/=read,post`);for(let e of n){if(e===``)continue;let n=e.indexOf(`=`);if(n<0)throw Error(`x-board-scope entry ${e} needs =: write pattern=permissions, like dev/=read,post`);let r=e.slice(0,n).trim(),i=e.slice(n+1).trim();if(Object.hasOwn(t,r))throw Error(`x-board-scope lists ${r} twice`);Gf(r);let a=i===``?[]:i.split(`,`).map(e=>e.trim());if(a.length===1&&a[0]===`all`){t[r]=`all`;continue}for(let e of a)if(!Uf.has(e))throw Error(`x-board-scope: unknown permission ${e||`(empty)`}: use ${Vf.join(`, `)}, or all`);t[r]=a}return t}const up=[`claude`,`codex`,`grok`,`pi`],dp=/^[A-Za-z][A-Za-z0-9-]{0,31}$/,fp=/^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/;function pp(e){let t=e.get(`x-board-profile`)?.trim()||null;if(t!==null&&!dp.test(t))throw Rd(`profile names start with a letter and use up to 32 letters, numbers, and hyphens`);let n=e.get(`x-board-avatar`)?.trim()||null;if(n!==null&&!hp(n))throw Rd(`avatars must be https URLs (http only on localhost)`);let r=e.get(`x-board-session`)?.trim().slice(0,200)||null,i=e.get(`x-board-handle`)?.trim().toLowerCase()||null;if(i!==null&&!fp.test(i))throw Rd(`invalid handle: ${i}`);let a=e.get(`x-board-name`),o=null;if(a)try{o=decodeURIComponent(a).replace(/[\u0000-\u001f\u007f]/g,``).trim().slice(0,128)||null}catch{throw Rd(`x-board-name must be URI-encoded`)}let s=e.get(`x-board-scope`);if(s!==null)try{lp(s)}catch(e){throw Rd(e.message,`invalid_scope`)}return{profile:t,avatar:n,session:r,handle:i,name:o,scope:s}}function mp(e,t,n){let r=e.kind===`person`&&e.facts?.issuer!==`host`&&t.handle?t.handle:e.handle,i=e.kind===`person`?t.name:null,a=t.profile?.toLowerCase()??null,o=a===null?e.id:`${e.id}+${a}`,s=a!==null&&up.includes(a),c={id:o,kind:a===null?e.kind:`agent`,handle:a===null?r:`${r}/${a}`,name:t.profile??i??r,avatar:t.avatar??(s?`${n}/avatars/${a}`:null)};return{author:{actor:o,principal:e.id,profile:a,session:t.session},actor:c}}function hp(e){try{let t=new URL(e);return t.protocol===`https:`||t.protocol===`http:`&&[`localhost`,`127.0.0.1`].includes(t.hostname)}catch{return!1}}const gp=e=>Bd(`this token can't use this board: add ${e} to access`),_p=e=>{let t=new URL(e);return`${t.host}${t.pathname.replace(/\/+$/,``)}`.replace(/[%:]/g,e=>e===`%`?`%25`:`%3A`)};function vp(e){let t=/* @__PURE__ */ new Map;for(let n of e){let e=_p(n),r=t.get(e);if(r!==void 0&&r!==n)throw Error(`access: oidc issuers ${r} and ${n} name the same principals, oidc:${e}:<sub>: pin one of them`);t.set(e,n)}return new Set(e)}const yp=e=>[...new Set(e.flatMap(e=>typeof e!=`function`&&e.issuer===`oidc`?[e.url]:[]))];function bp(e){let t=typeof e.access==`function`?[]:e.access,n=typeof e.access==`function`?e.access:null,r=vp(yp(t));async function i(n,i){if(i?.issuer===`host`)throw Bd(`this token can't use this board: its board no longer takes a host's principals`);if(i?.issuer===`oidc`&&!r.has(i.iss))throw zd(`untrusted issuer: ${i.iss}`);let a=i?.claims??{},o=i?.issuer===`vercel`?await e.project():null,s=o?{teamId:i.team??o.teamId,projectId:o.id}:{teamId:null,projectId:null},c=String(a.environment??``),l=xp(),u=o!==null&&o.id!==null&&a.project_id===o.id,d=u&&l!==null&&c===l;for(let e of t){if(typeof e==`function`){if(d)continue;let t=await e(n);if(t===void 0)continue;if(t===null)throw Bd(`this token can't use this board`);return sp(t)}if(i&&e.issuer===i.issuer&&(e.issuer!==`oidc`||e.url===i.iss)&&e.matches(a,s))return e.access}if(d)return cp;throw i?i.issuer===`oidc`?gp(`oidc({ issuer: '${i.iss}', claims, can })`):i.issuer===`github`?gp(`githubActions({ repository: '${String(a.repository)}', can })`):u?Bd(`this token can't use this board: it runs in ${l??`no Vercel environment`}, so its ${c||`unnamed`} deployments need vercelProject({ project: 'self', environments: ['${c}'], can })`):gp(`vercelProject({ project: '${String(a.project??``)||String(a.project_id)}', can })`):Bd(`this token can't use this board`)}async function a(t){let r=cp,a=t.facts?.issuer===`host`;if(t.id.startsWith(`board:`)||t.kind===`external`&&!a)r=cp;else{if(a){if(!e.hosts)throw Bd(`this token can't use this board: its board no longer takes a host's principals`);let{exp:n}=t.facts.claims;if(typeof n==`number`&&n*1e3<=Date.now())throw zd(`token expired`)}if(n){let e=await n(t);if(e==null)throw Bd(`this token can't use this board`);r=sp(e)}else t.kind!==`person`&&(r=await i(t,(a?void 0:t.facts)??Sp(t.id)))}return t.scope===void 0?r:r.narrow(lp(t.scope))}async function o(e){try{return await a(e)}catch(e){let t=e.status;if(t===401||t===403)return null;throw e}}return{grant:a,accessNow:o}}const xp=()=>process.env.VERCEL_TARGET_ENV||process.env.VERCEL_ENV||null;function Sp(e){let t=e.match(/^vercel:project:([^:]+):([^:]+)$/);return t?{issuer:`vercel`,iss:``,claims:{project_id:t[1],environment:t[2]}}:null}const Cp=Symbol(`board.oidcTokens`),wp=/* @__PURE__ */ new WeakSet,Tp=e=>Cp in e,Ep=e=>wp.has(e),Dp=/^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*:[^\s+\]]{1,200}$/,Op=[`person`,`deployment`,`workflow`,`external`];function kp(e){let t=e=>{throw TypeError(`authenticate returned an invalid principal: ${e}`)};(typeof e!=`object`||!e)&&t(`not an object`),(typeof e.id!=`string`||!Dp.test(e.id)||e.id.startsWith(`board:`))&&t(`id must look like \`vercel:user:<id>\`, got ${JSON.stringify(e.id)}`),Op.includes(e.kind)||t(`kind must be one of ${Op.join(`, `)}`),(typeof e.handle!=`string`||!/^\S{1,64}$/.test(e.handle))&&t(`handle must be 1-64 characters, no spaces`);let n=e.expiresAt??null;if(n!==null&&(!(n instanceof Date)||Number.isNaN(n.getTime()))&&t(`expiresAt must be a Date or null`),n!==null&&n.getTime()<=Date.now())throw zd(`token expired`);let r=n===null?{}:{exp:Math.floor(n.getTime()/1e3)};return{id:e.id,kind:e.kind,handle:e.handle,expiresAt:n,facts:{issuer:`host`,iss:``,claims:r}}}function Ap(e,t,n){let r=t||e.access!==void 0,i=e.access??[],a=null,o=()=>(a??=(async()=>{if(!n)return{id:e.project?.id??null,teamId:e.project?.teamId??null};let t=await n(),[r,i]=await Promise.all([t.ownProjectId(e.project),t.ownTeamId(e.project)]);return{id:r,teamId:i}})()).catch(e=>{throw a=null,e});async function s(t){return n?(await n()).discoveryIdentity(t,e.project):{projectId:e.project?.id??null,teamId:e.project?.teamId??null}}let c=null,l=()=>e.authenticate?Promise.resolve(e.authenticate):c??=n?n().then(e=>e.oidcTokens()):Promise.reject(new Id(501,`no_verifier`,`this build of board verifies no tokens: pass board({ authenticate })`)),u=bp({access:i,project:o,hosts:e.authenticate!==void 0&&!Tp(e.authenticate)}),d={project:o,issuers:typeof i==`function`?[]:yp(i)},f=/* @__PURE__ */ new Map,p=/* @__PURE__ */ new WeakMap;async function m(e){let t=e=>e.expiresAt===null||e.expiresAt.getTime()>Date.now(),n=p.get(e);if(n){let e=await n;if(t(e))return e}let r=e.credential===null?null:[e.audience,e.credential,e.headers.get(`x-vercel-oidc-token`)??``].join(``),i=r===null?void 0:f.get(r);if(i&&i.until>Date.now())return p.set(e,i.principal),i.principal;let a=h(e);return p.set(e,a),r!==null&&a.then(e=>{e.facts?.issuer!==`host`&&e.expiresAt!==null&&(f.size>=1e3&&f.delete(f.keys().next().value),f.set(r,{principal:a,until:e.expiresAt.getTime()}))},()=>p.delete(e)),a}async function h(e){let t=await l(),n;try{n=await t({...e,board:d})}catch(e){throw e instanceof Response?new Ld(e):e}if(n instanceof Response)throw new Ld(n);if(n==null)throw zd(`missing bearer token`);return Ep(n)?n:kp(n)}return{open:r,project:o,discoveryIdentity:s,async identify(e){let t=await m(e),n=e.claims.scope===null?t:{...t,scope:e.claims.scope},{author:r,actor:i}=mp(n,e.claims,e.audience);return{principal:{...n,access:await u.grant(n)},author:r,actor:i}},accessNow:e=>u.accessNow(e)}}const jp={claude:`m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z`,openai:`M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z`,x:`M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z`,slack:`M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z`,github:`M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12`,whatsapp:`M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z`},Mp={claude:{background:`#D97757`,mark:{path:jp.claude}},codex:{background:`#000000`,mark:{path:jp.openai}},grok:{background:`#000000`,mark:{path:jp.x}},pi:{background:`#1f1f1f`,mark:{glyph:`π`}}};function Np(e){let t=Mp[e]??{background:`#666666`,mark:{glyph:e.slice(0,1).toUpperCase()}},n=`path`in t.mark?`<path transform="translate(30 30) scale(2.8333)" fill="#ffffff" d="${t.mark.path}"/>`:`<text x="64" y="86" font-family="ui-sans-serif,system-ui,sans-serif" font-size="66" font-weight="600" text-anchor="middle" fill="#ffffff">${t.mark.glyph}</text>`;return`<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128"><rect width="128" height="128" rx="28" fill="${t.background}"/>${n}</svg>`}var Pp=class extends Id{responses;constructor(e){super(422,`dropped`,e.join(`
|
|
345
|
+
`)),(t.id!==void 0||t.data!==void 0)&&(yield t)}}}finally{t?.removeEventListener(`abort`,a),n.releaseLock()}}var yd=class extends Error{code;status;hint;origin;constructor(e,t,n,r={}){super(t),this.name=`BoardError`,this.code=e,this.status=n,this.hint=r.hint,this.origin=r.origin??`handle`}};const bd=/* @__PURE__ */ new WeakSet,xd=async e=>typeof e==`function`?await e():e,Sd=e=>{let{at:t,until:n,...r}=Cd(e);return{...r,...t===void 0?{}:{at:t instanceof Date?t.toISOString():t},...n===void 0?{}:{until:n instanceof Date?n.toISOString():n}}},Cd=e=>{if(typeof e==`string`)return{text:e};let{attachments:t,...n}=e;return t?.length?{...n,attachments:t.map(e=>typeof e==`string`?e:e.id)}:n},wd={ms:1,s:1e3,m:6e4,h:36e5,d:864e5};function Td(e){if(typeof e==`number`)return e;let t=e.trim().match(/^(\d+(?:\.\d+)?)(ms|s|m|h|d)?$/);if(!t)throw new yd(`invalid_duration`,`${e} isn't a duration like 30s, 10m, or 1h.`,0);return Number(t[1])*wd[t[2]??`ms`]}const Ed=e=>encodeURIComponent(e);function Dd(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))if(r!=null){if(n===`label`){let e=Array.isArray(r)?r:typeof r==`object`?Object.entries(r).map(([e,t])=>`${e}=${String(t)}`):[r];for(let n of e)t.append(`label`,String(n))}else t.set(n,String(r))}let n=t.toString();return n?`?${n}`:``}const Od=(e,t)=>t?.length?{...e,unknownMentions:t}:e;function kd(e){let t=e.url.replace(/\/+$/,``),n=e.fetch??((e,t)=>globalThis.fetch(e,t)),r=e.storeFetch??((e,t)=>globalThis.fetch(e,t));async function i(t,n){let r={...e.headers?await xd(e.headers):{}};if(!t)return r;e.token!==void 0&&(r.authorization=`Bearer ${await xd(e.token)}`);let i=n===void 0?e.profile===void 0?null:await xd(e.profile):n;if(i!==null){let{name:e,avatar:t}=typeof i==`string`?{name:i,avatar:void 0}:i;r[`x-board-profile`]=e,t&&(r[`x-board-avatar`]=t)}else{let t=e.person===void 0?null:await xd(e.person);t?.name&&(r[`x-board-name`]=encodeURIComponent(t.name)),t?.avatar&&(r[`x-board-avatar`]=t.avatar)}let a=n===void 0?e.session===void 0?null:await xd(e.session):null;a&&(r[`x-board-session`]=a);let o=e.handle===void 0?null:await xd(e.handle);return o&&(r[`x-board-handle`]=o),r}async function a(e,r,a={}){let o=await n(`${t}${r}`,{method:e,headers:{...await i(a.auth??!0),...a.body===void 0?{}:{"content-type":`application/json`},...a.headers},...a.body===void 0?{}:{body:JSON.stringify(a.body)},...a.signal?{signal:a.signal}:{}});if(!o.ok)throw await Ad(o);return o}async function o(e,t,n){return await(await a(e,t,n)).json()}let s=(e={})=>e;async function c(e={},t){return o(`GET`,`/events${Dd(e)}`,t?{signal:t}:{})}return{url:t,request:async(e,r={})=>n(`${t}${e}`,{method:r.method??`GET`,headers:{...r.headers,...await i(!0,r.as)},...r.body?{body:r.body}:{},...r.signal?{signal:r.signal}:{}}),discovery:()=>o(`GET`,`/`,{auth:!1}),me:()=>o(`GET`,`/me`),channels:async()=>(await o(`GET`,`/channels`)).channels,actors:async()=>(await o(`GET`,`/actors`)).actors,identity:()=>o(`GET`,`/identity`),unlinkAccount:e=>o(`POST`,`/identity/unlink`,{body:{actor:e}}),messages:(e={})=>o(`GET`,`/messages${Dd(e)}`),thread:e=>o(`GET`,`/messages/${Ed(e)}`),posted:async e=>(await o(`GET`,`/posts/${Ed(e)}`)).message,threads:(e={})=>o(`GET`,`/threads${Dd(e)}`),async post(e,t){let{message:n,unknownMentions:r}=await o(`POST`,`/messages`,{body:{channel:e,...Cd(t)}});return Od(n,r)},async reply(e,t){let{message:n,unknownMentions:r}=await o(`POST`,`/messages`,{body:{re:e,...Cd(t)}});return Od(n,r)},async schedule(e,t){let{schedule:n,unknownMentions:r}=await o(`POST`,`/schedules`,{body:{...typeof e==`string`?{channel:e}:{re:e.re},...Sd(t)}});return Od(n,r)},schedules:async(e={})=>(await o(`GET`,`/schedules${Dd(e)}`)).schedules,cancelSchedule:e=>o(`POST`,`/schedules/${Ed(e)}/cancel`,{body:{}}),async upload(e){let a=e.type||(e.data instanceof Blob?e.data.type:``)||Ne(e.name),s=e.data instanceof Blob?e.data.size:e.data.byteLength;if(s>4194304){if(s>104857600)throw new yd(`too_large`,`Attachments are at most ${Ae/1024/1024} MB.`,413);let t=await o(`POST`,`/attachments/uploads`,{body:{name:e.name,type:a,size:s}}).catch(e=>{throw e instanceof yd&&e.status===404&&e.code===`not_found`?new yd(`too_large`,`This board takes files of at most ${Oe/1024/1024} MB.`,413):e}),n=await r(t.url,{method:`PUT`,headers:t.headers,body:e.data});if(!n.ok)throw new yd(`upload_failed`,`The blob store refused the file: ${n.status} ${(await n.text().catch(()=>``)).slice(0,300)||n.statusText}`,n.status);return(await o(`POST`,`/attachments/uploads/${encodeURIComponent(t.id)}`,{body:{}})).attachment}let c=await n(`${t}/attachments`,{method:`POST`,headers:{...await i(!0),"content-type":a,"x-board-filename":encodeURIComponent(e.name)},body:e.data});if(!c.ok)throw await Ad(c);return(await c.json()).attachment},download:(e,t={})=>a(`GET`,`/attachments/${encodeURIComponent(e)}`,t.signal?{signal:t.signal}:{}),edit:(e,t)=>o(`POST`,`/messages/${Ed(e)}/edit`,{body:{text:t}}),delete:e=>o(`POST`,`/messages/${Ed(e)}/delete`,{body:{}}),react:(e,t,n={})=>o(`POST`,`/messages/${Ed(e)}/reactions`,{body:{emoji:Ee(t),...n}}),label:(e,t)=>o(`POST`,`/messages/${Ed(e)}/labels`,{body:t}),typing:async(e,t)=>(await o(`POST`,`/messages/${Ed(e)}/typing`,{body:t?{status:t}:{}})).targets,sync:((e,t)=>t===void 0?o(`GET`,`/messages/${Ed(e)}/sync`):o(`POST`,`/messages/${Ed(e)}/sync`,{body:{target:t}})),linked:e=>o(`GET`,`/links${Dd({url:e})}`),inbox:async(e,t={})=>(await o(`GET`,`/inbox/${e}${Dd(t)}`)).events,register:e=>o(`POST`,`/watchers`,{body:e}),watchers:async()=>(await o(`GET`,`/watchers`)).watchers,matches:async(e={})=>{let{signal:t,...n}=e;return(await o(`GET`,`/watchers/matches${Dd(n)}`,t?{signal:t}:{})).matches},ack:(e,t)=>o(`POST`,`/watchers/matches/${encodeURIComponent(e)}/ack`,{body:t}),readSource:(e,t,n={})=>o(`GET`,`/sources/${e}/read${Dd({target:t,...n})}`),joinSource:(e,t)=>o(`POST`,`/sources/${e}/join`,{body:{target:t}}),poll:c,syncImport:e=>o(`POST`,`/sync/imports`,{body:e}),syncReceipt:e=>o(`POST`,`/sync/receipts`,{body:e}),syncThread:e=>o(`GET`,`/sync/threads/${Ed(e)}`),syncFind:(e,t={})=>o(`GET`,`/sync/find${Dd(e)}`,t.signal?{signal:t.signal}:{}),syncCopies:async e=>(await o(`GET`,`/sync/copies?${e.map(e=>`message=${encodeURIComponent(e)}`).join(`&`)}`)).copies,syncRoots:async(e,t)=>(await o(`GET`,`/sync/roots${Dd({by:e,since:t instanceof Date?t.getTime():t})}`)).roots,inboxPush:(e,t)=>o(`POST`,`/inbox/${Ed(e)}`,{body:{events:t}}),inboxNext:async(e,t={})=>(await o(`GET`,`/inbox/${Ed(e)}/next${Dd(t)}`)).items,inboxAck:(e,t,n)=>o(`POST`,`/inbox/${Ed(e)}/${Ed(t)}/ack`,{body:n}),syncCode:e=>o(`POST`,`/sync/codes`,{body:{sync:e}}),syncAccount:e=>o(`POST`,`/sync/accounts`,{body:e}),syncUnlink:e=>o(`POST`,`/sync/accounts/unlink`,{body:{account:e}}),async*events(e={},t={}){let n=e.after,r=0;for(;!t.signal?.aborted;){let i;try{i=await a(`GET`,`/events${Dd({...s(e),after:n})}`,{headers:{accept:`text/event-stream`},...t.signal?{signal:t.signal}:{}})}catch(e){if(t.signal?.aborted)return;if(e instanceof yd&&e.status>=400&&e.status<500)throw e;await new Promise(e=>setTimeout(e,Math.min(3e4,500*2**r++)));continue}r=0;try{for await(let e of vd(i.body,t.signal))e.id!==void 0&&(n=e.id),e.event===`board`&&e.data&&(yield JSON.parse(e.data))}catch{if(t.signal?.aborted)return;await new Promise(e=>setTimeout(e,Math.min(3e4,500*2**r++)))}}},async wait(e={},t={}){let n=Date.now()+Td(t.timeout??`30m`),r=e.after??(await c({...e,after:void 0,wait:0},t.signal)).cursor;for(;Date.now()<n&&!t.signal?.aborted;){let i=Math.max(0,Math.min(25,Math.ceil((n-Date.now())/1e3))),a=await c({...e,after:r,wait:i},t.signal);if(a.events.length>0)return a.events[0];r=a.cursor}return null}}}async function Ad(e){try{let t=await e.json();if(t.error?.message)return new yd(t.error.code??`error`,t.error.message,e.status,{...typeof t.error.hint==`string`?{hint:t.error.hint}:{},origin:bd.has(e)?`handle`:`board`})}catch{}return new yd(`http_error`,`The board answered ${`${e.status} ${e.statusText}`.trim()}.`,e.status)}const jd=e=>Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``);async function Md(e){return jd(new Uint8Array(await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(e))))}async function Nd(...e){let t=new Uint8Array(await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(JSON.stringify(e)))).slice(0,16);t[6]=t[6]&15|128,t[8]=t[8]&63|128;let n=jd(t);return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20,32)}`}const Pd=/^[0-9a-f]{8}-[0-9a-f]{4}-8[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,Fd=async(e,t)=>`key:${e}:${(await Md(`board-key\u001f${t}`)).slice(0,32)}`;var Id=class extends Error{status;code;hint;origin;constructor(e,t,n,r={}){super(n),this.status=e,this.code=t,this.hint=r.hint,this.origin=r.origin??`board`}},Ld=class extends Id{response;constructor(e){super(e.status,`rejected`,`rejected with ${e.status}`),this.response=e}};const Rd=(e,t=`invalid_request`)=>new Id(400,t,e),zd=e=>new Id(401,`unauthorized`,e),Bd=e=>new Id(403,`forbidden`,e),Vd=(e,t=`not_found`)=>new Id(404,t,e),Hd=()=>new Id(409,`duplicate_id`,`that id was already used for a different write`),Ud=(e,t=200,n)=>new Response(JSON.stringify(e),{status:t,headers:{"content-type":`application/json`,...n}});function Wd(e){if(e.code!==`invalid_union`||e.errors.length===0)return e;let t=e.errors.reduce((e,t)=>t.length<e.length?t:e)[0];return t?Wd({...t,path:[...e.path,...t.path]}):e}function Gd(e){if(e instanceof Ld)return e.response;if(e instanceof Id){let t=Ud({error:{code:e.code,message:e.message,...e.hint===void 0?{}:{hint:e.hint}}},e.status);return e.origin===`handle`&&bd.add(t),t}if(e instanceof ac){let t=e.issues[0]&&Wd(e.issues[0]),n=t?.path.length?`${t.path.join(`.`)}: `:``;return Ud({error:{code:`invalid_request`,message:`${n}${t?.message??`invalid request`}`}},400)}let t=e?.code;return t===`INVALID_PAYLOAD`?Ud({error:{code:`invalid_request`,message:e.message}},400):t===`PARTIAL_DUPLICATE_BATCH`||t===`DUPLICATE_EVENT_ID`?Gd(Hd()):t===`STORE_UNAVAILABLE`||t===`STORE_NOT_CONFIGURED`?Ud({error:{code:`unavailable`,message:e.message}},503):(console.error(`[board]`,e),Ud({error:{code:`internal`,message:`internal error`}},500))}const Kd=`0.28.0`,qd=[`avatar`,`openapi`,`webhook`,`signIn`,`signedIn`,`identityUnlink`,`sync`],Jd=/* @__PURE__ */ `discovery.me.channels.actors.identity.messages.threads.message.post.posted.edit.delete.react.label.schedule.schedules.cancelSchedule.upload.attachment.uploadStart.uploadFinish.watchers.register.matches.ack.events.syncImport.syncReceipt.syncThread.syncFind.syncCopies.syncRoots.inboxPush.inboxNext.inboxAck.inbox.syncCode.syncAccount.syncUnlink.typing.readSource.joinSource.synced.linked`.split(`.`),Yd=e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);function Xd(e,t,n,r){let i=t.split(`/`).filter(Boolean),a=i.map(e=>e.startsWith(`:`)?`/([^/]+)`:`/${Yd(e)}`).join(``);return{method:e,pattern:RegExp(`${a}$`),names:i.filter(e=>e.startsWith(`:`)).map(e=>e.slice(1)),target:n,segments:i.length,literals:i.filter(e=>!e.startsWith(`:`)).length,own:r}}function Zd(e,t){let n=[...qd.map(e=>Xd(_d[e].method,_d[e].path,{kind:`board`,name:e},!1)),...Jd.filter(e=>e!==`discovery`).map(e=>Xd(_d[e].method,_d[e].path,{kind:`protocol`,name:e},!1)),...e.map(e=>Xd(e.method,e.path,{kind:`backend`,route:e},!0))].sort((e,t)=>t.segments-e.segments||t.literals-e.literals||Number(t.own)-Number(e.own)),r=(e,t,n)=>{let r={};try{e.names.forEach((e,t)=>r[e]=decodeURIComponent(n[t]))}catch{return null}let i=e.names[0];return{target:e.target,base:t,param:i===void 0?null:r[i],params:r}},i=e=>({target:{kind:`protocol`,name:`discovery`},base:e,param:null,params:{},root:!0});return function(e,a){let o=a.length>1?a.replace(/\/+$/,``):a;if(t!==void 0){let a=t.replace(/\/+$/,``);if(o!==a&&!o.startsWith(`${a}/`))return null;let s=o.slice(a.length)||`/`;if(s===`/`)return e===`GET`?i(a):null;for(let t of n){let n=t.method===e?s.match(RegExp(`^${t.pattern.source}`)):null;if(n)return r(t,a,n.slice(1))}return null}for(let t of n){if(t.method!==e)continue;let n=o.match(t.pattern);if(n)return r(t,o.slice(0,n.index),n.slice(1))}return e===`GET`?i(o===`/`?``:o):null}}function Qd(e){let t={};for(let n of new Set(e.searchParams.keys())){let r=e.searchParams.getAll(n);t[n]=r.length>1?r:r[0]}return t}async function $d(e){let t=await e.text();if(t.trim()!==``)try{return JSON.parse(t)}catch{throw Rd(`request body is not valid JSON`)}}const ef=()=>new Id(413,`too_large`,`attachments are at most ${Oe/1024/1024} MB`);async function tf(e,t){if(Number(e.headers.get(`content-length`)??0)>t)throw ef();let n=[],r=0;for await(let i of e.body??[]){if(r+=i.byteLength,r>t)throw ef();n.push(i)}let i=new Uint8Array(r),a=0;for(let e of n)i.set(e,a),a+=e.byteLength;return i}function nf(){let e={};for(let[t,n]of Object.entries(_d)){let r=n.path.replace(/:(\w+)/g,`{$1}`),i={operationId:t};`query`in n&&(i[`x-query-schema`]=tc(n.query,{io:`input`})),`body`in n&&(i.requestBody={content:{"application/json":{schema:tc(n.body,{io:`input`})}}}),(e[r]??={})[n.method.toLowerCase()]=i}return{openapi:`3.1.0`,info:{title:`board`,version:Kd},paths:e}}const rf={re:{type:`string`,value:`id`,description:`in a thread: its root's ID`},by:{type:`string`,value:`handle`,description:`by an author: a handle, me, or an actor ID`},mentions:{type:`string`,value:`@handle`,optionalValue:!0,description:`mentioning a handle, or you without one`},label:{type:`string`,multiple:!0,value:`k[=v|w]`,description:`with a label on the message or its thread's root`},source:{type:`string`,value:`source`,description:`from a source: a sync key such as slack, or board`},text:{type:`string`,value:`words`,description:`containing these words`},after:{type:`string`,value:`id`,description:`after a message or a cursor`},url:{type:`string`,value:`url`,description:`the board at this URL, not the one the environment points at`},scope:{type:`string`,value:`team`,description:`a team's board in Vercel's API, by its slug or ID`},team:{type:`string`,value:`team`,description:`the same as --scope`,hidden:!0},as:{type:`string`,value:`profile`,description:`write as a profile, such as an agent's name`},avatar:{type:`string`,value:`url`,description:`the profile's avatar, with --as`},human:{type:`boolean`,description:`write as yourself, with no profile or session`},handle:{type:`string`,value:`h`,description:`your handle (default: your Vercel username)`},json:{type:`boolean`,description:`JSON, for programs`},help:{type:`boolean`,short:`h`,description:`this help, or a command's`},version:{type:`boolean`,short:`v`,description:`the CLI's version`},limit:{type:`string`,short:`n`,value:`N`,description:`how many`},"idempotency-key":{type:`string`,value:`key`,description:`sending the same one again posts once`},sync:{type:`string`,multiple:!0,value:`target`,description:`sync the new thread to a target too, e.g. slack:#incidents`},"no-sync":{type:`boolean`,description:`keep it on the board: sync it nowhere`},attach:{type:`string`,multiple:!0,value:`file`,description:`attach a file`},unset:{type:`string`,multiple:!0,value:`k`,description:`remove a label`},channel:{type:`string`,value:`c`,description:`in a channel`},remove:{type:`boolean`,description:`take the reaction back`},all:{type:`boolean`,short:`a`,description:`everything, not only what most want`},timeout:{type:`string`,value:`duration`,description:`how long to wait (default: 30m)`},code:{type:`boolean`,description:`post a code from your account instead of signing in`},"no-wait":{type:`boolean`,description:`start linking, and don't wait for it to finish`},"no-open":{type:`boolean`,description:`don't open the browser`},in:{type:`string`,value:`duration`,description:`once, this long from now, e.g. 1d`},at:{type:`string`,value:`time`,description:`at a time: once, or with --every, the first`},every:{type:`string`,value:`duration`,description:`repeating at this interval, e.g. 30m`},until:{type:`string`,short:`u`,value:`time`,description:`repeating until a time`},for:{type:`string`,value:`duration`,description:`repeating for this long, e.g. 24h`},times:{type:`string`,value:`N`,description:`repeating this many times`},port:{type:`string`,value:`N`,description:`the port to listen on`},dir:{type:`string`,value:`dir`,description:`where the board keeps its log (default: .board/)`},"no-inspect":{type:`boolean`,description:`don't start the inspector`},agent:{type:`string`,value:`name`,description:`the agent whose turn ended`,hidden:!0}},af=(e,t,n)=>({name:e,...rf[e],...t?{description:t}:{},...n?{value:n}:{}});[`re`,`by`,`source`,`label`,`text`,`mentions`,`after`].map(e=>af(e)),[`url`,`scope`,`team`,`as`,`avatar`,`human`,`handle`,`json`,`help`,`version`].map(e=>af(e)),af(`code`),af(`no-wait`),af(`no-open`),af(`limit`,`threads to list (default: 50)`),af(`label`,`label it`,`k=v`),af(`attach`),af(`sync`),af(`no-sync`),af(`idempotency-key`),af(`attach`),af(`idempotency-key`),af(`no-sync`),af(`in`),af(`at`),af(`every`),af(`until`),af(`for`),af(`times`),af(`label`,`label it`,`k=v`),af(`attach`),af(`no-sync`),af(`by`,`scheduled by a handle`),af(`channel`,`posting in a channel`),af(`all`,`done and canceled ones too`),af(`remove`),af(`unset`),af(`limit`,`events to list`),af(`limit`,`messages to read`),af(`channel`,`the channel to check in (default: conformance)`),af(`agent`),af(`all`,`delivery receipts too`),af(`timeout`);const of={re:rf.re,by:rf.by,mentions:rf.mentions,label:rf.label,source:rf.source,text:rf.text};function sf(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n];r===`--mentions`?e[n+1]?.startsWith(`@`)?t.push(`--mentions=${e[++n]}`):t.push(`--mentions=me`):t.push(r)}return t}function cf(e){let t=[],n=null,r=null;for(let i=0;i<e.length;i++){let a=e[i];r?a===r?r=null:a===`\\`&&r===`"`&&i+1<e.length?n+=e[++i]:n+=a:/\s/.test(a)?(n!==null&&t.push(n),n=null):a===`"`||a===`'`?(r=a,n??=``):n=a===`\\`&&i+1<e.length?(n??``)+e[++i]:(n??``)+a}if(r)throw Error(`unterminated ${r}`);return n!==null&&t.push(n),t}const lf={...of,all:{type:`boolean`}};function uf(e){let t={},n=[];for(let r=0;r<e.length;r++){let i=e[r];if(i===`--`){n.push(...e.slice(r+1));break}if(!i.startsWith(`-`)||i===`-`){n.push(i);continue}let a=i.indexOf(`=`),o=i.startsWith(`--`)?i.slice(2,a===-1?void 0:a):null,s=o!==null&&Object.hasOwn(lf,o)?lf[o]:null;if(!s)throw Error(`${o===null?i.slice(0,2):`--${o}`} isn't a filter`);if(s.type===`boolean`){if(a!==-1)throw Error(`--${o} takes no value`);t[o]=!0;continue}let c;if(a!==-1)c=i.slice(a+1);else{let t=e[r+1];if(t===void 0||t.length>1&&t.startsWith(`-`))throw Error(`--${o} needs a value`);c=t,r++}t[o]=`multiple`in s?[...t[o]??[],c]:c}return{values:t,positionals:n}}function df(e){let{values:t,positionals:n}=uf(sf(cf(e)));if(n.length>1)throw Error(`expected one channel, got: ${n.join(` `)}`);let r=n[0],i=Eu.safeParse({...r?{channel:r}:{},...t.re?{re:t.re.replace(/^#/,``)}:{},...t.by?{by:t.by.replace(/^@/,``)}:{},...t.mentions?{mentions:t.mentions.replace(/^@/,``)}:{},...t.label?.length?{label:t.label}:{},...t.source?{from:t.source}:{},...t.text?{text:t.text}:{}});if(!i.success){let e=i.error.issues[0];throw Error(`${e?.path.length?`--${String(e.path[0])}: `:``}${e?.message??`invalid filters`}`)}return{filters:i.data,all:t.all===!0}}const ff=e=>e.channel!==void 0||e.re!==void 0||e.by!==void 0||e.mentions!==void 0||e.from!==void 0||e.text!==void 0||(e.label?.length??0)>0;function pf(e,t){let n,r;try{({filters:n,all:r}=df(t.tail))}catch(t){throw Error(`watch ${e}: ${t.message}`)}if(n.mentions===`me`)throw Error(`watch ${e}: a watcher has no "me": use --mentions @handle`);let i=ff(n);if(t.when===`enters`&&!i)throw Error(`watch ${e}: \`when: enters\` needs a filter to enter`);return{filters:n,criteria:i,enters:t.when===`enters`,all:r}}function mf(e){try{Reflect.get(globalThis,Symbol.for(`@vercel/request-context`))?.get?.()?.waitUntil?.(e)}catch{}}const hf=1e4,gf=e=>((e instanceof Error?e.message:String(e))||`unknown error`).slice(0,500),_f=e=>e?.startsWith(`https://`)?e:null;function vf(e){let t=typeof process<`u`&&process.env.VERCEL===`1`?process.env:null,n=t?.VERCEL_TARGET_ENV||t?.VERCEL_ENV,r=n===`preview`&&t?.VERCEL_GIT_COMMIT_REF||null;return!e||n!==`production`&&!r?null:{path:new URL(e).pathname,...r?{branch:r}:{}}}function yf(e){let{registry:t,rethrow:n}=e,r=e.binding,i=null,a=null;async function o(n){let r=await e.hash();return i&&i.url===n&&i.result.hash===r&&Date.now()-i.at<hf?i.result:(a??=e.wakeAt(n).then(e=>t.register(e)).then(e=>(i={url:n,at:Date.now(),result:e},e)).finally(()=>{a=null}),a)}async function s(e){let n={};if(!r().subscriptions[e.watcher])n={skip:!0};else try{await r().run(e.watcher,e.event,{trigger:`watch:${e.watcher}:${e.id}`,attempt:e.attempt+1})}catch(t){console.error(`[board] watcher ${e.watcher} failed:`,t),n={error:gf(t)}}await t.ack(e.id,{lease:e.lease,...n}).catch(e=>console.error(`[board] couldn't ack a match:`,gf(e)))}async function c(){let e=0,n=Date.now()+24e4;for(;Date.now()<n;){let n=await t.matches({limit:10});if(n.length===0)break;await Promise.all(n.map(s)),e+=n.length}return e+await r().pull()}let l=null;function u(){if(l)return;let n=l=new AbortController;(async()=>{for(let i=1e3;!n.signal.aborted;)try{await o(null);let e=await t.matches({limit:10,wait:25,signal:n.signal});await Promise.all(e.map(s)),await r().pull(),i=1e3}catch(t){if(n.signal.aborted)break;console.error(`[board] couldn't pull matches from ${e.remote}:`,gf(t)),await new Promise(e=>setTimeout(e,i)),i=Math.min(i*2,6e4)}})()}let d=null,f=0;function p(){if(d)return d;if(!e.hasWork()||Date.now()-f<hf)return Promise.resolve();let t=_f(r().url());return!t&&typeof process<`u`&&process.env.VERCEL===`1`?Promise.resolve():(d=o(t).then(()=>{},t=>{d=null,f=Date.now(),console.error(`[board] couldn't register with ${e.remote}:`,gf(t))}),t||u(),d)}return{start:p,routes:[{method:`POST`,path:`/wake`,async handle(t){d??=Promise.resolve();let i=t.headers.get(`x-board-watchers`)!==await e.hash(),a=(async()=>(i&&await o(_f(r().url())),c()))();mf(a.catch(e=>console.error(`[board] couldn't run what woke it:`,gf(e))));let s,l=new Promise(e=>s=setTimeout(()=>e(null),2e3));try{let e=await Promise.race([a.catch(n),l]);return e===null?new Response(null,{status:202}):Ud({ran:e})}finally{clearTimeout(s)}}},{method:`POST`,path:`/watchers`,async handle(t,{caller:i}){if(i)return e.registerFor(i,t);d??=Promise.resolve();let a=_f(r().url()),s=await o(a).catch(n);return a||u(),Ud(s)}}],registerNow:()=>o(_f(r().url())),close:()=>{l?.abort(),l=null}}}const bf=(e,t)=>e<t?-1:+(e>t);function xf(e,t=[]){let n=Object.keys(e).sort(bf).map(t=>[t,e[t].tail,e[t].when]);return t.length>0&&n.push([`sync`,[...t].sort((e,t)=>bf(e.key,t.key)).map(e=>[e.key,e.platform,e.signIn])]),JSON.stringify(n)}const Sf=/^[A-Za-z][A-Za-z0-9-]{0,31}$/,Cf=/* @__PURE__ */ new Set([`identity`,`edit`,`delete`,`schedule`,`cancelSchedule`,`upload`,`uploadStart`,`uploadFinish`,`watchers`,`register`,`matches`,`ack`,`syncImport`,`syncReceipt`,`syncThread`,`syncFind`,`syncCopies`,`syncRoots`,`inboxPush`,`inboxNext`,`inboxAck`,`inbox`,`syncCode`,`syncAccount`,`syncUnlink`]);function wf(e){let t=e.replace(/[^A-Za-z0-9-]+/g,`-`).replace(/^-+|-+$/g,``);return/^[A-Za-z]/.test(t)||(t=`u-${t}`),t.slice(0,32).replace(/-+$/,``)}function Tf(e,t){let n=new Set([...t,`middleware`,`client`].map(e=>e.toLowerCase())),r=wf(e),i=r;for(let e=2;n.has(i.toLowerCase());e++)i=`${r.slice(0,31-String(e).length)}-${e}`;return i}function Ef(e){let{access:t}=e.principal;if(t.everywhere(`manage`))return null;let n=Object.entries(t.summary()).map(([e,t])=>`${e}=${t.join(`,`)}`);return n.length>0?n.join(`;`):`*=`}const Df=e=>((e instanceof Error?e.message:String(e))||`unknown error`).slice(0,500),Of=e=>{throw e instanceof yd?new Id(e.status>=400?e.status:502,e.code,e.message,{...e.hint===void 0?{}:{hint:e.hint},origin:e.origin}):e instanceof Id||e instanceof Error&&e.name===`AbortError`?e:new Id(502,`unreachable`,`the board didn't answer: ${Df(e)}`)};function kf(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))if(r!=null&&r!==!1){if(n===`label`&&Array.isArray(r))for(let[e,n]of r)t.append(`label`,n===null?e:`${e}=${n.join(`|`)}`);else if(Array.isArray(r))for(let e of r)t.append(n,String(e));else t.set(n,String(r))}let n=t.toString();return n?`?${n}`:``}function Af(e,t){let n=(t.headers.get(`content-disposition`)??``).match(/filename\*=UTF-8''([^;]+)/)?.[1],r=`file`;try{n&&(r=decodeURIComponent(n))}catch{}return{attachment:{id:e,name:r,type:t.headers.get(`content-type`)??`application/octet-stream`,size:Number(t.headers.get(`content-length`)??0)},data:t.body??/* @__PURE__ */ new Uint8Array}}function jf(e,t,n){if(e!==void 0&&!/^https?:\/\/[^/]/.test(e))throw Error(`http: ${e} isn't a URL: pass the board's, like https://board.example.com/api/board`);if(e===void 0&&!n)throw Error(`http: pass the board's URL: outside Node there's no environment to find it in`);let r=(e??n.url()).replace(/\/+$/,``),i=t.fetch??n?.fetch(r)??((e,t)=>globalThis.fetch(e,t)),a=null,o={},s=[],c=null,l=()=>c??=Md(xf(o,s)).then(e=>e.slice(0,32)),u=()=>{if(!a)throw Error(`http: this backend isn't serving a board yet: pass it to board({ backend })`);return a},d=(e,t)=>kd({url:r,fetch:i,profile:e===void 0?()=>n?.profile().profile??null:e,session:t||e===null?null:()=>n?.profile().session??null}),f=d(null,!0),p=/* @__PURE__ */ new Map;function m(e){if(!Sf.test(e))throw new Id(400,`invalid_request`,`as: ${e}: profiles start with a letter and use up to 32 letters, numbers, and hyphens`);let t=p.get(e);return t||p.set(e,t=d(e,!0)),t}let h=/* @__PURE__ */ new Map;function g(e){let t=JSON.stringify(e??(e===null?null:`\0`)),n=h.get(t);return n||h.set(t,n=d(e,!1)),n}function _(e){return e.origin.via?.kind===`engine`?f:e.origin.via?.kind===`client`?(e.self!==null&&m(e.self),g(`profile`in e?e.profile:e.self??void 0)):m(e.self??`client`)}let v=null,y=()=>(v??=i(r).then(async e=>{if(!e.ok)throw new Id(e.status>=400?e.status:502,`no_board`,`There's no board at ${r}: it answered ${e.status}.`,{origin:`handle`});return await e.json()},Of)).catch(e=>{throw v=null,e}),b=null,x=()=>b??=f.me().then(e=>e.principal).catch(e=>{throw b=null,e}),S=async e=>Fd(await x(),e);async function C(e,t,n,i){let a=_d[t],o={...n},s=a.path.replace(/:(\w+)/g,(e,t)=>{let n=o[t];return delete o[t],encodeURIComponent(String(n))}),c;if(t===`upload`){let{data:t,name:r,type:a}=n;if(t.byteLength>4194304){let n=await e.upload({data:t,name:r??`file`,...a?{type:a}:{}}).catch(Of);return Response.json({attachment:n})}c=await e.request(s,{method:`POST`,body:t,headers:{...a?{"content-type":a}:{},...r===null?{}:{"x-board-filename":encodeURIComponent(r)}},signal:i}).catch(Of)}else c=a.method===`GET`?await e.request(`${s}${kf(o)}`,{signal:i}).catch(Of):await e.request(s,{method:`POST`,body:new TextEncoder().encode(JSON.stringify(o)),headers:{"content-type":`application/json`},signal:i}).catch(Of);if(c.ok)return c;try{let e=await c.json();if(e.error?.message)throw new Id(c.status,e.error.code??`error`,e.error.message,typeof e.error.hint==`string`?{hint:e.error.hint}:{})}catch(e){if(e instanceof Id)throw e}throw new Id(502,`remote_error`,`${r} answered ${c.status}`)}async function w(e,t,n,a){if(e===`me`){let{principal:e,author:n,actor:r}=t;return{actor:r.id,principal:e.id,kind:r.kind,handle:r.handle,name:r.name,avatar:r.avatar,profile:n.profile,session:n.session,expiresAt:e.expiresAt?.toISOString()??null,can:e.access.summary()}}if(Cf.has(e))throw Bd(`this board's callers act as its project on ${r}, which can't tell them apart: ${e} is the project's own to do there`);let s=Ef(t),c=t.actor.avatar?.startsWith(`https://`)?t.actor.avatar:void 0,l=kd({url:r,fetch:i,profile:{name:Tf(t.actor.handle,Object.keys(o)),...c?{avatar:c}:{}},session:null,...s===null?{}:{headers:{"x-board-scope":s}}});(e===`post`||e===`posted`)&&typeof n.id==`string`&&(n={...n,id:await S(await Nd(`board-gateway`,t.principal.id,n.id)).catch(Of)});let u=await C(l,e,n,a);return e===`attachment`?Af(String(n.id),u):u.json()}async function T(e,t,n,r){let i=k();if(`identity`in t)return w(e,t.identity,n,r);let a=_(t);`self`in t&&t.origin.via?.kind===`engine`&&await i,(e===`post`||e===`posted`)&&`self`in t&&typeof n.id==`string`&&Pd.test(n.id)&&(n={...n,id:await S(n.id).catch(Of)});let o=await C(a,e,n,r);return e===`attachment`?Af(String(n.id),o):o.json()}let E={...Object.fromEntries(Jd.map(e=>[e,(t,n,r)=>T(e,t,n,r)])),async discovery(){return y()},async readSource(e,t,n){return`self`in e&&u().sync.some(e=>e.key===t.key)?u().readSource(t.key,t.target,t.limit??50):T(`readSource`,e,t,n)},async joinSource(e,t,n){return`self`in e&&u().sync.some(e=>e.key===t.key)?u().joinSource(t.key,t.target):T(`joinSource`,e,t,n)},async synced(e,t,n){let{targets:r}=await T(`synced`,e,t,n);return{targets:await Promise.all(r.map(async e=>({...e,url:e.url??(e.thread!==null&&e.message!==null?await u().linkOf(e.key,e.thread,e.message):null)})))}},async linked(e,t,n){let r=()=>new Id(404,`message_not_found`,`no message on this board for that link`),i=await(async()=>{for(let{platform:e,thread:r,message:i}of u().locate(t.url))for(let t of u().sync.filter(t=>t.platform===e)){let e=await f.syncFind({thread:`${t.key}:${r}`,...i===null?{}:{message:i}},{signal:n}).catch(Of),a=i===null?e.thread===null?null:(await f.syncThread(e.thread).catch(Of)).root:e.message;if(a!==null)return a}return null})();if(i===null)return T(`linked`,e,t,n);try{return await E.message(e,{id:i},n)}catch(e){throw e instanceof Id&&e.status===404?r():e}},async typing(e,t,n){let{targets:r}=await T(`typing`,e,t,n);if(!(`self`in e)||u().sync.length===0)return{targets:r};let{message:i,replies:a}=await E.message(e,{id:t.id},n),o=await u().typing([i,...a],t.status).catch(e=>(console.warn(`[board] skipped typing where this board syncs:`,Df(e)),[]));return{targets:[...r,...o]}}};async function D(e){let t=vf(e);return t&&(await y()).wake_by_path?t:{url:e}}let O=yf({remote:r,registry:{register:e=>f.register({...e,watch:o,...s.length>0?{sync:s}:{}}),matches:e=>f.matches(e),ack:(e,t)=>f.ack(e,t)},wakeAt:D,binding:u,hash:l,hasWork:()=>Object.keys(o).length>0||s.length>0,rethrow:Of,registerFor:async(e,t)=>Ud(await E.register(e,Ru.parse(await t.json()),t.signal))}),k=O.start;return{...E,routes:O.routes,keeps:!1,bind(e){if(a)throw Error(`http: this backend already serves a board: create one http() per board()`);for(let[t,n]of Object.entries(e.subscriptions)){if(n.kind===`sync`){t===`@sync`&&(s=e.sync.map(e=>({...e})));continue}if(!Sf.test(t))throw Error(`watch ${t}: ids start with a letter and use up to 32 letters, numbers, and hyphens`);pf(t,n),o[t]={tail:n.tail,when:n.when}}c=null,a=e},registerWatchers:O.registerNow,close:O.close}}function Mf(e,t={}){return jf(e,t,null)}const Nf=/```[\s\S]*?```/g,Pf=/`[^`\n]*`/g,Ff=`[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?`,If=RegExp(`(?<![\\w@.-])@(${Ff}(?:/${Ff})?)(?!:|[a-z0-9_/-]|\\.(?=[a-z0-9]))`,`gi`),Lf=/(?<![\w@.-])@\[([^\]\s]+)\]/g,Rf=e=>e.replace(Nf,e=>` `.repeat(e.length)).replace(Pf,e=>` `.repeat(e.length));function zf(e){let t=Rf(e),n=[];for(let e of t.matchAll(Lf)){let t=e[1];t!==void 0&&n.push({index:e.index,token:{kind:`actor`,actor:t},key:`actor:${t}`})}for(let e of t.replace(Lf,e=>` `.repeat(e.length)).matchAll(If)){let t=e[1]?.toLowerCase();t!==void 0&&n.push({index:e.index,token:{kind:`handle`,handle:t},key:`handle:${t}`})}let r=/* @__PURE__ */ new Set;return n.sort((e,t)=>e.index-t.index).filter(({key:e})=>!r.has(e)&&r.add(e)).map(({token:e})=>e)}function Bf(e,t){let n=Rf(e),r=[];for(let e of n.matchAll(Lf))r.push({index:e.index,length:e[0].length,token:{kind:`actor`,actor:e[1]}});for(let e of n.replace(Lf,e=>` `.repeat(e.length)).matchAll(If))r.push({index:e.index,length:e[0].length,token:{kind:`handle`,handle:e[1].toLowerCase()}});let i=``,a=0;for(let{index:n,length:o,token:s}of r.sort((e,t)=>e.index-t.index)){let r=e.slice(n,n+o);i+=e.slice(a,n)+(t(s,r)??r),a=n+o}return i+e.slice(a)}const Vf=[`read`,`post`,`react`,`label`,`sync`,`manage`],Hf={read:[],post:[],react:[`read`],label:[`read`],sync:[`read`],manage:[`read`,`post`,`react`,`label`,`sync`]},Uf=new Map(Vf.map((e,t)=>[e,t])),Wf=`write *, a channel, or a channel and its subtree (feedback/)`;function Gf(e){if(e===`*`)return{kind:`all`};if(e.includes(`*`)){let t=e.slice(0,e.indexOf(`*`)).replace(/\/+$/,``),n=t===``?`write * for every channel`:Yl.safeParse(t).success?`write ${t}/ for ${t} and its subtree`:Wf;throw Error(`invalid channel pattern ${e}: ${n}`)}let t=e.endsWith(`/`),n=t?e.slice(0,-1):e;if(!Yl.safeParse(n).success)throw Error(`invalid channel pattern ${e||`(empty)`}: ${Wf}`);return t?{kind:`subtree`,path:n}:{kind:`exact`,path:n}}const Kf=e=>e.kind===`all`?`*`:e.kind===`subtree`?`${e.path}/`:e.path;function qf(e){let t=/* @__PURE__ */ new Set,n=e=>{if(!Uf.has(e))throw Error(`unknown permission ${String(e)}: use ${Vf.join(`, `)}`);if(!t.has(e)){t.add(e);for(let t of Hf[e])n(t)}};for(let t of e===`all`?Vf:e)n(t);return t}const Jf=/* @__PURE__ */ new Set;function Yf(e){let t=null,n=/* @__PURE__ */ new Map,r=[];for(let[i,a]of e)i.kind===`all`?t=a:i.kind===`exact`?n.set(i.path,a):r.push([i.path,a]);return r.sort((e,t)=>t[0].length-e[0].length),{all:t,exact:n,subtrees:r}}const Xf=(e,t)=>e===t||e.startsWith(`${t}/`);function Zf(e,t,n=!1){if(!n){let n=e.exact.get(t);if(n)return n}for(let[n,r]of e.subtrees)if(Xf(t,n))return r;return e.all??Jf}const Qf=(e,t)=>t.kind===`all`?e.all??Jf:Zf(e,t.path,t.kind===`subtree`),$f=(e,t)=>e.size===t.size&&[...e].every(e=>t.has(e));function ep(e,t){if(t.kind===`exact`)return Zf(e,t.path,!0);if(t.kind===`subtree`){for(let[n,r]of e.subtrees)if(n!==t.path&&Xf(t.path,n))return r}return e.all??Jf}function tp(e){let t=Yf(e);return Yf(e.filter(([e,n])=>e.kind===`all`?n.size>0:!$f(n,ep(t,e))))}function np(e){return e===`all`||Array.isArray(e)?[[{kind:`all`},qf(e)]]:Object.entries(e).map(([e,t])=>[Gf(e),qf(t)])}const rp=e=>[...e.all?[[{kind:`all`},e.all]]:[],...e.subtrees.map(([e,t])=>[{kind:`subtree`,path:e},t]),...[...e.exact].map(([e,t])=>[{kind:`exact`,path:e},t])],ip=Symbol(`board.access`),ap=e=>typeof e==`object`&&ip in e;function op(e){let t=rp(e),n=n=>(e.all?.has(n)??!1)&&t.every(([,e])=>e.has(n)),r=/* @__PURE__ */ new Map;return{[ip]:e,can:(t,n)=>Zf(e,n).has(t),readable(t){let n=r.get(t);return n===void 0&&r.set(t,n=Zf(e,t).has(`read`)),n},readsAll:n(`read`),everywhere:n,anywhere:e=>t.some(([,t])=>t.has(e)),narrow(n){let r=ap(n)?n[ip]:tp(np(n)),i=/* @__PURE__ */ new Map([[`*`,{kind:`all`}]]);for(let[e]of[...t,...rp(r)])i.set(Kf(e),e);return op(tp([...i.values()].map(t=>{let n=Qf(r,t);return[t,new Set([...Qf(e,t)].filter(e=>n.has(e)))]})))},summary(){let e=t.map(([e,t])=>[Kf(e),t]);e.sort(([e],[t])=>e===`*`?-1:t===`*`?1:e.localeCompare(t));let n={};for(let[t,r]of e)n[t]=[...r].sort((e,t)=>Uf.get(e)-Uf.get(t));return n}}}function sp(e){return op(tp(np(e)))}const cp=sp(`all`);function lp(e){if(e.length>4e3)throw Error(`x-board-scope is longer than 4000 characters`);let t={},n=e.split(`;`).map(e=>e.trim());if(n.every(e=>e===``))throw Error(`x-board-scope is empty: write pattern=permissions, like dev/=read,post`);for(let e of n){if(e===``)continue;let n=e.indexOf(`=`);if(n<0)throw Error(`x-board-scope entry ${e} needs =: write pattern=permissions, like dev/=read,post`);let r=e.slice(0,n).trim(),i=e.slice(n+1).trim();if(Object.hasOwn(t,r))throw Error(`x-board-scope lists ${r} twice`);Gf(r);let a=i===``?[]:i.split(`,`).map(e=>e.trim());if(a.length===1&&a[0]===`all`){t[r]=`all`;continue}for(let e of a)if(!Uf.has(e))throw Error(`x-board-scope: unknown permission ${e||`(empty)`}: use ${Vf.join(`, `)}, or all`);t[r]=a}return t}const up=[`claude`,`codex`,`grok`,`pi`],dp=/^[A-Za-z][A-Za-z0-9-]{0,31}$/,fp=/^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/;function pp(e){let t=e.get(`x-board-profile`)?.trim()||null;if(t!==null&&!dp.test(t))throw Rd(`profile names start with a letter and use up to 32 letters, numbers, and hyphens`);let n=e.get(`x-board-avatar`)?.trim()||null;if(n!==null&&!hp(n))throw Rd(`avatars must be https URLs (http only on localhost)`);let r=e.get(`x-board-session`)?.trim().slice(0,200)||null,i=e.get(`x-board-handle`)?.trim().toLowerCase()||null;if(i!==null&&!fp.test(i))throw Rd(`invalid handle: ${i}`);let a=e.get(`x-board-name`),o=null;if(a)try{o=decodeURIComponent(a).replace(/[\u0000-\u001f\u007f]/g,``).trim().slice(0,128)||null}catch{throw Rd(`x-board-name must be URI-encoded`)}let s=e.get(`x-board-scope`);if(s!==null)try{lp(s)}catch(e){throw Rd(e.message,`invalid_scope`)}return{profile:t,avatar:n,session:r,handle:i,name:o,scope:s}}function mp(e,t,n){let r=e.kind===`person`&&e.facts?.issuer!==`host`&&t.handle?t.handle:e.handle,i=e.kind===`person`?t.name:null,a=t.profile?.toLowerCase()??null,o=a===null?e.id:`${e.id}+${a}`,s=a!==null&&up.includes(a),c={id:o,kind:a===null?e.kind:`agent`,handle:a===null?r:`${r}/${a}`,name:t.profile??i??r,avatar:t.avatar??(s?`${n}/avatars/${a}`:null)};return{author:{actor:o,principal:e.id,profile:a,session:t.session},actor:c}}function hp(e){try{let t=new URL(e);return t.protocol===`https:`||t.protocol===`http:`&&[`localhost`,`127.0.0.1`].includes(t.hostname)}catch{return!1}}const gp=e=>Bd(`this token can't use this board: add ${e} to access`),_p=e=>{let t=new URL(e);return`${t.host}${t.pathname.replace(/\/+$/,``)}`.replace(/[%:]/g,e=>e===`%`?`%25`:`%3A`)};function vp(e){let t=/* @__PURE__ */ new Map;for(let n of e){let e=_p(n),r=t.get(e);if(r!==void 0&&r!==n)throw Error(`access: oidc issuers ${r} and ${n} name the same principals, oidc:${e}:<sub>: pin one of them`);t.set(e,n)}return new Set(e)}const yp=e=>[...new Set(e.flatMap(e=>typeof e!=`function`&&e.issuer===`oidc`?[e.url]:[]))];function bp(e){let t=typeof e.access==`function`?[]:e.access,n=typeof e.access==`function`?e.access:null,r=vp(yp(t));async function i(n,i){if(i?.issuer===`host`)throw Bd(`this token can't use this board: its board no longer takes a host's principals`);if(i?.issuer===`oidc`&&!r.has(i.iss))throw zd(`untrusted issuer: ${i.iss}`);let a=i?.claims??{},o=i?.issuer===`vercel`?await e.project():null,s=o?{teamId:i.team??o.teamId,projectId:o.id}:{teamId:null,projectId:null},c=String(a.environment??``),l=xp(),u=o!==null&&o.id!==null&&a.project_id===o.id,d=u&&l!==null&&c===l;for(let e of t){if(typeof e==`function`){if(d)continue;let t=await e(n);if(t===void 0)continue;if(t===null)throw Bd(`this token can't use this board`);return sp(t)}if(i&&e.issuer===i.issuer&&(e.issuer!==`oidc`||e.url===i.iss)&&e.matches(a,s))return e.access}if(d)return cp;throw i?i.issuer===`oidc`?gp(`oidc({ issuer: '${i.iss}', claims, can })`):i.issuer===`github`?gp(`githubActions({ repository: '${String(a.repository)}', can })`):u?Bd(`this token can't use this board: it runs in ${l??`no Vercel environment`}, so its ${c||`unnamed`} deployments need vercelProject({ project: 'self', environments: ['${c}'], can })`):gp(`vercelProject({ project: '${String(a.project??``)||String(a.project_id)}', can })`):Bd(`this token can't use this board`)}async function a(t){let r=cp,a=t.facts?.issuer===`host`;if(t.id.startsWith(`board:`)||t.kind===`external`&&!a)r=cp;else{if(a){if(!e.hosts)throw Bd(`this token can't use this board: its board no longer takes a host's principals`);let{exp:n}=t.facts.claims;if(typeof n==`number`&&n*1e3<=Date.now())throw zd(`token expired`)}if(n){let e=await n(t);if(e==null)throw Bd(`this token can't use this board`);r=sp(e)}else t.kind!==`person`&&(r=await i(t,(a?void 0:t.facts)??Sp(t.id)))}return t.scope===void 0?r:r.narrow(lp(t.scope))}async function o(e){try{return await a(e)}catch(e){let t=e.status;if(t===401||t===403)return null;throw e}}return{grant:a,accessNow:o}}const xp=()=>process.env.VERCEL_TARGET_ENV||process.env.VERCEL_ENV||null;function Sp(e){let t=e.match(/^vercel:project:([^:]+):([^:]+)$/);return t?{issuer:`vercel`,iss:``,claims:{project_id:t[1],environment:t[2]}}:null}const Cp=Symbol(`board.oidcTokens`),wp=/* @__PURE__ */ new WeakSet,Tp=e=>Cp in e,Ep=e=>wp.has(e),Dp=/^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*:[^\s+\]]{1,200}$/,Op=[`person`,`deployment`,`workflow`,`external`];function kp(e){let t=e=>{throw TypeError(`authenticate returned an invalid principal: ${e}`)};(typeof e!=`object`||!e)&&t(`not an object`),(typeof e.id!=`string`||!Dp.test(e.id)||e.id.startsWith(`board:`))&&t(`id must look like \`vercel:user:<id>\`, got ${JSON.stringify(e.id)}`),Op.includes(e.kind)||t(`kind must be one of ${Op.join(`, `)}`),(typeof e.handle!=`string`||!/^\S{1,64}$/.test(e.handle))&&t(`handle must be 1-64 characters, no spaces`);let n=e.expiresAt??null;if(n!==null&&(!(n instanceof Date)||Number.isNaN(n.getTime()))&&t(`expiresAt must be a Date or null`),n!==null&&n.getTime()<=Date.now())throw zd(`token expired`);let r=n===null?{}:{exp:Math.floor(n.getTime()/1e3)};return{id:e.id,kind:e.kind,handle:e.handle,expiresAt:n,facts:{issuer:`host`,iss:``,claims:r}}}function Ap(e,t,n){let r=t||e.access!==void 0,i=e.access??[],a=null,o=()=>(a??=(async()=>{if(!n)return{id:e.project?.id??null,teamId:e.project?.teamId??null};let t=await n(),[r,i]=await Promise.all([t.ownProjectId(e.project),t.ownTeamId(e.project)]);return{id:r,teamId:i}})()).catch(e=>{throw a=null,e});async function s(t){return n?(await n()).discoveryIdentity(t,e.project):{projectId:e.project?.id??null,teamId:e.project?.teamId??null}}let c=null,l=()=>e.authenticate?Promise.resolve(e.authenticate):c??=n?n().then(e=>e.oidcTokens()):Promise.reject(new Id(501,`no_verifier`,`this build of board verifies no tokens: pass board({ authenticate })`)),u=bp({access:i,project:o,hosts:e.authenticate!==void 0&&!Tp(e.authenticate)}),d={project:o,issuers:typeof i==`function`?[]:yp(i)},f=/* @__PURE__ */ new Map,p=/* @__PURE__ */ new WeakMap;async function m(e){let t=e=>e.expiresAt===null||e.expiresAt.getTime()>Date.now(),n=p.get(e);if(n){let e=await n;if(t(e))return e}let r=e.credential===null?null:[e.audience,e.credential,e.headers.get(`x-vercel-oidc-token`)??``].join(``),i=r===null?void 0:f.get(r);if(i&&i.until>Date.now())return p.set(e,i.principal),i.principal;let a=h(e);return p.set(e,a),r!==null&&a.then(e=>{e.facts?.issuer!==`host`&&e.expiresAt!==null&&(f.size>=1e3&&f.delete(f.keys().next().value),f.set(r,{principal:a,until:e.expiresAt.getTime()}))},()=>p.delete(e)),a}async function h(e){let t=await l(),n;try{n=await t({...e,board:d})}catch(e){throw e instanceof Response?new Ld(e):e}if(n instanceof Response)throw new Ld(n);if(n==null)throw zd(`missing bearer token`);return Ep(n)?n:kp(n)}return{open:r,project:o,discoveryIdentity:s,async identify(e){let t=await m(e),n=e.claims.scope===null?t:{...t,scope:e.claims.scope},{author:r,actor:i}=mp(n,e.claims,e.audience);return{principal:{...n,access:await u.grant(n)},author:r,actor:i}},accessNow:e=>u.accessNow(e)}}const jp={claude:`m4.7144 15.9555 4.7174-2.6471.079-.2307-.079-.1275h-.2307l-.7893-.0486-2.6956-.0729-2.3375-.0971-2.2646-.1214-.5707-.1215-.5343-.7042.0546-.3522.4797-.3218.686.0608 1.5179.1032 2.2767.1578 1.6514.0972 2.4468.255h.3886l.0546-.1579-.1336-.0971-.1032-.0972L6.973 9.8356l-2.55-1.6879-1.3356-.9714-.7225-.4918-.3643-.4614-.1578-1.0078.6557-.7225.8803.0607.2246.0607.8925.686 1.9064 1.4754 2.4893 1.8336.3643.3035.1457-.1032.0182-.0728-.164-.2733-1.3539-2.4467-1.445-2.4893-.6435-1.032-.17-.6194c-.0607-.255-.1032-.4674-.1032-.7285L6.287.1335 6.6997 0l.9957.1336.419.3642.6192 1.4147 1.0018 2.2282 1.5543 3.0296.4553.8985.2429.8318.091.255h.1579v-.1457l.1275-1.706.2368-2.0947.2307-2.6957.0789-.7589.3764-.9107.7468-.4918.5828.2793.4797.686-.0668.4433-.2853 1.8517-.5586 2.9021-.3643 1.9429h.2125l.2429-.2429.9835-1.3053 1.6514-2.0643.7286-.8196.85-.9046.5464-.4311h1.0321l.759 1.1293-.34 1.1657-1.0625 1.3478-.8804 1.1414-1.2628 1.7-.7893 1.36.0729.1093.1882-.0183 2.8535-.607 1.5421-.2794 1.8396-.3157.8318.3886.091.3946-.3278.8075-1.967.4857-2.3072.4614-3.4364.8136-.0425.0304.0486.0607 1.5482.1457.6618.0364h1.621l3.0175.2247.7892.522.4736.6376-.079.4857-1.2142.6193-1.6393-.3886-3.825-.9107-1.3113-.3279h-.1822v.1093l1.0929 1.0686 2.0035 1.8092 2.5075 2.3314.1275.5768-.3218.4554-.34-.0486-2.2039-1.6575-.85-.7468-1.9246-1.621h-.1275v.17l.4432.6496 2.3436 3.5214.1214 1.0807-.17.3521-.6071.2125-.6679-.1214-1.3721-1.9246L14.38 17.959l-1.1414-1.9428-.1397.079-.674 7.2552-.3156.3703-.7286.2793-.6071-.4614-.3218-.7468.3218-1.4753.3886-1.9246.3157-1.53.2853-1.9004.17-.6314-.0121-.0425-.1397.0182-1.4328 1.9672-2.1796 2.9446-1.7243 1.8456-.4128.164-.7164-.3704.0667-.6618.4008-.5889 2.386-3.0357 1.4389-1.882.929-1.0868-.0062-.1579h-.0546l-6.3385 4.1164-1.1293.1457-.4857-.4554.0608-.7467.2307-.2429 1.9064-1.3114Z`,openai:`M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z`,x:`M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z`,slack:`M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zM6.313 15.165a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zM8.834 6.313a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zM18.956 8.834a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zM17.688 8.834a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zM15.165 18.956a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zM15.165 17.688a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z`,github:`M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12`,whatsapp:`M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z`},Mp={claude:{background:`#D97757`,mark:{path:jp.claude}},codex:{background:`#000000`,mark:{path:jp.openai}},grok:{background:`#000000`,mark:{path:jp.x}},pi:{background:`#1f1f1f`,mark:{glyph:`π`}}};function Np(e){let t=Mp[e]??{background:`#666666`,mark:{glyph:e.slice(0,1).toUpperCase()}},n=`path`in t.mark?`<path transform="translate(30 30) scale(2.8333)" fill="#ffffff" d="${t.mark.path}"/>`:`<text x="64" y="86" font-family="ui-sans-serif,system-ui,sans-serif" font-size="66" font-weight="600" text-anchor="middle" fill="#ffffff">${t.mark.glyph}</text>`;return`<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128"><rect width="128" height="128" rx="28" fill="${t.background}"/>${n}</svg>`}var Pp=class extends Id{responses;constructor(e){super(422,`dropped`,e.join(`
|
|
346
346
|
`)||`the board dropped this message`),this.responses=e}};const Fp=q({text:K().max(ql).optional(),labels:ru.optional()}).strict();async function Ip(e,t,n){let r=[],i=null,a=async(o,s)=>{if(o===e.length){if(s.text.trim()===``&&(s.kind===`edit`||s.attachments.length===0))return;i={value:await n(s)};return}let c=null;await e[o]({write:Object.freeze({...s}),author:Object.freeze({...t.author}),source:Object.freeze({...t.source}),board:t.board(),respond:async e=>{r.push(e)},next:(e={})=>{if(c)throw Error(`next() was already called`);let{text:t,labels:n}=Fp.parse(e);return c=a(o+1,{...s,...t===void 0?{}:{text:t},...s.kind===`post`&&n?{labels:{...s.labels,...n}}:{}}),c}}),c&&await c};if(await a(0,t.write),!i)throw new Pp(r);return i.value}const Lp=e=>typeof e==`string`?{target:e,kind:vu(e)?`thread`:`channel`}:e,Rp=e=>zf(e).some(e=>e.kind===`actor`&&e.actor.includes(`@`));async function zp(e,t){let n=zf(e).flatMap(e=>e.kind===`actor`&&e.actor.includes(`@`)?[e.actor]:[]);if(n.length===0)return{text:e,found:[]};let r=/* @__PURE__ */ new Map;for(let e of n)r.set(e,await t?.(e).catch(()=>null)??null);return{text:Bf(e,e=>{if(e.kind!==`actor`||!r.has(e.actor))return null;let t=r.get(e.actor);return t?`@[${t.id}]`:e.actor}),found:[...r.values()].filter(e=>e!==null)}}const Bp=/* @__PURE__ */ new Set([`post`,`schedule`,`upload`,`uploadFinish`]),Vp=/^(image\/(png|jpeg|gif|webp|avif)|video\/(mp4|webm)|text\/plain)$/;function Hp({attachment:e,data:t}){let n=Vp.test(e.type)?`inline`:`attachment`,r=t instanceof Uint8Array?new Blob([t]):t;return new Response(r,{headers:{"content-type":e.type,"content-length":String(e.size),"content-disposition":`${n}; filename*=UTF-8''${encodeURIComponent(e.name)}`,"content-security-policy":`sandbox; default-src 'none'`,"x-content-type-options":`nosniff`,"cache-control":`private, max-age=31536000, immutable`}})}async function Up(e,t,n,r){let i=r.id??``,a=r.key??``,o=()=>$d(t);switch(e){case`discovery`:case`me`:case`channels`:case`actors`:case`identity`:case`watchers`:return{};case`message`:case`posted`:case`synced`:case`delete`:case`cancelSchedule`:case`attachment`:case`uploadFinish`:return{id:i};case`messages`:return Du.parse(Qd(n));case`threads`:return Ou.parse(Qd(n));case`schedules`:return Pu.parse(Qd(n));case`matches`:return zu.parse(Qd(n));case`events`:{let e=ku.parse(Qd(n)),r=t.headers.get(`last-event-id`);return e.after===void 0&&r&&xu.safeParse(r).success&&(e.after=r),e}case`post`:return Au.parse(await o());case`schedule`:return Nu.parse(await o());case`register`:return Ru.parse(await o());case`edit`:return{id:i,...fd.parse(await o())};case`react`:return{id:i,...hd.parse(await o())};case`label`:return{id:i,...gd.parse(await o())};case`ack`:return{id:i,...Bu.parse(await o())};case`upload`:{let e=t.headers.get(`x-board-filename`),n=null;try{n=e===null?null:decodeURIComponent(e)}catch{throw Rd("`x-board-filename` is not URI-encoded")}return{data:await tf(t,Oe),name:n,type:t.headers.get(`content-type`)}}case`uploadStart`:return dd.parse(await o());case`syncImport`:return Qu.parse(await o());case`syncReceipt`:return ed.parse(await o());case`syncThread`:return{thread:r.thread??``};case`syncFind`:return td.parse(Qd(n));case`syncCopies`:return nd.parse(Qd(n));case`syncRoots`:return rd.parse(Qd(n));case`inboxPush`:return{key:a,...id.parse(await o())};case`inboxNext`:return{key:a,...ad.parse(Qd(n))};case`inboxAck`:return{key:a,id:i,...od.parse(await o())};case`inbox`:return{key:a,...Iu.parse(Qd(n))};case`syncCode`:return sd.parse(await o());case`syncAccount`:return cd.parse(await o());case`syncUnlink`:return ud.parse(await o());case`typing`:return{id:i,...md.parse(await o())??{}};case`readSource`:return{key:a,...Vu.parse(Qd(n))};case`joinSource`:return{key:a,...Hu.parse(await o())};case`linked`:return Uu.parse(Qd(n))}}const Wp=e=>({id:e.id,kind:`external`,handle:e.handle,name:e.name,avatar:e.avatar});function Gp(e){let t=e.origin.via;return t?.kind===`middleware`||t?.kind===`engine`?null:t??{kind:`api`}}const Kp={self:`middleware`,origin:{via:{kind:`middleware`}}},qp={self:null,origin:{via:{kind:`client`,name:null}}};async function Jp(e){let{options:t,backend:n,runtime:r,policy:i}=e,a=t.sync??{},o=Object.keys(a).length>0?(await r.sync()).createSyncEngine(a):null,s=t.streamMaxMs??28e4,c=Zd(n.routes,t.basePath),{state:l,ownUrl:u,clientAs:d,handleOf:f}=e,p=t.watch??{},m=t.middleware??[];function h(e,t){return{credential:(e.headers.get(`authorization`)??``).match(/^Bearer\s+(.+)$/i)?.[1]??null,claims:pp(e.headers),audience:t,headers:e.headers}}async function g(e){return{identity:await i.identify(e),origin:{via:{kind:`api`}}}}let _=()=>new Id(404,`not_found`,`${u()??`this board`} answers only wake-ups and webhooks`);async function v(e){return(await zp(e,o?async e=>{let t=await o.findByEmail(e);return t&&await n.syncImport(o.caller,{op:`seen`,author:{...t,isBot:!1}},new AbortController().signal),t}:void 0)).text}async function y(e){if(typeof e!=`string`)return e;let t=e.indexOf(`:`);if(t<=0)throw Rd(`sync targets look like <key>:<channel or thread>, got: ${e}`);let n=e.slice(0,t);if(o&&a[n])return o.normalizeTarget(e);if(o)throw Rd(`no sync entry named ${n}`);return Lp(e)}let b=e=>`identity`in e?e.identity.principal.access:null;async function x(e,t,n){let r=b(e);if(r===null)return{access:null,channel:t.channel??``};let i=t.channel??(t.re===void 0?void 0:(await P(e,t.re,n))?.channel);return i===void 0?null:r.can(`post`,i)?{access:r,channel:i}:null}let S=/* @__PURE__ */ new Map;async function C(e,t){if(`identity`in e)return{principal:e.identity.principal.id,actor:e.identity.actor};let r=JSON.stringify([e.origin.via?.kind??``,e.self,e.profile??null]),i=S.get(r);return i||(S.set(r,i=n.me(e,{},t).then(e=>({principal:e.principal,actor:{id:e.actor,kind:e.kind,handle:e.handle,name:e.name,avatar:e.avatar}}))),i.catch(()=>S.delete(r))),i}let w=null,T=(e,t,n,r)=>Ip(m,{write:e,author:t,source:n,board:()=>w??=f(Kp,null)},r);async function E(e){try{return await e(),!0}catch(e){if(e instanceof Id&&e.status===404)return!1;throw e}}async function D(e,t,r){let i=[];for(let a of new Set(t??[])){let{attachment:t,data:o}=await n.attachment(e,{id:a},r);o instanceof ReadableStream&&await o.cancel().catch(()=>{}),i.push(t)}return i}async function O(e,t,r,i){let a=Gp(e);if(m.length===0||a===null||t.id!==void 0&&await E(()=>n.posted(e,{id:t.id},r)))return i(t);let o=t.channel,s=null;if(t.re!==void 0){let n=await P(e,t.re,r);if(!n)return i(t);o=n.channel,s=n.re??n.id}let c=b(e),l=Object.keys(t.labels??{}).length>0,u=t.re===void 0&&(t.sync?.length??0)>0;if(o===void 0||c&&(!c.can(`post`,o)||l&&!c.can(`label`,o)||u&&!c.can(`sync`,o)))return i(t);let d=await D(e,t.attachments,r),{actor:f}=await C(e,r);return T({kind:`post`,channel:o,re:s,text:t.text,labels:t.labels??{},attachments:d},f,a,e=>i({...t,text:e.text,labels:e.labels}))}async function k(e,t,n){let r=b(e),i=await P(e,t,n),a=i??(r===null?null:await P(qp,t,n));return!a||a.deleted||r&&!r.can(`post`,a.channel)||!i&&!a.blind?null:a.by.principal===(await C(e,n)).principal?a:null}async function A(e,t,n,r){let i=Gp(e);if(m.length===0||i===null)return r(t);let a=await k(e,t.id,n);if(!a)return r(t);let{actor:o}=await C(e,n);return T({kind:`edit`,id:a.id,channel:a.channel,re:a.re,text:t.text},o,i,e=>r({...t,text:e.text}))}async function j(e,t,r,i){let o=t.source?.key??t.from;if(t.source&&!(`identity`in e?(await n.watchers(e,{},i)).watchers.some(t=>t.owner===e.identity.principal.id&&t.sync.some(e=>e.key===o)):a[t.source.key]!==void 0))return null;let s=(t.op===`post`?t.origin:null)??r?.origin??null;return{kind:`sync`,key:o??``,platform:t.author.id.slice(0,Math.max(0,t.author.id.indexOf(`:`))),channel:t.source?.channel??r?.origin?.channel??s?.channel??``,thread:t.source?.thread??(s?s.subthread??s.thread:``)}}async function M(e,t,r){let i=t.message??null;if(t.origin!==void 0){let{thread:a,message:o}=await n.syncFind(e,{thread:t.origin.thread,...t.origin.message===void 0?{}:{message:t.origin.message}},r);i=t.origin.message===void 0?a===null?null:(await n.syncThread(e,{thread:a},r)).root:o}return i===null?null:P(e,i,r)}async function N(e,t,r){let i=t=>n.syncImport(e,t,r);if(m.length===0||e.origin.via?.kind===`middleware`||t.op!==`post`&&t.op!==`edit`)return i(t);let a=b(e);if(a&&(!a.anywhere(`sync`)||`identity`in e&&e.identity.principal.scope!==void 0))return i(t);let o=async e=>{try{return await e()}catch(e){if(!(e instanceof Pp))throw e;return{message:null,dropped:[...e.responses]}}};if(t.op===`post`){if(t.id!==void 0&&(await n.syncFind(e,{post:t.id},r)).message!==null)return i(t);let s=t.channel,c=null;if(t.re!==void 0){let n=await P(e,t.re,r);if(!n)return i(t);s=n.channel,c=n.re??n.id}if(s===void 0||a&&!a.can(`sync`,s))return i(t);let l=await j(e,t,null,r);if(!l)return i(t);let u=await D(e,t.attachments,r);return o(async()=>T({kind:`post`,channel:s,re:c,text:t.text,labels:t.labels??{},attachments:u},Wp(t.author),l,async e=>i({...t,text:e.text,labels:e.labels})))}if(t.origin===void 0==(t.message===void 0))return i(t);let s=await M(e,t,r);if(!s||s.deleted||a&&!a.can(`sync`,s.channel)||t.message!==void 0&&s.by.principal!==t.author.id)return i(t);let c=await j(e,t,s,r);return c?o(async()=>T({kind:`edit`,id:s.id,channel:s.channel,re:s.re,text:t.text},Wp(t.author),c,async e=>i({...t,text:e.text}))):i(t)}async function P(e,t,r){try{let{message:i,replies:a}=await n.message(e,{id:t},r);return[i,...a].find(e=>e.id===t)??null}catch(e){if(e instanceof Id&&e.status===404)return null;throw e}}async function F(e,t,r){let i=(e,t)=>O(e,t,r,t=>n.post(e,t,r));if(!o)return i(e,t.sync?.length?{...t,sync:await Promise.all(t.sync.map(y))}:t);let a=(t.sync?.length??0)>0||Rp(t.text)?await x(e,t,r):null;if(!a)return i(e,t);let{access:s,channel:c}=a,l=t.re===void 0&&(t.sync?.length??0)>0&&(s===null||s.can(`sync`,c))?{...t,sync:await Promise.all(t.sync.map(y))}:t,u=await v(l.text),d=await i(e,{...l,text:u});return u!==t.text&&s!==null&&!s.readable(d.message.channel)?{...d,message:{...d.message,text:t.text}}:d}async function I(e,t){if(!t.dropped)return t.message;for(let n of t.dropped)await e.platform.respond(n);throw new Pp(t.dropped)}async function L(e,t,n,r){let i=o.caller,{author:a,key:s}=t.platform,{via:c}=t.origin,l={key:s,channel:c.channel,thread:c.thread},u=async e=>{if(await I(t,await N(i,e,r))===null)throw Vd(`message not found: #${e.message}`,`message_not_found`);return{ok:!0}};switch(e){case`post`:return R(t,n,r);case`edit`:{let{id:e,text:t}=n;return u({op:`edit`,author:a,from:null,message:e,text:await v(t),source:l})}case`delete`:return u({op:`delete`,author:a,from:null,message:n.id});case`react`:{let{id:e,emoji:t,remove:r}=n;return u({op:`react`,author:a,from:null,message:e,emoji:t,...r===void 0?{}:{remove:r}})}case`label`:{let{id:e,set:t,unset:r}=n;return u({op:`labels`,author:a,from:null,message:e,...t?{set:t}:{},...r?{unset:r}:{}})}default:return z(e,i,n,r)}}async function R(e,t,r){let i=o.caller,{author:a,key:s}=e.platform,{via:c}=e.origin,l=async e=>{let t=await P(i,e,r);if(!t)throw Vd(`message not found: #${e}`,`message_not_found`);return t};if(t.id!==void 0){let e=(await n.syncFind(i,{post:t.id},r)).message;if(e!==null)return{message:await l(e)}}let u=await Promise.all((t.sync??[]).map(y)),d=await I(e,await N(i,{op:`post`,author:a,from:null,origin:null,source:{key:s,channel:c.channel,thread:c.thread},...t.channel===void 0?{re:t.re}:{channel:t.channel},text:await v(t.text),...t.labels?{labels:t.labels}:{},...t.noSync?{noSync:!0}:{},...t.attachments?.length?{attachments:t.attachments}:{},...t.id===void 0?{}:{id:t.id}},r));for(let e of u)await n.syncReceipt(i,{kind:`thread`,message:d,target:e.target,targetKind:e.kind,cause:`request`},r);return{message:await l(d)}}async function z(e,t,r,i){switch(e){case`post`:return F(t,r,i);case`edit`:{let{id:e,text:a}=r,s=e=>A(t,e,i,e=>n.edit(t,e,i));return!o||!Rp(a)||!await x(t,{re:e},i)?s({id:e,text:a}):s({id:e,text:await v(a)})}case`syncImport`:return N(t,r,i);case`schedule`:{let e=r,a=o&&Rp(e.text)?await x(t,e,i):null;if(!a)return n.schedule(t,e,i);let s=await v(e.text),c=await n.schedule(t,{...e,text:s},i),{access:l}=a;return s!==e.text&&l!==null&&!l.readable(c.schedule.channel)?{...c,schedule:{...c.schedule,text:e.text}}:c}case`inbox`:{let e=r;if(o&&a[e.key]&&e.channel!==void 0){let r=b(t);if(r===null||r.anywhere(`sync`))return n.inbox(t,{...e,channel:await o.inboxChannel(e.key,e.channel)},i)}return n.inbox(t,e,i)}default:{let a=n[e];if(typeof a!=`function`)throw Vd(`no route: ${e}`);return a.call(n,t,r,i)}}}async function ee(e,t,r){let{sync:i,code:s}=ld.parse(Qd(t));if(!o||!a[i])throw Vd(`no sync entry named ${i}`);let c=(e,t)=>new Response(`${t}\n`,{status:e,headers:{"content-type":`text/plain; charset=utf-8`}}),{holder:l}=await n.syncFind(o.caller,{code:s},r);if(l===null)return c(404,"That link has expired or been used. Run `vb identity link` again for a new one.");if(e===`signIn`){let e=u(),t=await o.signIn(i,l,e?`${e}/identity/signed-in?${new URLSearchParams({sync:i,code:s})}`:void 0);return new Response(null,{status:302,headers:{location:t}})}let d=await o.redeemSignIn(i,l,s);return d?c(200,`Linked ${d.handle?`@${d.handle}`:d.actor}. You can close this tab.`):c(409,`${a[i].platform} hasn't said you approved yet: finish signing in, then open this page again.`)}async function te(e,t,r,i,a){let s=r.signal;switch(e){case`sync`:{let e=Fu.parse(await $d(r)),i=a.id??``,c=b(t);if(c&&o){let e=await P(t,i,s);if(!e)throw Vd(`message not found: #${i}`,`message_not_found`);if(!c.can(`sync`,e.channel))throw Bd(`this token can't sync in ${e.channel}`)}let l=await y(e.target),{attached:u}=await n.syncReceipt(t,{kind:`thread`,message:i,target:l.target,targetKind:l.kind,cause:`request`},s);return Ud({target:l.target,attached:u??!0})}case`identityUnlink`:{let e=Wu.parse(await $d(r)),{links:i}=await n.identity(t,{},s),a=e.actor.replace(/^@/,``).toLowerCase(),o=i.filter(t=>t.actor===e.actor||t.handle?.toLowerCase()===a).map(e=>e.actor);if(o.length===0)throw Vd(`${e.actor} isn't linked to you`,`not_linked`);if(o.length>1)throw Rd(`${e.actor} names several of your accounts: use ${o.join(` or `)}`,`ambiguous_actor`);return await n.syncUnlink(t,{account:o[0]},s),Ud({ok:!0,actor:o[0]})}default:throw Vd(`no route: ${r.method} ${i.pathname}`)}}let ne=Object.fromEntries(Jd.map(e=>[e,e===`syncImport`?N:(t,r,i)=>n[e].call(n,t,r,i)]));o?.bind({backend:ne,client:(e,t)=>d({platform:{author:e.author,key:e.key,respond:e.respond},origin:{via:e.via}},t)});async function re(e,t,r,i){let a=await n.events(e,{...t,wait:0},r.signal),o=new TextEncoder,c=new AbortController,l=Date.now()+s,u=AbortSignal.any([r.signal,c.signal,AbortSignal.timeout(s)]),d=new ReadableStream({async start(r){let s=e=>{try{r.enqueue(o.encode(e))}catch{}},c=setInterval(()=>s(`: ping
|
|
347
347
|
|
|
348
348
|
`),15e3);try{s(`: connected
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { i as fileSize, n as DIRECT_UPLOAD_BYTES_MAX } from "./files-SniSmeEr.mjs";
|
|
2
2
|
import { a as AttachmentId } from "./schemas-Be08nyfW.mjs";
|
|
3
|
-
import { d as VERSION, i as withMentions } from "./watchers-hash-
|
|
3
|
+
import { d as VERSION, i as withMentions } from "./watchers-hash-7DJU9b-n.mjs";
|
|
4
4
|
import { n as displayEmoji, r as normalizeEmoji } from "./emoji-CTLpvH-A.mjs";
|
|
5
5
|
import { t as BoardError } from "./client-D0Px7KzF.mjs";
|
|
6
|
-
import { i as groups, n as filters$1, o as options, r as globalOptions, s as usage$1, t as commands } from "./commands-
|
|
7
|
-
import {
|
|
8
|
-
import { t as http } from "./backend-http-
|
|
9
|
-
import { t as board } from "./server-
|
|
6
|
+
import { i as groups, n as filters$1, o as options, r as globalOptions, s as usage$1, t as commands } from "./commands-BFookFtn.mjs";
|
|
7
|
+
import { a as handFetch, d as vercelProjectFile, n as boardUrl, o as handLogin, r as connect } from "./node-Zd_C-gxP.mjs";
|
|
8
|
+
import { t as http } from "./backend-http-BvNFrvcY.mjs";
|
|
9
|
+
import { t as board } from "./server-DTX0prGr.mjs";
|
|
10
10
|
import { t as conformance } from "./conformance-DlnfuzEB.mjs";
|
|
11
|
-
import { n as handTeam, r as vercel, t as credentialSource } from "./backend-vercel-
|
|
11
|
+
import { n as handTeam, r as vercel, t as credentialSource } from "./backend-vercel-DTrDiSk5.mjs";
|
|
12
12
|
import { t as displayText } from "./bots-CGkO76qH.mjs";
|
|
13
13
|
import { spawn } from "node:child_process";
|
|
14
14
|
import { readFile, stat, writeFile } from "node:fs/promises";
|
|
@@ -511,7 +511,6 @@ function commandPath(words, all) {
|
|
|
511
511
|
//#region src/cli/failure.ts
|
|
512
512
|
function exitCode(failure) {
|
|
513
513
|
if (failure.class === "usage" || failure.class === "missing_input") return 2;
|
|
514
|
-
if (failure.class === "timeout") return 124;
|
|
515
514
|
if (failure.class === "canceled") return 130;
|
|
516
515
|
return 1;
|
|
517
516
|
}
|
|
@@ -1829,7 +1828,7 @@ const context = () => ({
|
|
|
1829
1828
|
});
|
|
1830
1829
|
/**
|
|
1831
1830
|
* Runs board's CLI on `argv` (what follows the command name) as `app`, and answers its exit
|
|
1832
|
-
* code: 0 success, 1 error
|
|
1831
|
+
* code: 0 success, 1 error (a `wait` that timed out included), 2 misuse, 130 when Ctrl-C stops it. A
|
|
1833
1832
|
* failure goes to `app.onError`, or to stderr: `error: ` and what failed, then how to fix it, or
|
|
1834
1833
|
* with `--json`, one JSON document. A long-running command (`tail`, `serve`) answers once it's
|
|
1835
1834
|
* stopped.
|
|
@@ -1837,11 +1836,13 @@ const context = () => ({
|
|
|
1837
1836
|
async function main(argv, options) {
|
|
1838
1837
|
handLogin(options.login ?? null);
|
|
1839
1838
|
handTeam(options.team ?? null);
|
|
1839
|
+
handFetch(options.fetch ?? null);
|
|
1840
1840
|
try {
|
|
1841
1841
|
return await runOnce(argv, options);
|
|
1842
1842
|
} finally {
|
|
1843
1843
|
handLogin(null);
|
|
1844
1844
|
handTeam(null);
|
|
1845
|
+
handFetch(null);
|
|
1845
1846
|
}
|
|
1846
1847
|
}
|
|
1847
1848
|
async function runOnce(argv, options) {
|
|
@@ -157,6 +157,30 @@ let handed = null;
|
|
|
157
157
|
function handLogin(login) {
|
|
158
158
|
handed = login;
|
|
159
159
|
}
|
|
160
|
+
/** The fetch a CLI that runs board's hands it for Vercel's API (`vercel board`'s), while one does. */
|
|
161
|
+
let handedFetch = null;
|
|
162
|
+
/**
|
|
163
|
+
* Hands board the fetch that sends its requests to Vercel's API with the login it's handed, adding
|
|
164
|
+
* that login's credentials itself, as `vercel board` does: a DPoP login's proof is signed for each
|
|
165
|
+
* request's method and URL, so a token alone can't make one. Null takes it back.
|
|
166
|
+
*/
|
|
167
|
+
function handFetch(send) {
|
|
168
|
+
handedFetch = send;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* A request to Vercel's API as you: through the fetch the CLI that runs board's hands it with its
|
|
172
|
+
* login, which adds its credentials, or with `login` as a Bearer token, through `send`.
|
|
173
|
+
*/
|
|
174
|
+
function asYou(input, init, login, send = fetch) {
|
|
175
|
+
if (handedFetch && loginHanded()) return handedFetch(input, init);
|
|
176
|
+
const headers = new Headers(input instanceof Request ? input.headers : void 0);
|
|
177
|
+
new Headers(init.headers).forEach((value, name) => headers.set(name, value));
|
|
178
|
+
headers.set("authorization", `Bearer ${login}`);
|
|
179
|
+
return send(input, {
|
|
180
|
+
...init,
|
|
181
|
+
headers
|
|
182
|
+
});
|
|
183
|
+
}
|
|
160
184
|
/** Whether the login is one a CLI handed over (`createApp`'s `login`, or `VERCEL_AUTH_TOKEN`). */
|
|
161
185
|
const loginHanded = () => handed !== null || !!process.env.VERCEL_AUTH_TOKEN;
|
|
162
186
|
/**
|
|
@@ -205,10 +229,7 @@ async function personToken(audience, discovery) {
|
|
|
205
229
|
let development;
|
|
206
230
|
try {
|
|
207
231
|
if (!authToken) throw new Error("no Vercel CLI credentials file");
|
|
208
|
-
const response = await
|
|
209
|
-
method: "POST",
|
|
210
|
-
headers: { authorization: `Bearer ${authToken}` }
|
|
211
|
-
});
|
|
232
|
+
const response = await asYou(`https://api.vercel.com/v1/projects/${project.id}/token?source=board${project.team ? `&teamId=${project.team}` : ""}`, { method: "POST" }, authToken);
|
|
212
233
|
if (response.status === 403 || response.status === 404) throw new BoardError("no_access", "Your Vercel account can't access this board's project.", response.status, { hint: "Ask someone on the project's team for access to it." });
|
|
213
234
|
if (!response.ok) throw new Error(`${response.status} ${response.statusText}`);
|
|
214
235
|
development = (await response.json()).token;
|
|
@@ -246,10 +267,7 @@ async function boardProject(url, discovery, authToken) {
|
|
|
246
267
|
team: discovery.team_id
|
|
247
268
|
};
|
|
248
269
|
const found = await findProject(authToken ? async (method, path) => {
|
|
249
|
-
const response = await
|
|
250
|
-
method,
|
|
251
|
-
headers: { authorization: `Bearer ${authToken}` }
|
|
252
|
-
});
|
|
270
|
+
const response = await asYou(`https://api.vercel.com${path}`, { method }, authToken);
|
|
253
271
|
return response.ok ? await response.json() : null;
|
|
254
272
|
} : vercelCliApi, host);
|
|
255
273
|
if (!found) throw new BoardError("no_access", `Your Vercel login can't see the project ${host} belongs to.`, 0, { hint: "Log in as someone on the project's team (vercel login), or ask for access to it." });
|
|
@@ -278,7 +296,7 @@ async function tokenFromVercelCli(project) {
|
|
|
278
296
|
/** Your Vercel username, display name, and avatar (Vercel serves avatars publicly). */
|
|
279
297
|
async function vercelUser(authToken) {
|
|
280
298
|
try {
|
|
281
|
-
const response = await
|
|
299
|
+
const response = await asYou("https://api.vercel.com/v2/user", {}, authToken);
|
|
282
300
|
if (!response.ok) return null;
|
|
283
301
|
const { user } = await response.json();
|
|
284
302
|
return {
|
|
@@ -583,14 +601,13 @@ async function projectBypass(url, host, doFetch) {
|
|
|
583
601
|
const blocked = (why, fix) => new BoardError("protected", `${url} is behind Vercel Deployment Protection, and your Vercel login ${why}.`, 0, { hint: `${fix}, or set VERCEL_AUTOMATION_BYPASS_SECRET (${WHERE}).` });
|
|
584
602
|
const token = await apiLogin(await handedToken());
|
|
585
603
|
const api = token ? async (method, path) => {
|
|
586
|
-
const response = await
|
|
604
|
+
const response = await asYou(`https://api.vercel.com${path}`, {
|
|
587
605
|
method,
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
});
|
|
606
|
+
...method === "PATCH" ? {
|
|
607
|
+
headers: { "content-type": "application/json" },
|
|
608
|
+
body: "{}"
|
|
609
|
+
} : {}
|
|
610
|
+
}, token, doFetch);
|
|
594
611
|
return response.ok ? await response.json() : null;
|
|
595
612
|
} : vercelCliApi;
|
|
596
613
|
const project = await findProject(api, host);
|
|
@@ -658,4 +675,4 @@ const vercelCliApi = async (method, path) => {
|
|
|
658
675
|
}
|
|
659
676
|
};
|
|
660
677
|
//#endregion
|
|
661
|
-
export {
|
|
678
|
+
export { handFetch as a, loginHanded as c, vercelProjectFile as d, environmentProfile as i, projectDir as l, boardUrl as n, handLogin as o, connect as r, localTokenFile as s, asYou as t, vercelLogin as u };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { t as BoardError } from "./client-D0Px7KzF.mjs";
|
|
2
|
-
import {
|
|
3
|
-
import { t as board } from "./server-
|
|
2
|
+
import { s as localTokenFile } from "./node-Zd_C-gxP.mjs";
|
|
3
|
+
import { t as board } from "./server-DTX0prGr.mjs";
|
|
4
4
|
import { t as oidcTokens } from "./tokens-BuCU-61R.mjs";
|
|
5
|
-
import { n as fsBlob, t as a2 } from "./a2-
|
|
5
|
+
import { n as fsBlob, t as a2 } from "./a2-B0_VlbtC.mjs";
|
|
6
6
|
import { t as localScheduler } from "./local-DhkrAqPP.mjs";
|
|
7
7
|
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
8
8
|
import { userInfo } from "node:os";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as createBoard } from "./exports-
|
|
2
|
-
import { t as http } from "./backend-http-
|
|
1
|
+
import { t as createBoard } from "./exports-CCzw2Vdw.mjs";
|
|
2
|
+
import { t as http } from "./backend-http-BvNFrvcY.mjs";
|
|
3
3
|
//#region src/server/index.ts
|
|
4
4
|
/**
|
|
5
5
|
* The handle on a board. With a `backend`, the board lives there: `a2()` keeps it in this
|
|
@@ -2,7 +2,7 @@ import { n as DIRECT_UPLOAD_BYTES_MAX, t as ATTACHMENT_BYTES_MAX } from "./files
|
|
|
2
2
|
import { S as storable, a as AttachmentId, c as ChannelPath, d as LabelKey, g as MessageText, l as Emoji, m as MESSAGE_TEXT_MAX, n as ActorId, p as Labels, x as platformAvatar } from "./schemas-Be08nyfW.mjs";
|
|
3
3
|
import { a as Link, i as ExternalTarget, n as ExternalEvent, o as Origin, t as ExternalAuthor } from "./external-BV_cUncs.mjs";
|
|
4
4
|
import { r as badRequest, t as HttpError } from "./errors-CusN4x2l.mjs";
|
|
5
|
-
import { o as options } from "./commands-
|
|
5
|
+
import { o as options } from "./commands-BFookFtn.mjs";
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
//#region src/api/routes.ts
|
|
8
8
|
/**
|
|
@@ -662,7 +662,7 @@ const routes = {
|
|
|
662
662
|
const SYNC = "@sync";
|
|
663
663
|
//#endregion
|
|
664
664
|
//#region src/version.ts
|
|
665
|
-
const VERSION = "0.
|
|
665
|
+
const VERSION = "0.28.0";
|
|
666
666
|
//#endregion
|
|
667
667
|
//#region src/server/routing.ts
|
|
668
668
|
/** board()'s own routes: the files it serves, and sync's, which run where board() does. */
|
|
@@ -133,8 +133,8 @@ vb wait --re 812 --timeout 30m
|
|
|
133
133
|
|
|
134
134
|
`vb wait [channel] [filters]` blocks until the next matching event, prints it,
|
|
135
135
|
and exits 0. If nothing matches in time it says so on stderr
|
|
136
|
-
(`error: Nothing matched within 30m.`) and exits
|
|
137
|
-
|
|
136
|
+
(`error: Nothing matched within 30m.`) and exits 1, with `reason: "timeout"`
|
|
137
|
+
in its `--json` error document. The timeout defaults to `30m` and takes
|
|
138
138
|
`30s`, `10m`, `1h`, or `1d`.
|
|
139
139
|
|
|
140
140
|
Like `tail`, it starts at the head. Pass `--after` to start from a known
|
package/docs/01-quickstart.md
CHANGED
|
@@ -137,8 +137,9 @@ returns:
|
|
|
137
137
|
#7 general ↳ #2 grace: thanks!
|
|
138
138
|
```
|
|
139
139
|
|
|
140
|
-
On a timeout it
|
|
141
|
-
|
|
140
|
+
On a timeout it fails with `reason: "timeout"` (with `--json`, in its error
|
|
141
|
+
document on stderr), so a script or an agent can tell "no answer yet" from
|
|
142
|
+
another error. See [Reading](./01-board/05-reading.md) for
|
|
142
143
|
filters, `vb tail`, and reading after a position.
|
|
143
144
|
|
|
144
145
|
## 7. Open it in a browser
|
|
@@ -126,7 +126,8 @@ Several agents can work at once, on one machine or many:
|
|
|
126
126
|
- **Sessions tell them apart.** `by.session` on each message names the agent
|
|
127
127
|
session that wrote it, even when they share a profile.
|
|
128
128
|
|
|
129
|
-
`wait`
|
|
130
|
-
only receive events while they run; nothing wakes an
|
|
131
|
-
ends. For that, run a
|
|
129
|
+
A `wait` that times out fails with `reason: "timeout"`: silence isn't an
|
|
130
|
+
answer. `tail` and `wait` only receive events while they run; nothing wakes an
|
|
131
|
+
agent after its turn ends. For that, run a
|
|
132
|
+
[watcher](../01-board/06-watchers.md) on the board (see
|
|
132
133
|
[A triage agent](04-triage.md)).
|
package/docs/03-guides/03-ci.md
CHANGED
|
@@ -105,7 +105,7 @@ npx -y @vercel/board wait --re "$id" --after "$id" --text "ship it" --timeout 30
|
|
|
105
105
|
```
|
|
106
106
|
|
|
107
107
|
`wait` exits 0 once someone replies in the thread with "ship it" (in Slack
|
|
108
|
-
too, if `deploys` mirrors a channel), or
|
|
108
|
+
too, if `deploys` mirrors a channel), or 1 when the timeout passes, which
|
|
109
109
|
fails the step.
|
|
110
110
|
|
|
111
111
|
### A protected board
|
|
@@ -78,8 +78,8 @@ reply=$(vb reply "$id" "Thanks! Tracking this with #640.")
|
|
|
78
78
|
`wait` starts at the newest event unless you pass `--after`. The first run
|
|
79
79
|
starts there; every later run passes the last cursor it handled, so nothing
|
|
80
80
|
that arrived between turns is missed.
|
|
81
|
-
|
|
82
|
-
turn.
|
|
81
|
+
When the timeout passes it fails with `reason: "timeout"`; `|| exit 0` ends
|
|
82
|
+
the turn quietly then, and on any other failure, which the next run retries.
|
|
83
83
|
|
|
84
84
|
### Wait for a person
|
|
85
85
|
|
|
@@ -93,7 +93,7 @@ vb wait --re "$id" --after "$reply" --timeout 30m --json
|
|
|
93
93
|
|
|
94
94
|
`--after "$reply"` counts an answer that lands before the wait starts. Check
|
|
95
95
|
the event's `type` and author: thread activity also includes reactions,
|
|
96
|
-
edits, and labels. A timeout (
|
|
96
|
+
edits, and labels. A timeout (`reason: "timeout"`) is silence, not an answer.
|
|
97
97
|
|
|
98
98
|
## 3. Triage on the board
|
|
99
99
|
|
|
@@ -53,11 +53,14 @@ const code = await createApp({
|
|
|
53
53
|
// that throws fails it too, with what it threw as the failure's details.
|
|
54
54
|
login: async () => process.env.VERCEL_AUTH_TOKEN!,
|
|
55
55
|
team: async () => process.env.VERCEL_ORG_ID ?? null,
|
|
56
|
+
// How requests to Vercel's API go with that login: the app's own fetch, which adds the login's
|
|
57
|
+
// credentials. Without it, the login goes as a Bearer token, which a DPoP login can't use.
|
|
58
|
+
// fetch: (input, init) => yourSignedFetch(input, init), // a DPoP proof for each request
|
|
56
59
|
}).run(process.argv.slice(3))
|
|
57
60
|
```
|
|
58
61
|
|
|
59
62
|
`class` fixes the exit code: `usage` and `missing_input` answer 2,
|
|
60
|
-
`
|
|
63
|
+
`canceled` 130, and the rest 1, `timeout` included. Without `onError`, board
|
|
61
64
|
prints its own on stderr: `error: ` and the lines, or with `--json`, its
|
|
62
65
|
[JSON document](#errors).
|
|
63
66
|
|
|
@@ -254,9 +257,8 @@ error document:
|
|
|
254
257
|
| Code | Meaning |
|
|
255
258
|
| --- | --- |
|
|
256
259
|
| 0 | success |
|
|
257
|
-
| 1 | it failed: `error: Couldn't find message #9999
|
|
260
|
+
| 1 | it failed: `error: Couldn't find message #9999.`, or `wait` or `identity link` timed out (`reason: "timeout"`) |
|
|
258
261
|
| 2 | misuse: an unknown command or option, a missing or malformed argument, or no board to use |
|
|
259
|
-
| 124 | `wait` timed out (the GNU `timeout` convention), or `identity link` saw no link in time |
|
|
260
262
|
| 130 | Ctrl-C stopped `tail` or `wait` |
|
|
261
263
|
|
|
262
264
|
## Setup
|
|
@@ -712,7 +714,8 @@ vb wait [channel] [filters] [--after <id>] [--timeout 30m]
|
|
|
712
714
|
```
|
|
713
715
|
|
|
714
716
|
Blocks until the next matching event, prints it, and exits 0. On timeout it
|
|
715
|
-
prints `
|
|
717
|
+
prints `error: Nothing matched within 30m.` on stderr and exits 1
|
|
718
|
+
(`reason: "timeout"`). `--after` defaults to the current
|
|
716
719
|
head; pass a message ID to catch anything that arrived since it.
|
|
717
720
|
|
|
718
721
|
```bash
|