@k9o/core 1.0.0 → 1.1.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/CHANGELOG.md +5 -71
- package/README.md +224 -32
- package/dist/{chunk-OE2MMUIG.js → chunk-2NDFTHUB.js} +2 -2
- package/dist/chunk-2NDFTHUB.js.map +1 -0
- package/dist/{chunk-2VSTF5UU.js → chunk-LJZ45UA2.js} +1 -1
- package/dist/chunk-LJZ45UA2.js.map +1 -0
- package/dist/{chunk-FVWKL5UQ.js → chunk-O2ZTV6YN.js} +2 -2
- package/dist/chunk-O2ZTV6YN.js.map +1 -0
- package/dist/envelope.d.ts +9 -9
- package/dist/http.d.ts +4 -4
- package/dist/http.js +2 -2
- package/dist/index.d.ts +163 -183
- package/dist/index.js +43 -44
- package/dist/index.js.map +1 -1
- package/dist/kerror.d.ts +2 -2
- package/dist/kerror.js +1 -1
- package/dist/types.d.ts +4 -6
- package/dist/url-grammar.d.ts +6 -6
- package/dist/url-grammar.js +2 -2
- package/package.json +4 -4
- package/src/audit.ts +6 -6
- package/src/compute/llms.ts +16 -16
- package/src/data/from.ts +12 -12
- package/src/envelope.ts +9 -9
- package/src/extensions-bridge.ts +7 -9
- package/src/functions.ts +8 -8
- package/src/gate-bridge.ts +2 -2
- package/src/http.ts +4 -4
- package/src/index.ts +17 -27
- package/src/internal/sse.ts +2 -2
- package/src/kerror.ts +2 -2
- package/src/me.ts +7 -8
- package/src/metadata.ts +13 -20
- package/src/migrations.ts +12 -12
- package/src/org.ts +19 -19
- package/src/orgs.ts +5 -5
- package/src/policies.ts +2 -2
- package/src/projects.ts +5 -5
- package/src/realtime.ts +16 -16
- package/src/retry.ts +1 -1
- package/src/storage-buckets.ts +1 -1
- package/src/studio/dashboards.ts +13 -13
- package/src/studio/index.ts +2 -2
- package/src/studio/workflows.ts +21 -21
- package/src/types.ts +4 -6
- package/src/url-grammar.ts +6 -6
- package/dist/chunk-2VSTF5UU.js.map +0 -1
- package/dist/chunk-FVWKL5UQ.js.map +0 -1
- package/dist/chunk-OE2MMUIG.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/from.ts","../src/projects.ts","../src/storage-buckets.ts","../src/provider-region.ts","../src/storage-locations.ts","../src/metadata.ts","../src/migrations.ts","../src/functions.ts","../src/policies.ts","../src/audit.ts","../src/orgs.ts","../src/org.ts","../src/me.ts","../src/studio/workflows.ts","../src/studio/dashboards.ts","../src/studio/index.ts","../src/internal/sse.ts","../src/compute/llms.ts","../src/ai.ts","../src/realtime.ts","../src/gate-bridge.ts","../src/extensions-bridge.ts","../src/index.ts","../src/byos.ts"],"sourcesContent":["/**\n * Data-plane DSL: `client.from(collection).select()` etc.\n *\n * The DSL is a\n * chainable builder that composes a query against a project's user-\n * collection. The chain terminates in a verb (`select`, `insert`,\n * `update`, `delete`) that issues the HTTP request and returns the\n * envelope.\n *\n * Wire mapping:\n * - `from('posts').select()` → GET /@<projectSlug>/data/posts\n * - `from('posts').select().eq('id','rec_X')` → GET /@<projectSlug>/data/posts?id=eq.rec_X\n * - `from('posts').insert({ title: '...' })` → POST /@<projectSlug>/data/posts\n * - `from('posts').update({ title: '...' }).eq(...)` → PATCH /@<projectSlug>/data/posts/:id\n * - `from('posts').delete().eq('id','rec_X')` → DELETE /@<projectSlug>/data/posts/:id\n *\n * Filters compose as AND per ch04 §3.2; multiple chained `.eq()` /\n * `.gt()` / etc. calls all attach to the query string.\n *\n * Pagination + counting per ch01 §6.4: `.limit(n)`, `.cursor(opaque)`,\n * `.count('none' | 'exact' | 'estimated')`. The returned envelope's\n * `meta.cursor.next` is the cursor for the next page.\n *\n * Per ch13 §4.1 KError delivery: every terminal verb throws KError on\n * non-2xx. Caller catches via `instanceof KError` + narrows on `.code`.\n */\n\nimport { projectPath, validateSlug } from \"../url-grammar.ts\";\nimport { request, type HttpClientConfig } from \"../http.ts\";\nimport { KError } from \"../kerror.ts\";\nimport type { Envelope } from \"../envelope.ts\";\nimport type { FilterOp } from \"../types.ts\";\n\n/**\n * Internal filter representation. Serialised to query parameters at\n * terminal-verb time.\n */\ntype Filter = {\n column: string;\n op: FilterOp;\n value: string | number | boolean | ReadonlyArray<string | number>;\n};\n\n/**\n * Query builder shared across all verbs. The `select`/`insert`/`update`/\n * `delete` factories below extend this via composition so the chainable\n * shape is consistent.\n */\nclass QueryBuilder {\n protected filters: Filter[] = [];\n protected limitVal?: number;\n protected cursorVal?: string;\n protected countMode?: \"none\" | \"exact\" | \"estimated\";\n\n /**\n * Attach an equality filter. Composes with other filters via AND.\n */\n eq(column: string, value: string | number | boolean): this {\n this.filters.push({ column, op: \"eq\", value });\n return this;\n }\n\n neq(column: string, value: string | number | boolean): this {\n this.filters.push({ column, op: \"neq\", value });\n return this;\n }\n\n gt(column: string, value: string | number): this {\n this.filters.push({ column, op: \"gt\", value });\n return this;\n }\n\n gte(column: string, value: string | number): this {\n this.filters.push({ column, op: \"gte\", value });\n return this;\n }\n\n lt(column: string, value: string | number): this {\n this.filters.push({ column, op: \"lt\", value });\n return this;\n }\n\n lte(column: string, value: string | number): this {\n this.filters.push({ column, op: \"lte\", value });\n return this;\n }\n\n in(column: string, values: ReadonlyArray<string | number>): this {\n this.filters.push({ column, op: \"in\", value: values });\n return this;\n }\n\n notIn(column: string, values: ReadonlyArray<string | number>): this {\n this.filters.push({ column, op: \"notIn\", value: values });\n return this;\n }\n\n like(column: string, pattern: string): this {\n this.filters.push({ column, op: \"like\", value: pattern });\n return this;\n }\n\n ilike(column: string, pattern: string): this {\n this.filters.push({ column, op: \"ilike\", value: pattern });\n return this;\n }\n\n is(column: string, value: \"null\" | \"true\" | \"false\"): this {\n this.filters.push({ column, op: \"is\", value });\n return this;\n }\n\n /**\n * Attach a `.filter(column, op, value)` for explicit op selection.\n */\n filter(column: string, op: FilterOp, value: string | number | boolean | ReadonlyArray<string | number>): this {\n this.filters.push({ column, op, value });\n return this;\n }\n\n /**\n * Page-size hint (default per gateway tier; max bounded server-side).\n */\n limit(n: number): this {\n this.limitVal = n;\n return this;\n }\n\n /**\n * Opaque cursor for next-page fetch — returned in prior response's\n * `meta.cursor.next`.\n */\n cursor(opaque: string): this {\n this.cursorVal = opaque;\n return this;\n }\n\n /**\n * Total-count behaviour per ch01 §6.4. `none` (default) skips the\n * count query (cheapest); `exact` runs `SELECT COUNT(*)` (most\n * expensive at scale); `estimated` reads from pg_stats (fast +\n * approximate).\n */\n count(mode: \"none\" | \"exact\" | \"estimated\"): this {\n this.countMode = mode;\n return this;\n }\n\n /**\n * Serialise filters + pagination + count to query parameters.\n * Format: per-filter `<column>=<op>.<value>`; multi-value (in/notIn)\n * uses comma-joined parenthesised value `<col>=in.(a,b,c)`.\n */\n protected toQuery(): Record<string, string | number | undefined> {\n const q: Record<string, string | number | undefined> = {};\n for (const f of this.filters) {\n const val = Array.isArray(f.value)\n ? `(${(f.value as ReadonlyArray<string | number>).join(\",\")})`\n : String(f.value);\n // Multiple filters on the same column are not currently supported via\n // the simple key=value query map. ch04 §3.2 future cycles cover\n // `.or()` / multi-filter — when those land the builder will switch\n // to a serialisation that supports collisions.\n q[f.column] = `${f.op}.${val}`;\n }\n if (this.limitVal !== undefined) q[\"limit\"] = this.limitVal;\n if (this.cursorVal !== undefined) q[\"cursor\"] = this.cursorVal;\n if (this.countMode !== undefined) q[\"count\"] = this.countMode;\n return q;\n }\n}\n\n/**\n * Terminal-verb builder returned by `from(collection)`. Each verb method\n * returns a sub-builder that resolves to the HTTP envelope when awaited.\n */\nclass FromBuilder {\n constructor(\n private readonly config: HttpClientConfig,\n private readonly collection: string,\n ) {}\n\n /**\n * Initiate a SELECT query. Returns a chainable filter/page builder\n * that resolves to the data envelope on await.\n */\n select<T = unknown>(): SelectBuilder<T> {\n return new SelectBuilder<T>(this.config, this.collection);\n }\n\n /**\n * Insert one record. Returns the inserted record (with platform-\n * generated `id` + `metadata`) per ch04 §6.4.\n */\n async insert<T = unknown>(record: Partial<T>): Promise<Envelope<T>> {\n return request<T>(this.config, {\n method: \"POST\",\n path: collectionPath(this.config, this.collection),\n body: record,\n });\n }\n\n /**\n * Initiate an UPDATE. Returns a builder; the chain MUST include a\n * filter clause (typically `.eq('id', 'rec_...')`) and resolves to\n * the updated record envelope.\n */\n update<T = unknown>(patch: Partial<T>): UpdateBuilder<T> {\n return new UpdateBuilder<T>(this.config, this.collection, patch);\n }\n\n /**\n * Initiate a DELETE. Returns a builder; the chain MUST include a\n * filter clause and resolves to the deleted record envelope.\n */\n delete<T = unknown>(): DeleteBuilder<T> {\n return new DeleteBuilder<T>(this.config, this.collection);\n }\n}\n\nclass SelectBuilder<T> extends QueryBuilder implements PromiseLike<Envelope<ReadonlyArray<T>>> {\n constructor(\n private readonly config: HttpClientConfig,\n private readonly collection: string,\n ) {\n super();\n }\n\n private exec(): Promise<Envelope<ReadonlyArray<T>>> {\n return request<ReadonlyArray<T>>(this.config, {\n method: \"GET\",\n path: collectionPath(this.config, this.collection),\n query: this.toQuery(),\n });\n }\n\n then<TResult1 = Envelope<ReadonlyArray<T>>, TResult2 = never>(\n onfulfilled?: ((value: Envelope<ReadonlyArray<T>>) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.exec().then(onfulfilled, onrejected);\n }\n}\n\nclass UpdateBuilder<T> extends QueryBuilder implements PromiseLike<Envelope<T>> {\n constructor(\n private readonly config: HttpClientConfig,\n private readonly collection: string,\n private readonly patch: Partial<T>,\n ) {\n super();\n }\n\n private exec(): Promise<Envelope<T>> {\n const idFilter = this.filters.find((f) => f.column === \"id\" && f.op === \"eq\");\n if (idFilter === undefined) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"update() requires an `.eq('id', '...')` filter; row-mass update is not supported at v0.1.0\",\n context: { collection: this.collection },\n recommendation: \"Chain `.eq('id', 'rec_…')` before awaiting the update; row-mass update lands in a v0.x sub-cycle.\",\n });\n }\n return request<T>(this.config, {\n method: \"PATCH\",\n path: `${collectionPath(this.config, this.collection)}/${encodeURIComponent(String(idFilter.value))}`,\n body: this.patch,\n });\n }\n\n then<TResult1 = Envelope<T>, TResult2 = never>(\n onfulfilled?: ((value: Envelope<T>) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.exec().then(onfulfilled, onrejected);\n }\n}\n\nclass DeleteBuilder<T> extends QueryBuilder implements PromiseLike<Envelope<T>> {\n constructor(\n private readonly config: HttpClientConfig,\n private readonly collection: string,\n ) {\n super();\n }\n\n private exec(): Promise<Envelope<T>> {\n const idFilter = this.filters.find((f) => f.column === \"id\" && f.op === \"eq\");\n if (idFilter === undefined) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"delete() requires an `.eq('id', '...')` filter; row-mass delete is not supported at v0.1.0\",\n context: { collection: this.collection },\n recommendation: \"Chain `.eq('id', 'rec_…')` before awaiting the delete; row-mass delete lands in a v0.x sub-cycle.\",\n });\n }\n return request<T>(this.config, {\n method: \"DELETE\",\n path: `${collectionPath(this.config, this.collection)}/${encodeURIComponent(String(idFilter.value))}`,\n });\n }\n\n then<TResult1 = Envelope<T>, TResult2 = never>(\n onfulfilled?: ((value: Envelope<T>) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.exec().then(onfulfilled, onrejected);\n }\n}\n\n/**\n * Build the collection-records URL path. Requires `config.projectSlug`\n * to be bound; member-plane resources route via the `/@<projectSlug>/...`\n * prefix per v2.5.68 URL grammar.\n */\nfunction collectionPath(config: HttpClientConfig, collection: string): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new KError({\n code: \"K9O_MISSING_PROJECT_CONTEXT\",\n message: \"data-plane operations require projectSlug to be bound on the client\",\n context: { collection },\n recommendation: \"Pass `projectSlug` in createClient options or use a project-scoped sub-client.\",\n });\n }\n validateSlug(config.projectSlug, \"project\");\n // Validate collection name shape — same slug grammar per ch04 §1.2.\n if (!/^[a-z][a-z0-9_-]{0,62}$/.test(collection)) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: `collection name \"${collection}\" does not match required format`,\n context: { collection },\n recommendation: \"Use lowercase letters / digits / underscores / hyphens; start with a letter; 1-63 chars.\",\n });\n }\n return projectPath(config.projectSlug, `data/${collection}`);\n}\n\n/**\n * Factory — entry point for the data-plane DSL. Returned via\n * `client.from(collection)` on the K9oClient instance.\n */\nexport function makeFromFactory(config: HttpClientConfig) {\n return function from(collection: string): FromBuilder {\n return new FromBuilder(config, collection);\n };\n}\n","/**\n * Project lifecycle SDK methods — `client.projects.*`.\n *\n * Wire mapping per gateway routes (`services/gateway/src/routes/projects-crud.ts` +\n * `discovery.ts`):\n * - `client.projects.list()` → GET /projects\n * - `client.projects.create({...})` → POST /projects\n * - `client.projects.get(slug)` → GET /@<projectSlug>/project\n * - `client.projects.update(slug,...)` → PATCH /@<projectSlug>/project\n *\n * The `list` + `create` operations operate org-plane and require\n * `orgSlug` to be bound on the client (or the bearer token to carry\n * an org context per ch01 §8.3). The `get` + `update` operations\n * operate member-plane and use the project slug.\n *\n * Per ch13 §4.1: all methods throw KError on non-2xx.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { orgPath, projectPath, validateSlug } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/**\n * Project shape per ch02. Fields are typed per the canonical shape;\n * the gateway may return additional fields that this type doesn't\n * narrow — those are accessible via `as unknown as` widening.\n */\nexport type Project = {\n /** `proj_<base62>` per ch01 §3.2. */\n id: string;\n slug: string;\n name: string;\n custodyMode: \"managed\" | \"byok\" | \"hyok\";\n createdAt: string;\n updatedAt: string | null;\n orgId: string;\n};\n\n/**\n * Project-creation input.\n */\nexport type CreateProjectInput = {\n slug: string;\n name: string;\n custodyMode?: \"managed\" | \"byok\" | \"hyok\" | undefined;\n};\n\n/**\n * Project-update patch.\n */\nexport type UpdateProjectInput = {\n name?: string;\n};\n\n/**\n * Factory — produces the `client.projects.*` namespace bound to the\n * supplied config.\n */\nexport function makeProjectsNamespace(config: HttpClientConfig) {\n return {\n /**\n * List projects accessible to the caller. Requires authenticated\n * session; results are scoped by RBAC per ch06.\n */\n async list(): Promise<Envelope<ReadonlyArray<Project>>> {\n return request<ReadonlyArray<Project>>(config, {\n method: \"GET\",\n path: orgPath(\"projects\"),\n });\n },\n\n /**\n * Create a new project under the caller's active org.\n */\n async create(input: CreateProjectInput): Promise<Envelope<Project>> {\n validateSlug(input.slug, \"project\");\n return request<Project>(config, {\n method: \"POST\",\n path: orgPath(\"projects\"),\n body: input,\n });\n },\n\n /**\n * Get a project by slug. Returns the project record + meta.\n */\n async get(slug: string): Promise<Envelope<Project>> {\n validateSlug(slug, \"project\");\n return request<Project>(config, {\n method: \"GET\",\n path: projectPath(slug, \"project\"),\n });\n },\n\n /**\n * Update a project's mutable fields.\n */\n async update(slug: string, patch: UpdateProjectInput): Promise<Envelope<Project>> {\n validateSlug(slug, \"project\");\n return request<Project>(config, {\n method: \"PATCH\",\n path: projectPath(slug, \"project\"),\n body: patch,\n });\n },\n };\n}\n","/**\n * `client.storage` buckets and objects (ch04 §9): per-project logical buckets and the objects in them, against\n * `/@<projectSlug>/storage/buckets…`. `client.storage.locations.*` (the customer's own object stores) lives in\n * `storage-locations.ts` and is unchanged.\n *\n * Bucket names are logical: the platform resolves them to a physical store, so a developer never sees a\n * physical bucket or key. Signed URLs require an explicit `expiresIn` (no default, max 7 days).\n *\n * What is NOT here yet, by design: a signed PUT (a method- and content-type-bound upload URL). The gateway has\n * no route for it; uploads go through the multipart `upload` below.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport { KError } from \"./kerror.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/** A bucket. */\nexport type StorageBucket = {\n name: string;\n /** `true` removes the authentication requirement on GET; per-object access policies still apply. */\n public: boolean;\n /** Bytes; `null` = no limit. */\n fileSizeLimit: number | null;\n /** MIME allow-list; empty = any. */\n allowedMimeTypes: string[];\n versioning: boolean;\n /** Lifecycle auto-expiry in days; `null` = never. */\n deleteAfterDays: number | null;\n createdAt: string;\n updatedAt: string;\n /** Platform-owned buckets (for example audit assets) cannot be written through the public routes. */\n system: boolean;\n /** The storage location the bucket is linked to, or `null` for platform-managed storage. */\n byosBindingId: string | null;\n};\n\n/** Options for `createBucket`. The bucket name is the first argument (3 to 63 chars, lowercase, digits, hyphens). */\nexport type CreateBucketOptions = {\n public?: boolean;\n fileSizeLimit?: number;\n allowedMimeTypes?: string[] | null;\n versioning?: boolean;\n deleteAfterDays?: number;\n /** Link the bucket to one of the project's storage locations (see `client.storage.locations`). */\n byosBindingId?: string;\n};\n\n/** Fields you may change on a bucket. `null` clears a limit; `allowedMimeTypes: null` allows any type. */\nexport type UpdateBucketOptions = {\n public?: boolean;\n fileSizeLimit?: number | null;\n allowedMimeTypes?: string[] | null;\n versioning?: boolean;\n deleteAfterDays?: number | null;\n /** `null` unlinks the bucket from its storage location. */\n byosBindingId?: string | null;\n};\n\n/** An object listing entry. `path` is relative to the bucket. */\nexport type StorageObject = {\n path: string;\n size: number;\n lastModified: string | null;\n};\n\nexport type UploadOptions = {\n /** Defaults to the data's own type when it is a `Blob`. */\n contentType?: string;\n /** `false` (default) refuses to overwrite an existing path (`409 K9O_ALREADY_EXISTS`). */\n upsert?: boolean;\n /** Caller-defined string metadata: at most 10 keys and 2 KB in total (enforced by the gateway). */\n metadata?: Record<string, string>;\n};\n\nexport type SignedUrlOptions = {\n /** Seconds, required: 1 to 604800 (7 days). There is deliberately no default. */\n expiresIn: number;\n /** `true` makes the download an attachment (`Content-Disposition: attachment`). */\n download?: boolean;\n};\n\nexport type SignedUrl = { signedUrl: string; expiresIn: number };\nexport type RemovedObject = { bucket: string; path: string; deleted: boolean };\nexport type DeletedBucket = { name: string; deleted: true; objectsDeleted: number };\n\nconst MAX_EXPIRES_IN = 604_800;\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (config.projectSlug === undefined || config.projectSlug.length === 0) {\n throw new KError({\n code: \"K9O_MISSING_PROJECT_CONTEXT\",\n message: \"client.storage buckets and objects require a bound projectSlug (per-project resource)\",\n context: {},\n recommendation: \"Pass projectSlug when constructing the client.\",\n });\n }\n return config.projectSlug;\n}\n\nconst bucketsPath = (config: HttpClientConfig, suffix = \"\"): string =>\n projectPath(requireProjectSlug(config), `storage/buckets${suffix}`);\n\nconst bucketPath = (config: HttpClientConfig, name: string, suffix = \"\"): string => {\n if (name.length === 0) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"bucket name must not be empty\",\n context: { field: \"bucket\", reason: \"empty\" },\n recommendation: null,\n });\n }\n // `.` and `..` survive percent-encoding and are collapsed as dot segments by the URL layer BEFORE the request leaves,\n // so a bucket named `..` would address a different route. No bucket can have that name (3 to 63 chars), so refuse it\n // here rather than send a rewritten URL.\n if (name === \".\" || name === \"..\") {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"bucket name must not be a dot segment\",\n context: { field: \"bucket\", reason: \"dot_segment\" },\n recommendation: null,\n });\n }\n return bucketsPath(config, `/${encodeURIComponent(name)}${suffix}`);\n};\n\nfunction requireObjectPath(path: string): void {\n if (path.length === 0) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"object path must not be empty\",\n context: { field: \"path\", reason: \"empty\" },\n recommendation: null,\n });\n }\n}\n\nfunction requireExpiresIn(expiresIn: unknown): asserts expiresIn is number {\n if (typeof expiresIn !== \"number\" || !Number.isInteger(expiresIn) || expiresIn < 1 || expiresIn > MAX_EXPIRES_IN) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: `expiresIn is required and must be an integer from 1 to ${MAX_EXPIRES_IN} seconds`,\n context: { field: \"expiresIn\", reason: \"out_of_range\" },\n recommendation: \"Pass an explicit expiresIn; signed URLs have no default lifetime.\",\n });\n }\n}\n\nfunction toBlob(data: Blob | Uint8Array | ArrayBuffer | string, contentType?: string): Blob {\n const init = contentType !== undefined ? { type: contentType } : {};\n if (data instanceof Blob) return contentType !== undefined && data.type !== contentType ? new Blob([data], init) : data;\n if (typeof data === \"string\") return new Blob([data], init);\n return new Blob([data as unknown as ArrayBuffer], init);\n}\n\n/** A handle on one bucket: `client.storage.from(\"avatars\")`. */\nexport function makeBucketHandle(config: HttpClientConfig, bucket: string) {\n return {\n /**\n * Upload an object. `POST /@<projectSlug>/storage/buckets/<bucket>/objects` (multipart). The bytes pass through\n * the gateway; the bucket's size and MIME limits are enforced there.\n */\n async upload(path: string, data: Blob | Uint8Array | ArrayBuffer | string, options: UploadOptions = {}): Promise<Envelope<StorageObject>> {\n requireObjectPath(path);\n const form = new FormData();\n form.append(\"file\", toBlob(data, options.contentType), path.split(\"/\").pop() || \"file\");\n form.append(\"path\", path);\n if (options.contentType !== undefined) form.append(\"contentType\", options.contentType);\n form.append(\"upsert\", options.upsert === true ? \"true\" : \"false\");\n if (options.metadata !== undefined) form.append(\"metadata\", JSON.stringify(options.metadata));\n return request<StorageObject>(config, { method: \"POST\", path: bucketPath(config, bucket, \"/objects\"), body: form });\n },\n\n /**\n * A pre-authenticated GET URL for one object. `POST …/objects/sign`. `expiresIn` is required.\n * (A signed PUT is not offered: the gateway has no route for it yet.)\n */\n async createSignedUrl(path: string, options: SignedUrlOptions): Promise<Envelope<SignedUrl>> {\n requireObjectPath(path);\n requireExpiresIn(options?.expiresIn);\n return request<SignedUrl>(config, {\n method: \"POST\",\n path: bucketPath(config, bucket, \"/objects/sign\"),\n body: { path, expiresIn: options.expiresIn, ...(options.download !== undefined ? { download: options.download } : {}) },\n });\n },\n\n /** List objects, optionally under a prefix. `GET …/objects?prefix=`. */\n async list(options: { prefix?: string } = {}): Promise<Envelope<ReadonlyArray<StorageObject>>> {\n return request<ReadonlyArray<StorageObject>>(config, {\n method: \"GET\",\n path: bucketPath(config, bucket, \"/objects\"),\n ...(options.prefix !== undefined ? { query: { prefix: options.prefix } } : {}),\n });\n },\n\n /** Delete one object. `DELETE …/objects?path=`. */\n async remove(path: string): Promise<Envelope<RemovedObject>> {\n requireObjectPath(path);\n return request<RemovedObject>(config, { method: \"DELETE\", path: bucketPath(config, bucket, \"/objects\"), query: { path } });\n },\n };\n}\n\n/** Bucket operations; merged into `client.storage` next to `locations`. */\nexport function makeBucketOperations(config: HttpClientConfig) {\n return {\n /** List the project's buckets. `GET /@<projectSlug>/storage/buckets`. */\n async listBuckets(): Promise<Envelope<ReadonlyArray<StorageBucket>>> {\n return request<ReadonlyArray<StorageBucket>>(config, { method: \"GET\", path: bucketsPath(config) });\n },\n\n /** Read one bucket. `GET …/buckets/<name>`. */\n async getBucket(name: string): Promise<Envelope<StorageBucket>> {\n return request<StorageBucket>(config, { method: \"GET\", path: bucketPath(config, name) });\n },\n\n /**\n * Create a bucket. `POST …/buckets`. A name outside 3 to 63 lowercase letters, digits and hyphens is refused\n * (`INVALID_BUCKET_NAME`).\n */\n async createBucket(name: string, options: CreateBucketOptions = {}): Promise<Envelope<StorageBucket>> {\n return request<StorageBucket>(config, { method: \"POST\", path: bucketsPath(config), body: { name, ...options } });\n },\n\n /** Change a bucket. `PATCH …/buckets/<name>`. */\n async updateBucket(name: string, options: UpdateBucketOptions): Promise<Envelope<StorageBucket>> {\n return request<StorageBucket>(config, { method: \"PATCH\", path: bucketPath(config, name), body: options });\n },\n\n /**\n * Delete a bucket. `DELETE …/buckets/<name>`. A non-empty bucket is refused unless `empty: true`, which purges\n * its objects first.\n */\n async deleteBucket(name: string, options: { empty?: boolean } = {}): Promise<Envelope<DeletedBucket>> {\n return request<DeletedBucket>(config, {\n method: \"DELETE\",\n path: bucketPath(config, name),\n ...(options.empty === true ? { query: { empty: \"true\" } } : {}),\n });\n },\n\n /** A handle on one bucket for object operations: `from(\"avatars\").upload(...)`. */\n from(bucket: string) {\n return makeBucketHandle(config, bucket);\n },\n };\n}\n","/**\n * The provider's own name for a bucket's location (`providerRegion`), as opposed to the platform region (a short code\n * such as `de01`). It goes into hostnames (`s3.<r>.amazonaws.com`, `sts.<r>.amazonaws.com`, `s3.<r>.backblazeb2.com`),\n * so a value like `x.attacker.net#` would aim a SigV4-signed request at a host the caller chose. The gateway checks the\n * same closed grammar on write and again where each endpoint is built; checking it here first means a bad value is\n * refused before any request is sent and before a credential envelope is sealed.\n *\n * Grammars (the Step 0 ruling for the BYOS split):\n * - `s3` (AWS): `^[a-z]{2}(-gov)?-[a-z]+-\\d$` e.g. `us-east-1`, `us-gov-west-1`\n * - `b2`: `^[a-z]{2}-[a-z]+-\\d{3}$` e.g. `eu-central-003`\n * - `r2`: `auto` only\n * - `gcs`, `azure_blob`: lower-case letters, digits and `-`, 1 to 32 characters, first and last alphanumeric (the gateway's bound)\n * - `s3_compatible`, `minio`: the same closed charset as GCS and Azure. The ruling gives the AWS grammar only for an\n * S3-compatible store that uses an AWS endpoint; every other region name is accepted only if it cannot reshape a host.\n */\n\nimport { KError } from \"./kerror.ts\";\n\nexport type ProviderRegionProvider = \"s3\" | \"s3_compatible\" | \"gcs\" | \"azure_blob\" | \"minio\" | \"r2\" | \"b2\";\n\nconst CHARSET = /^[a-z0-9](?:[a-z0-9-]{0,30}[a-z0-9])?$/;\nconst GRAMMAR: Record<ProviderRegionProvider, (v: string) => boolean> = {\n s3: (v) => /^[a-z]{2}(-gov)?-[a-z]+-\\d$/.test(v),\n b2: (v) => /^[a-z]{2}-[a-z]+-\\d{3}$/.test(v),\n r2: (v) => v === \"auto\",\n gcs: (v) => CHARSET.test(v),\n azure_blob: (v) => CHARSET.test(v),\n s3_compatible: (v) => CHARSET.test(v),\n minio: (v) => CHARSET.test(v),\n};\n\n/** True if `value` is a well-formed provider region for `provider`; with no provider, the closed charset only. */\nexport function isProviderRegion(value: unknown, provider?: ProviderRegionProvider): boolean {\n if (typeof value !== \"string\" || value.length === 0) return false;\n return provider === undefined ? CHARSET.test(value) : GRAMMAR[provider](value);\n}\n\n/**\n * Throw `K9O_INVALID_FIELD_VALUE` (`reason: \"provider_region_invalid\"`, the gateway's own reason) unless `value` is a\n * well-formed provider region. The value is never echoed.\n */\nexport function assertProviderRegion(value: unknown, provider?: ProviderRegionProvider): void {\n if (isProviderRegion(value, provider)) return;\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message:\n provider === undefined\n ? \"providerRegion must be lower-case letters, digits and '-' (at most 32 characters)\"\n : `providerRegion is not a valid ${provider} region`,\n context: { field: \"providerRegion\", reason: \"provider_region_invalid\", ...(provider !== undefined ? { provider } : {}) },\n recommendation:\n provider === \"r2\" ? \"Use `auto` for R2.\" : \"Pass the provider's own region name (for example `us-east-1`), not the platform region (`de01`).\",\n });\n}\n","/**\n * `client.storage.locations.*` — storage locations: the customer's own object stores (Bring-Your-Own-Store),\n * registered once per project and then linked to buckets and Datasets. Per-project CRUD against\n * `/@<projectSlug>/storage/locations`; it replaces the withdrawn purpose-based `client.byos.*` /\n * `/@<projectSlug>/byos` (hard cutover: the old routes answer 404).\n *\n * Deliberately independent of `byos.ts` (the credential pre-create/reference helpers) and of\n * `client.kibo.vault.secrets` — a location's `credentialRef` is just a string here. The caller pre-creates the\n * credential separately (`k9o byos-cred create` / `client.kibo.vault.secrets.create`) and passes the resulting\n * `kibo://byos-creds/<secId>` reference in; this namespace never creates, reads or returns a credential.\n *\n * A location carries no \"purpose\": which bucket or Dataset uses it is decided at link time, not here.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport { KError } from \"./kerror.ts\";\nimport type { Envelope } from \"./envelope.ts\";\nimport { makeBucketOperations } from \"./storage-buckets.ts\";\nimport { assertProviderRegion } from \"./provider-region.ts\";\n\n/** Storage provider. */\nexport type StorageLocationProvider = \"s3\" | \"s3_compatible\" | \"gcs\" | \"azure_blob\" | \"minio\" | \"r2\" | \"b2\";\n/** Key-custody mode. */\nexport type StorageLocationCustodyMode = \"PLATFORM_MANAGED\" | \"BYOK\" | \"HYOK\";\n\n/**\n * Non-secret, provider-specific configuration. Keys the platform reads: `accountId` and `parentAccessKeyId`\n * (`r2`), `bucketId` (`b2`). The gateway stores them as given and the credential mint fails closed when a\n * required one is missing, so set them when you create the location.\n */\nexport type StorageLocationProviderParams = Record<string, string>;\n\n/** A storage location. */\nexport type StorageLocation = {\n id: string;\n projectId: string;\n provider: StorageLocationProvider;\n bucketName: string;\n /** The platform region (a 4-character short code such as `de01`), checked against the project's residency set. */\n region: string;\n /** The provider's own name for the bucket's location (`us-east-1`, `auto` for R2, the GCS or Azure location). Never residency-checked. */\n providerRegion: string;\n endpointOverride: string | null;\n /** The `kibo://byos-creds/<secId>` reference. The credential itself is never returned. */\n credentialRef: string;\n custodyMode: StorageLocationCustodyMode;\n providerParams: StorageLocationProviderParams;\n createdAt: string;\n /** `null` while the location is live. */\n retiredAt: string | null;\n};\n\n/** Input to register a location from a pre-created credential reference. */\nexport type CreateStorageLocationInput = {\n provider: StorageLocationProvider;\n bucketName: string;\n /** The platform region (short code), checked against the project's residency set. */\n region: string;\n /** The provider's own name for the bucket's location. Required; `auto` for R2. */\n providerRegion: string;\n endpointOverride?: string;\n credentialRef: string;\n custodyMode?: StorageLocationCustodyMode;\n providerParams?: StorageLocationProviderParams;\n};\n\n/**\n * Fields you may change on a live location. `provider` cannot change. Moving a location that is in use (its\n * bucket, region, providerRegion, endpoint, `providerParams` or `custodyMode`) is refused with `409 location_in_use`; rotating\n * the credential is allowed. A `custodyMode` change counts as a move because it re-states the custody claim for\n * data already stored there. `providerParams`, when given, REPLACES the whole map (send every key you want to keep).\n */\nexport type UpdateStorageLocationInput = {\n bucketName?: string;\n region?: string;\n providerRegion?: string;\n /** `null` clears a previously set override. */\n endpointOverride?: string | null;\n credentialRef?: string;\n custodyMode?: StorageLocationCustodyMode;\n providerParams?: StorageLocationProviderParams;\n};\n\n/** Result of retiring a location. */\nexport type RetiredStorageLocation = { id: string; status: \"retired\" };\n\n/**\n * Result of `test`. Today this is a dry run that echoes the location's coordinates; the live probe is not\n * built yet (`dependencyOn` names what it waits for).\n */\nexport type StorageLocationTestResult = {\n dryRun: boolean;\n locationId: string;\n provider: StorageLocationProvider;\n bucketName: string;\n region: string;\n providerRegion: string;\n endpointOverride: string | null;\n dependencyOn: string;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (config.projectSlug === undefined || config.projectSlug.length === 0) {\n throw new KError({\n code: \"K9O_MISSING_PROJECT_CONTEXT\",\n message: \"client.storage.locations requires a bound projectSlug (per-project resource)\",\n context: {},\n recommendation: \"Pass projectSlug when constructing the client.\",\n });\n }\n return config.projectSlug;\n}\n\nconst locationsPath = (config: HttpClientConfig, suffix = \"\"): string =>\n projectPath(requireProjectSlug(config), `storage/locations${suffix}`);\n\nexport function makeStorageNamespace(config: HttpClientConfig) {\n return {\n // Buckets and objects (storage-buckets.ts): createBucket, listBuckets, from(bucket).upload, ...\n ...makeBucketOperations(config),\n locations: {\n /** List the live storage locations of the bound project. `GET /@<projectSlug>/storage/locations`. */\n async list(): Promise<Envelope<ReadonlyArray<StorageLocation>>> {\n return request<ReadonlyArray<StorageLocation>>(config, { method: \"GET\", path: locationsPath(config) });\n },\n\n /**\n * Register a location. `POST /@<projectSlug>/storage/locations`. The region must be inside the project's\n * residency set (`400`, reason `region_outside_residency`).\n */\n async create(input: CreateStorageLocationInput): Promise<Envelope<StorageLocation>> {\n assertProviderRegion(input.providerRegion, input.provider);\n return request<StorageLocation>(config, { method: \"POST\", path: locationsPath(config), body: input });\n },\n\n /** Read one location. `GET /@<projectSlug>/storage/locations/<locationId>`. */\n async get(locationId: string): Promise<Envelope<StorageLocation>> {\n return request<StorageLocation>(config, {\n method: \"GET\",\n path: locationsPath(config, `/${encodeURIComponent(locationId)}`),\n });\n },\n\n /** Update a live location. `PATCH /@<projectSlug>/storage/locations/<locationId>`. */\n async update(locationId: string, patch: UpdateStorageLocationInput): Promise<Envelope<StorageLocation>> {\n // The provider of an existing location cannot change and is not in the patch, so only the closed charset is\n // checked here; the gateway applies the provider's own grammar.\n if (patch.providerRegion !== undefined) assertProviderRegion(patch.providerRegion);\n return request<StorageLocation>(config, {\n method: \"PATCH\",\n path: locationsPath(config, `/${encodeURIComponent(locationId)}`),\n body: patch,\n });\n },\n\n /**\n * Retire a location. `DELETE /@<projectSlug>/storage/locations/<locationId>`. Refused with\n * `409 location_in_use` while a bucket or any Dataset (retired ones included) still uses it.\n */\n async retire(locationId: string): Promise<Envelope<RetiredStorageLocation>> {\n return request<RetiredStorageLocation>(config, {\n method: \"DELETE\",\n path: locationsPath(config, `/${encodeURIComponent(locationId)}`),\n });\n },\n\n /** Dry-run check of a location. `POST /@<projectSlug>/storage/locations/<locationId>/test`. */\n async test(locationId: string): Promise<Envelope<StorageLocationTestResult>> {\n return request<StorageLocationTestResult>(config, {\n method: \"POST\",\n path: locationsPath(config, `/${encodeURIComponent(locationId)}/test`),\n });\n },\n },\n };\n}\n","/**\n * `client.metadata.*` — ch14 cross-surface metadata query (`k9o.metadata.*` per ch14 §3.1).\n *\n * 🔴 Client-side surface only, built against the ch14 §3.2 REST contract and the landed Inc-1\n * parse/validate layer (`w4-ch14-metadata-query @ 3488e5c2`, unmerged as of this writing —\n * `services/gateway/src/routes/metadata-query-parse.ts`). `POST /@:projectSlug/metadata/query`\n * (Inc 2 — the route + telemetry-slice execution) has NOT landed yet; calling `.execute()` today\n * hits a 404, not a working query. This ships ahead of the route deliberately (same pattern as the\n * BYOS SDK surfaces) so the wire shape is locked to the spec, not re-derived once the route exists.\n *\n * The telemetry slice is buildable on Inc 2\n * (reuses the existing audit-log query); the collection + storage slices are blocked on greenfield\n * `record.metadata`/object-metadata schema (Inc 3/Inc 4) — so even once Inc 2 lands, only\n * `telemetry:*` surfaces will actually return data until those land.\n *\n * `textSearch`/`vectorSearch` (ch14 §3.4) are explicitly a later increment (Inc 5) — not implemented\n * here; adding stub methods for an unspecified future mode would be speculative, not spec-grounded.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport { KError } from \"./kerror.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/** The three cross-surface slices (ch14 §2.1). */\nexport type MetadataSlice = \"collection\" | \"storage\" | \"telemetry\";\n\n/** ch14 §3.3 operator vocabulary (= ch06 §3.5 JSON-policy set), mirrored verbatim from the gateway's\n * `metadata-query-parse.ts` so a typo can't silently pass client-side and fail only server-side. */\nexport const METADATA_OPERATORS = [\n \"eq\", \"neq\", \"gt\", \"gte\", \"lt\", \"lte\",\n \"contains\", \"startsWith\", \"endsWith\", \"in\", \"notIn\",\n \"and\", \"or\", \"not\",\n] as const;\nexport type MetadataOperator = (typeof METADATA_OPERATORS)[number];\n\n/** A surface label `<slice>:<scope>` (ch14 §2.2), e.g. `collection:posts`, `storage:images`,\n * `telemetry:auth.session.created`. */\nexport type MetadataSurface = `${MetadataSlice}:${string}`;\n\nexport type MetadataWhereClause = {\n readonly field: string;\n readonly op: MetadataOperator;\n readonly value: unknown;\n};\n\n/**\n * One result row (ch14 §3.1): \"each record carries its surface + scope + the queried metadata\n * fields plus a back-reference id\" — `recordId` (collection), `objectPath` (storage), or `eventId`\n * (telemetry), depending on which surface the row came from. Exact field names are provisional\n * pending Inc 2 landing a concrete response schema; kept loose (`metadata: Record<string, unknown>`)\n * rather than guessing a shape that isn't coined in code anywhere yet.\n */\nexport type MetadataQueryRecord = {\n surface: MetadataSurface;\n scope: string;\n recordId?: string;\n objectPath?: string;\n eventId?: string;\n metadata: Record<string, unknown>;\n};\n\nexport type MetadataQueryResult = {\n records: readonly MetadataQueryRecord[];\n nextCursor: string | null;\n};\n\n/** The `k9o.metadata.from(...).where(...).limit(...).execute()` builder (ch14 §3.1). Immutable —\n * every chained call returns a new builder, so a partially-built query can be safely reused/branched. */\nexport type MetadataQueryBuilder = {\n where(field: string, op: MetadataOperator, value: unknown): MetadataQueryBuilder;\n limit(n: number): MetadataQueryBuilder;\n cursor(c: string | null): MetadataQueryBuilder;\n execute(): Promise<Envelope<MetadataQueryResult>>;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (config.projectSlug === undefined || config.projectSlug.length === 0) {\n throw new KError({\n code: \"K9O_MISSING_PROJECT_CONTEXT\",\n message: \"client.metadata requires a bound projectSlug (project data-plane resource, ch14 §4)\",\n context: {},\n recommendation: \"Pass projectSlug when constructing the client.\",\n });\n }\n return config.projectSlug;\n}\n\nfunction makeBuilder(\n config: HttpClientConfig,\n surfaces: readonly MetadataSurface[],\n where: readonly MetadataWhereClause[],\n limit: number | undefined,\n cursorValue: string | null,\n): MetadataQueryBuilder {\n return {\n where(field, op, value) {\n return makeBuilder(config, surfaces, [...where, { field, op, value }], limit, cursorValue);\n },\n limit(n) {\n return makeBuilder(config, surfaces, where, n, cursorValue);\n },\n cursor(c) {\n return makeBuilder(config, surfaces, where, limit, c);\n },\n async execute() {\n return request<MetadataQueryResult>(config, {\n method: \"POST\",\n path: projectPath(requireProjectSlug(config), \"metadata/query\"),\n body: {\n surfaces,\n where,\n ...(limit !== undefined ? { limit } : {}),\n cursor: cursorValue,\n },\n });\n },\n };\n}\n\nexport function makeMetadataNamespace(config: HttpClientConfig) {\n return {\n /** Start a cross-surface metadata query against one or more surfaces (ch14 §3.1). */\n from(surface: MetadataSurface | readonly MetadataSurface[]): MetadataQueryBuilder {\n const surfaces = Array.isArray(surface) ? surface : [surface as MetadataSurface];\n if (surfaces.length === 0) {\n throw new KError({\n code: \"K9O_UNKNOWN_SURFACE\",\n message: \"client.metadata.from(...) requires at least one surface label.\",\n context: {},\n recommendation: \"Pass a surface like 'collection:posts', 'storage:images', or 'telemetry:auth.session.created'.\",\n });\n }\n return makeBuilder(config, surfaces, [], undefined, null);\n },\n };\n}\n","/**\n * Migration lifecycle SDK — `client.migrations.*`.\n *\n * Backed by the gateway migrations routes.\n * All routes are member-plane (`/@<projectSlug>/migrations/...`).\n *\n * Wire mapping:\n * - `apply({ migrations })` → POST /@<slug>/migrations/apply\n * - `list()` → GET /@<slug>/migrations\n * - `get(version)` → GET /@<slug>/migrations/<version>\n * - `queue({ migrations })` → POST /@<slug>/migrations/queue\n * - `listPending()` → GET /@<slug>/migrations/pending\n * - `applyPending(pendingId)` → POST /@<slug>/migrations/pending/<pendingId>/apply\n * - `rejectPending(pendingId)` → POST /@<slug>/migrations/pending/<pendingId>/reject\n * - `deletePending(pendingId)` → DELETE /@<slug>/migrations/pending/<pendingId>\n *\n * Migration shape — STRUCTURED\n * DECLARATIVE DDL, never raw SQL. Every schema change is a typed, key-tagged\n * operation, so schema drift is impossible at the SDK layer (the §2.1\n * invariant). Raw SQL is the separate runtime `client.query()` surface (§6),\n * which cannot create/alter schema. The gateway checksums each migration and\n * stores it in `_sys.migrations`; already-applied versions are skipped on\n * re-run and mismatched checksums are rejected, preserving the drift invariant.\n *\n * Per-operation field shapes are grounded in the gateway DDL parser\n * (`services/gateway/src/db/migration-runner.ts`), NOT invented.\n *\n * Verified against the gateway DDL parser:\n * - `up`/`down` arrays — parser now iterates them (shipped `2.58.0-beta.1`).\n * - ColumnSpec protection attrs — live since `2.56.0`; `encrypted` is the\n * `true | { store, searchable }` union with `searchable` NESTED (not a\n * sibling); `blind_indexed` is the C-mode sibling. Aligned above.\n * - Op set FROZEN at 6 (no alter_column/rename_table/constraint at v2).\n * `rename_column` is a pending 7th — to be added once its field\n * names are finalised and the re-encryption pass ships.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/** Foreign-key reference on a column — compiles to a REFERENCES clause. */\nexport type ColumnReferences = {\n collection: string;\n on: string;\n on_delete?: \"CASCADE\" | \"RESTRICT\" | \"SET NULL\" | \"NO ACTION\";\n on_update?: \"CASCADE\" | \"RESTRICT\" | \"SET NULL\" | \"NO ACTION\";\n};\n\n/**\n * A column definition. `type` is the ch04 §2.2.1 column-type vocabulary\n * (parser-owned; kept as `string` rather than a fabricated enum). The\n * protection attributes declare at-rest field encryption per §2.2.1 (gateway\n * shape verified vs the parser, live since `2.56.0`).\n */\nexport type ColumnSpec = {\n name: string;\n type: string;\n primary_key?: boolean;\n not_null?: boolean;\n unique?: boolean;\n default?: string;\n references?: ColumnReferences;\n /**\n * At-rest field encryption (§2.2.1). `true` = inline-stored encrypted column;\n * the object form opts into a `store` (\"inline\" | \"vault\") and the D-mode\n * searchable-encryption index (`searchable`). NOTE: `searchable` is NESTED\n * here — it is NOT a sibling attribute.\n */\n encrypted?: true | { store: \"inline\" | \"vault\"; searchable?: boolean };\n /** C-mode: deterministic blind index for equality lookup over an encrypted column. */\n blind_indexed?: boolean;\n};\n\n/** An index definition. `name` defaults to `<table>_<cols>_idx`. */\nexport type IndexSpec = {\n name?: string;\n columns: ReadonlyArray<string>;\n unique?: boolean;\n};\n\n/**\n * A single declarative DDL operation — KEY-TAGGED (exactly one key set), the\n * shape the gateway applies. The v2 set is these 7 — no `alter_column`,\n * `rename_table`, or constraint ops at v2. `alter_table` is the BATCHED column\n * mutation (one op carries optional `add_columns[]` + `drop_columns[]`), live in\n * the gateway runner (`migration-runner.ts:156`).\n * `rename_column` remains a pending future op (its parser field names are not yet\n * finalised); NOTE per ch04 §2.2.1/§2.2.3 a `rename_column` on an ENCRYPTED column\n * is fail-closed-rejected (`K9O_ENCRYPTED_COLUMN_DECLARATION_INVALID`) pending the\n * re-encryption pass — to document when that op lands.\n */\nexport type Operation =\n | { create_table: { name: string; columns: ReadonlyArray<ColumnSpec>; indexes?: ReadonlyArray<IndexSpec> } }\n | { drop_table: string }\n | { add_column: { table: string; column: ColumnSpec } }\n | { drop_column: { table: string; column: string } }\n | { alter_table: { name: string; add_columns?: ReadonlyArray<ColumnSpec>; drop_columns?: ReadonlyArray<string> } }\n | { create_index: { table: string; index: IndexSpec } }\n | { drop_index: { name: string } };\n\n/** A declarative authorization/relationship rule (compiles to RLS USING + WITH\n * CHECK per ch06 §4.2). The rule grammar is the policy-expression DSL. */\nexport type ActionRule = { rule?: unknown };\n\n/** A declared relationship for embedding/joins (ch04 §2.2 references). */\nexport type RelationshipSpec = {\n collection: string;\n on: string;\n as: string;\n type?: \"inner\" | \"left\";\n};\n\n/** Per-collection policy block (RLS + relationships), ch06 §4. */\nexport type CollectionPolicy = {\n references?: ReadonlyArray<RelationshipSpec>;\n actions?: {\n select?: ActionRule;\n insert?: ActionRule;\n update?: ActionRule;\n delete?: ActionRule;\n };\n};\n\n/** Per-bucket storage policy block, ch06 §5. */\nexport type StorageBucketPolicy = {\n public?: boolean;\n actions?: {\n read?: ActionRule;\n upload?: ActionRule;\n delete?: ActionRule;\n list?: ActionRule;\n };\n};\n\n/** The optional `policy` section authored alongside a migration. */\nexport type MigrationPolicy = {\n collections?: Record<string, CollectionPolicy>;\n storage?: { buckets?: Record<string, StorageBucketPolicy> };\n};\n\n/**\n * A migration — a versioned, checksummed unit of structured DDL. `up` applies\n * the change; `down` reverses it. Both are operation arrays.\n */\nexport type Migration = {\n version: number;\n slug: string;\n up: ReadonlyArray<Operation>;\n down: ReadonlyArray<Operation>;\n policy?: MigrationPolicy;\n};\n\n/**\n * Applied-migration record returned by `list` + `get`.\n */\nexport type AppliedMigration = {\n version: number;\n slug: string;\n checksum: string;\n appliedAt: string;\n};\n\n/**\n * Pending migration record returned by `listPending`.\n */\nexport type PendingMigration = {\n pendingId: string;\n version: number;\n slug: string;\n checksum: string;\n submittedAt: string;\n submittedBy: string;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"migrations operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makeMigrationsNamespace(config: HttpClientConfig) {\n return {\n /** Apply migrations immediately (PROJECT_ADMIN minimum). */\n async apply(input: { migrations: ReadonlyArray<Migration> }): Promise<Envelope<{ applied: ReadonlyArray<AppliedMigration> }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, \"migrations/apply\"),\n body: input,\n });\n },\n\n /** List applied migrations on the project. */\n async list(): Promise<Envelope<ReadonlyArray<AppliedMigration>>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"migrations\"),\n });\n },\n\n /** Get a single applied migration by version. */\n async get(version: number): Promise<Envelope<AppliedMigration>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `migrations/${encodeURIComponent(String(version))}`),\n });\n },\n\n /** Queue migrations for maker-checker approval per ch06 §8. */\n async queue(input: { migrations: ReadonlyArray<Migration> }): Promise<Envelope<{ pending: ReadonlyArray<PendingMigration> }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, \"migrations/queue\"),\n body: input,\n });\n },\n\n /** List pending (queued, not yet approved) migrations. */\n async listPending(): Promise<Envelope<ReadonlyArray<PendingMigration>>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"migrations/pending\"),\n });\n },\n\n /**\n * Apply a queued migration by id (§2.6 same-actor fast path — floors at\n * PROJECT_ADMIN; a `pending_approval` row, i.e. a protected-collection\n * migration awaiting a distinct-admin's review, is refused here and\n * needs its own approval flow, not this call).\n */\n async applyPending(pendingId: string): Promise<Envelope<AppliedMigration>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `migrations/pending/${encodeURIComponent(pendingId)}/apply`),\n });\n },\n\n /** Reject a pending migration (transitions to rejected; does not apply). */\n async rejectPending(pendingId: string, input?: { reason?: string }): Promise<Envelope<{ rejected: boolean }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `migrations/pending/${encodeURIComponent(pendingId)}/reject`),\n body: input,\n });\n },\n\n /** Delete a pending migration from the queue. */\n async deletePending(pendingId: string): Promise<Envelope<{ deleted: boolean }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"DELETE\",\n path: projectPath(slug, `migrations/pending/${encodeURIComponent(pendingId)}`),\n });\n },\n };\n}\n","/**\n * Function lifecycle SDK — `client.functions.*`.\n *\n * Backed by the gateway functions and invoke routes.\n *\n * Wire mapping:\n * - `deploy({ name, runtime, code, ... })` → POST /@<slug>/functions\n * - `list()` → GET /@<slug>/functions\n * - `get(name)` → GET /@<slug>/functions/<name>\n * - `delete(name)` → DELETE /@<slug>/functions/<name>\n * - `invoke(name, payload)` → POST /@<slug>/functions/<name>/invoke\n *\n * Per ch07 §3.3: deploy requires PROJECT_ADMIN; invoke authority is per\n * function manifest. Per ch07 §3.1: deploy returns 202 with status\n * `deploying`; the function is ready when status flips to `active`.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/**\n * Function record returned by gateway endpoints.\n */\nexport type FunctionRecord = {\n /** `fn_<base62>` per ch01 §3.2. */\n id: string;\n name: string;\n runtime: \"wasm\" | \"bun\" | \"node\";\n status: \"deploying\" | \"active\" | \"retired\" | \"failed\";\n tier: \"low\" | \"medium\" | \"high\";\n createdAt: string;\n updatedAt: string | null;\n};\n\n/**\n * Deploy input. The `code` field is the runtime bundle (base64-encoded\n * WASM or JS source) per ch07 §3.4.\n */\nexport type DeployFunctionInput = {\n name: string;\n runtime: \"wasm\" | \"bun\" | \"node\";\n code: string;\n tier?: \"low\" | \"medium\" | \"high\";\n config?: Record<string, unknown>;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"functions operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makeFunctionsNamespace(config: HttpClientConfig) {\n return {\n /** Deploy or redeploy a function. Returns the function record with status. */\n async deploy(input: DeployFunctionInput): Promise<Envelope<FunctionRecord>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, \"functions\"),\n body: input,\n });\n },\n\n /** List deployed functions (cursor pagination per ch01 §6.4). */\n async list(opts?: { limit?: number; cursor?: string; status?: FunctionRecord[\"status\"] }): Promise<Envelope<ReadonlyArray<FunctionRecord>>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"functions\"),\n query: opts,\n });\n },\n\n /** Get a function by name. */\n async get(name: string): Promise<Envelope<FunctionRecord>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `functions/${encodeURIComponent(name)}`),\n });\n },\n\n /** Retire a function. Returns confirmation; the function name enters a 24h cooldown per ch07 §3.1. */\n async delete(name: string): Promise<Envelope<{ retired: boolean; cooldownUntil: string }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"DELETE\",\n path: projectPath(slug, `functions/${encodeURIComponent(name)}`),\n });\n },\n\n /**\n * Invoke a function. The `payload` is passed to the function runtime\n * verbatim; the gateway returns whatever the function returns wrapped\n * in the standard envelope.\n *\n * Per ch07 §3.3: invoke authority is per-function (declared in the\n * function manifest). Per ch07 §5: streaming responses use the\n * subscription/async-iterator pattern; this method covers the\n * request-response variant only.\n */\n async invoke<TResult = unknown, TPayload = unknown>(name: string, payload: TPayload): Promise<Envelope<TResult>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `functions/${encodeURIComponent(name)}/invoke`),\n body: payload,\n });\n },\n };\n}\n","/**\n * Policy bundle lifecycle SDK — `client.policies.*`.\n *\n * Backed by the gateway policies routes.\n *\n * Wire mapping:\n * - `current()` → GET /@<slug>/policy (active policy)\n * - `list()` → GET /@<slug>/policies (all bundles)\n * - `create({...})` → POST /@<slug>/policies (draft bundle)\n * - `validate({...})` → POST /@<slug>/policies/validate (lint without persist)\n * - `get(bundleId)` → GET /@<slug>/policies/<id>\n * - `update(bundleId, patch)` → PATCH /@<slug>/policies/<id>\n * - `delete(bundleId)` → DELETE /@<slug>/policies/<id>\n * - `publish(bundleId)` → POST /@<slug>/policies/<id>/publish\n *\n * Per ch06 §9.4: only Pathmaker-class roles author policy; only\n * Custodian-class roles publish. `validate` is read-only and any role\n * with policy-read can lint a candidate bundle.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\nexport type PolicyBundle = {\n /** `pol_<base62>` per ch01 §3.2. */\n id: string;\n name: string;\n version: number;\n status: \"draft\" | \"published\" | \"deactivated\";\n rules: Record<string, unknown>;\n createdAt: string;\n publishedAt: string | null;\n createdBy: string;\n};\n\nexport type CreatePolicyInput = {\n name: string;\n rules: Record<string, unknown>;\n};\n\nexport type UpdatePolicyInput = {\n name?: string;\n rules?: Record<string, unknown>;\n};\n\nexport type ValidatePolicyResult = {\n valid: boolean;\n errors: ReadonlyArray<{ rule: string; message: string }>;\n warnings: ReadonlyArray<{ rule: string; message: string }>;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"policies operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makePoliciesNamespace(config: HttpClientConfig) {\n return {\n /** Return the currently-active policy for the project. */\n async current(): Promise<Envelope<PolicyBundle | null>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"policy\"),\n });\n },\n\n /** List all policy bundles (draft + published + deactivated). */\n async list(opts?: { status?: PolicyBundle[\"status\"] | undefined; limit?: number | undefined; cursor?: string | undefined }): Promise<Envelope<ReadonlyArray<PolicyBundle>>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"policies\"),\n query: opts,\n });\n },\n\n /** Create a draft policy bundle. */\n async create(input: CreatePolicyInput): Promise<Envelope<PolicyBundle>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, \"policies\"),\n body: input,\n });\n },\n\n /** Lint a candidate rule set without persisting. */\n async validate(input: { rules: Record<string, unknown> }): Promise<Envelope<ValidatePolicyResult>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, \"policies/validate\"),\n body: input,\n });\n },\n\n /** Get a single bundle by id. */\n async get(bundleId: string): Promise<Envelope<PolicyBundle>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `policies/${encodeURIComponent(bundleId)}`),\n });\n },\n\n /** Patch a draft bundle. Cannot patch published bundles (publish→republish flow). */\n async update(bundleId: string, patch: UpdatePolicyInput): Promise<Envelope<PolicyBundle>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"PATCH\",\n path: projectPath(slug, `policies/${encodeURIComponent(bundleId)}`),\n body: patch,\n });\n },\n\n /** Delete a draft bundle. Cannot delete published bundles. */\n async delete(bundleId: string): Promise<Envelope<{ deleted: boolean }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"DELETE\",\n path: projectPath(slug, `policies/${encodeURIComponent(bundleId)}`),\n });\n },\n\n /** Publish a draft bundle — transitions to `published` + becomes active for the project. */\n async publish(bundleId: string): Promise<Envelope<PolicyBundle>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `policies/${encodeURIComponent(bundleId)}/publish`),\n });\n },\n };\n}\n","/**\n * Audit log query SDK — `client.audit.*`.\n *\n * Backed by the gateway audit-log routes.\n *\n * Wire mapping:\n * - `query({ since, until, type, actorId, targetKind, targetId, limit, cursor })`\n * → GET /@<slug>/audit-log?...\n *\n * The endpoint accepts cursor-paginated reverse-chronological queries.\n * `type` is the audit-event namespace (e.g. `data.write.access.insert`,\n * `gate.signin.success`) per the ch05 §4 event-name taxonomy +\n * `feedback_error_code_namespace_boundary_and_prefix.md` cement.\n *\n * Returns audit events with full context payload — actorId / targetKind /\n * targetId / payload / occurredAt / requestId / traceId per ch05 §4.2.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/**\n * Audit event record per ch05 §4.2 `_sys.audit_log` shape.\n */\nexport type AuditEvent = {\n id: string;\n /** Dotted namespace per ch05 §4 (e.g. `data.write.access.insert`). */\n type: string;\n actorId: string | null;\n targetKind: string | null;\n targetId: string | null;\n payload: Record<string, unknown>;\n occurredAt: string;\n requestId: string | null;\n traceId: string | null;\n};\n\nexport type AuditQueryOpts = {\n /** ISO 8601 lower bound (inclusive). */\n since?: string | undefined;\n /** ISO 8601 upper bound (exclusive). */\n until?: string | undefined;\n /** Filter by event type (exact match; future cycles may add prefix-match). */\n type?: string | undefined;\n /** Filter by actor. */\n actorId?: string | undefined;\n /** Filter by target resource kind. */\n targetKind?: string | undefined;\n /** Filter by target resource id. */\n targetId?: string | undefined;\n /** Page size (per-tier max bounded server-side). */\n limit?: number | undefined;\n /** Cursor from prior response. */\n cursor?: string | undefined;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"audit operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makeAuditNamespace(config: HttpClientConfig) {\n return {\n /**\n * Query the audit log. Returns reverse-chronological events matching\n * all supplied filters (AND composition).\n *\n * Per ch05 §4 RBAC: requires `AUDIT_READER` role minimum; Custodian-\n * class roles inherit. Project-level audit is project-scoped (this\n * endpoint); platform-level audit is admin-only (separate surface).\n */\n async query(opts?: AuditQueryOpts): Promise<Envelope<ReadonlyArray<AuditEvent>>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"audit-log\"),\n query: opts,\n });\n },\n\n /**\n * Convenience: live-tail recent events. Currently single-shot read\n * with `since` defaulted to \"1 minute ago\"; subscription-mode tail\n * (SSE) lands when the streaming layer ships per ch04 §8 pattern.\n */\n async tail(opts?: { sinceMinutes?: number; limit?: number }): Promise<Envelope<ReadonlyArray<AuditEvent>>> {\n const slug = requireProjectSlug(config);\n const minutes = opts?.sinceMinutes ?? 1;\n const since = new Date(Date.now() - minutes * 60_000).toISOString();\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"audit-log\"),\n query: { since, limit: opts?.limit ?? 100 },\n });\n },\n };\n}\n","/**\n * Org lifecycle SDK — `client.orgs.*`.\n *\n * Backed by the gateway orgs routes.\n *\n * Wire mapping (all org-plane / platform-plane):\n * - `list()` → GET /orgs\n * - `get(orgSlug)` → GET /orgs/<orgSlug>\n * - `restore(orgId)` → POST /orgs/<orgId>/restore\n * - `current()` → GET /org\n *\n * The `current()` endpoint returns the org bound to the caller's session\n * context (via `x-k9o-org-slug` header or token claim). `get` addresses an\n * explicit org by its **slug** (slug-first management grammar) for\n * cross-org admin scenarios; most callers reach for `current()`.\n * `restore` is the one exception — it stays keyed by `orgId`, because a\n * soft-deleted org's slug is tombstoned and may have been reassigned.\n *\n * Per ch02 RBAC: org listing is scoped by the caller's accessible orgs\n * (most callers see exactly one — their own). Org creation is currently\n * out of scope at v0.1.0 (signup flow per ch10 §1; future sub-cycle\n * wires `client.orgs.create()` once signup substrate stabilises).\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { orgPath, validateSlug } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\nexport type Org = {\n /** `org_<base62>` per ch01 §3.2. */\n id: string;\n slug: string;\n name: string;\n status: \"active\" | \"suspended\" | \"soft-deleted\";\n createdAt: string;\n updatedAt: string | null;\n};\n\nexport function makeOrgsNamespace(config: HttpClientConfig) {\n return {\n /** List orgs accessible to the caller. */\n async list(): Promise<Envelope<ReadonlyArray<Org>>> {\n return request(config, {\n method: \"GET\",\n path: orgPath(\"orgs\"),\n });\n },\n\n /** Get a single org by slug. */\n async get(orgSlug: string): Promise<Envelope<Org>> {\n validateSlug(orgSlug, \"org\");\n return request(config, {\n method: \"GET\",\n path: orgPath(`orgs/${encodeURIComponent(orgSlug)}`),\n });\n },\n\n /** Restore a soft-deleted org. */\n async restore(orgId: string): Promise<Envelope<Org>> {\n return request(config, {\n method: \"POST\",\n path: orgPath(`orgs/${encodeURIComponent(orgId)}/restore`),\n });\n },\n\n /** Get the org bound to the caller's current session context. */\n async current(): Promise<Envelope<Org>> {\n return request(config, {\n method: \"GET\",\n path: orgPath(\"org\"),\n });\n },\n };\n}\n","/**\n * Org-plane SDK namespace — `client.org.*`.\n *\n * Covers org members, groups, SMTP, audit and gate administration.\n *\n * Distinct from `client.orgs` (collection-style; list/get/restore/current\n * across accessible orgs) — `client.org` is the singular bound-org\n * namespace with member / group / smtp / audit / gate sub-namespaces.\n *\n * Org-plane URL grammar per v2.5.68 §5.4: requests route against the\n * `<orgSlug>.api.k9o.io/` org subdomain WITHOUT the `@<projectSlug>/`\n * prefix used by project-plane requests. The gateway resolves the org\n * context from the subdomain.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { orgPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\nimport type { LLMModelId } from \"./compute/llms.ts\";\n\n// ----------------------------------------------------------------------\n// Types\n// ----------------------------------------------------------------------\n\nexport type OrgMember = {\n /** `u_<base62>` per ch01 §3.2. */\n userId: string;\n email: string;\n /** Org-level role enum per ch05 §2.1. */\n role: \"ORG_OWNER\" | \"ORG_ADMIN\" | \"ORG_BILLING_ADMIN\" | \"ORG_MEMBER\";\n joinedAt: string;\n status: \"active\" | \"invited\" | \"suspended\";\n};\n\nexport type OrgGroup = {\n /** `grp_<base62>` per ch01 §3.2. */\n id: string;\n name: string;\n memberCount: number;\n createdAt: string;\n};\n\nexport type OrgRoleGrant = {\n /** `grt_<base62>` per ch02 §6.5. */\n id: string;\n userId: string;\n role: \"ORG_ADMIN\" | \"ORG_BILLING_ADMIN\";\n grantedBy: string;\n grantedAt: string;\n revokedAt: string | null;\n revokedBy: string | null;\n viaDelegationId: string | null;\n};\n\n/**\n * Org-level audit event per ch05 §4.2 6-event family.\n *\n * Event types (closed set at v2.1.132):\n * - `data.write.org.member_invited`\n * - `data.write.org.member_removed`\n * - `data.write.org.role_granted`\n * - `data.write.org.role_revoked`\n * - `data.write.org.idp_config_changed`\n * - `data.write.org.settings_updated`\n *\n * `targetKind` is `org` for all; `targetId` is the orgId per ch05 §4.1.\n */\nexport type OrgAuditEvent = {\n id: string;\n type: string;\n actorId: string | null;\n targetKind: \"org\";\n targetId: string;\n payload: Record<string, unknown>;\n occurredAt: string;\n requestId: string | null;\n traceId: string | null;\n};\n\n/**\n * Org SMTP configuration per ch02 §6.6. Sensitive fields (passwordRef)\n * are sequestered in Kibo enclave; the SDK stores only the reference.\n */\nexport type SmtpConfig = {\n host: string;\n port: number;\n username: string;\n /** Kibo enclave credential reference; opaque token. */\n passwordRef: string;\n fromEmail: string;\n fromName: string;\n encryption: \"none\" | \"starttls\" | \"tls\";\n replyToEmail?: string | undefined;\n};\n\nexport type SmtpTestEmailInput = {\n to: string;\n /** Optional override of the from address for the test send (defaults to fromEmail). */\n fromOverride?: string | undefined;\n};\n\nexport type SmtpTestEmailResult = {\n ok: boolean;\n /** Diagnostic message returned by the SMTP server (success or error detail). */\n diagnostic: string;\n /** ISO 8601 timestamp of the test attempt. */\n attemptedAt: string;\n};\n\nexport type OrgIdpProvider = {\n /** `idp_<base62>` per ch01 §3.2. */\n id: string;\n name: string;\n /** Protocol/vendor (e.g. \"okta-saml\", \"azure-ad-oidc\", \"google-workspace\"). */\n kind: string;\n enabled: boolean;\n createdAt: string;\n};\n\nexport type CreateOrgIdpInput = {\n name: string;\n kind: string;\n config: Record<string, unknown>;\n};\n\n// ----------------------------------------------------------------------\n// Sub-namespace factories\n// ----------------------------------------------------------------------\n\nfunction makeMembersNamespace(config: HttpClientConfig) {\n return {\n /** GET /members (org-plane LIST). */\n async list(opts?: { limit?: number | undefined; cursor?: string | undefined; status?: OrgMember[\"status\"] | undefined }): Promise<Envelope<ReadonlyArray<OrgMember>>> {\n return request(config, { method: \"GET\", path: orgPath(\"members\"), query: opts });\n },\n\n /** POST /members — invite a new org member by email. */\n async invite(input: { email: string; role: OrgMember[\"role\"] }): Promise<Envelope<OrgMember>> {\n return request(config, { method: \"POST\", path: orgPath(\"members\"), body: input });\n },\n\n /** GET /members/<userId> — single-read (existing endpoint). */\n async get(userId: string): Promise<Envelope<OrgMember>> {\n return request(config, { method: \"GET\", path: orgPath(`members/${encodeURIComponent(userId)}`) });\n },\n\n /** DELETE /members/<userId> — remove a member from the org. */\n async remove(userId: string): Promise<Envelope<{ removed: boolean }>> {\n return request(config, { method: \"DELETE\", path: orgPath(`members/${encodeURIComponent(userId)}`) });\n },\n };\n}\n\nfunction makeGroupsNamespace(config: HttpClientConfig) {\n return {\n /** GET /groups (org-plane LIST). */\n async list(opts?: { limit?: number; cursor?: string }): Promise<Envelope<ReadonlyArray<OrgGroup>>> {\n return request(config, { method: \"GET\", path: orgPath(\"groups\"), query: opts });\n },\n\n /** POST /groups — create a new group. */\n async create(input: { name: string }): Promise<Envelope<OrgGroup>> {\n return request(config, { method: \"POST\", path: orgPath(\"groups\"), body: input });\n },\n\n /** GET /groups/<groupId> — single-read (pre-cement existing endpoint). */\n async get(groupId: string): Promise<Envelope<OrgGroup>> {\n return request(config, { method: \"GET\", path: orgPath(`groups/${encodeURIComponent(groupId)}`) });\n },\n\n /** DELETE /groups/<groupId> — remove a group. */\n async delete(groupId: string): Promise<Envelope<{ deleted: boolean }>> {\n return request(config, { method: \"DELETE\", path: orgPath(`groups/${encodeURIComponent(groupId)}`) });\n },\n };\n}\n\nfunction makeOrgAuditLogNamespace(config: HttpClientConfig) {\n return {\n /**\n * GET /audit-log (org-plane).\n * Distinct from project-plane `client.audit.query()` which routes to\n * `@<projectSlug>/audit-log`. Org-plane events cover the 6-event family\n * per ch05 §4.2 (member_invited/removed/role_granted/revoked/\n * idp_config_changed/settings_updated).\n */\n async query(opts?: {\n since?: string | undefined; until?: string | undefined; type?: string | undefined; actorId?: string | undefined;\n targetKind?: string | undefined; targetId?: string | undefined; limit?: number | undefined; cursor?: string | undefined;\n }): Promise<Envelope<ReadonlyArray<OrgAuditEvent>>> {\n return request(config, { method: \"GET\", path: orgPath(\"audit-log\"), query: opts });\n },\n\n /** Convenience: recent events (defaults to 5 minute window). */\n async tail(opts?: { sinceMinutes?: number; limit?: number }): Promise<Envelope<ReadonlyArray<OrgAuditEvent>>> {\n const minutes = opts?.sinceMinutes ?? 5;\n const since = new Date(Date.now() - minutes * 60_000).toISOString();\n return request(config, {\n method: \"GET\",\n path: orgPath(\"audit-log\"),\n query: { since, limit: opts?.limit ?? 100 },\n });\n },\n };\n}\n\nfunction makeOrgGateNamespace(config: HttpClientConfig) {\n return {\n roles: {\n /** GET /org-role-grants — list active grants per ch02 §6.5 ask 4. */\n async list(opts?: { userId?: string | undefined; role?: OrgRoleGrant[\"role\"] | undefined; includeRevoked?: boolean | undefined }): Promise<Envelope<ReadonlyArray<OrgRoleGrant>>> {\n return request(config, { method: \"GET\", path: orgPath(\"org-role-grants\"), query: opts });\n },\n\n /** POST /org-role-grants — grant an ORG_ADMIN or ORG_BILLING_ADMIN role. */\n async grant(input: { userId: string; role: OrgRoleGrant[\"role\"] }): Promise<Envelope<OrgRoleGrant>> {\n return request(config, { method: \"POST\", path: orgPath(\"org-role-grants\"), body: input });\n },\n\n /** GET /org-role-grants/<grantId> — single-read. */\n async get(grantId: string): Promise<Envelope<OrgRoleGrant>> {\n return request(config, { method: \"GET\", path: orgPath(`org-role-grants/${encodeURIComponent(grantId)}`) });\n },\n\n /** DELETE /org-role-grants/<grantId> — revoke a grant (soft delete; sets revokedAt). */\n async revoke(grantId: string): Promise<Envelope<OrgRoleGrant>> {\n return request(config, { method: \"DELETE\", path: orgPath(`org-role-grants/${encodeURIComponent(grantId)}`) });\n },\n },\n\n idpProviders: {\n /** GET /idp-providers — list configured org operator IdP providers per ch02 §6.5 ask 7. */\n async list(): Promise<Envelope<ReadonlyArray<OrgIdpProvider>>> {\n return request(config, { method: \"GET\", path: orgPath(\"idp-providers\") });\n },\n\n /** POST /idp-providers — create a new IdP integration. */\n async create(input: CreateOrgIdpInput): Promise<Envelope<OrgIdpProvider>> {\n return request(config, { method: \"POST\", path: orgPath(\"idp-providers\"), body: input });\n },\n\n /** GET /idp-providers/<idpId>. */\n async get(idpId: string): Promise<Envelope<OrgIdpProvider>> {\n return request(config, { method: \"GET\", path: orgPath(`idp-providers/${encodeURIComponent(idpId)}`) });\n },\n\n /** PATCH /idp-providers/<idpId> — update config or enable/disable. */\n async configure(idpId: string, patch: { name?: string; enabled?: boolean; config?: Record<string, unknown> }): Promise<Envelope<OrgIdpProvider>> {\n return request(config, { method: \"PATCH\", path: orgPath(`idp-providers/${encodeURIComponent(idpId)}`), body: patch });\n },\n\n /** DELETE /idp-providers/<idpId>. */\n async delete(idpId: string): Promise<Envelope<{ deleted: boolean }>> {\n return request(config, { method: \"DELETE\", path: orgPath(`idp-providers/${encodeURIComponent(idpId)}`) });\n },\n },\n };\n}\n\nfunction makeSmtpNamespace(config: HttpClientConfig) {\n return {\n /**\n * GET /org/smtp — read current SMTP config.\n * Returns null when no org-level SMTP is configured (falls back to\n * platform SMTP per ch02 §6.6 3-tier cascade).\n */\n async get(): Promise<Envelope<SmtpConfig | null>> {\n return request(config, { method: \"GET\", path: orgPath(\"org/smtp\") });\n },\n\n /**\n * PATCH /orgs/<orgSlug> with `smtpConfig` body — set or update SMTP.\n * PATCH on the org resource accepts smtpConfig.\n * Passwords route through Kibo enclave — SDK accepts plaintext at\n * the SDK boundary; gateway stores the reference.\n */\n async set(config_: Omit<SmtpConfig, \"passwordRef\"> & { password: string }): Promise<Envelope<SmtpConfig>> {\n return request(config, { method: \"PATCH\", path: orgPath(\"org\"), body: { smtpConfig: config_ } });\n },\n\n /**\n * POST /org/smtp/test-email — send a diagnostic email to verify config.\n * 5/hour rate limit; RFC 5322 validation;\n * 3-tier resolution (platform→org→project) of effective SMTP.\n */\n async test(input: SmtpTestEmailInput): Promise<Envelope<SmtpTestEmailResult>> {\n return request(config, { method: \"POST\", path: orgPath(\"org/smtp/test-email\"), body: input });\n },\n\n /** PATCH /orgs/<orgSlug> with `smtpConfig: null` — clear org-level SMTP. */\n async unset(): Promise<Envelope<{ cleared: boolean }>> {\n return request(config, { method: \"PATCH\", path: orgPath(\"org\"), body: { smtpConfig: null } });\n },\n };\n}\n\nfunction makeDefaultLlmNamespace(config: HttpClientConfig) {\n return {\n /**\n * GET /org/default-llm — read the org-default LLM model id per ch07\n * §10.3. Returns `null` when no explicit default is set (gateway\n * falls back to `mistral-7b` per §10.3). ORG_ADMIN read; tier-gated.\n */\n async get(): Promise<Envelope<LLMModelId | null>> {\n return request(config, { method: \"GET\", path: orgPath(\"org/default-llm\") });\n },\n\n /**\n * PATCH /org/default-llm — set the org-default LLM per ch07 §10.3.\n * ORG_ADMIN only. The model must be available to the org's tier per\n * §10.1 or the gateway returns K9O_TIER_FEATURE_GATED.\n */\n async set(input: { modelId: LLMModelId }): Promise<Envelope<LLMModelId>> {\n return request(config, { method: \"PATCH\", path: orgPath(\"org/default-llm\"), body: input });\n },\n };\n}\n\n// ----------------------------------------------------------------------\n// Top-level namespace\n// ----------------------------------------------------------------------\n\nexport function makeOrgNamespace(config: HttpClientConfig) {\n return {\n /** Member lifecycle — list / invite / get / remove. */\n members: makeMembersNamespace(config),\n /** Group lifecycle — list / create / get / delete. */\n groups: makeGroupsNamespace(config),\n /** Org-plane audit log — query / tail. Distinct from project-plane `client.audit`. */\n auditLog: makeOrgAuditLogNamespace(config),\n /** Gate (IAK) org-level surfaces — role-grants + IdP-providers. */\n gate: makeOrgGateNamespace(config),\n /** Org-level SMTP config — get / set / test / unset. */\n smtp: makeSmtpNamespace(config),\n /** Org-default LLM — get / set per ch07 §10.3 (ORG_ADMIN). */\n defaultLLM: makeDefaultLlmNamespace(config),\n\n /**\n * GET /org — read the current org (slug + name + status + settings).\n * Mirrors `client.orgs.current()` for symmetry; `client.org.get()` is\n * the singular-namespace convention for use within an org-bound client.\n */\n async get(): Promise<Envelope<{ id: string; slug: string; name: string; status: string; createdAt: string }>> {\n return request(config, { method: \"GET\", path: orgPath(\"org\") });\n },\n };\n}\n","/**\n * Operator-self SDK namespace — `client.me.*`.\n *\n * Distinct from tenant-\n * scoped surfaces: `/me/*` is the operator-self lane that does NOT\n * require org or project context.\n *\n * Wire mapping (gateway uses platform-plane / cross-org `/me/...` routes):\n * - `client.me.profile.get/update` → GET/PATCH /me\n * - `client.me.sessions.list/revoke` → GET/DELETE /me/sessions\n * - `client.me.apiTokens.list/create/delete` → GET/POST/DELETE /me/api-tokens (forward sub-cycle)\n * - `client.me.notifications.list/markRead` → GET/PATCH /me/notifications (forward sub-cycle)\n * - `client.me.auditLog.query` → GET /me/audit-log (forward sub-cycle)\n * - `client.me.dataExport.request` → POST /me/data-export (forward sub-cycle)\n *\n * Profile, sessions and MFA setup are served by the existing gateway routes\n * `me.ts` + `mfa.ts`.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { orgPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\nexport type MyProfile = {\n /** `u_<base62>` per ch01 §3.2. */\n id: string;\n email: string;\n displayName: string | null;\n /** ISO 8601. */\n createdAt: string;\n /** Last activity timestamp. */\n lastActiveAt: string | null;\n};\n\nexport type MySession = {\n /** `sess_<base62>`. */\n id: string;\n /** Initial sign-in time. */\n createdAt: string;\n /** Most recent activity time. */\n lastSeenAt: string;\n userAgent: string | null;\n ipAddress: string | null;\n /** Whether this session is the one issuing the current request. */\n current: boolean;\n};\n\nexport type MyApiToken = {\n /** `tok_<base62>`. */\n id: string;\n name: string;\n /** ISO 8601. */\n createdAt: string;\n /** ISO 8601 or null for non-expiring tokens. */\n expiresAt: string | null;\n /** Last 4 chars for display. */\n suffix: string;\n scope: string;\n};\n\nexport type MyNotification = {\n id: string;\n type: string;\n payload: Record<string, unknown>;\n createdAt: string;\n readAt: string | null;\n};\n\nexport function makeMeNamespace(config: HttpClientConfig) {\n return {\n profile: {\n /** GET /me — operator profile (cross-org). */\n async get(): Promise<Envelope<MyProfile>> {\n return request(config, { method: \"GET\", path: orgPath(\"me\") });\n },\n\n /** PATCH /me — update mutable profile fields (displayName). */\n async update(patch: { displayName?: string | null }): Promise<Envelope<MyProfile>> {\n return request(config, { method: \"PATCH\", path: orgPath(\"me\"), body: patch });\n },\n },\n\n sessions: {\n /** GET /me/sessions — list active sessions for the operator. */\n async list(): Promise<Envelope<ReadonlyArray<MySession>>> {\n return request(config, { method: \"GET\", path: orgPath(\"me/sessions\") });\n },\n\n /** DELETE /me/sessions/<sessionId> — revoke a specific session. */\n async revoke(sessionId: string): Promise<Envelope<{ revoked: boolean }>> {\n return request(config, { method: \"DELETE\", path: orgPath(`me/sessions/${encodeURIComponent(sessionId)}`) });\n },\n\n /** DELETE /me/sessions (no path) — revoke all sessions except the current one. */\n async revokeAll(): Promise<Envelope<{ revoked: number }>> {\n return request(config, { method: \"DELETE\", path: orgPath(\"me/sessions\") });\n },\n },\n\n /**\n * API tokens for personal scripting (forward-cycle surface per ch12\n * §3.1 implicit; substrate not yet shipped per gateway routes audit).\n * Methods will return K9O_NOT_FOUND until gateway lands the endpoints.\n */\n apiTokens: {\n async list(): Promise<Envelope<ReadonlyArray<MyApiToken>>> {\n return request(config, { method: \"GET\", path: orgPath(\"me/api-tokens\") });\n },\n\n async create(input: { name: string; expiresInDays?: number | undefined; scope?: string | undefined }): Promise<Envelope<MyApiToken & { token: string }>> {\n return request(config, { method: \"POST\", path: orgPath(\"me/api-tokens\"), body: input });\n },\n\n async delete(tokenId: string): Promise<Envelope<{ deleted: boolean }>> {\n return request(config, { method: \"DELETE\", path: orgPath(`me/api-tokens/${encodeURIComponent(tokenId)}`) });\n },\n },\n\n /**\n * Notifications — operator-targeted (account-level events). Forward-\n * cycle substrate; methods route correctly when gateway ships.\n */\n notifications: {\n async list(opts?: { unreadOnly?: boolean | undefined; limit?: number | undefined; cursor?: string | undefined }): Promise<Envelope<ReadonlyArray<MyNotification>>> {\n return request(config, { method: \"GET\", path: orgPath(\"me/notifications\"), query: opts });\n },\n\n async markRead(notificationId: string): Promise<Envelope<MyNotification>> {\n return request(config, { method: \"PATCH\", path: orgPath(`me/notifications/${encodeURIComponent(notificationId)}`), body: { read: true } });\n },\n\n async markAllRead(): Promise<Envelope<{ marked: number }>> {\n return request(config, { method: \"PATCH\", path: orgPath(\"me/notifications\"), body: { read: true } });\n },\n },\n\n /**\n * Operator-self audit log — actions performed BY this operator across\n * orgs. Distinct from `client.audit` (project-plane) and\n * `client.org.auditLog` (org-plane).\n */\n auditLog: {\n async query(opts?: { since?: string | undefined; until?: string | undefined; type?: string | undefined; limit?: number | undefined; cursor?: string | undefined }): Promise<Envelope<ReadonlyArray<{ id: string; type: string; occurredAt: string; payload: Record<string, unknown> }>>> {\n return request(config, { method: \"GET\", path: orgPath(\"me/audit-log\"), query: opts });\n },\n },\n\n /**\n * Personal data export per GDPR-style requests. Returns a job id\n * the operator polls for completion.\n */\n dataExport: {\n async request(input?: { format?: \"json\" | \"csv\" }): Promise<Envelope<{ jobId: string; status: \"queued\" | \"in-progress\" | \"ready\" }>> {\n return request(config, { method: \"POST\", path: orgPath(\"me/data-export\"), body: input ?? {} });\n },\n\n async status(jobId: string): Promise<Envelope<{ jobId: string; status: \"queued\" | \"in-progress\" | \"ready\" | \"failed\"; downloadUrl: string | null }>> {\n return request(config, { method: \"GET\", path: orgPath(`me/data-export/${encodeURIComponent(jobId)}`) });\n },\n },\n };\n}\n","/**\n * Studio Workflows SDK — `client.studio.workflows.*`.\n *\n * Workflows substrate. Mirrors\n * `_sys.workflows` (§9.1) + `_sys.workflow_runs` (§9.2) row shapes.\n *\n * Wire mapping (project-plane; ch07 §9.6):\n * - list() → GET /@<slug>/workflows\n * - create(workflow) → POST /@<slug>/workflows\n * - read(id) → GET /@<slug>/workflows/<wfl-id>\n * - update(id, updates) → PATCH /@<slug>/workflows/<wfl-id>\n * - delete(id) → DELETE /@<slug>/workflows/<wfl-id>\n * - trigger(id, triggerContext) → POST /@<slug>/workflows/<wfl-id>/runs\n * - runs.list(id) → GET /@<slug>/workflows/<wfl-id>/runs\n * - runs.read(id, runId) → GET /@<slug>/workflows/<wfl-id>/runs/<wfr-id>\n * - runs.cancel(id, runId) → POST /@<slug>/workflows/<wfl-id>/runs/<wfr-id>/cancel\n *\n * Per ch07 §9.6 RBAC: create/update/delete/trigger/cancel require\n * PROJECT_AUTHOR; list/read/runs read against all cohort roles subject\n * to RLS. Per ch07 §9.11, surfaces 6 K9O_WORKFLOW_* error codes (see\n * `WORKFLOW_ERROR_CODES`); callers narrow on `error.code`.\n */\n\nimport { request, type HttpClientConfig } from \"../http.ts\";\nimport { projectPath } from \"../url-grammar.ts\";\nimport type { Envelope } from \"../envelope.ts\";\n\n// ----------------------------------------------------------------------\n// Enums (closed at v2 launch per ch07 §9.3 + §9.4; extensible v2.x)\n// ----------------------------------------------------------------------\n\n/** 5-trigger catalogue per ch07 §9.3. */\nexport type WorkflowTriggerType =\n | \"view_row_event\"\n | \"form_submission\"\n | \"scheduled\"\n | \"manual\"\n | \"webhook\";\n\n/** 9-action catalogue per ch07 §9.4. */\nexport type WorkflowActionType =\n | \"write_collection\"\n | \"read_collection\"\n | \"invoke_function\"\n | \"invoke_extension\"\n | \"llm_inference\"\n | \"send_notification\"\n | \"http_request\"\n | \"approval_step\"\n | \"branch\";\n\nexport type WorkflowStatus = \"active\" | \"archived\" | \"draft\";\n\nexport type WorkflowRunStatus =\n | \"pending\"\n | \"running\"\n | \"succeeded\"\n | \"failed\"\n | \"cancelled\";\n\n/** A single step in the `actions` chain per ch07 §9.4. */\nexport type WorkflowAction = {\n index: number;\n action_type: WorkflowActionType;\n config: Record<string, unknown>;\n retry?: { maxAttempts: number; backoffStrategy?: string };\n condition?: Record<string, unknown>;\n /** Sibling steps with parallel:true execute concurrently per §9.4. */\n parallel?: boolean;\n};\n\n// ----------------------------------------------------------------------\n// Resource shapes (mirror _sys.workflows + _sys.workflow_runs rows)\n// ----------------------------------------------------------------------\n\n/** Workflow record per ch07 §9.1 `_sys.workflows` row. */\nexport type Workflow = {\n /** `wfl_<base62>` per ch01 §3.2. */\n id: string;\n projectId: string;\n name: string;\n description: string;\n status: WorkflowStatus;\n triggerType: WorkflowTriggerType;\n /** Shape varies per triggerType per §9.3. */\n triggerConfig: Record<string, unknown>;\n /** Chain definition per §9.4. */\n actions: ReadonlyArray<WorkflowAction>;\n /** Approver-step participant resolution per §9.5. */\n rbacBinding: Record<string, unknown>;\n authoredBy: string;\n authoredAt: string;\n updatedBy: string;\n updatedAt: string;\n};\n\n/** Per-step status entry in a run per ch07 §9.2 `per_step_status`. */\nexport type WorkflowRunStep = {\n stepIndex: number;\n actionType: WorkflowActionType;\n status: \"running\" | \"succeeded\" | \"failed\" | \"awaiting_approval\";\n startedAt: string;\n completedAt?: string | null;\n error?: Record<string, unknown> | null;\n outputSummary?: unknown;\n costSubtotal?: number;\n};\n\n/** Workflow run record per ch07 §9.2 `_sys.workflow_runs` row. */\nexport type WorkflowRun = {\n /** `wfr_<base62>` per ch01 §3.2. */\n id: string;\n workflowId: string;\n projectId: string;\n status: WorkflowRunStatus;\n triggerContext: Record<string, unknown>;\n perStepStatus: ReadonlyArray<WorkflowRunStep>;\n costAccountingTotal: number;\n errorContext?: Record<string, unknown> | null;\n startedAt: string;\n completedAt: string | null;\n firedBy: string;\n};\n\n/** Create input — omits server-assigned fields per §9.1. */\nexport type CreateWorkflowInput = {\n name: string;\n description?: string;\n status?: WorkflowStatus;\n triggerType: WorkflowTriggerType;\n triggerConfig: Record<string, unknown>;\n actions: ReadonlyArray<WorkflowAction>;\n rbacBinding?: Record<string, unknown>;\n};\n\nexport type UpdateWorkflowInput = Partial<\n Pick<\n CreateWorkflowInput,\n \"name\" | \"description\" | \"status\" | \"triggerType\" | \"triggerConfig\" | \"actions\" | \"rbacBinding\"\n >\n>;\n\nexport type WorkflowListFilters = {\n limit?: number;\n cursor?: string;\n status?: WorkflowStatus;\n triggerType?: WorkflowTriggerType;\n};\n\nexport type WorkflowRunListFilters = {\n limit?: number;\n cursor?: string;\n status?: WorkflowRunStatus;\n};\n\n/**\n * 6 K9O_WORKFLOW_* error codes per ch07 §9.11. KError code-space is\n * open; these constants document the well-known codes for narrowing\n * (`if (e.code === WORKFLOW_ERROR_CODES.RUN_NOT_CANCELLABLE)`).\n */\nexport const WORKFLOW_ERROR_CODES = {\n NOT_FOUND: \"K9O_WORKFLOW_NOT_FOUND\",\n TRIGGER_INVALID: \"K9O_WORKFLOW_TRIGGER_INVALID\",\n ACTION_INVALID: \"K9O_WORKFLOW_ACTION_INVALID\",\n RUN_NOT_FOUND: \"K9O_WORKFLOW_RUN_NOT_FOUND\",\n RUN_NOT_CANCELLABLE: \"K9O_WORKFLOW_RUN_NOT_CANCELLABLE\",\n WEBHOOK_SIGNATURE_INVALID: \"K9O_WORKFLOW_WEBHOOK_SIGNATURE_INVALID\",\n} as const;\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"studio.workflows operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nfunction makeRunsNamespace(config: HttpClientConfig) {\n return {\n /** GET /@<slug>/workflows/<wfl-id>/runs — cursor-paginated runs list. */\n async list(workflowId: string, filters?: WorkflowRunListFilters): Promise<Envelope<ReadonlyArray<WorkflowRun>>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}/runs`),\n query: filters,\n });\n },\n\n /** GET /@<slug>/workflows/<wfl-id>/runs/<wfr-id> — run detail (per-step + cost). */\n async read(workflowId: string, runId: string): Promise<Envelope<WorkflowRun>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}`),\n });\n },\n\n /** POST /@<slug>/workflows/<wfl-id>/runs/<wfr-id>/cancel — cancel pending or running run. */\n async cancel(workflowId: string, runId: string): Promise<Envelope<WorkflowRun>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/cancel`),\n });\n },\n };\n}\n\nexport function makeWorkflowsNamespace(config: HttpClientConfig) {\n return {\n /** GET /@<slug>/workflows — list workflows (cursor pagination per ch01 §6.4). */\n async list(filters?: WorkflowListFilters): Promise<Envelope<ReadonlyArray<Workflow>>> {\n const slug = requireProjectSlug(config);\n return request(config, { method: \"GET\", path: projectPath(slug, \"workflows\"), query: filters });\n },\n\n /** POST /@<slug>/workflows — create a workflow. Requires PROJECT_AUTHOR. */\n async create(workflow: CreateWorkflowInput): Promise<Envelope<Workflow>> {\n const slug = requireProjectSlug(config);\n return request(config, { method: \"POST\", path: projectPath(slug, \"workflows\"), body: workflow });\n },\n\n /** GET /@<slug>/workflows/<wfl-id> — read a workflow. */\n async read(workflowId: string): Promise<Envelope<Workflow>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}`),\n });\n },\n\n /** PATCH /@<slug>/workflows/<wfl-id> — update a workflow. Requires PROJECT_AUTHOR. */\n async update(workflowId: string, updates: UpdateWorkflowInput): Promise<Envelope<Workflow>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"PATCH\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}`),\n body: updates,\n });\n },\n\n /** DELETE /@<slug>/workflows/<wfl-id> — delete a workflow. Requires PROJECT_AUTHOR. */\n async delete(workflowId: string): Promise<Envelope<{ deleted: boolean }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"DELETE\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}`),\n });\n },\n\n /**\n * POST /@<slug>/workflows/<wfl-id>/runs — manual-trigger a run.\n * Valid only for `triggerType: 'manual'` workflows per ch07 §9.6.\n * Requires PROJECT_AUTHOR. Returns the materialised WorkflowRun.\n */\n async trigger(workflowId: string, triggerContext: Record<string, unknown> = {}): Promise<Envelope<WorkflowRun>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}/runs`),\n body: triggerContext,\n });\n },\n\n /** Run sub-namespace — list / read / cancel runs of a workflow. */\n runs: makeRunsNamespace(config),\n };\n}\n","/**\n * Studio Dashboards SDK — `client.studio.dashboards.*`.\n *\n * Dashboards persisted authoring substrate.\n * Mirrors `_sys.dashboards` (§3.10.1) row shape.\n *\n * Wire mapping (project-plane; ch04 §3.10.4):\n * - list() → GET /@<slug>/dashboards\n * - create(dashboard) → POST /@<slug>/dashboards\n * - read(id) → GET /@<slug>/dashboards/<dsh-id>\n * - update(id, updates) → PATCH /@<slug>/dashboards/<dsh-id>\n * - delete(id) → DELETE /@<slug>/dashboards/<dsh-id>\n * - pin(id) → POST /@<slug>/dashboards/<dsh-id>/pin\n * - unpin(id) → POST /@<slug>/dashboards/<dsh-id>/unpin\n *\n * Per ch04 §3.10.4 RBAC: create/update/delete/pin/unpin require\n * PROJECT_AUTHOR; list/read read against all cohort roles subject\n * to RLS. Per ch04 §3.10.7, surfaces 2 K9O_DASHBOARD_* codes.\n */\n\nimport { request, type HttpClientConfig } from \"../http.ts\";\nimport { projectPath } from \"../url-grammar.ts\";\nimport type { Envelope } from \"../envelope.ts\";\n\n// ----------------------------------------------------------------------\n// Enums (closed at v2 launch per ch04 §3.10.2 + §3.10.3)\n// ----------------------------------------------------------------------\n\n/** 9-widget catalogue per ch04 §3.10.2. */\nexport type WidgetType =\n | \"kpi_card\"\n | \"bar_chart\"\n | \"line_chart\"\n | \"pie_chart\"\n | \"data_table\"\n | \"filter_dropdown\"\n | \"filter_date_range\"\n | \"text_panel\"\n | \"workflow_status\";\n\n/** Widget data source modes. */\nexport type WidgetDataSourceMode = \"view\" | \"query\" | \"workflow\" | \"rollup\" | \"form\";\n\nexport type DashboardStatus = \"active\" | \"archived\" | \"draft\";\n\n/** A widget config entry in the `widgets` array per ch04 §3.10.2. */\nexport type Widget = {\n id: string;\n widgetType: WidgetType;\n title?: string;\n dataSource: {\n mode: WidgetDataSourceMode;\n /** Resolved per mode: viewId / queryId / workflowId / rollupSlug / formId. */\n config: Record<string, unknown>;\n };\n /** Widget-local config (display options, thresholds, etc.). */\n config?: Record<string, unknown>;\n};\n\n// ----------------------------------------------------------------------\n// Resource shapes (mirror _sys.dashboards row)\n// ----------------------------------------------------------------------\n\n/** Dashboard record per ch04 §3.10.1 `_sys.dashboards` row. */\nexport type Dashboard = {\n /** `dsh_<base62>` per ch01 §3.2. */\n id: string;\n projectId: string;\n name: string;\n description: string;\n status: DashboardStatus;\n /** Widget positions + sizes per output-03 §3 layout schema. */\n layoutGrid: Record<string, unknown>;\n widgets: ReadonlyArray<Widget>;\n /** Dashboard-level filter widgets cascade to per-widget data sources. */\n filterConfig: Record<string, unknown>;\n /** Pathmaker org-pin per output-03 §9; surfaces in Workspace sidebar. */\n pinnedToWorkspace: boolean;\n rbacBinding: Record<string, unknown>;\n authoredBy: string;\n authoredAt: string;\n updatedBy: string;\n updatedAt: string;\n};\n\nexport type CreateDashboardInput = {\n name: string;\n description?: string;\n status?: DashboardStatus;\n layoutGrid?: Record<string, unknown>;\n widgets?: ReadonlyArray<Widget>;\n filterConfig?: Record<string, unknown>;\n rbacBinding?: Record<string, unknown>;\n};\n\nexport type UpdateDashboardInput = Partial<CreateDashboardInput>;\n\nexport type DashboardListFilters = {\n limit?: number;\n cursor?: string;\n status?: DashboardStatus;\n pinnedToWorkspace?: boolean;\n};\n\n/** 2 K9O_DASHBOARD_* error codes per ch04 §3.10.7. */\nexport const DASHBOARD_ERROR_CODES = {\n NOT_FOUND: \"K9O_DASHBOARD_NOT_FOUND\",\n WIDGET_INVALID: \"K9O_DASHBOARD_WIDGET_INVALID\",\n} as const;\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"studio.dashboards operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makeDashboardsNamespace(config: HttpClientConfig) {\n return {\n /** GET /@<slug>/dashboards — list dashboards (cursor pagination per ch01 §6.4). */\n async list(filters?: DashboardListFilters): Promise<Envelope<ReadonlyArray<Dashboard>>> {\n const slug = requireProjectSlug(config);\n return request(config, { method: \"GET\", path: projectPath(slug, \"dashboards\"), query: filters });\n },\n\n /** POST /@<slug>/dashboards — create a dashboard. Requires PROJECT_AUTHOR. */\n async create(dashboard: CreateDashboardInput): Promise<Envelope<Dashboard>> {\n const slug = requireProjectSlug(config);\n return request(config, { method: \"POST\", path: projectPath(slug, \"dashboards\"), body: dashboard });\n },\n\n /** GET /@<slug>/dashboards/<dsh-id> — read a dashboard. */\n async read(dashboardId: string): Promise<Envelope<Dashboard>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `dashboards/${encodeURIComponent(dashboardId)}`),\n });\n },\n\n /** PATCH /@<slug>/dashboards/<dsh-id> — update a dashboard. Requires PROJECT_AUTHOR. */\n async update(dashboardId: string, updates: UpdateDashboardInput): Promise<Envelope<Dashboard>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"PATCH\",\n path: projectPath(slug, `dashboards/${encodeURIComponent(dashboardId)}`),\n body: updates,\n });\n },\n\n /** DELETE /@<slug>/dashboards/<dsh-id> — delete a dashboard. Requires PROJECT_AUTHOR. */\n async delete(dashboardId: string): Promise<Envelope<{ deleted: boolean }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"DELETE\",\n path: projectPath(slug, `dashboards/${encodeURIComponent(dashboardId)}`),\n });\n },\n\n /** POST /@<slug>/dashboards/<dsh-id>/pin — pin to Workspace sidebar. Requires PROJECT_AUTHOR. */\n async pin(dashboardId: string): Promise<Envelope<Dashboard>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `dashboards/${encodeURIComponent(dashboardId)}/pin`),\n });\n },\n\n /** POST /@<slug>/dashboards/<dsh-id>/unpin — unpin. Requires PROJECT_AUTHOR. */\n async unpin(dashboardId: string): Promise<Envelope<Dashboard>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `dashboards/${encodeURIComponent(dashboardId)}/unpin`),\n });\n },\n };\n}\n","/**\n * Studio namespace — `client.studio.*`.\n *\n * Groups the Pathmaker-authored Studio surfaces: dashboards and workflows.\n */\n\nimport type { HttpClientConfig } from \"../http.ts\";\nimport { makeWorkflowsNamespace } from \"./workflows.ts\";\nimport { makeDashboardsNamespace } from \"./dashboards.ts\";\n\nexport function makeStudioNamespace(config: HttpClientConfig) {\n return {\n /** Workflow lifecycle + runs — `client.studio.workflows.*` (ch07 §9). */\n workflows: makeWorkflowsNamespace(config),\n /** Dashboard lifecycle + widget data — `client.studio.dashboards.*` (ch04 §3.10). */\n dashboards: makeDashboardsNamespace(config),\n };\n}\n","/**\n * Minimal SSE (Server-Sent Events) stream parser — internal.\n *\n * Used by:\n * - `client.compute.llms.invokeStream()` (ch07 §10.2 `/invoke-stream`)\n * - `client.realtime.subscribe()` SSE transport fallback (ch07 §11.3)\n *\n * Parses an SSE byte stream (a `ReadableStream<Uint8Array>` from a fetch\n * `Response.body`) into an async iterable of parsed `data:` payloads.\n * Each event's `data:` field is JSON-parsed; events whose data is the\n * sentinel `[DONE]` terminate the stream (OpenAI-compatible convention,\n * matched by the gateway's streaming surfaces).\n *\n * Per the SDK-abstracted-primitive discipline\n * (`feedback_sdk_abstracted_primitive_default_to_richer_interaction.md`),\n * transport mechanics stay internal; consumers see a clean async iterable.\n */\n\n/**\n * Parse an SSE stream into an async iterable of JSON-decoded `data:`\n * payloads. Multi-line `data:` fields are concatenated with `\\n` per the\n * SSE spec; the assembled payload is `JSON.parse`d. Non-JSON payloads\n * yield the raw string.\n */\nexport async function* parseSseStream<T>(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<T, void, void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n // Events are separated by a blank line (\\n\\n). Process complete events.\n let sepIndex: number;\n while ((sepIndex = indexOfEventBoundary(buffer)) !== -1) {\n const rawEvent = buffer.slice(0, sepIndex);\n buffer = buffer.slice(sepIndex).replace(/^(\\r?\\n)+/, \"\");\n const payload = extractData(rawEvent);\n if (payload === null) continue;\n if (payload === \"[DONE]\") return;\n yield decodePayload<T>(payload);\n }\n }\n\n // Flush any trailing event without a terminating blank line.\n const tail = buffer.trim();\n if (tail.length > 0) {\n const payload = extractData(tail);\n if (payload !== null && payload !== \"[DONE]\") {\n yield decodePayload<T>(payload);\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction indexOfEventBoundary(buffer: string): number {\n const lf = buffer.indexOf(\"\\n\\n\");\n const crlf = buffer.indexOf(\"\\r\\n\\r\\n\");\n if (lf === -1) return crlf;\n if (crlf === -1) return lf;\n return Math.min(lf, crlf);\n}\n\n/** Extract + concatenate `data:` lines from a single raw SSE event block. */\nfunction extractData(rawEvent: string): string | null {\n const lines = rawEvent.split(/\\r?\\n/);\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith(\":\")) continue; // comment / heartbeat\n if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(5).replace(/^ /, \"\"));\n }\n }\n if (dataLines.length === 0) return null;\n return dataLines.join(\"\\n\");\n}\n\nfunction decodePayload<T>(payload: string): T {\n try {\n return JSON.parse(payload) as T;\n } catch {\n return payload as unknown as T;\n }\n}\n","/**\n * Compute LLMs SDK — `client.compute.llms.*`.\n *\n * Compute LLMs registry. Curated 9-model library\n * (§10.1) + 4-endpoint family (§10.2) + per-model tier-gating.\n *\n * Wire mapping (project-plane; ch07 §10.2):\n * - list() → GET /@<slug>/compute/llms\n * - read(modelId) → GET /@<slug>/compute/llms/<model-id>\n * - invoke(modelId, ...) → POST /@<slug>/compute/llms/<model-id>/invoke\n * - invokeStream(modelId,...) → POST /@<slug>/compute/llms/<model-id>/invoke-stream (SSE)\n *\n * Per ch07 §10.5 RBAC: list/read against all cohort roles; invoke +\n * invokeStream require PROJECT_AUTHOR or PROJECT_ADMIN (LLM cost gate).\n * Per ch07 §10.6, surfaces K9O_LLM_PROVIDER_UNAVAILABLE (503) +\n * reuses K9O_MODEL_NOT_DECLARED / K9O_TIER_FEATURE_GATED /\n * K9O_AGENT_INFERENCE_TIMEOUT.\n */\n\nimport { request, requestStream, type HttpClientConfig } from \"../http.ts\";\nimport { projectPath } from \"../url-grammar.ts\";\nimport type { Envelope } from \"../envelope.ts\";\nimport { parseSseStream } from \"../internal/sse.ts\";\n\n/** Curated 9-model closed enum at v2 launch per ch07 §10.1 (extensible v2.x). */\nexport type LLMModelId =\n | \"mistral-7b\"\n | \"mistral-8x7b\"\n | \"llama-3-8b\"\n | \"llama-3-70b\"\n | \"claude-3-5-sonnet\"\n | \"gpt-4o\"\n | \"gpt-4o-mini\"\n | \"text-embedding-3-small\"\n | \"text-embedding-3-large\";\n\nexport type LLMProviderClass = \"self-hosted\" | \"external\";\nexport type LLMModality = \"text-completion\" | \"text-completion+tool-use\" | \"embeddings\";\n\n/** Model metadata per ch07 §10.1 + §10.4 (cost transparency). */\nexport type LLMModel = {\n id: LLMModelId;\n providerClass: LLMProviderClass;\n modality: LLMModality;\n /** Minimum tier gate per ch10 (e.g. \"base-camp\", \"ascent\", \"ridge\"). */\n tierGate: string;\n contextWindow: number;\n capabilities: ReadonlyArray<string>;\n /** Per-model token cost for cost-transparency per §10.4. */\n costPerMillionInputTokens: number;\n costPerMillionOutputTokens: number;\n};\n\n/** Inference parameters per ch07 §10.2 (passed through to provider). */\nexport type LLMInvokeParams = {\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n stop?: ReadonlyArray<string>;\n [key: string]: unknown;\n};\n\n/** Synchronous inference response per ch07 §10.2 `/invoke`. */\nexport type LLMResponse = {\n completion: string;\n tokensUsed: number;\n latencyMs: number;\n};\n\n/** Streaming chunk per ch07 §10.2 `/invoke-stream` (SSE per-token). */\nexport type LLMStreamChunk = {\n /** Incremental completion delta. */\n delta: string;\n /** True on the terminal chunk. */\n done?: boolean;\n /** Populated on terminal chunk. */\n tokensUsed?: number;\n};\n\nexport type LLMInvokeInput = {\n prompt: string;\n params?: LLMInvokeParams;\n};\n\n/** Error code coined in ch07 §10.6 (others reused per §10.6). */\nexport const LLM_ERROR_CODES = {\n PROVIDER_UNAVAILABLE: \"K9O_LLM_PROVIDER_UNAVAILABLE\",\n} as const;\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"compute.llms operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makeLlmsNamespace(config: HttpClientConfig) {\n return {\n /** GET /@<slug>/compute/llms — list models available to the project tier per ch10. */\n async list(opts?: { modality?: LLMModality; providerClass?: LLMProviderClass }): Promise<Envelope<ReadonlyArray<LLMModel>>> {\n const slug = requireProjectSlug(config);\n return request(config, { method: \"GET\", path: projectPath(slug, \"compute/llms\"), query: opts });\n },\n\n /** GET /@<slug>/compute/llms/<model-id> — read single model metadata + cost. */\n async read(modelId: LLMModelId | string): Promise<Envelope<LLMModel>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `compute/llms/${encodeURIComponent(modelId)}`),\n });\n },\n\n /**\n * POST /@<slug>/compute/llms/<model-id>/invoke — synchronous inference.\n * Requires PROJECT_AUTHOR or PROJECT_ADMIN (LLM cost gate per §10.5).\n */\n async invoke(modelId: LLMModelId | string, input: LLMInvokeInput): Promise<Envelope<LLMResponse>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `compute/llms/${encodeURIComponent(modelId)}/invoke`),\n body: { prompt: input.prompt, params: input.params },\n });\n },\n\n /**\n * POST /@<slug>/compute/llms/<model-id>/invoke-stream — streaming\n * inference (SSE; per-token delta for low-latency UX per §10.2).\n * Returns an async iterable of `LLMStreamChunk` — caller writes\n * `for await (const chunk of client.compute.llms.invokeStream(...))`.\n * The SDK handles SSE framing internally per\n * `feedback_sdk_abstracted_primitive_default_to_richer_interaction.md`.\n */\n async *invokeStream(modelId: LLMModelId | string, input: LLMInvokeInput): AsyncGenerator<LLMStreamChunk, void, void> {\n const slug = requireProjectSlug(config);\n const response = await requestStream(config, {\n method: \"POST\",\n path: projectPath(slug, `compute/llms/${encodeURIComponent(modelId)}/invoke-stream`),\n body: { prompt: input.prompt, params: input.params },\n accept: \"text/event-stream\",\n });\n // requestStream guarantees a non-null body on 2xx.\n yield* parseSseStream<LLMStreamChunk>(response.body as ReadableStream<Uint8Array>);\n },\n };\n}\n\nexport function makeComputeNamespace(config: HttpClientConfig) {\n return {\n /** LLM registry + inference — `client.compute.llms.*` (ch07 §10). */\n llms: makeLlmsNamespace(config),\n };\n}\n","/**\n * `client.ai.*` — platform AI primitives (`k9o.ai.embed()` is a platform primitive, not sugar over\n * `context.embed`).\n *\n * Wire mapping (project-plane):\n * - embed({ model?, input }) → POST /@<slug>/ai/embeddings body { model?, input: string | string[] }\n * → { data: { embeddings: number[][], model, dimensions }, meta }\n *\n * Callers are an extension (authority is the `(ai, embed, \"*\")` manifest grant) or a project member's own\n * backend; the gateway refuses an end user's client. Bounds (enforced by the gateway, not here): at most 64\n * inputs, each non-empty, at most 256 KiB of input per request, at most 4 requests in flight per project.\n * The platform adds nothing to the input: callers add the model's task prefixes themselves. The SDK sends the\n * input exactly as given and never puts it in an error.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/** The one declared embedding model today. A different `model` is refused with `K9O_MODEL_NOT_DECLARED`. */\nexport type EmbeddingModelId = \"nomic-embed-text-v1.5\";\n\nexport type EmbedInput = {\n /** Optional; defaults server-side to the one declared embedding model. */\n model?: EmbeddingModelId | (string & {});\n /** One string, or an array of strings; the result has one vector per string, in order. */\n input: string | ReadonlyArray<string>;\n};\n\nexport type EmbedResult = {\n /** One vector per input string, in input order. */\n embeddings: number[][];\n model: string;\n dimensions: number;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"ai operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makeAiNamespace(config: HttpClientConfig) {\n return {\n /** POST /@<slug>/ai/embeddings — embed one or more strings. */\n async embed(input: EmbedInput): Promise<Envelope<EmbedResult>> {\n const slug = requireProjectSlug(config);\n const body: { model?: string; input: string | string[] } = {\n input: typeof input.input === \"string\" ? input.input : [...input.input],\n };\n if (input.model !== undefined) body.model = input.model;\n return request(config, { method: \"POST\", path: projectPath(slug, \"ai/embeddings\"), body });\n },\n };\n}\n","/**\n * Realtime Subscriptions SDK — `client.realtime.*`.\n *\n * Realtime Subscriptions ALL-LIVE primitive.\n *\n * `client.realtime.subscribe(topic, options?)` returns an async iterable\n * yielding `RealtimeEvent`s — the caller writes idiomatic\n * `for await (const event of client.realtime.subscribe(topic)) { ... }`.\n *\n * Per `feedback_sdk_abstracted_primitive_default_to_richer_interaction.md`\n * + ch07 §11.3: the SDK chooses the transport (WebSocket primary → SSE\n * → poll), transparently. SPLIT (polling) is the SDK-internal fallback\n * when WebSocket / SSE are unavailable — NOT a consumer-side design\n * choice. The consumer sees one uniform async iterable regardless.\n *\n * Wire mapping (project-plane; ch07 §11.2):\n * - subscribe → GET /@<slug>/realtime/subscribe?topic=<t>&filter=<jsonb> (WS/SSE upgrade)\n * - replay → POST /@<slug>/realtime/replay { topic, fromSequence, untilSequence?, limit? }\n *\n * Per ch07 §11.4, `filter` + RLS compose (filter narrows, RLS gates).\n * Per ch07 §11.5, surfaces no new codes — reuses K9O_INVALID_FILTER +\n * K9O_SUBSCRIPTION_LIMIT_EXCEEDED + K9O_TIER_FEATURE_GATED.\n */\n\nimport { request, requestStream, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport { KError } from \"./kerror.ts\";\nimport type { Envelope } from \"./envelope.ts\";\nimport { parseSseStream } from \"./internal/sse.ts\";\n\n// ----------------------------------------------------------------------\n// Topic catalogue (closed 6-family enum per ch07 §11.1)\n// ----------------------------------------------------------------------\n\n/**\n * The 6 closed subscription topic families per ch07 §11.1. Concrete\n * topic strings carry a dynamic segment (collection name, resource id,\n * event family) — use `realtimeTopic.*` builders to construct them.\n */\nexport type RealtimeTopicFamily =\n | \"collections\"\n | \"studio.workflows.runs\"\n | \"studio.queries.executed\"\n | \"studio.dashboards.refresh\"\n | \"forge.functions.invocations\"\n | \"audit.org\";\n\n/** A concrete topic string, e.g. `studio.dashboards.refresh.dsh_abc`. */\nexport type RealtimeTopic = string;\n\n/**\n * Typed builders for the 6 topic families per ch07 §11.1. Prefer these\n * over hand-built strings for compile-time family safety.\n */\nexport const realtimeTopic = {\n /** `collections.<collection>.*` — row insert / update / delete events. */\n collection(collection: string): RealtimeTopic {\n return `collections.${collection}.*`;\n },\n /** `studio.workflows.runs.*` — run started / step_changed / approval_pending / completed. */\n workflowRuns(): RealtimeTopic {\n return \"studio.workflows.runs.*\";\n },\n /** `studio.queries.executed.<query-id>` — query execute events. */\n queryExecuted(queryId: string): RealtimeTopic {\n return `studio.queries.executed.${queryId}`;\n },\n /** `studio.dashboards.refresh.<dashboard-id>` — widget data refresh. */\n dashboardRefresh(dashboardId: string): RealtimeTopic {\n return `studio.dashboards.refresh.${dashboardId}`;\n },\n /** `forge.functions.invocations.<function-id>` — invoked / completed / failed. */\n functionInvocations(functionId: string): RealtimeTopic {\n return `forge.functions.invocations.${functionId}`;\n },\n /** `audit.org.<event-family>` — org-plane audit events. */\n auditOrg(eventFamily: string): RealtimeTopic {\n return `audit.org.${eventFamily}`;\n },\n} as const;\n\n// ----------------------------------------------------------------------\n// Event + filter shapes\n// ----------------------------------------------------------------------\n\n/** Per-topic filter predicate per ch07 §11.4 (ch04 §3.2 vocabulary). */\nexport type RealtimeFilter = Record<string, unknown>;\n\n/** A single realtime event delivered on a subscription per ch07 §11. */\nexport type RealtimeEvent<T = unknown> = {\n topic: RealtimeTopic;\n /** Event type within the topic family (e.g. `row_inserted`, `workflow.run.completed`). */\n type: string;\n /** Monotonic sequence number — use as `fromSequence` for replay catch-up. */\n sequence: number;\n payload: T;\n occurredAt: string;\n};\n\nexport type SubscribeOptions = {\n filter?: RealtimeFilter;\n /** Abort the subscription (closes the underlying transport). */\n signal?: AbortSignal;\n /**\n * Force a transport instead of the WebSocket → SSE → poll cascade.\n * Mainly for tests + constrained runtimes. Omit for production —\n * the SDK picks the richest available transport per §11.3.\n */\n transport?: RealtimeTransportKind;\n /** Poll-transport interval in ms (default 2000). Only used when polling. */\n pollIntervalMs?: number;\n};\n\nexport type RealtimeTransportKind = \"websocket\" | \"sse\" | \"poll\";\n\n/**\n * A live subscription. It is itself an async iterable (`for await`) and\n * exposes `close()` for explicit teardown + `transport` for diagnostics.\n */\nexport type RealtimeSubscription<T = unknown> = AsyncIterable<RealtimeEvent<T>> & {\n /** Stop the subscription + release the underlying transport. */\n close(): void;\n /** The transport actually selected (post-fallback). */\n readonly transport: RealtimeTransportKind;\n};\n\nexport type ReplayInput = {\n topic: RealtimeTopic;\n filter?: RealtimeFilter;\n fromSequence: number;\n untilSequence?: number;\n limit?: number;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"realtime operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\n/** Pick the richest transport available in this runtime per §11.3. */\nfunction selectTransport(forced?: RealtimeTransportKind): RealtimeTransportKind {\n if (forced) return forced;\n if (typeof (globalThis as { WebSocket?: unknown }).WebSocket === \"function\") return \"websocket\";\n // SSE rides on fetch streaming, which the http layer already requires.\n return \"sse\";\n}\n\n/** Convert an http(s) baseUrl to a ws(s) URL for the WebSocket transport. */\nfunction toWebSocketUrl(baseUrl: string, path: string, query: Record<string, string>): string {\n const trimmed = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const wsBase = trimmed.replace(/^http/, \"ws\");\n const qs = new URLSearchParams(query).toString();\n return `${wsBase}${path}${qs ? `?${qs}` : \"\"}`;\n}\n\n/** WebSocket transport — primary per §11.3. Bridges socket → async queue. */\nasync function* websocketTransport<T>(\n config: HttpClientConfig,\n topic: RealtimeTopic,\n options: SubscribeOptions,\n closed: { value: boolean },\n): AsyncGenerator<RealtimeEvent<T>, void, void> {\n const slug = requireProjectSlug(config);\n const query: Record<string, string> = { topic };\n if (options.filter) query.filter = JSON.stringify(options.filter);\n if (config.apiKey) query.access_token = config.apiKey; // WS can't set Authorization header\n const url = toWebSocketUrl(config.baseUrl, projectPath(slug, \"realtime/subscribe\"), query);\n const WS = (globalThis as { WebSocket: new (url: string) => WebSocket }).WebSocket;\n const socket = new WS(url);\n\n const queue: RealtimeEvent<T>[] = [];\n let resolveNext: (() => void) | null = null;\n let socketClosed = false;\n let socketError: Error | null = null;\n\n const wake = () => {\n if (resolveNext) {\n resolveNext();\n resolveNext = null;\n }\n };\n socket.onmessage = (ev: MessageEvent) => {\n try {\n queue.push(JSON.parse(typeof ev.data === \"string\" ? ev.data : String(ev.data)) as RealtimeEvent<T>);\n } catch {\n /* ignore malformed frame */\n }\n wake();\n };\n socket.onerror = () => {\n socketError = new Error(\"realtime websocket transport error\");\n wake();\n };\n socket.onclose = () => {\n socketClosed = true;\n wake();\n };\n options.signal?.addEventListener(\"abort\", () => socket.close());\n\n try {\n while (!closed.value) {\n if (queue.length > 0) {\n yield queue.shift() as RealtimeEvent<T>;\n continue;\n }\n if (socketClosed) {\n if (socketError) throw socketError;\n return;\n }\n await new Promise<void>((resolve) => {\n resolveNext = resolve;\n });\n }\n } finally {\n try {\n socket.close();\n } catch {\n /* already closed */\n }\n }\n}\n\n/** SSE transport — fallback per §11.3. Rides on fetch streaming. */\nasync function* sseTransport<T>(\n config: HttpClientConfig,\n topic: RealtimeTopic,\n options: SubscribeOptions,\n closed: { value: boolean },\n): AsyncGenerator<RealtimeEvent<T>, void, void> {\n const slug = requireProjectSlug(config);\n const query: Record<string, string | number | boolean | undefined> = { topic };\n if (options.filter) query.filter = JSON.stringify(options.filter);\n const response = await requestStream(config, {\n method: \"GET\",\n path: projectPath(slug, \"realtime/subscribe\"),\n query,\n accept: \"text/event-stream\",\n });\n for await (const event of parseSseStream<RealtimeEvent<T>>(response.body as ReadableStream<Uint8Array>)) {\n if (closed.value || options.signal?.aborted) return;\n yield event;\n }\n}\n\n/** Poll transport — last-resort fallback per §11.3 (SPLIT, SDK-internal). */\nasync function* pollTransport<T>(\n config: HttpClientConfig,\n topic: RealtimeTopic,\n options: SubscribeOptions,\n closed: { value: boolean },\n): AsyncGenerator<RealtimeEvent<T>, void, void> {\n const slug = requireProjectSlug(config);\n const interval = options.pollIntervalMs ?? 2000;\n let cursor = 0;\n while (!closed.value && !options.signal?.aborted) {\n const { data } = await request<ReadonlyArray<RealtimeEvent<T>>>(config, {\n method: \"POST\",\n path: projectPath(slug, \"realtime/replay\"),\n body: { topic, filter: options.filter, fromSequence: cursor },\n });\n for (const event of data ?? []) {\n if (closed.value || options.signal?.aborted) return;\n cursor = Math.max(cursor, event.sequence + 1);\n yield event;\n }\n if (closed.value || options.signal?.aborted) return;\n await new Promise<void>((resolve) => setTimeout(resolve, interval));\n }\n}\n\nexport function makeRealtimeNamespace(config: HttpClientConfig) {\n return {\n /**\n * Subscribe to a topic. Returns a `RealtimeSubscription` — an async\n * iterable of `RealtimeEvent`s. The SDK selects the richest available\n * transport (WebSocket → SSE → poll) per ch07 §11.3; the caller's\n * `for await` loop is transport-agnostic.\n *\n * ```ts\n * const sub = client.realtime.subscribe(\n * realtimeTopic.dashboardRefresh(\"dsh_abc\"),\n * );\n * for await (const event of sub) {\n * if (event.type === \"dashboard.widget.data_refreshed\") rerender(event.payload);\n * }\n * ```\n */\n subscribe<T = unknown>(topic: RealtimeTopic, options: SubscribeOptions = {}): RealtimeSubscription<T> {\n requireProjectSlug(config);\n const transport = selectTransport(options.transport);\n const closed = { value: false };\n\n const iterate = (): AsyncGenerator<RealtimeEvent<T>, void, void> => {\n switch (transport) {\n case \"websocket\":\n return websocketTransport<T>(config, topic, options, closed);\n case \"poll\":\n return pollTransport<T>(config, topic, options, closed);\n case \"sse\":\n default:\n return sseTransport<T>(config, topic, options, closed);\n }\n };\n\n let active: AsyncGenerator<RealtimeEvent<T>, void, void> | null = null;\n return {\n transport,\n [Symbol.asyncIterator]() {\n active = iterate();\n return active;\n },\n close() {\n closed.value = true;\n void active?.return(undefined);\n },\n };\n },\n\n /**\n * One-shot historical replay per ch07 §11.2 — catch up on missed\n * events from `fromSequence`. Capped at 10k events server-side;\n * paginate via the returned events' `sequence`. Use the highest\n * `sequence` you've seen as the next `fromSequence`.\n */\n async replay<T = unknown>(input: ReplayInput): Promise<Envelope<ReadonlyArray<RealtimeEvent<T>>>> {\n const slug = requireProjectSlug(config);\n if (!Number.isInteger(input.fromSequence) || input.fromSequence < 0) {\n throw new KError({\n code: \"K9O_INVALID_FILTER\",\n message: \"replay fromSequence must be a non-negative integer\",\n context: { fromSequence: input.fromSequence },\n recommendation: \"Pass the highest sequence number you have already observed (or 0 to replay from the start).\",\n });\n }\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, \"realtime/replay\"),\n body: {\n topic: input.topic,\n filter: input.filter,\n fromSequence: input.fromSequence,\n untilSequence: input.untilSequence,\n limit: input.limit,\n },\n });\n },\n };\n}\n","/**\n * Pillar composition: `@k9o/core` ↔ `@k9o/gate`.\n *\n * `@k9o/core` composes `@k9o/gate` as the `client.gate` namespace on\n * the K9oClient, sharing the same `baseUrl` + `projectSlug` config.\n *\n * `@k9o/gate` remains independently importable for Auth0-parity\n * standalone deployments (Trojan Horse motion); the bridge here is the\n * composition path when the caller imports `@k9o/core` and wants the\n * full platform surface.\n *\n * Mode defaults to `native` for the composition path — Native is the\n * mode that pairs with the broader Kilimanjaro billing model per\n * `@k9o/gate/mode.ts` ch01 §12.4. Standalone customers should import\n * `@k9o/gate` directly and call `createGateClient({ mode: 'standalone', ... })`.\n *\n * KError vs GateError alignment is still open.\n * Until then both error types remain shape-compatible (`code` /\n * `message` / `context` / `recommendation` fields are identical),\n * and caller code that narrows on `error.code` works against either.\n */\n\nimport { createGateClient, type GateClient } from \"@k9o/gate\";\nimport type { HttpClientConfig } from \"./http.ts\";\nimport { KError } from \"./kerror.ts\";\n\n/**\n * Build the composed `client.gate` namespace bound to the K9oClient's\n * baseUrl + projectSlug. Requires `projectSlug` to be set on the\n * client config — gate operations are inherently project-scoped per\n * v2.5.68 URL grammar.\n *\n * Returns `null` when projectSlug is not bound — the K9oClient may be\n * constructed for org-plane operations only (e.g. `client.orgs.list()`\n * or `client.projects.create()`), in which case gate operations are\n * not available until a per-project client is constructed.\n */\nexport function makeGateBridge(config: HttpClientConfig): GateClient | null {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n return null;\n }\n // Spread optional fields only when defined — GateConfig's partnerToken\n // + fetch are non-optional-undefined under exactOptionalPropertyTypes.\n return createGateClient({\n mode: \"native\",\n baseUrl: config.baseUrl,\n projectSlug: config.projectSlug,\n ...(config.apiKey !== undefined ? { partnerToken: config.apiKey } : {}),\n ...(config.fetch !== undefined ? { fetch: config.fetch } : {}),\n });\n}\n\n/**\n * Throw a helpful error when `client.gate` is accessed but projectSlug\n * is not bound. Wraps the null-return from `makeGateBridge` so callers\n * get a typed `K9O_MISSING_PROJECT_CONTEXT` rather than a null deref.\n */\nexport function gateNotAvailable(): never {\n throw new KError({\n code: \"K9O_MISSING_PROJECT_CONTEXT\",\n message: \"client.gate requires projectSlug bound on the createClient options\",\n context: {},\n recommendation: \"Pass `projectSlug` in createClient options. For multi-project apps, construct one client per project context.\",\n });\n}\n","/**\n * Pillar composition: `@k9o/core` ↔ `@k9o/extensions`.\n *\n * Re-exports the `k9o.extension(slug)` factory from `@k9o/extensions`.\n *\n * `@k9o/extensions` exports a `k9o` namespace with `extension(slug)`\n * factory returning typed bindings for Trailblazer/Anchor/Keystone\n * class extensions (baked in at SDK publish time). Circuit-class\n * (Long Tail) extensions use the install-time `k9o codegen` tool\n * (v2.x) per ch13 §8.1.4 path (a) OR raw HTTP / vendor-SDK fallback\n * per path (b).\n *\n * The bridge re-exports the factory directly — it is config-free at\n * v0.3.0 (extension stubs do not require HTTP routing yet; v2.5.68p-\n * stack-sdk-pass2 wires per-method HTTP dispatch). When pass2 lands,\n * the bridge will need to thread baseUrl + auth into the extension\n * runtime; until then the re-export is a thin pass-through.\n */\n\nimport { k9o as extensionsNamespace, type ExtensionSlug, type Extension } from \"@k9o/extensions\";\n\nexport { extensionsNamespace, type ExtensionSlug, type Extension };\n\n/**\n * Build the composed `client.extensions` namespace. Currently a thin\n * re-export of the `@k9o/extensions` `k9o.extension(slug)` factory.\n * Config-free at v0.3.0 — wires to client HTTP config when pass2 lands\n * runtime dispatch.\n */\nexport function makeExtensionsBridge() {\n return {\n /** Resolve a typed extension instance by slug. See `@k9o/extensions` for the factory contract. */\n extension: extensionsNamespace.extension,\n };\n}\n","/**\n * `@k9o/core` — Kilimanjaro platform SDK entry point.\n *\n * Customer-facing surface. The `createClient(options)`\n * factory returns a `K9oClient` instance with namespaces:\n *\n * - `client.from(collection)` — data-plane DSL (ch04 §3 + §6.4)\n * - `client.projects` — project lifecycle (ch02)\n *\n * Forward sub-cycles add:\n * - `client.gate` — auth composition (re-export from `@k9o/gate`)\n * - `client.kibo` — vault ops (re-export from future `@k9o/kibo`)\n * - `client.extensions` — extension consumption (re-export from `@k9o/extensions`)\n * - `client.migrations` — migration lifecycle (ch04 §2)\n * - `client.functions` — function deploy/invoke (ch07)\n * - `client.policies` — policy bundle lifecycle (ch06)\n * - `client.audit` — audit log queries (ch05 §4)\n * - `client.orgs` — org lifecycle (ch02)\n *\n * Architectural posture: 3-pillar default (`@k9o/gate` + `@k9o/extensions` + future `@k9o/kibo`)\n * with `@k9o/core` as the umbrella factory that composes pillars +\n * provides cross-cutting client construction + data-plane surface.\n * The SDK shape stays stable whether pillars are imported directly or\n * through `@k9o/core` — only the package boundary moves.\n *\n * Every async method throws `KError` on non-2xx\n * gateway responses, transport failures, or SDK-side validation errors.\n * Caller code narrows on `error.code` per the closed taxonomy.\n *\n * Canonical usage:\n *\n * ```typescript\n * import { createClient, KError } from \"@k9o/core\";\n *\n * const client = createClient({\n * baseUrl: \"https://acme.api.k9o.io\",\n * apiKey: process.env.K9O_API_KEY,\n * orgSlug: \"acme\",\n * projectSlug: \"member-portal\",\n * });\n *\n * try {\n * const { data, meta } = await client.from(\"posts\").select().limit(10);\n * console.log(data, meta.cursor.next);\n * } catch (e) {\n * if (e instanceof KError && e.code === \"K9O_TIER_CAP_HIT\") {\n * console.warn(e.message, e.recommendation);\n * }\n * throw e;\n * }\n * ```\n */\n\nimport { resolveBaseUrl } from \"./url-grammar.ts\";\nimport type { HttpClientConfig } from \"./http.ts\";\nimport { makeFromFactory } from \"./data/from.ts\";\nimport { makeProjectsNamespace } from \"./projects.ts\";\nimport { makeStorageNamespace } from \"./storage-locations.ts\";\nexport type {\n StorageBucket, CreateBucketOptions, UpdateBucketOptions, StorageObject, UploadOptions, SignedUrlOptions,\n SignedUrl, RemovedObject, DeletedBucket,\n} from \"./storage-buckets.ts\";\nimport { makeMetadataNamespace } from \"./metadata.ts\";\nimport { makeMigrationsNamespace } from \"./migrations.ts\";\nimport { makeFunctionsNamespace } from \"./functions.ts\";\nimport { makePoliciesNamespace } from \"./policies.ts\";\nimport { makeAuditNamespace } from \"./audit.ts\";\nimport { makeOrgsNamespace } from \"./orgs.ts\";\nimport { makeOrgNamespace } from \"./org.ts\";\nimport { makeMeNamespace } from \"./me.ts\";\nimport { makeStudioNamespace } from \"./studio/index.ts\";\nimport { makeComputeNamespace } from \"./compute/llms.ts\";\nimport { makeAiNamespace } from \"./ai.ts\";\nimport { makeRealtimeNamespace } from \"./realtime.ts\";\nimport { makeGateBridge, gateNotAvailable } from \"./gate-bridge.ts\";\nimport { makeExtensionsBridge } from \"./extensions-bridge.ts\";\nimport type { GateClient } from \"@k9o/gate\";\nimport { createKiboClient, type KiboClient } from \"@k9o/kibo\";\nimport type { CreateClientOptions } from \"./types.ts\";\n\nexport { KError, kerrorFromWire, type KErrorWire } from \"./kerror.ts\";\nexport {\n type Envelope,\n type MetaCursor,\n type MetaSubscription,\n type MetaIdempotency,\n type MetaWarning,\n type MetaCost,\n type MetaTiming,\n type MetaContext,\n type PaginatedEnvelope,\n} from \"./envelope.ts\";\nexport {\n validateBaseUrl,\n resolveBaseUrl,\n validateSlug,\n projectPath,\n orgPath,\n platformPath,\n} from \"./url-grammar.ts\";\nexport type {\n CreateClientOptions,\n RetryConfig,\n FilterOp,\n} from \"./types.ts\";\nexport type { Project, CreateProjectInput, UpdateProjectInput } from \"./projects.ts\";\nexport {\n BYOS_CRED_REF_PREFIX,\n BYOS_CRED_FORMAT_VERSION,\n BYOS_CRED_VAULT_NAME_PREFIX,\n BYOS_PROVIDER_SCHEME,\n encodeByosCredential,\n byosCredentialRef,\n byosCredVaultName,\n type ByosCredProvider,\n type ByosCredInput,\n} from \"./byos.ts\";\nexport type {\n StorageLocation, StorageLocationProvider, StorageLocationCustodyMode, StorageLocationProviderParams,\n CreateStorageLocationInput, UpdateStorageLocationInput, RetiredStorageLocation, StorageLocationTestResult,\n} from \"./storage-locations.ts\";\nexport {\n METADATA_OPERATORS,\n type MetadataSlice, type MetadataOperator, type MetadataSurface,\n type MetadataWhereClause, type MetadataQueryRecord, type MetadataQueryResult,\n type MetadataQueryBuilder,\n} from \"./metadata.ts\";\nexport type {\n Migration, AppliedMigration, PendingMigration,\n Operation, ColumnSpec, IndexSpec, ColumnReferences,\n MigrationPolicy, CollectionPolicy, StorageBucketPolicy, RelationshipSpec, ActionRule,\n} from \"./migrations.ts\";\nexport type { FunctionRecord, DeployFunctionInput } from \"./functions.ts\";\nexport type { PolicyBundle, CreatePolicyInput, UpdatePolicyInput, ValidatePolicyResult } from \"./policies.ts\";\nexport type { AuditEvent, AuditQueryOpts } from \"./audit.ts\";\nexport type { Org } from \"./orgs.ts\";\nexport type {\n OrgMember,\n OrgGroup,\n OrgRoleGrant,\n OrgAuditEvent,\n SmtpConfig,\n SmtpTestEmailInput,\n SmtpTestEmailResult,\n OrgIdpProvider,\n CreateOrgIdpInput,\n} from \"./org.ts\";\nexport type {\n MyProfile,\n MySession,\n MyApiToken,\n MyNotification,\n} from \"./me.ts\";\nexport type { ExtensionSlug, Extension } from \"./extensions-bridge.ts\";\nexport type { GateClient } from \"@k9o/gate\";\nexport type {\n KiboClient, KmsProvider, StoreZkDekInput, ZkDekHandle, ZkDekRecord,\n SecretVisibility, CreateSecretInput, SecretSummary,\n ListSecretsInput, ListSecretsResult, AttestationTier, RevealChallenge, RevealSecretResult,\n UpdateSecretInput, UpdateSecretResult, RotateSecretResult, MoveSecretResult,\n} from \"@k9o/kibo\";\n\n// Studio surfaces (ch07 §9 workflows + ch04 §3.10 dashboards)\nexport {\n WORKFLOW_ERROR_CODES,\n type Workflow,\n type WorkflowRun,\n type WorkflowRunStep,\n type WorkflowAction,\n type WorkflowStatus,\n type WorkflowRunStatus,\n type WorkflowTriggerType,\n type WorkflowActionType,\n type CreateWorkflowInput,\n type UpdateWorkflowInput,\n type WorkflowListFilters,\n type WorkflowRunListFilters,\n} from \"./studio/workflows.ts\";\nexport {\n DASHBOARD_ERROR_CODES,\n type Dashboard,\n type Widget,\n type WidgetType,\n type WidgetDataSourceMode,\n type DashboardStatus,\n type CreateDashboardInput,\n type UpdateDashboardInput,\n type DashboardListFilters,\n} from \"./studio/dashboards.ts\";\n\n// Compute LLMs (ch07 §10)\nexport {\n LLM_ERROR_CODES,\n type LLMModelId,\n type LLMModel,\n type LLMModality,\n type LLMProviderClass,\n type LLMInvokeParams,\n type LLMInvokeInput,\n type LLMResponse,\n type LLMStreamChunk,\n} from \"./compute/llms.ts\";\n\nexport type { EmbedInput, EmbedResult, EmbeddingModelId } from \"./ai.ts\";\n\nexport { assertProviderRegion, isProviderRegion, type ProviderRegionProvider } from \"./provider-region.ts\";\n\n// Realtime subscriptions (ch07 §11)\nexport {\n realtimeTopic,\n type RealtimeTopic,\n type RealtimeTopicFamily,\n type RealtimeFilter,\n type RealtimeEvent,\n type RealtimeSubscription,\n type RealtimeTransportKind,\n type SubscribeOptions,\n type ReplayInput,\n} from \"./realtime.ts\";\n\n/**\n * The client returned by `createClient`. Namespaces hang off the\n * instance — composed from per-resource factories that share the\n * bound HTTP config.\n */\nexport type K9oClient = {\n /** Data-plane DSL — `client.from(collection).select()` etc. */\n from: ReturnType<typeof makeFromFactory>;\n /** Project lifecycle — `client.projects.list()` etc. */\n projects: ReturnType<typeof makeProjectsNamespace>;\n /** Storage locations — `client.storage.locations.create({..., credentialRef})` etc. Independent of\n * `client.kibo.vault.secrets` (credential pre-create): this namespace only registers a caller-supplied\n * `credentialRef` string, never creates or resolves one. */\n storage: ReturnType<typeof makeStorageNamespace>;\n /** Cross-surface metadata query (ch14) — `client.metadata.from(...).where(...).execute()`. Client-side\n * only until the gateway's Inc-2 route lands; see `metadata.ts` for status. */\n metadata: ReturnType<typeof makeMetadataNamespace>;\n /** Migration lifecycle — `client.migrations.apply()` etc. */\n migrations: ReturnType<typeof makeMigrationsNamespace>;\n /** Function deploy + invoke — `client.functions.deploy()` etc. */\n functions: ReturnType<typeof makeFunctionsNamespace>;\n /** Policy bundle lifecycle — `client.policies.publish()` etc. */\n policies: ReturnType<typeof makePoliciesNamespace>;\n /** Audit log queries — `client.audit.query()` etc. */\n audit: ReturnType<typeof makeAuditNamespace>;\n /** Org lifecycle — `client.orgs.list()` etc. (collection-style across accessible orgs) */\n orgs: ReturnType<typeof makeOrgsNamespace>;\n /** Org-bound namespace — `client.org.members`, `client.org.groups`, `client.org.smtp`, `client.org.auditLog`, `client.org.gate`. */\n org: ReturnType<typeof makeOrgNamespace>;\n /** Operator-self namespace — `client.me.profile`, `client.me.sessions`, etc. Cross-org; no tenant context required. */\n me: ReturnType<typeof makeMeNamespace>;\n /** Studio surfaces — `client.studio.workflows.*` (ch07 §9) + `client.studio.dashboards.*` (ch04 §3.10). */\n studio: ReturnType<typeof makeStudioNamespace>;\n /** Compute surfaces — `client.compute.llms.*` (ch07 §10). */\n compute: ReturnType<typeof makeComputeNamespace>;\n /** Platform AI primitives — `client.ai.embed({ model?, input })`. */\n ai: ReturnType<typeof makeAiNamespace>;\n /** Realtime subscriptions — `client.realtime.subscribe()` / `.replay()` (ch07 §11). */\n realtime: ReturnType<typeof makeRealtimeNamespace>;\n /** Gate (Identity-Aware Kernel) — composed from `@k9o/gate`. Available when projectSlug is bound on the client. */\n readonly gate: GateClient;\n /** Kibo (Zero-Knowledge vault) — composed from `@k9o/kibo`. `client.kibo.vault.zkDeks.*` (ch08 §11.3.2 F.5); project-scoped methods self-guard the project context. */\n readonly kibo: KiboClient;\n /** Extensions consumption — composed from `@k9o/extensions`. `client.extensions.extension(slug)` returns typed extension bindings per ch13 §8.1. */\n extensions: ReturnType<typeof makeExtensionsBridge>;\n /** Bound config — exposed for advanced use (custom HTTP per-call). */\n readonly config: Readonly<HttpClientConfig>;\n};\n\n/**\n * Construct a `K9oClient` bound to the supplied gateway baseUrl + auth\n * + project context. Validates the baseUrl at construct time per ch13\n * §7.2 — path-bearing baseUrls throw `K9O_INVALID_BASE_URL` synchronously.\n */\nexport function createClient(options: CreateClientOptions): K9oClient {\n const baseUrl = resolveBaseUrl(options.baseUrl, options.orgSlug);\n const config: HttpClientConfig = {\n baseUrl,\n apiKey: options.apiKey,\n projectSlug: options.projectSlug,\n orgSlug: options.orgSlug,\n fetch: options.fetch,\n defaultHeaders: options.defaultHeaders,\n retryConfig: options.retryConfig,\n };\n const gateBridge = makeGateBridge(config);\n return {\n from: makeFromFactory(config),\n projects: makeProjectsNamespace(config),\n storage: makeStorageNamespace(config),\n metadata: makeMetadataNamespace(config),\n migrations: makeMigrationsNamespace(config),\n functions: makeFunctionsNamespace(config),\n policies: makePoliciesNamespace(config),\n audit: makeAuditNamespace(config),\n orgs: makeOrgsNamespace(config),\n org: makeOrgNamespace(config),\n me: makeMeNamespace(config),\n studio: makeStudioNamespace(config),\n compute: makeComputeNamespace(config),\n ai: makeAiNamespace(config),\n realtime: makeRealtimeNamespace(config),\n // gate is a proxy — null when projectSlug isn't bound; surfacing a\n // helpful K9O_MISSING_PROJECT_CONTEXT instead of a null deref when\n // the caller reaches for any gate method without project context.\n get gate() {\n if (gateBridge === null) return gateNotAvailable();\n return gateBridge;\n },\n extensions: makeExtensionsBridge(),\n kibo: createKiboClient(config),\n config: Object.freeze({ ...config }),\n };\n}\n","/**\n * BYOS (Bring-Your-Own-Store) credential-reference wire format — the client-side counterpart of the\n * gateway's B2 seal-plane gate (mirrors `services/gateway/src/analytics/\n * byos-credential-ref.ts` + `byos-credential-resolver.ts`) plus the 5-provider envelope shapes from the\n * provisioning spec — each provider's long-lived cred is\n * revealed CORE-side via an already-wired scheme that reads one exact field shape.\n *\n * The customer PRE-CREATES their cloud credential as a vault secret under their OWN auth, then binds\n * only a `kibo://byos-creds/<secId>` reference — the gateway never handles the raw long-lived cloud\n * credential at bind time (`byos-cred create`, `packages/cli/src/commands/byos-cred.ts`).\n */\n\nimport { KError } from \"./kerror.ts\";\nimport { assertProviderRegion } from \"./provider-region.ts\";\n\n/** The reference scheme the gateway's `assertByosCredentialRef` accepts at bind time. */\nexport const BYOS_CRED_REF_PREFIX = \"kibo://byos-creds/\";\n\n/**\n * The reserved vault SECRET-NAME namespace `byos-cred create` always stores under (distinct from\n * {@link BYOS_CRED_REF_PREFIX}, the `kibo://` reference scheme formed from the resulting secret id).\n * `SecretRecord` has no class/purpose column — `name` is the only vault-stored,\n * non-caller-asserted field the reveal endpoint's class gate can check authoritatively to tell \"this\n * is a BYOS credential\" and refuse revealing an install-scoped secret through the BYOS reveal path\n * (closing a receipt-bypass). `byos-cred create` enforces this prefix unconditionally —\n * it is not a convention callers opt into.\n */\nexport const BYOS_CRED_VAULT_NAME_PREFIX = \"byos-creds/\";\n\n/** The allowed charset for the caller-given part of a BYOS vault secret name (after stripping\n * {@link BYOS_CRED_VAULT_NAME_PREFIX} if present) — hygiene, not a security boundary (the seal is\n * customer-plane-scoped and the reveal resolves by vault-generated secId, never by name), but an\n * unvalidated name could otherwise land a secret at an odd vault path. */\nconst VAULT_NAME_SEGMENT = /^[a-z0-9._-]+(?:\\/[a-z0-9._-]+)*$/;\n\n/** Prefix a caller-given secret name with {@link BYOS_CRED_VAULT_NAME_PREFIX} if it isn't already\n * under it. Idempotent so re-running with an already-prefixed name doesn't double-nest.\n * Two independent checks, not one: a literal `..` substring is rejected\n * outright (traversal), separately from {@link VAULT_NAME_SEGMENT} restricting the charset to\n * `[a-z0-9._/-]` (hygiene) — the charset still permits a lone `.`, which is not itself a traversal\n * token and is not what blocks `..`. */\nexport function byosCredVaultName(name: string): string {\n const suffix = name.startsWith(BYOS_CRED_VAULT_NAME_PREFIX) ? name.slice(BYOS_CRED_VAULT_NAME_PREFIX.length) : name;\n if (suffix.length === 0 || suffix.includes(\"..\") || !VAULT_NAME_SEGMENT.test(suffix)) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"a BYOS credential name must be non-empty, lowercase alphanumeric/._- per path segment, and must not contain '..'\",\n context: { field: \"name\" },\n recommendation: \"Use a name like 's3-prod' or 'team/s3-prod' — no '..', no uppercase, no other punctuation.\",\n });\n }\n return `${BYOS_CRED_VAULT_NAME_PREFIX}${suffix}`;\n}\n\n/** The sealed BYOS credential format version (pin `v`, fail-closed on\n * an unrecognised version so a future cred shape never silently mis-parses as v1). */\nexport const BYOS_CRED_FORMAT_VERSION = 1;\n\n/** The CORE-mintable providers — each maps to exactly one wired reveal scheme.\n * `azure_blob` has no envelope shape yet (not in the provisioning spec). */\nexport type ByosCredProvider = \"s3\" | \"s3_compatible\" | \"minio\" | \"gcs\" | \"b2\" | \"r2\";\n\n/** provider → WIRED reveal scheme — informational; not itself sent on the wire (the\n * scheme name IS part of each envelope below). */\nexport const BYOS_PROVIDER_SCHEME: Record<ByosCredProvider, string> = {\n s3: \"aws_sigv4\",\n s3_compatible: \"aws_sigv4\",\n minio: \"aws_sigv4\",\n gcs: \"gcp_workload_identity\",\n b2: \"http_basic\",\n r2: \"bearer\",\n};\n\ntype SigV4Input = {\n provider: \"s3\" | \"s3_compatible\" | \"minio\";\n accessKeyId: string;\n secretAccessKey: string;\n /** The provider's STS-signing region the CORE mint signs its STS request against (`us-east-1`), NOT a platform region. */\n providerRegion: string;\n /** Present only to be rejected — a sealed cred must be long-lived. */\n sessionToken?: string | undefined;\n};\n\ntype GcsInput = {\n provider: \"gcs\";\n /** The service account's PKCS8 private key, PEM-encoded. */\n privateKeyPem: string;\n /** The service account's email — the mint's `clientId`. */\n clientId: string;\n};\n\ntype B2Input = {\n provider: \"b2\";\n /** The B2 master key's `keyId` — sealed as `username` (RFC 7617; must not contain `:`). */\n keyId: string;\n /** The B2 master key's `appKey` — sealed as `password`. */\n appKey: string;\n};\n\ntype R2Input = {\n provider: \"r2\";\n /** The Cloudflare API token — sealed as `token`. */\n apiToken: string;\n};\n\n/** Discriminated input to {@link encodeByosCredential} — one shape per CORE-mintable provider. */\nexport type ByosCredInput = SigV4Input | GcsInput | B2Input | R2Input;\n\nfunction rejectTempCred(sessionToken: string | undefined): void {\n if (typeof sessionToken === \"string\" && sessionToken.length > 0) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message:\n \"cannot seal a temporary BYOS credential (a sessionToken expires and would invalidate the credentialRef once sealed); supply a long-lived access key\",\n context: { field: \"sessionToken\" },\n recommendation: \"Create a bucket-scoped, long-lived IAM access key for this credential instead of a temporary/STS one.\",\n });\n }\n}\n\n/**\n * Encode a customer cloud credential to the exact versioned JSON string the vault secret's `value`\n * must carry, per provider:\n *\n * - s3 / s3_compatible / minio: `{v:1, scheme:\"aws_sigv4\", service:\"sts\", providerRegion, accessKeyId, secretAccessKey}`\n * 🔴 `service` MUST be `\"sts\"` — the long-lived cred signs ONLY the STS mint; the CORE\n * mint fail-closes on `service !== \"sts\"`. Not caller-configurable.\n * - gcs: `{v:1, scheme:\"gcp_workload_identity\", privateKeyPem, clientId}`\n * - b2: `{v:1, scheme:\"http_basic\", username, password}` — 🔴 the B2 master's `keyId` seals as\n * `username`, `appKey` as `password` (RFC 7617 field names, not B2's native ones); throws if\n * `keyId` contains `:` (RFC 7617 forbids it in `username`).\n * - r2: `{v:1, scheme:\"bearer\", token}`\n *\n * 🔴 Rejects a temporary/session credential on the `aws_sigv4` path —\n * a `sessionToken` expires and would silently invalidate the `credentialRef` once sealed, so this\n * refuses to encode one rather than deferring to the gateway's own reveal-time rejection. The other\n * three schemes have no analogous temporary-credential field in this envelope shape.\n */\nexport function encodeByosCredential(input: ByosCredInput): string {\n switch (input.provider) {\n case \"s3\":\n case \"s3_compatible\":\n case \"minio\": {\n rejectTempCred(input.sessionToken);\n // Sealed into the envelope and later put into hostnames by the mint: refuse a malformed one before it is sealed.\n assertProviderRegion(input.providerRegion, input.provider);\n return JSON.stringify({\n v: BYOS_CRED_FORMAT_VERSION,\n scheme: \"aws_sigv4\",\n service: \"sts\",\n providerRegion: input.providerRegion,\n accessKeyId: input.accessKeyId,\n secretAccessKey: input.secretAccessKey,\n });\n }\n case \"gcs\":\n return JSON.stringify({\n v: BYOS_CRED_FORMAT_VERSION,\n scheme: \"gcp_workload_identity\",\n privateKeyPem: input.privateKeyPem,\n clientId: input.clientId,\n });\n case \"b2\": {\n if (input.keyId.includes(\":\")) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"a B2 master keyId sealed as the http_basic username must not contain ':' (RFC 7617)\",\n context: { field: \"keyId\" },\n recommendation: null,\n });\n }\n return JSON.stringify({\n v: BYOS_CRED_FORMAT_VERSION,\n scheme: \"http_basic\",\n username: input.keyId,\n password: input.appKey,\n });\n }\n case \"r2\":\n return JSON.stringify({\n v: BYOS_CRED_FORMAT_VERSION,\n scheme: \"bearer\",\n token: input.apiToken,\n });\n }\n}\n\n/** Form the `kibo://byos-creds/<secId>` reference from a vault secret id — the inverse of the\n * gateway's `byosCredentialSecId`. */\nexport function byosCredentialRef(secId: string): string {\n return `${BYOS_CRED_REF_PREFIX}${secId}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAgDA,IAAM,eAAN,MAAmB;AAAA,EACP,UAAoB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAKV,GAAG,QAAgB,OAAwC;AACzD,SAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI,MAAM,MAAM,CAAC;AAC7C,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,QAAgB,OAAwC;AAC1D,SAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI,OAAO,MAAM,CAAC;AAC9C,WAAO;AAAA,EACT;AAAA,EAEA,GAAG,QAAgB,OAA8B;AAC/C,SAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI,MAAM,MAAM,CAAC;AAC7C,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,QAAgB,OAA8B;AAChD,SAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI,OAAO,MAAM,CAAC;AAC9C,WAAO;AAAA,EACT;AAAA,EAEA,GAAG,QAAgB,OAA8B;AAC/C,SAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI,MAAM,MAAM,CAAC;AAC7C,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,QAAgB,OAA8B;AAChD,SAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI,OAAO,MAAM,CAAC;AAC9C,WAAO;AAAA,EACT;AAAA,EAEA,GAAG,QAAgB,QAA8C;AAC/D,SAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI,MAAM,OAAO,OAAO,CAAC;AACrD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAgB,QAA8C;AAClE,SAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI,SAAS,OAAO,OAAO,CAAC;AACxD,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,QAAgB,SAAuB;AAC1C,SAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI,QAAQ,OAAO,QAAQ,CAAC;AACxD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAgB,SAAuB;AAC3C,SAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI,SAAS,OAAO,QAAQ,CAAC;AACzD,WAAO;AAAA,EACT;AAAA,EAEA,GAAG,QAAgB,OAAwC;AACzD,SAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI,MAAM,MAAM,CAAC;AAC7C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAgB,IAAc,OAAyE;AAC5G,SAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI,MAAM,CAAC;AACvC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAiB;AACrB,SAAK,WAAW;AAChB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,QAAsB;AAC3B,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAA4C;AAChD,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,UAAuD;AAC/D,UAAM,IAAiD,CAAC;AACxD,eAAW,KAAK,KAAK,SAAS;AAC5B,YAAM,MAAM,MAAM,QAAQ,EAAE,KAAK,IAC7B,IAAK,EAAE,MAAyC,KAAK,GAAG,CAAC,MACzD,OAAO,EAAE,KAAK;AAKlB,QAAE,EAAE,MAAM,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG;AAAA,IAC9B;AACA,QAAI,KAAK,aAAa,OAAW,GAAE,OAAO,IAAI,KAAK;AACnD,QAAI,KAAK,cAAc,OAAW,GAAE,QAAQ,IAAI,KAAK;AACrD,QAAI,KAAK,cAAc,OAAW,GAAE,OAAO,IAAI,KAAK;AACpD,WAAO;AAAA,EACT;AACF;AAMA,IAAM,cAAN,MAAkB;AAAA,EAChB,YACmB,QACA,YACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnB,SAAwC;AACtC,WAAO,IAAI,cAAiB,KAAK,QAAQ,KAAK,UAAU;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAoB,QAA0C;AAClE,WAAO,QAAW,KAAK,QAAQ;AAAA,MAC7B,QAAQ;AAAA,MACR,MAAM,eAAe,KAAK,QAAQ,KAAK,UAAU;AAAA,MACjD,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAoB,OAAqC;AACvD,WAAO,IAAI,cAAiB,KAAK,QAAQ,KAAK,YAAY,KAAK;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAwC;AACtC,WAAO,IAAI,cAAiB,KAAK,QAAQ,KAAK,UAAU;AAAA,EAC1D;AACF;AAEA,IAAM,gBAAN,cAA+B,aAAgE;AAAA,EAC7F,YACmB,QACA,YACjB;AACA,UAAM;AAHW;AACA;AAAA,EAGnB;AAAA,EAJmB;AAAA,EACA;AAAA,EAKX,OAA4C;AAClD,WAAO,QAA0B,KAAK,QAAQ;AAAA,MAC5C,QAAQ;AAAA,MACR,MAAM,eAAe,KAAK,QAAQ,KAAK,UAAU;AAAA,MACjD,OAAO,KAAK,QAAQ;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,KACE,aACA,YACkC;AAClC,WAAO,KAAK,KAAK,EAAE,KAAK,aAAa,UAAU;AAAA,EACjD;AACF;AAEA,IAAM,gBAAN,cAA+B,aAAiD;AAAA,EAC9E,YACmB,QACA,YACA,OACjB;AACA,UAAM;AAJW;AACA;AACA;AAAA,EAGnB;AAAA,EALmB;AAAA,EACA;AAAA,EACA;AAAA,EAKX,OAA6B;AACnC,UAAM,WAAW,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE,OAAO,IAAI;AAC5E,QAAI,aAAa,QAAW;AAC1B,YAAM,IAAI,OAAO;AAAA,QACf,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,EAAE,YAAY,KAAK,WAAW;AAAA,QACvC,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AACA,WAAO,QAAW,KAAK,QAAQ;AAAA,MAC7B,QAAQ;AAAA,MACR,MAAM,GAAG,eAAe,KAAK,QAAQ,KAAK,UAAU,CAAC,IAAI,mBAAmB,OAAO,SAAS,KAAK,CAAC,CAAC;AAAA,MACnG,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,EACH;AAAA,EAEA,KACE,aACA,YACkC;AAClC,WAAO,KAAK,KAAK,EAAE,KAAK,aAAa,UAAU;AAAA,EACjD;AACF;AAEA,IAAM,gBAAN,cAA+B,aAAiD;AAAA,EAC9E,YACmB,QACA,YACjB;AACA,UAAM;AAHW;AACA;AAAA,EAGnB;AAAA,EAJmB;AAAA,EACA;AAAA,EAKX,OAA6B;AACnC,UAAM,WAAW,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE,OAAO,IAAI;AAC5E,QAAI,aAAa,QAAW;AAC1B,YAAM,IAAI,OAAO;AAAA,QACf,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,EAAE,YAAY,KAAK,WAAW;AAAA,QACvC,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AACA,WAAO,QAAW,KAAK,QAAQ;AAAA,MAC7B,QAAQ;AAAA,MACR,MAAM,GAAG,eAAe,KAAK,QAAQ,KAAK,UAAU,CAAC,IAAI,mBAAmB,OAAO,SAAS,KAAK,CAAC,CAAC;AAAA,IACrG,CAAC;AAAA,EACH;AAAA,EAEA,KACE,aACA,YACkC;AAClC,WAAO,KAAK,KAAK,EAAE,KAAK,aAAa,UAAU;AAAA,EACjD;AACF;AAOA,SAAS,eAAe,QAA0B,YAA4B;AAC5E,MAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,WAAW,GAAG;AAC7E,UAAM,IAAI,OAAO;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,EAAE,WAAW;AAAA,MACtB,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,eAAa,OAAO,aAAa,SAAS;AAE1C,MAAI,CAAC,0BAA0B,KAAK,UAAU,GAAG;AAC/C,UAAM,IAAI,OAAO;AAAA,MACf,MAAM;AAAA,MACN,SAAS,oBAAoB,UAAU;AAAA,MACvC,SAAS,EAAE,WAAW;AAAA,MACtB,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,SAAO,YAAY,OAAO,aAAa,QAAQ,UAAU,EAAE;AAC7D;AAMO,SAAS,gBAAgB,QAA0B;AACxD,SAAO,SAAS,KAAK,YAAiC;AACpD,WAAO,IAAI,YAAY,QAAQ,UAAU;AAAA,EAC3C;AACF;;;AC/RO,SAAS,sBAAsB,QAA0B;AAC9D,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKL,MAAM,OAAkD;AACtD,aAAO,QAAgC,QAAQ;AAAA,QAC7C,QAAQ;AAAA,QACR,MAAM,QAAQ,UAAU;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,OAAO,OAAuD;AAClE,mBAAa,MAAM,MAAM,SAAS;AAClC,aAAO,QAAiB,QAAQ;AAAA,QAC9B,QAAQ;AAAA,QACR,MAAM,QAAQ,UAAU;AAAA,QACxB,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,IAAI,MAA0C;AAClD,mBAAa,MAAM,SAAS;AAC5B,aAAO,QAAiB,QAAQ;AAAA,QAC9B,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,SAAS;AAAA,MACnC,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,OAAO,MAAc,OAAuD;AAChF,mBAAa,MAAM,SAAS;AAC5B,aAAO,QAAiB,QAAQ;AAAA,QAC9B,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,SAAS;AAAA,QACjC,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACpBA,IAAM,iBAAiB;AAEvB,SAAS,mBAAmB,QAAkC;AAC5D,MAAI,OAAO,gBAAgB,UAAa,OAAO,YAAY,WAAW,GAAG;AACvE,UAAM,IAAI,OAAO;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAAC;AAAA,MACV,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,SAAO,OAAO;AAChB;AAEA,IAAM,cAAc,CAAC,QAA0B,SAAS,OACtD,YAAY,mBAAmB,MAAM,GAAG,kBAAkB,MAAM,EAAE;AAEpE,IAAM,aAAa,CAAC,QAA0B,MAAc,SAAS,OAAe;AAClF,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,IAAI,OAAO;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,EAAE,OAAO,UAAU,QAAQ,QAAQ;AAAA,MAC5C,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAIA,MAAI,SAAS,OAAO,SAAS,MAAM;AACjC,UAAM,IAAI,OAAO;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,EAAE,OAAO,UAAU,QAAQ,cAAc;AAAA,MAClD,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,SAAO,YAAY,QAAQ,IAAI,mBAAmB,IAAI,CAAC,GAAG,MAAM,EAAE;AACpE;AAEA,SAAS,kBAAkB,MAAoB;AAC7C,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,IAAI,OAAO;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,EAAE,OAAO,QAAQ,QAAQ,QAAQ;AAAA,MAC1C,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,iBAAiB,WAAiD;AACzE,MAAI,OAAO,cAAc,YAAY,CAAC,OAAO,UAAU,SAAS,KAAK,YAAY,KAAK,YAAY,gBAAgB;AAChH,UAAM,IAAI,OAAO;AAAA,MACf,MAAM;AAAA,MACN,SAAS,0DAA0D,cAAc;AAAA,MACjF,SAAS,EAAE,OAAO,aAAa,QAAQ,eAAe;AAAA,MACtD,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,OAAO,MAAgD,aAA4B;AAC1F,QAAM,OAAO,gBAAgB,SAAY,EAAE,MAAM,YAAY,IAAI,CAAC;AAClE,MAAI,gBAAgB,KAAM,QAAO,gBAAgB,UAAa,KAAK,SAAS,cAAc,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,IAAI;AACnH,MAAI,OAAO,SAAS,SAAU,QAAO,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI;AAC1D,SAAO,IAAI,KAAK,CAAC,IAA8B,GAAG,IAAI;AACxD;AAGO,SAAS,iBAAiB,QAA0B,QAAgB;AACzE,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKL,MAAM,OAAO,MAAc,MAAgD,UAAyB,CAAC,GAAqC;AACxI,wBAAkB,IAAI;AACtB,YAAM,OAAO,IAAI,SAAS;AAC1B,WAAK,OAAO,QAAQ,OAAO,MAAM,QAAQ,WAAW,GAAG,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,MAAM;AACtF,WAAK,OAAO,QAAQ,IAAI;AACxB,UAAI,QAAQ,gBAAgB,OAAW,MAAK,OAAO,eAAe,QAAQ,WAAW;AACrF,WAAK,OAAO,UAAU,QAAQ,WAAW,OAAO,SAAS,OAAO;AAChE,UAAI,QAAQ,aAAa,OAAW,MAAK,OAAO,YAAY,KAAK,UAAU,QAAQ,QAAQ,CAAC;AAC5F,aAAO,QAAuB,QAAQ,EAAE,QAAQ,QAAQ,MAAM,WAAW,QAAQ,QAAQ,UAAU,GAAG,MAAM,KAAK,CAAC;AAAA,IACpH;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,gBAAgB,MAAc,SAAyD;AAC3F,wBAAkB,IAAI;AACtB,uBAAiB,SAAS,SAAS;AACnC,aAAO,QAAmB,QAAQ;AAAA,QAChC,QAAQ;AAAA,QACR,MAAM,WAAW,QAAQ,QAAQ,eAAe;AAAA,QAChD,MAAM,EAAE,MAAM,WAAW,QAAQ,WAAW,GAAI,QAAQ,aAAa,SAAY,EAAE,UAAU,QAAQ,SAAS,IAAI,CAAC,EAAG;AAAA,MACxH,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,KAAK,UAA+B,CAAC,GAAoD;AAC7F,aAAO,QAAsC,QAAQ;AAAA,QACnD,QAAQ;AAAA,QACR,MAAM,WAAW,QAAQ,QAAQ,UAAU;AAAA,QAC3C,GAAI,QAAQ,WAAW,SAAY,EAAE,OAAO,EAAE,QAAQ,QAAQ,OAAO,EAAE,IAAI,CAAC;AAAA,MAC9E,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,OAAO,MAAgD;AAC3D,wBAAkB,IAAI;AACtB,aAAO,QAAuB,QAAQ,EAAE,QAAQ,UAAU,MAAM,WAAW,QAAQ,QAAQ,UAAU,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC;AAAA,IAC3H;AAAA,EACF;AACF;AAGO,SAAS,qBAAqB,QAA0B;AAC7D,SAAO;AAAA;AAAA,IAEL,MAAM,cAA+D;AACnE,aAAO,QAAsC,QAAQ,EAAE,QAAQ,OAAO,MAAM,YAAY,MAAM,EAAE,CAAC;AAAA,IACnG;AAAA;AAAA,IAGA,MAAM,UAAU,MAAgD;AAC9D,aAAO,QAAuB,QAAQ,EAAE,QAAQ,OAAO,MAAM,WAAW,QAAQ,IAAI,EAAE,CAAC;AAAA,IACzF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,aAAa,MAAc,UAA+B,CAAC,GAAqC;AACpG,aAAO,QAAuB,QAAQ,EAAE,QAAQ,QAAQ,MAAM,YAAY,MAAM,GAAG,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AAAA,IACjH;AAAA;AAAA,IAGA,MAAM,aAAa,MAAc,SAAgE;AAC/F,aAAO,QAAuB,QAAQ,EAAE,QAAQ,SAAS,MAAM,WAAW,QAAQ,IAAI,GAAG,MAAM,QAAQ,CAAC;AAAA,IAC1G;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,aAAa,MAAc,UAA+B,CAAC,GAAqC;AACpG,aAAO,QAAuB,QAAQ;AAAA,QACpC,QAAQ;AAAA,QACR,MAAM,WAAW,QAAQ,IAAI;AAAA,QAC7B,GAAI,QAAQ,UAAU,OAAO,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,IAAI,CAAC;AAAA,MAC/D,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,KAAK,QAAgB;AACnB,aAAO,iBAAiB,QAAQ,MAAM;AAAA,IACxC;AAAA,EACF;AACF;;;ACnOA,IAAM,UAAU;AAChB,IAAM,UAAkE;AAAA,EACtE,IAAI,CAAC,MAAM,8BAA8B,KAAK,CAAC;AAAA,EAC/C,IAAI,CAAC,MAAM,0BAA0B,KAAK,CAAC;AAAA,EAC3C,IAAI,CAAC,MAAM,MAAM;AAAA,EACjB,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC;AAAA,EAC1B,YAAY,CAAC,MAAM,QAAQ,KAAK,CAAC;AAAA,EACjC,eAAe,CAAC,MAAM,QAAQ,KAAK,CAAC;AAAA,EACpC,OAAO,CAAC,MAAM,QAAQ,KAAK,CAAC;AAC9B;AAGO,SAAS,iBAAiB,OAAgB,UAA4C;AAC3F,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,EAAG,QAAO;AAC5D,SAAO,aAAa,SAAY,QAAQ,KAAK,KAAK,IAAI,QAAQ,QAAQ,EAAE,KAAK;AAC/E;AAMO,SAAS,qBAAqB,OAAgB,UAAyC;AAC5F,MAAI,iBAAiB,OAAO,QAAQ,EAAG;AACvC,QAAM,IAAI,OAAO;AAAA,IACf,MAAM;AAAA,IACN,SACE,aAAa,SACT,sFACA,iCAAiC,QAAQ;AAAA,IAC/C,SAAS,EAAE,OAAO,kBAAkB,QAAQ,2BAA2B,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC,EAAG;AAAA,IACvH,gBACE,aAAa,OAAO,uBAAuB;AAAA,EAC/C,CAAC;AACH;;;ACiDA,SAASA,oBAAmB,QAAkC;AAC5D,MAAI,OAAO,gBAAgB,UAAa,OAAO,YAAY,WAAW,GAAG;AACvE,UAAM,IAAI,OAAO;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAAC;AAAA,MACV,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,SAAO,OAAO;AAChB;AAEA,IAAM,gBAAgB,CAAC,QAA0B,SAAS,OACxD,YAAYA,oBAAmB,MAAM,GAAG,oBAAoB,MAAM,EAAE;AAE/D,SAAS,qBAAqB,QAA0B;AAC7D,SAAO;AAAA;AAAA,IAEL,GAAG,qBAAqB,MAAM;AAAA,IAC9B,WAAW;AAAA;AAAA,MAET,MAAM,OAA0D;AAC9D,eAAO,QAAwC,QAAQ,EAAE,QAAQ,OAAO,MAAM,cAAc,MAAM,EAAE,CAAC;AAAA,MACvG;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,OAAO,OAAuE;AAClF,6BAAqB,MAAM,gBAAgB,MAAM,QAAQ;AACzD,eAAO,QAAyB,QAAQ,EAAE,QAAQ,QAAQ,MAAM,cAAc,MAAM,GAAG,MAAM,MAAM,CAAC;AAAA,MACtG;AAAA;AAAA,MAGA,MAAM,IAAI,YAAwD;AAChE,eAAO,QAAyB,QAAQ;AAAA,UACtC,QAAQ;AAAA,UACR,MAAM,cAAc,QAAQ,IAAI,mBAAmB,UAAU,CAAC,EAAE;AAAA,QAClE,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,MAAM,OAAO,YAAoB,OAAuE;AAGtG,YAAI,MAAM,mBAAmB,OAAW,sBAAqB,MAAM,cAAc;AACjF,eAAO,QAAyB,QAAQ;AAAA,UACtC,QAAQ;AAAA,UACR,MAAM,cAAc,QAAQ,IAAI,mBAAmB,UAAU,CAAC,EAAE;AAAA,UAChE,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAM,OAAO,YAA+D;AAC1E,eAAO,QAAgC,QAAQ;AAAA,UAC7C,QAAQ;AAAA,UACR,MAAM,cAAc,QAAQ,IAAI,mBAAmB,UAAU,CAAC,EAAE;AAAA,QAClE,CAAC;AAAA,MACH;AAAA;AAAA,MAGA,MAAM,KAAK,YAAkE;AAC3E,eAAO,QAAmC,QAAQ;AAAA,UAChD,QAAQ;AAAA,UACR,MAAM,cAAc,QAAQ,IAAI,mBAAmB,UAAU,CAAC,OAAO;AAAA,QACvE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;ACnJO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EAAM;AAAA,EAAO;AAAA,EAAM;AAAA,EAAO;AAAA,EAAM;AAAA,EAChC;AAAA,EAAY;AAAA,EAAc;AAAA,EAAY;AAAA,EAAM;AAAA,EAC5C;AAAA,EAAO;AAAA,EAAM;AACf;AA2CA,SAASC,oBAAmB,QAAkC;AAC5D,MAAI,OAAO,gBAAgB,UAAa,OAAO,YAAY,WAAW,GAAG;AACvE,UAAM,IAAI,OAAO;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAAC;AAAA,MACV,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,SAAO,OAAO;AAChB;AAEA,SAAS,YACP,QACA,UACA,OACA,OACA,aACsB;AACtB,SAAO;AAAA,IACL,MAAM,OAAO,IAAI,OAAO;AACtB,aAAO,YAAY,QAAQ,UAAU,CAAC,GAAG,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,OAAO,WAAW;AAAA,IAC3F;AAAA,IACA,MAAM,GAAG;AACP,aAAO,YAAY,QAAQ,UAAU,OAAO,GAAG,WAAW;AAAA,IAC5D;AAAA,IACA,OAAO,GAAG;AACR,aAAO,YAAY,QAAQ,UAAU,OAAO,OAAO,CAAC;AAAA,IACtD;AAAA,IACA,MAAM,UAAU;AACd,aAAO,QAA6B,QAAQ;AAAA,QAC1C,QAAQ;AAAA,QACR,MAAM,YAAYA,oBAAmB,MAAM,GAAG,gBAAgB;AAAA,QAC9D,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,UACvC,QAAQ;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,sBAAsB,QAA0B;AAC9D,SAAO;AAAA;AAAA,IAEL,KAAK,SAA6E;AAChF,YAAM,WAAW,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAA0B;AAC/E,UAAI,SAAS,WAAW,GAAG;AACzB,cAAM,IAAI,OAAO;AAAA,UACf,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,CAAC;AAAA,UACV,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH;AACA,aAAO,YAAY,QAAQ,UAAU,CAAC,GAAG,QAAW,IAAI;AAAA,IAC1D;AAAA,EACF;AACF;;;ACuCA,SAASC,oBAAmB,QAAkC;AAC5D,MAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,WAAW,GAAG;AAC7E,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AACA,SAAO,OAAO;AAChB;AAEO,SAAS,wBAAwB,QAA0B;AAChE,SAAO;AAAA;AAAA,IAEL,MAAM,MAAM,OAAkH;AAC5H,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,kBAAkB;AAAA,QAC1C,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,OAA2D;AAC/D,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,YAAY;AAAA,MACtC,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,IAAI,SAAsD;AAC9D,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,cAAc,mBAAmB,OAAO,OAAO,CAAC,CAAC,EAAE;AAAA,MAC7E,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,MAAM,OAAkH;AAC5H,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,kBAAkB;AAAA,QAC1C,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,cAAkE;AACtE,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,oBAAoB;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAM,aAAa,WAAwD;AACzE,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,sBAAsB,mBAAmB,SAAS,CAAC,QAAQ;AAAA,MACrF,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,cAAc,WAAmB,OAAuE;AAC5G,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,sBAAsB,mBAAmB,SAAS,CAAC,SAAS;AAAA,QACpF,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,cAAc,WAA4D;AAC9E,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,sBAAsB,mBAAmB,SAAS,CAAC,EAAE;AAAA,MAC/E,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACzNA,SAASC,oBAAmB,QAAkC;AAC5D,MAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,WAAW,GAAG;AAC7E,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AACA,SAAO,OAAO;AAChB;AAEO,SAAS,uBAAuB,QAA0B;AAC/D,SAAO;AAAA;AAAA,IAEL,MAAM,OAAO,OAA+D;AAC1E,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,WAAW;AAAA,QACnC,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,KAAK,MAAiI;AAC1I,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,WAAW;AAAA,QACnC,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,IAAI,MAAiD;AACzD,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,aAAa,mBAAmB,IAAI,CAAC,EAAE;AAAA,MACjE,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,OAAO,MAA8E;AACzF,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,aAAa,mBAAmB,IAAI,CAAC,EAAE;AAAA,MACjE,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYA,MAAM,OAA8C,MAAc,SAA+C;AAC/G,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,aAAa,mBAAmB,IAAI,CAAC,SAAS;AAAA,QACtE,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AC7DA,SAASC,oBAAmB,QAAkC;AAC5D,MAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,WAAW,GAAG;AAC7E,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AACA,SAAO,OAAO;AAChB;AAEO,SAAS,sBAAsB,QAA0B;AAC9D,SAAO;AAAA;AAAA,IAEL,MAAM,UAAkD;AACtD,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,QAAQ;AAAA,MAClC,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,KAAK,MAAiK;AAC1K,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,UAAU;AAAA,QAClC,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,OAAO,OAA2D;AACtE,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,UAAU;AAAA,QAClC,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,SAAS,OAAoF;AACjG,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,mBAAmB;AAAA,QAC3C,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,IAAI,UAAmD;AAC3D,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,YAAY,mBAAmB,QAAQ,CAAC,EAAE;AAAA,MACpE,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,OAAO,UAAkB,OAA2D;AACxF,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,YAAY,mBAAmB,QAAQ,CAAC,EAAE;AAAA,QAClE,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,OAAO,UAA2D;AACtE,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,YAAY,mBAAmB,QAAQ,CAAC,EAAE;AAAA,MACpE,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,QAAQ,UAAmD;AAC/D,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,YAAY,mBAAmB,QAAQ,CAAC,UAAU;AAAA,MAC5E,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AChFA,SAASC,oBAAmB,QAAkC;AAC5D,MAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,WAAW,GAAG;AAC7E,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO,OAAO;AAChB;AAEO,SAAS,mBAAmB,QAA0B;AAC3D,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASL,MAAM,MAAM,MAAqE;AAC/E,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,WAAW;AAAA,QACnC,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,KAAK,MAAgG;AACzG,YAAM,OAAOA,oBAAmB,MAAM;AACtC,YAAM,UAAU,MAAM,gBAAgB;AACtC,YAAM,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,UAAU,GAAM,EAAE,YAAY;AAClE,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,WAAW;AAAA,QACnC,OAAO,EAAE,OAAO,OAAO,MAAM,SAAS,IAAI;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AC7DO,SAAS,kBAAkB,QAA0B;AAC1D,SAAO;AAAA;AAAA,IAEL,MAAM,OAA8C;AAClD,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,QAAQ,MAAM;AAAA,MACtB,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,IAAI,SAAyC;AACjD,mBAAa,SAAS,KAAK;AAC3B,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,QAAQ,QAAQ,mBAAmB,OAAO,CAAC,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,QAAQ,OAAuC;AACnD,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,QAAQ,QAAQ,mBAAmB,KAAK,CAAC,UAAU;AAAA,MAC3D,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,UAAkC;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,QAAQ,KAAK;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACwDA,SAAS,qBAAqB,QAA0B;AACtD,SAAO;AAAA;AAAA,IAEL,MAAM,KAAK,MAA2J;AACpK,aAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,SAAS,GAAG,OAAO,KAAK,CAAC;AAAA,IACjF;AAAA;AAAA,IAGA,MAAM,OAAO,OAAiF;AAC5F,aAAO,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,MAAM,QAAQ,SAAS,GAAG,MAAM,MAAM,CAAC;AAAA,IAClF;AAAA;AAAA,IAGA,MAAM,IAAI,QAA8C;AACtD,aAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,WAAW,mBAAmB,MAAM,CAAC,EAAE,EAAE,CAAC;AAAA,IAClG;AAAA;AAAA,IAGA,MAAM,OAAO,QAAyD;AACpE,aAAO,QAAQ,QAAQ,EAAE,QAAQ,UAAU,MAAM,QAAQ,WAAW,mBAAmB,MAAM,CAAC,EAAE,EAAE,CAAC;AAAA,IACrG;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,QAA0B;AACrD,SAAO;AAAA;AAAA,IAEL,MAAM,KAAK,MAAwF;AACjG,aAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,QAAQ,GAAG,OAAO,KAAK,CAAC;AAAA,IAChF;AAAA;AAAA,IAGA,MAAM,OAAO,OAAsD;AACjE,aAAO,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,GAAG,MAAM,MAAM,CAAC;AAAA,IACjF;AAAA;AAAA,IAGA,MAAM,IAAI,SAA8C;AACtD,aAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,UAAU,mBAAmB,OAAO,CAAC,EAAE,EAAE,CAAC;AAAA,IAClG;AAAA;AAAA,IAGA,MAAM,OAAO,SAA0D;AACrE,aAAO,QAAQ,QAAQ,EAAE,QAAQ,UAAU,MAAM,QAAQ,UAAU,mBAAmB,OAAO,CAAC,EAAE,EAAE,CAAC;AAAA,IACrG;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,QAA0B;AAC1D,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQL,MAAM,MAAM,MAGwC;AAClD,aAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,WAAW,GAAG,OAAO,KAAK,CAAC;AAAA,IACnF;AAAA;AAAA,IAGA,MAAM,KAAK,MAAmG;AAC5G,YAAM,UAAU,MAAM,gBAAgB;AACtC,YAAM,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,UAAU,GAAM,EAAE,YAAY;AAClE,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,QAAQ,WAAW;AAAA,QACzB,OAAO,EAAE,OAAO,OAAO,MAAM,SAAS,IAAI;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,QAA0B;AACtD,SAAO;AAAA,IACL,OAAO;AAAA;AAAA,MAEL,MAAM,KAAK,MAAuK;AAChL,eAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,iBAAiB,GAAG,OAAO,KAAK,CAAC;AAAA,MACzF;AAAA;AAAA,MAGA,MAAM,MAAM,OAAwF;AAClG,eAAO,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,MAAM,QAAQ,iBAAiB,GAAG,MAAM,MAAM,CAAC;AAAA,MAC1F;AAAA;AAAA,MAGA,MAAM,IAAI,SAAkD;AAC1D,eAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,mBAAmB,mBAAmB,OAAO,CAAC,EAAE,EAAE,CAAC;AAAA,MAC3G;AAAA;AAAA,MAGA,MAAM,OAAO,SAAkD;AAC7D,eAAO,QAAQ,QAAQ,EAAE,QAAQ,UAAU,MAAM,QAAQ,mBAAmB,mBAAmB,OAAO,CAAC,EAAE,EAAE,CAAC;AAAA,MAC9G;AAAA,IACF;AAAA,IAEA,cAAc;AAAA;AAAA,MAEZ,MAAM,OAAyD;AAC7D,eAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,eAAe,EAAE,CAAC;AAAA,MAC1E;AAAA;AAAA,MAGA,MAAM,OAAO,OAA6D;AACxE,eAAO,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,MAAM,QAAQ,eAAe,GAAG,MAAM,MAAM,CAAC;AAAA,MACxF;AAAA;AAAA,MAGA,MAAM,IAAI,OAAkD;AAC1D,eAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,iBAAiB,mBAAmB,KAAK,CAAC,EAAE,EAAE,CAAC;AAAA,MACvG;AAAA;AAAA,MAGA,MAAM,UAAU,OAAe,OAAkH;AAC/I,eAAO,QAAQ,QAAQ,EAAE,QAAQ,SAAS,MAAM,QAAQ,iBAAiB,mBAAmB,KAAK,CAAC,EAAE,GAAG,MAAM,MAAM,CAAC;AAAA,MACtH;AAAA;AAAA,MAGA,MAAM,OAAO,OAAwD;AACnE,eAAO,QAAQ,QAAQ,EAAE,QAAQ,UAAU,MAAM,QAAQ,iBAAiB,mBAAmB,KAAK,CAAC,EAAE,EAAE,CAAC;AAAA,MAC1G;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,QAA0B;AACnD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAML,MAAM,MAA4C;AAChD,aAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,UAAU,EAAE,CAAC;AAAA,IACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAM,IAAI,SAAgG;AACxG,aAAO,QAAQ,QAAQ,EAAE,QAAQ,SAAS,MAAM,QAAQ,KAAK,GAAG,MAAM,EAAE,YAAY,QAAQ,EAAE,CAAC;AAAA,IACjG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,KAAK,OAAmE;AAC5E,aAAO,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,MAAM,QAAQ,qBAAqB,GAAG,MAAM,MAAM,CAAC;AAAA,IAC9F;AAAA;AAAA,IAGA,MAAM,QAAiD;AACrD,aAAO,QAAQ,QAAQ,EAAE,QAAQ,SAAS,MAAM,QAAQ,KAAK,GAAG,MAAM,EAAE,YAAY,KAAK,EAAE,CAAC;AAAA,IAC9F;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,QAA0B;AACzD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAML,MAAM,MAA4C;AAChD,aAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,iBAAiB,EAAE,CAAC;AAAA,IAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,IAAI,OAA+D;AACvE,aAAO,QAAQ,QAAQ,EAAE,QAAQ,SAAS,MAAM,QAAQ,iBAAiB,GAAG,MAAM,MAAM,CAAC;AAAA,IAC3F;AAAA,EACF;AACF;AAMO,SAAS,iBAAiB,QAA0B;AACzD,SAAO;AAAA;AAAA,IAEL,SAAS,qBAAqB,MAAM;AAAA;AAAA,IAEpC,QAAQ,oBAAoB,MAAM;AAAA;AAAA,IAElC,UAAU,yBAAyB,MAAM;AAAA;AAAA,IAEzC,MAAM,qBAAqB,MAAM;AAAA;AAAA,IAEjC,MAAM,kBAAkB,MAAM;AAAA;AAAA,IAE9B,YAAY,wBAAwB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAO1C,MAAM,MAAwG;AAC5G,aAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,KAAK,EAAE,CAAC;AAAA,IAChE;AAAA,EACF;AACF;;;ACtRO,SAAS,gBAAgB,QAA0B;AACxD,SAAO;AAAA,IACL,SAAS;AAAA;AAAA,MAEP,MAAM,MAAoC;AACxC,eAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,IAAI,EAAE,CAAC;AAAA,MAC/D;AAAA;AAAA,MAGA,MAAM,OAAO,OAAsE;AACjF,eAAO,QAAQ,QAAQ,EAAE,QAAQ,SAAS,MAAM,QAAQ,IAAI,GAAG,MAAM,MAAM,CAAC;AAAA,MAC9E;AAAA,IACF;AAAA,IAEA,UAAU;AAAA;AAAA,MAER,MAAM,OAAoD;AACxD,eAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,aAAa,EAAE,CAAC;AAAA,MACxE;AAAA;AAAA,MAGA,MAAM,OAAO,WAA4D;AACvE,eAAO,QAAQ,QAAQ,EAAE,QAAQ,UAAU,MAAM,QAAQ,eAAe,mBAAmB,SAAS,CAAC,EAAE,EAAE,CAAC;AAAA,MAC5G;AAAA;AAAA,MAGA,MAAM,YAAoD;AACxD,eAAO,QAAQ,QAAQ,EAAE,QAAQ,UAAU,MAAM,QAAQ,aAAa,EAAE,CAAC;AAAA,MAC3E;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,WAAW;AAAA,MACT,MAAM,OAAqD;AACzD,eAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,eAAe,EAAE,CAAC;AAAA,MAC1E;AAAA,MAEA,MAAM,OAAO,OAA4I;AACvJ,eAAO,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,MAAM,QAAQ,eAAe,GAAG,MAAM,MAAM,CAAC;AAAA,MACxF;AAAA,MAEA,MAAM,OAAO,SAA0D;AACrE,eAAO,QAAQ,QAAQ,EAAE,QAAQ,UAAU,MAAM,QAAQ,iBAAiB,mBAAmB,OAAO,CAAC,EAAE,EAAE,CAAC;AAAA,MAC5G;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,eAAe;AAAA,MACb,MAAM,KAAK,MAAwJ;AACjK,eAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,kBAAkB,GAAG,OAAO,KAAK,CAAC;AAAA,MAC1F;AAAA,MAEA,MAAM,SAAS,gBAA2D;AACxE,eAAO,QAAQ,QAAQ,EAAE,QAAQ,SAAS,MAAM,QAAQ,oBAAoB,mBAAmB,cAAc,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,KAAK,EAAE,CAAC;AAAA,MAC3I;AAAA,MAEA,MAAM,cAAqD;AACzD,eAAO,QAAQ,QAAQ,EAAE,QAAQ,SAAS,MAAM,QAAQ,kBAAkB,GAAG,MAAM,EAAE,MAAM,KAAK,EAAE,CAAC;AAAA,MACrG;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,UAAU;AAAA,MACR,MAAM,MAAM,MAA6Q;AACvR,eAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,cAAc,GAAG,OAAO,KAAK,CAAC;AAAA,MACtF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,YAAY;AAAA,MACV,MAAM,QAAQ,OAAuH;AACnI,eAAO,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,MAAM,QAAQ,gBAAgB,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC;AAAA,MAC/F;AAAA,MAEA,MAAM,OAAO,OAAwI;AACnJ,eAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,QAAQ,kBAAkB,mBAAmB,KAAK,CAAC,EAAE,EAAE,CAAC;AAAA,MACxG;AAAA,IACF;AAAA,EACF;AACF;;;ACDO,IAAM,uBAAuB;AAAA,EAClC,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,2BAA2B;AAC7B;AAEA,SAASC,oBAAmB,QAAkC;AAC5D,MAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,WAAW,GAAG;AAC7E,UAAM,IAAI,MAAM,qEAAqE;AAAA,EACvF;AACA,SAAO,OAAO;AAChB;AAEA,SAAS,kBAAkB,QAA0B;AACnD,SAAO;AAAA;AAAA,IAEL,MAAM,KAAK,YAAoB,SAAiF;AAC9G,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,aAAa,mBAAmB,UAAU,CAAC,OAAO;AAAA,QAC1E,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,KAAK,YAAoB,OAA+C;AAC5E,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,aAAa,mBAAmB,UAAU,CAAC,SAAS,mBAAmB,KAAK,CAAC,EAAE;AAAA,MACzG,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,OAAO,YAAoB,OAA+C;AAC9E,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,aAAa,mBAAmB,UAAU,CAAC,SAAS,mBAAmB,KAAK,CAAC,SAAS;AAAA,MAChH,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,uBAAuB,QAA0B;AAC/D,SAAO;AAAA;AAAA,IAEL,MAAM,KAAK,SAA2E;AACpF,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,YAAY,MAAM,WAAW,GAAG,OAAO,QAAQ,CAAC;AAAA,IAChG;AAAA;AAAA,IAGA,MAAM,OAAO,UAA4D;AACvE,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,MAAM,YAAY,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC;AAAA,IACjG;AAAA;AAAA,IAGA,MAAM,KAAK,YAAiD;AAC1D,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,aAAa,mBAAmB,UAAU,CAAC,EAAE;AAAA,MACvE,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,OAAO,YAAoB,SAA2D;AAC1F,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,aAAa,mBAAmB,UAAU,CAAC,EAAE;AAAA,QACrE,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,OAAO,YAA6D;AACxE,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,aAAa,mBAAmB,UAAU,CAAC,EAAE;AAAA,MACvE,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,QAAQ,YAAoB,iBAA0C,CAAC,GAAmC;AAC9G,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,aAAa,mBAAmB,UAAU,CAAC,OAAO;AAAA,QAC1E,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,kBAAkB,MAAM;AAAA,EAChC;AACF;;;AClKO,IAAM,wBAAwB;AAAA,EACnC,WAAW;AAAA,EACX,gBAAgB;AAClB;AAEA,SAASC,oBAAmB,QAAkC;AAC5D,MAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,WAAW,GAAG;AAC7E,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AACA,SAAO,OAAO;AAChB;AAEO,SAAS,wBAAwB,QAA0B;AAChE,SAAO;AAAA;AAAA,IAEL,MAAM,KAAK,SAA6E;AACtF,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,YAAY,MAAM,YAAY,GAAG,OAAO,QAAQ,CAAC;AAAA,IACjG;AAAA;AAAA,IAGA,MAAM,OAAO,WAA+D;AAC1E,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,MAAM,YAAY,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC;AAAA,IACnG;AAAA;AAAA,IAGA,MAAM,KAAK,aAAmD;AAC5D,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,cAAc,mBAAmB,WAAW,CAAC,EAAE;AAAA,MACzE,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,OAAO,aAAqB,SAA6D;AAC7F,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,cAAc,mBAAmB,WAAW,CAAC,EAAE;AAAA,QACvE,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,OAAO,aAA8D;AACzE,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,cAAc,mBAAmB,WAAW,CAAC,EAAE;AAAA,MACzE,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,IAAI,aAAmD;AAC3D,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,cAAc,mBAAmB,WAAW,CAAC,MAAM;AAAA,MAC7E,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,MAAM,aAAmD;AAC7D,YAAM,OAAOA,oBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,cAAc,mBAAmB,WAAW,CAAC,QAAQ;AAAA,MAC/E,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACvKO,SAAS,oBAAoB,QAA0B;AAC5D,SAAO;AAAA;AAAA,IAEL,WAAW,uBAAuB,MAAM;AAAA;AAAA,IAExC,YAAY,wBAAwB,MAAM;AAAA,EAC5C;AACF;;;ACOA,gBAAuB,eACrB,MAC+B;AAC/B,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAGhD,UAAI;AACJ,cAAQ,WAAW,qBAAqB,MAAM,OAAO,IAAI;AACvD,cAAM,WAAW,OAAO,MAAM,GAAG,QAAQ;AACzC,iBAAS,OAAO,MAAM,QAAQ,EAAE,QAAQ,aAAa,EAAE;AACvD,cAAM,UAAU,YAAY,QAAQ;AACpC,YAAI,YAAY,KAAM;AACtB,YAAI,YAAY,SAAU;AAC1B,cAAM,cAAiB,OAAO;AAAA,MAChC;AAAA,IACF;AAGA,UAAM,OAAO,OAAO,KAAK;AACzB,QAAI,KAAK,SAAS,GAAG;AACnB,YAAM,UAAU,YAAY,IAAI;AAChC,UAAI,YAAY,QAAQ,YAAY,UAAU;AAC5C,cAAM,cAAiB,OAAO;AAAA,MAChC;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;AAEA,SAAS,qBAAqB,QAAwB;AACpD,QAAM,KAAK,OAAO,QAAQ,MAAM;AAChC,QAAM,OAAO,OAAO,QAAQ,UAAU;AACtC,MAAI,OAAO,GAAI,QAAO;AACtB,MAAI,SAAS,GAAI,QAAO;AACxB,SAAO,KAAK,IAAI,IAAI,IAAI;AAC1B;AAGA,SAAS,YAAY,UAAiC;AACpD,QAAM,QAAQ,SAAS,MAAM,OAAO;AACpC,QAAM,YAAsB,CAAC;AAC7B,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,GAAG,EAAG;AAC1B,QAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,gBAAU,KAAK,KAAK,MAAM,CAAC,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,IAChD;AAAA,EACF;AACA,MAAI,UAAU,WAAW,EAAG,QAAO;AACnC,SAAO,UAAU,KAAK,IAAI;AAC5B;AAEA,SAAS,cAAiB,SAAoB;AAC5C,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACLO,IAAM,kBAAkB;AAAA,EAC7B,sBAAsB;AACxB;AAEA,SAASC,qBAAmB,QAAkC;AAC5D,MAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,WAAW,GAAG;AAC7E,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AACA,SAAO,OAAO;AAChB;AAEO,SAAS,kBAAkB,QAA0B;AAC1D,SAAO;AAAA;AAAA,IAEL,MAAM,KAAK,MAAiH;AAC1H,YAAM,OAAOA,qBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ,EAAE,QAAQ,OAAO,MAAM,YAAY,MAAM,cAAc,GAAG,OAAO,KAAK,CAAC;AAAA,IAChG;AAAA;AAAA,IAGA,MAAM,KAAK,SAA2D;AACpE,YAAM,OAAOA,qBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,gBAAgB,mBAAmB,OAAO,CAAC,EAAE;AAAA,MACvE,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,MAAM,OAAO,SAA8B,OAAuD;AAChG,YAAM,OAAOA,qBAAmB,MAAM;AACtC,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,gBAAgB,mBAAmB,OAAO,CAAC,SAAS;AAAA,QAC5E,MAAM,EAAE,QAAQ,MAAM,QAAQ,QAAQ,MAAM,OAAO;AAAA,MACrD,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,OAAO,aAAa,SAA8B,OAAmE;AACnH,YAAM,OAAOA,qBAAmB,MAAM;AACtC,YAAM,WAAW,MAAM,cAAc,QAAQ;AAAA,QAC3C,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,gBAAgB,mBAAmB,OAAO,CAAC,gBAAgB;AAAA,QACnF,MAAM,EAAE,QAAQ,MAAM,QAAQ,QAAQ,MAAM,OAAO;AAAA,QACnD,QAAQ;AAAA,MACV,CAAC;AAED,aAAO,eAA+B,SAAS,IAAkC;AAAA,IACnF;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB,QAA0B;AAC7D,SAAO;AAAA;AAAA,IAEL,MAAM,kBAAkB,MAAM;AAAA,EAChC;AACF;;;ACrHA,SAASC,qBAAmB,QAAkC;AAC5D,MAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,WAAW,GAAG;AAC7E,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AACA,SAAO,OAAO;AAChB;AAEO,SAAS,gBAAgB,QAA0B;AACxD,SAAO;AAAA;AAAA,IAEL,MAAM,MAAM,OAAmD;AAC7D,YAAM,OAAOA,qBAAmB,MAAM;AACtC,YAAM,OAAqD;AAAA,QACzD,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,CAAC,GAAG,MAAM,KAAK;AAAA,MACxE;AACA,UAAI,MAAM,UAAU,OAAW,MAAK,QAAQ,MAAM;AAClD,aAAO,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,MAAM,YAAY,MAAM,eAAe,GAAG,KAAK,CAAC;AAAA,IAC3F;AAAA,EACF;AACF;;;ACDO,IAAM,gBAAgB;AAAA;AAAA,EAE3B,WAAW,YAAmC;AAC5C,WAAO,eAAe,UAAU;AAAA,EAClC;AAAA;AAAA,EAEA,eAA8B;AAC5B,WAAO;AAAA,EACT;AAAA;AAAA,EAEA,cAAc,SAAgC;AAC5C,WAAO,2BAA2B,OAAO;AAAA,EAC3C;AAAA;AAAA,EAEA,iBAAiB,aAAoC;AACnD,WAAO,6BAA6B,WAAW;AAAA,EACjD;AAAA;AAAA,EAEA,oBAAoB,YAAmC;AACrD,WAAO,+BAA+B,UAAU;AAAA,EAClD;AAAA;AAAA,EAEA,SAAS,aAAoC;AAC3C,WAAO,aAAa,WAAW;AAAA,EACjC;AACF;AAuDA,SAASC,qBAAmB,QAAkC;AAC5D,MAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,WAAW,GAAG;AAC7E,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AACA,SAAO,OAAO;AAChB;AAGA,SAAS,gBAAgB,QAAuD;AAC9E,MAAI,OAAQ,QAAO;AACnB,MAAI,OAAQ,WAAuC,cAAc,WAAY,QAAO;AAEpF,SAAO;AACT;AAGA,SAAS,eAAe,SAAiB,MAAc,OAAuC;AAC5F,QAAM,UAAU,QAAQ,SAAS,GAAG,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI;AAC/D,QAAM,SAAS,QAAQ,QAAQ,SAAS,IAAI;AAC5C,QAAM,KAAK,IAAI,gBAAgB,KAAK,EAAE,SAAS;AAC/C,SAAO,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,IAAI,EAAE,KAAK,EAAE;AAC9C;AAGA,gBAAgB,mBACd,QACA,OACA,SACA,QAC8C;AAC9C,QAAM,OAAOA,qBAAmB,MAAM;AACtC,QAAM,QAAgC,EAAE,MAAM;AAC9C,MAAI,QAAQ,OAAQ,OAAM,SAAS,KAAK,UAAU,QAAQ,MAAM;AAChE,MAAI,OAAO,OAAQ,OAAM,eAAe,OAAO;AAC/C,QAAM,MAAM,eAAe,OAAO,SAAS,YAAY,MAAM,oBAAoB,GAAG,KAAK;AACzF,QAAM,KAAM,WAA6D;AACzE,QAAM,SAAS,IAAI,GAAG,GAAG;AAEzB,QAAM,QAA4B,CAAC;AACnC,MAAI,cAAmC;AACvC,MAAI,eAAe;AACnB,MAAI,cAA4B;AAEhC,QAAM,OAAO,MAAM;AACjB,QAAI,aAAa;AACf,kBAAY;AACZ,oBAAc;AAAA,IAChB;AAAA,EACF;AACA,SAAO,YAAY,CAAC,OAAqB;AACvC,QAAI;AACF,YAAM,KAAK,KAAK,MAAM,OAAO,GAAG,SAAS,WAAW,GAAG,OAAO,OAAO,GAAG,IAAI,CAAC,CAAqB;AAAA,IACpG,QAAQ;AAAA,IAER;AACA,SAAK;AAAA,EACP;AACA,SAAO,UAAU,MAAM;AACrB,kBAAc,IAAI,MAAM,oCAAoC;AAC5D,SAAK;AAAA,EACP;AACA,SAAO,UAAU,MAAM;AACrB,mBAAe;AACf,SAAK;AAAA,EACP;AACA,UAAQ,QAAQ,iBAAiB,SAAS,MAAM,OAAO,MAAM,CAAC;AAE9D,MAAI;AACF,WAAO,CAAC,OAAO,OAAO;AACpB,UAAI,MAAM,SAAS,GAAG;AACpB,cAAM,MAAM,MAAM;AAClB;AAAA,MACF;AACA,UAAI,cAAc;AAChB,YAAI,YAAa,OAAM;AACvB;AAAA,MACF;AACA,YAAM,IAAI,QAAc,CAAC,YAAY;AACnC,sBAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF,UAAE;AACA,QAAI;AACF,aAAO,MAAM;AAAA,IACf,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAGA,gBAAgB,aACd,QACA,OACA,SACA,QAC8C;AAC9C,QAAM,OAAOA,qBAAmB,MAAM;AACtC,QAAM,QAA+D,EAAE,MAAM;AAC7E,MAAI,QAAQ,OAAQ,OAAM,SAAS,KAAK,UAAU,QAAQ,MAAM;AAChE,QAAM,WAAW,MAAM,cAAc,QAAQ;AAAA,IAC3C,QAAQ;AAAA,IACR,MAAM,YAAY,MAAM,oBAAoB;AAAA,IAC5C;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AACD,mBAAiB,SAAS,eAAiC,SAAS,IAAkC,GAAG;AACvG,QAAI,OAAO,SAAS,QAAQ,QAAQ,QAAS;AAC7C,UAAM;AAAA,EACR;AACF;AAGA,gBAAgB,cACd,QACA,OACA,SACA,QAC8C;AAC9C,QAAM,OAAOA,qBAAmB,MAAM;AACtC,QAAM,WAAW,QAAQ,kBAAkB;AAC3C,MAAI,SAAS;AACb,SAAO,CAAC,OAAO,SAAS,CAAC,QAAQ,QAAQ,SAAS;AAChD,UAAM,EAAE,KAAK,IAAI,MAAM,QAAyC,QAAQ;AAAA,MACtE,QAAQ;AAAA,MACR,MAAM,YAAY,MAAM,iBAAiB;AAAA,MACzC,MAAM,EAAE,OAAO,QAAQ,QAAQ,QAAQ,cAAc,OAAO;AAAA,IAC9D,CAAC;AACD,eAAW,SAAS,QAAQ,CAAC,GAAG;AAC9B,UAAI,OAAO,SAAS,QAAQ,QAAQ,QAAS;AAC7C,eAAS,KAAK,IAAI,QAAQ,MAAM,WAAW,CAAC;AAC5C,YAAM;AAAA,IACR;AACA,QAAI,OAAO,SAAS,QAAQ,QAAQ,QAAS;AAC7C,UAAM,IAAI,QAAc,CAAC,YAAY,WAAW,SAAS,QAAQ,CAAC;AAAA,EACpE;AACF;AAEO,SAAS,sBAAsB,QAA0B;AAC9D,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBL,UAAuB,OAAsB,UAA4B,CAAC,GAA4B;AACpG,MAAAA,qBAAmB,MAAM;AACzB,YAAM,YAAY,gBAAgB,QAAQ,SAAS;AACnD,YAAM,SAAS,EAAE,OAAO,MAAM;AAE9B,YAAM,UAAU,MAAoD;AAClE,gBAAQ,WAAW;AAAA,UACjB,KAAK;AACH,mBAAO,mBAAsB,QAAQ,OAAO,SAAS,MAAM;AAAA,UAC7D,KAAK;AACH,mBAAO,cAAiB,QAAQ,OAAO,SAAS,MAAM;AAAA,UACxD,KAAK;AAAA,UACL;AACE,mBAAO,aAAgB,QAAQ,OAAO,SAAS,MAAM;AAAA,QACzD;AAAA,MACF;AAEA,UAAI,SAA8D;AAClE,aAAO;AAAA,QACL;AAAA,QACA,CAAC,OAAO,aAAa,IAAI;AACvB,mBAAS,QAAQ;AACjB,iBAAO;AAAA,QACT;AAAA,QACA,QAAQ;AACN,iBAAO,QAAQ;AACf,eAAK,QAAQ,OAAO,MAAS;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAM,OAAoB,OAAwE;AAChG,YAAM,OAAOA,qBAAmB,MAAM;AACtC,UAAI,CAAC,OAAO,UAAU,MAAM,YAAY,KAAK,MAAM,eAAe,GAAG;AACnE,cAAM,IAAI,OAAO;AAAA,UACf,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,EAAE,cAAc,MAAM,aAAa;AAAA,UAC5C,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH;AACA,aAAO,QAAQ,QAAQ;AAAA,QACrB,QAAQ;AAAA,QACR,MAAM,YAAY,MAAM,iBAAiB;AAAA,QACzC,MAAM;AAAA,UACJ,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM;AAAA,UACd,cAAc,MAAM;AAAA,UACpB,eAAe,MAAM;AAAA,UACrB,OAAO,MAAM;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACvUA,SAAS,wBAAyC;AAe3C,SAAS,eAAe,QAA6C;AAC1E,MAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,WAAW,GAAG;AAC7E,WAAO;AAAA,EACT;AAGA,SAAO,iBAAiB;AAAA,IACtB,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,IAChB,aAAa,OAAO;AAAA,IACpB,GAAI,OAAO,WAAW,SAAY,EAAE,cAAc,OAAO,OAAO,IAAI,CAAC;AAAA,IACrE,GAAI,OAAO,UAAU,SAAY,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,EAC9D,CAAC;AACH;AAOO,SAAS,mBAA0B;AACxC,QAAM,IAAI,OAAO;AAAA,IACf,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,CAAC;AAAA,IACV,gBAAgB;AAAA,EAClB,CAAC;AACH;;;AC7CA,SAAS,OAAO,2BAA+D;AAUxE,SAAS,uBAAuB;AACrC,SAAO;AAAA;AAAA,IAEL,WAAW,oBAAoB;AAAA,EACjC;AACF;;;AC2CA,SAAS,wBAAyC;;;AC7D3C,IAAM,uBAAuB;AAW7B,IAAM,8BAA8B;AAM3C,IAAM,qBAAqB;AAQpB,SAAS,kBAAkB,MAAsB;AACtD,QAAM,SAAS,KAAK,WAAW,2BAA2B,IAAI,KAAK,MAAM,4BAA4B,MAAM,IAAI;AAC/G,MAAI,OAAO,WAAW,KAAK,OAAO,SAAS,IAAI,KAAK,CAAC,mBAAmB,KAAK,MAAM,GAAG;AACpF,UAAM,IAAI,OAAO;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,EAAE,OAAO,OAAO;AAAA,MACzB,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,SAAO,GAAG,2BAA2B,GAAG,MAAM;AAChD;AAIO,IAAM,2BAA2B;AAQjC,IAAM,uBAAyD;AAAA,EACpE,IAAI;AAAA,EACJ,eAAe;AAAA,EACf,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AACN;AAqCA,SAAS,eAAe,cAAwC;AAC9D,MAAI,OAAO,iBAAiB,YAAY,aAAa,SAAS,GAAG;AAC/D,UAAM,IAAI,OAAO;AAAA,MACf,MAAM;AAAA,MACN,SACE;AAAA,MACF,SAAS,EAAE,OAAO,eAAe;AAAA,MACjC,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAoBO,SAAS,qBAAqB,OAA8B;AACjE,UAAQ,MAAM,UAAU;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,SAAS;AACZ,qBAAe,MAAM,YAAY;AAEjC,2BAAqB,MAAM,gBAAgB,MAAM,QAAQ;AACzD,aAAO,KAAK,UAAU;AAAA,QACpB,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,gBAAgB,MAAM;AAAA,QACtB,aAAa,MAAM;AAAA,QACnB,iBAAiB,MAAM;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,IACA,KAAK;AACH,aAAO,KAAK,UAAU;AAAA,QACpB,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,eAAe,MAAM;AAAA,QACrB,UAAU,MAAM;AAAA,MAClB,CAAC;AAAA,IACH,KAAK,MAAM;AACT,UAAI,MAAM,MAAM,SAAS,GAAG,GAAG;AAC7B,cAAM,IAAI,OAAO;AAAA,UACf,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,EAAE,OAAO,QAAQ;AAAA,UAC1B,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH;AACA,aAAO,KAAK,UAAU;AAAA,QACpB,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,IACA,KAAK;AACH,aAAO,KAAK,UAAU;AAAA,QACpB,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,OAAO,MAAM;AAAA,MACf,CAAC;AAAA,EACL;AACF;AAIO,SAAS,kBAAkB,OAAuB;AACvD,SAAO,GAAG,oBAAoB,GAAG,KAAK;AACxC;;;ADmFO,SAAS,aAAa,SAAyC;AACpE,QAAM,UAAU,eAAe,QAAQ,SAAS,QAAQ,OAAO;AAC/D,QAAM,SAA2B;AAAA,IAC/B;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,aAAa,QAAQ;AAAA,IACrB,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf,gBAAgB,QAAQ;AAAA,IACxB,aAAa,QAAQ;AAAA,EACvB;AACA,QAAM,aAAa,eAAe,MAAM;AACxC,SAAO;AAAA,IACL,MAAM,gBAAgB,MAAM;AAAA,IAC5B,UAAU,sBAAsB,MAAM;AAAA,IACtC,SAAS,qBAAqB,MAAM;AAAA,IACpC,UAAU,sBAAsB,MAAM;AAAA,IACtC,YAAY,wBAAwB,MAAM;AAAA,IAC1C,WAAW,uBAAuB,MAAM;AAAA,IACxC,UAAU,sBAAsB,MAAM;AAAA,IACtC,OAAO,mBAAmB,MAAM;AAAA,IAChC,MAAM,kBAAkB,MAAM;AAAA,IAC9B,KAAK,iBAAiB,MAAM;AAAA,IAC5B,IAAI,gBAAgB,MAAM;AAAA,IAC1B,QAAQ,oBAAoB,MAAM;AAAA,IAClC,SAAS,qBAAqB,MAAM;AAAA,IACpC,IAAI,gBAAgB,MAAM;AAAA,IAC1B,UAAU,sBAAsB,MAAM;AAAA;AAAA;AAAA;AAAA,IAItC,IAAI,OAAO;AACT,UAAI,eAAe,KAAM,QAAO,iBAAiB;AACjD,aAAO;AAAA,IACT;AAAA,IACA,YAAY,qBAAqB;AAAA,IACjC,MAAM,iBAAiB,MAAM;AAAA,IAC7B,QAAQ,OAAO,OAAO,EAAE,GAAG,OAAO,CAAC;AAAA,EACrC;AACF;","names":["requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug"]}
|
|
1
|
+
{"version":3,"sources":["../src/data/from.ts","../src/projects.ts","../src/storage-buckets.ts","../src/provider-region.ts","../src/storage-locations.ts","../src/metadata.ts","../src/migrations.ts","../src/functions.ts","../src/policies.ts","../src/audit.ts","../src/orgs.ts","../src/org.ts","../src/me.ts","../src/studio/workflows.ts","../src/studio/dashboards.ts","../src/studio/index.ts","../src/internal/sse.ts","../src/compute/llms.ts","../src/ai.ts","../src/realtime.ts","../src/gate-bridge.ts","../src/extensions-bridge.ts","../src/index.ts","../src/byos.ts"],"sourcesContent":["/**\n * Data-plane DSL: `client.from(collection).select()` etc.\n *\n * The DSL is a\n * chainable builder that composes a query against a project's user-\n * collection. The chain terminates in a verb (`select`, `insert`,\n * `update`, `delete`) that issues the HTTP request and returns the\n * envelope.\n *\n * Wire mapping:\n * - `from('posts').select()` → GET /@<projectSlug>/data/posts\n * - `from('posts').select().eq('id','rec_X')` → GET /@<projectSlug>/data/posts?id=eq.rec_X\n * - `from('posts').insert({ title: '...' })` → POST /@<projectSlug>/data/posts\n * - `from('posts').update({ title: '...' }).eq(...)` → PATCH /@<projectSlug>/data/posts/:id\n * - `from('posts').delete().eq('id','rec_X')` → DELETE /@<projectSlug>/data/posts/:id\n *\n * Filters compose as AND; multiple chained `.eq()` /\n * `.gt()` / etc. calls all attach to the query string.\n *\n * Pagination + counting: `.limit(n)`, `.cursor(opaque)`,\n * `.count('none' | 'exact' | 'estimated')`. The returned envelope's\n * `meta.cursor.next` is the cursor for the next page.\n *\n * Per KError delivery: every terminal verb throws KError on\n * non-2xx. Caller catches via `instanceof KError` + narrows on `.code`.\n */\n\nimport { projectPath, validateSlug } from \"../url-grammar.ts\";\nimport { request, type HttpClientConfig } from \"../http.ts\";\nimport { KError } from \"../kerror.ts\";\nimport type { Envelope } from \"../envelope.ts\";\nimport type { FilterOp } from \"../types.ts\";\n\n/**\n * Internal filter representation. Serialised to query parameters at\n * terminal-verb time.\n */\ntype Filter = {\n column: string;\n op: FilterOp;\n value: string | number | boolean | ReadonlyArray<string | number>;\n};\n\n/**\n * Query builder shared across all verbs. The `select`/`insert`/`update`/\n * `delete` factories below extend this via composition so the chainable\n * shape is consistent.\n */\nclass QueryBuilder {\n protected filters: Filter[] = [];\n protected limitVal?: number;\n protected cursorVal?: string;\n protected countMode?: \"none\" | \"exact\" | \"estimated\";\n\n /**\n * Attach an equality filter. Composes with other filters via AND.\n */\n eq(column: string, value: string | number | boolean): this {\n this.filters.push({ column, op: \"eq\", value });\n return this;\n }\n\n neq(column: string, value: string | number | boolean): this {\n this.filters.push({ column, op: \"neq\", value });\n return this;\n }\n\n gt(column: string, value: string | number): this {\n this.filters.push({ column, op: \"gt\", value });\n return this;\n }\n\n gte(column: string, value: string | number): this {\n this.filters.push({ column, op: \"gte\", value });\n return this;\n }\n\n lt(column: string, value: string | number): this {\n this.filters.push({ column, op: \"lt\", value });\n return this;\n }\n\n lte(column: string, value: string | number): this {\n this.filters.push({ column, op: \"lte\", value });\n return this;\n }\n\n in(column: string, values: ReadonlyArray<string | number>): this {\n this.filters.push({ column, op: \"in\", value: values });\n return this;\n }\n\n notIn(column: string, values: ReadonlyArray<string | number>): this {\n this.filters.push({ column, op: \"notIn\", value: values });\n return this;\n }\n\n like(column: string, pattern: string): this {\n this.filters.push({ column, op: \"like\", value: pattern });\n return this;\n }\n\n ilike(column: string, pattern: string): this {\n this.filters.push({ column, op: \"ilike\", value: pattern });\n return this;\n }\n\n is(column: string, value: \"null\" | \"true\" | \"false\"): this {\n this.filters.push({ column, op: \"is\", value });\n return this;\n }\n\n /**\n * Attach a `.filter(column, op, value)` for explicit op selection.\n */\n filter(column: string, op: FilterOp, value: string | number | boolean | ReadonlyArray<string | number>): this {\n this.filters.push({ column, op, value });\n return this;\n }\n\n /**\n * Page-size hint (default per gateway tier; max bounded server-side).\n */\n limit(n: number): this {\n this.limitVal = n;\n return this;\n }\n\n /**\n * Opaque cursor for next-page fetch — returned in prior response's\n * `meta.cursor.next`.\n */\n cursor(opaque: string): this {\n this.cursorVal = opaque;\n return this;\n }\n\n /**\n * Total-count behaviour. `none` (default) skips the\n * count query (cheapest); `exact` runs `SELECT COUNT(*)` (most\n * expensive at scale); `estimated` reads from pg_stats (fast +\n * approximate).\n */\n count(mode: \"none\" | \"exact\" | \"estimated\"): this {\n this.countMode = mode;\n return this;\n }\n\n /**\n * Serialise filters + pagination + count to query parameters.\n * Format: per-filter `<column>=<op>.<value>`; multi-value (in/notIn)\n * uses comma-joined parenthesised value `<col>=in.(a,b,c)`.\n */\n protected toQuery(): Record<string, string | number | undefined> {\n const q: Record<string, string | number | undefined> = {};\n for (const f of this.filters) {\n const val = Array.isArray(f.value)\n ? `(${(f.value as ReadonlyArray<string | number>).join(\",\")})`\n : String(f.value);\n // Multiple filters on the same column are not currently supported via\n // the simple key=value query map. future cycles cover\n // `.or()` / multi-filter — when those land the builder will switch\n // to a serialisation that supports collisions.\n q[f.column] = `${f.op}.${val}`;\n }\n if (this.limitVal !== undefined) q[\"limit\"] = this.limitVal;\n if (this.cursorVal !== undefined) q[\"cursor\"] = this.cursorVal;\n if (this.countMode !== undefined) q[\"count\"] = this.countMode;\n return q;\n }\n}\n\n/**\n * Terminal-verb builder returned by `from(collection)`. Each verb method\n * returns a sub-builder that resolves to the HTTP envelope when awaited.\n */\nclass FromBuilder {\n constructor(\n private readonly config: HttpClientConfig,\n private readonly collection: string,\n ) {}\n\n /**\n * Initiate a SELECT query. Returns a chainable filter/page builder\n * that resolves to the data envelope on await.\n */\n select<T = unknown>(): SelectBuilder<T> {\n return new SelectBuilder<T>(this.config, this.collection);\n }\n\n /**\n * Insert one record. Returns the inserted record (with platform-\n * generated `id` + `metadata`).\n */\n async insert<T = unknown>(record: Partial<T>): Promise<Envelope<T>> {\n return request<T>(this.config, {\n method: \"POST\",\n path: collectionPath(this.config, this.collection),\n body: record,\n });\n }\n\n /**\n * Initiate an UPDATE. Returns a builder; the chain MUST include a\n * filter clause (typically `.eq('id', 'rec_...')`) and resolves to\n * the updated record envelope.\n */\n update<T = unknown>(patch: Partial<T>): UpdateBuilder<T> {\n return new UpdateBuilder<T>(this.config, this.collection, patch);\n }\n\n /**\n * Initiate a DELETE. Returns a builder; the chain MUST include a\n * filter clause and resolves to the deleted record envelope.\n */\n delete<T = unknown>(): DeleteBuilder<T> {\n return new DeleteBuilder<T>(this.config, this.collection);\n }\n}\n\nclass SelectBuilder<T> extends QueryBuilder implements PromiseLike<Envelope<ReadonlyArray<T>>> {\n constructor(\n private readonly config: HttpClientConfig,\n private readonly collection: string,\n ) {\n super();\n }\n\n private exec(): Promise<Envelope<ReadonlyArray<T>>> {\n return request<ReadonlyArray<T>>(this.config, {\n method: \"GET\",\n path: collectionPath(this.config, this.collection),\n query: this.toQuery(),\n });\n }\n\n then<TResult1 = Envelope<ReadonlyArray<T>>, TResult2 = never>(\n onfulfilled?: ((value: Envelope<ReadonlyArray<T>>) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.exec().then(onfulfilled, onrejected);\n }\n}\n\nclass UpdateBuilder<T> extends QueryBuilder implements PromiseLike<Envelope<T>> {\n constructor(\n private readonly config: HttpClientConfig,\n private readonly collection: string,\n private readonly patch: Partial<T>,\n ) {\n super();\n }\n\n private exec(): Promise<Envelope<T>> {\n const idFilter = this.filters.find((f) => f.column === \"id\" && f.op === \"eq\");\n if (idFilter === undefined) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"update() requires an `.eq('id', '...')` filter; changing many rows in one call is not supported\",\n context: { collection: this.collection },\n recommendation: \"Chain `.eq('id', 'rec_…')` before awaiting the update; to change several rows, call update once per id.\",\n });\n }\n return request<T>(this.config, {\n method: \"PATCH\",\n path: `${collectionPath(this.config, this.collection)}/${encodeURIComponent(String(idFilter.value))}`,\n body: this.patch,\n });\n }\n\n then<TResult1 = Envelope<T>, TResult2 = never>(\n onfulfilled?: ((value: Envelope<T>) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.exec().then(onfulfilled, onrejected);\n }\n}\n\nclass DeleteBuilder<T> extends QueryBuilder implements PromiseLike<Envelope<T>> {\n constructor(\n private readonly config: HttpClientConfig,\n private readonly collection: string,\n ) {\n super();\n }\n\n private exec(): Promise<Envelope<T>> {\n const idFilter = this.filters.find((f) => f.column === \"id\" && f.op === \"eq\");\n if (idFilter === undefined) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"delete() requires an `.eq('id', '...')` filter; deleting many rows in one call is not supported\",\n context: { collection: this.collection },\n recommendation: \"Chain `.eq('id', 'rec_…')` before awaiting the delete; to delete several rows, call delete once per id.\",\n });\n }\n return request<T>(this.config, {\n method: \"DELETE\",\n path: `${collectionPath(this.config, this.collection)}/${encodeURIComponent(String(idFilter.value))}`,\n });\n }\n\n then<TResult1 = Envelope<T>, TResult2 = never>(\n onfulfilled?: ((value: Envelope<T>) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.exec().then(onfulfilled, onrejected);\n }\n}\n\n/**\n * Build the collection-records URL path. Requires `config.projectSlug`\n * to be bound; member-plane resources route via the `/@<projectSlug>/...`\n * prefix per the URL grammar.\n */\nfunction collectionPath(config: HttpClientConfig, collection: string): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new KError({\n code: \"K9O_MISSING_PROJECT_CONTEXT\",\n message: \"data-plane operations require projectSlug to be bound on the client\",\n context: { collection },\n recommendation: \"Pass `projectSlug` in createClient options or use a project-scoped sub-client.\",\n });\n }\n validateSlug(config.projectSlug, \"project\");\n // Validate collection name shape — same slug grammar.\n if (!/^[a-z][a-z0-9_-]{0,62}$/.test(collection)) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: `collection name \"${collection}\" does not match required format`,\n context: { collection },\n recommendation: \"Use lowercase letters / digits / underscores / hyphens; start with a letter; 1-63 chars.\",\n });\n }\n return projectPath(config.projectSlug, `data/${collection}`);\n}\n\n/**\n * Factory — entry point for the data-plane DSL. Returned via\n * `client.from(collection)` on the K9oClient instance.\n */\nexport function makeFromFactory(config: HttpClientConfig) {\n return function from(collection: string): FromBuilder {\n return new FromBuilder(config, collection);\n };\n}\n","/**\n * Project lifecycle SDK methods — `client.projects.*`.\n *\n * Wire mapping per gateway routes (`services/gateway/src/routes/projects-crud.ts` +\n * `discovery.ts`):\n * - `client.projects.list()` → GET /projects\n * - `client.projects.create({...})` → POST /projects\n * - `client.projects.get(slug)` → GET /@<projectSlug>/project\n * - `client.projects.update(slug,...)` → PATCH /@<projectSlug>/project\n *\n * The `list` + `create` operations operate org-plane and require\n * `orgSlug` to be bound on the client (or the bearer token to carry\n * an org context). The `get` + `update` operations\n * operate member-plane and use the project slug.\n *\n * Per: all methods throw KError on non-2xx.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { orgPath, projectPath, validateSlug } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/**\n * Project shape. Fields are typed per the canonical shape;\n * the gateway may return additional fields that this type doesn't\n * narrow — those are accessible via `as unknown as` widening.\n */\nexport type Project = {\n /** `proj_<base62>`. */\n id: string;\n slug: string;\n name: string;\n custodyMode: \"managed\" | \"byok\" | \"hyok\";\n createdAt: string;\n updatedAt: string | null;\n orgId: string;\n};\n\n/**\n * Project-creation input.\n */\nexport type CreateProjectInput = {\n slug: string;\n name: string;\n custodyMode?: \"managed\" | \"byok\" | \"hyok\" | undefined;\n};\n\n/**\n * Project-update patch.\n */\nexport type UpdateProjectInput = {\n name?: string;\n};\n\n/**\n * Factory — produces the `client.projects.*` namespace bound to the\n * supplied config.\n */\nexport function makeProjectsNamespace(config: HttpClientConfig) {\n return {\n /**\n * List projects accessible to the caller. Requires authenticated\n * session; results are scoped by RBAC.\n */\n async list(): Promise<Envelope<ReadonlyArray<Project>>> {\n return request<ReadonlyArray<Project>>(config, {\n method: \"GET\",\n path: orgPath(\"projects\"),\n });\n },\n\n /**\n * Create a new project under the caller's active org.\n */\n async create(input: CreateProjectInput): Promise<Envelope<Project>> {\n validateSlug(input.slug, \"project\");\n return request<Project>(config, {\n method: \"POST\",\n path: orgPath(\"projects\"),\n body: input,\n });\n },\n\n /**\n * Get a project by slug. Returns the project record + meta.\n */\n async get(slug: string): Promise<Envelope<Project>> {\n validateSlug(slug, \"project\");\n return request<Project>(config, {\n method: \"GET\",\n path: projectPath(slug, \"project\"),\n });\n },\n\n /**\n * Update a project's mutable fields.\n */\n async update(slug: string, patch: UpdateProjectInput): Promise<Envelope<Project>> {\n validateSlug(slug, \"project\");\n return request<Project>(config, {\n method: \"PATCH\",\n path: projectPath(slug, \"project\"),\n body: patch,\n });\n },\n };\n}\n","/**\n * `client.storage` buckets and objects: per-project logical buckets and the objects in them, against\n * `/@<projectSlug>/storage/buckets…`. `client.storage.locations.*` (the customer's own object stores) lives in\n * `storage-locations.ts` and is unchanged.\n *\n * Bucket names are logical: the platform resolves them to a physical store, so a developer never sees a\n * physical bucket or key. Signed URLs require an explicit `expiresIn` (no default, max 7 days).\n *\n * What is NOT here yet, by design: a signed PUT (a method- and content-type-bound upload URL). The gateway has\n * no route for it; uploads go through the multipart `upload` below.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport { KError } from \"./kerror.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/** A bucket. */\nexport type StorageBucket = {\n name: string;\n /** `true` removes the authentication requirement on GET; per-object access policies still apply. */\n public: boolean;\n /** Bytes; `null` = no limit. */\n fileSizeLimit: number | null;\n /** MIME allow-list; empty = any. */\n allowedMimeTypes: string[];\n versioning: boolean;\n /** Lifecycle auto-expiry in days; `null` = never. */\n deleteAfterDays: number | null;\n createdAt: string;\n updatedAt: string;\n /** Platform-owned buckets (for example audit assets) cannot be written through the public routes. */\n system: boolean;\n /** The storage location the bucket is linked to, or `null` for platform-managed storage. */\n byosBindingId: string | null;\n};\n\n/** Options for `createBucket`. The bucket name is the first argument (3 to 63 chars, lowercase, digits, hyphens). */\nexport type CreateBucketOptions = {\n public?: boolean;\n fileSizeLimit?: number;\n allowedMimeTypes?: string[] | null;\n versioning?: boolean;\n deleteAfterDays?: number;\n /** Link the bucket to one of the project's storage locations (see `client.storage.locations`). */\n byosBindingId?: string;\n};\n\n/** Fields you may change on a bucket. `null` clears a limit; `allowedMimeTypes: null` allows any type. */\nexport type UpdateBucketOptions = {\n public?: boolean;\n fileSizeLimit?: number | null;\n allowedMimeTypes?: string[] | null;\n versioning?: boolean;\n deleteAfterDays?: number | null;\n /** `null` unlinks the bucket from its storage location. */\n byosBindingId?: string | null;\n};\n\n/** An object listing entry. `path` is relative to the bucket. */\nexport type StorageObject = {\n path: string;\n size: number;\n lastModified: string | null;\n};\n\nexport type UploadOptions = {\n /** Defaults to the data's own type when it is a `Blob`. */\n contentType?: string;\n /** `false` (default) refuses to overwrite an existing path (`409 K9O_ALREADY_EXISTS`). */\n upsert?: boolean;\n /** Caller-defined string metadata: at most 10 keys and 2 KB in total (enforced by the gateway). */\n metadata?: Record<string, string>;\n};\n\nexport type SignedUrlOptions = {\n /** Seconds, required: 1 to 604800 (7 days). There is deliberately no default. */\n expiresIn: number;\n /** `true` makes the download an attachment (`Content-Disposition: attachment`). */\n download?: boolean;\n};\n\nexport type SignedUrl = { signedUrl: string; expiresIn: number };\nexport type RemovedObject = { bucket: string; path: string; deleted: boolean };\nexport type DeletedBucket = { name: string; deleted: true; objectsDeleted: number };\n\nconst MAX_EXPIRES_IN = 604_800;\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (config.projectSlug === undefined || config.projectSlug.length === 0) {\n throw new KError({\n code: \"K9O_MISSING_PROJECT_CONTEXT\",\n message: \"client.storage buckets and objects require a bound projectSlug (per-project resource)\",\n context: {},\n recommendation: \"Pass projectSlug when constructing the client.\",\n });\n }\n return config.projectSlug;\n}\n\nconst bucketsPath = (config: HttpClientConfig, suffix = \"\"): string =>\n projectPath(requireProjectSlug(config), `storage/buckets${suffix}`);\n\nconst bucketPath = (config: HttpClientConfig, name: string, suffix = \"\"): string => {\n if (name.length === 0) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"bucket name must not be empty\",\n context: { field: \"bucket\", reason: \"empty\" },\n recommendation: null,\n });\n }\n // `.` and `..` survive percent-encoding and are collapsed as dot segments by the URL layer BEFORE the request leaves,\n // so a bucket named `..` would address a different route. No bucket can have that name (3 to 63 chars), so refuse it\n // here rather than send a rewritten URL.\n if (name === \".\" || name === \"..\") {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"bucket name must not be a dot segment\",\n context: { field: \"bucket\", reason: \"dot_segment\" },\n recommendation: null,\n });\n }\n return bucketsPath(config, `/${encodeURIComponent(name)}${suffix}`);\n};\n\nfunction requireObjectPath(path: string): void {\n if (path.length === 0) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"object path must not be empty\",\n context: { field: \"path\", reason: \"empty\" },\n recommendation: null,\n });\n }\n}\n\nfunction requireExpiresIn(expiresIn: unknown): asserts expiresIn is number {\n if (typeof expiresIn !== \"number\" || !Number.isInteger(expiresIn) || expiresIn < 1 || expiresIn > MAX_EXPIRES_IN) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: `expiresIn is required and must be an integer from 1 to ${MAX_EXPIRES_IN} seconds`,\n context: { field: \"expiresIn\", reason: \"out_of_range\" },\n recommendation: \"Pass an explicit expiresIn; signed URLs have no default lifetime.\",\n });\n }\n}\n\nfunction toBlob(data: Blob | Uint8Array | ArrayBuffer | string, contentType?: string): Blob {\n const init = contentType !== undefined ? { type: contentType } : {};\n if (data instanceof Blob) return contentType !== undefined && data.type !== contentType ? new Blob([data], init) : data;\n if (typeof data === \"string\") return new Blob([data], init);\n return new Blob([data as unknown as ArrayBuffer], init);\n}\n\n/** A handle on one bucket: `client.storage.from(\"avatars\")`. */\nexport function makeBucketHandle(config: HttpClientConfig, bucket: string) {\n return {\n /**\n * Upload an object. `POST /@<projectSlug>/storage/buckets/<bucket>/objects` (multipart). The bytes pass through\n * the gateway; the bucket's size and MIME limits are enforced there.\n */\n async upload(path: string, data: Blob | Uint8Array | ArrayBuffer | string, options: UploadOptions = {}): Promise<Envelope<StorageObject>> {\n requireObjectPath(path);\n const form = new FormData();\n form.append(\"file\", toBlob(data, options.contentType), path.split(\"/\").pop() || \"file\");\n form.append(\"path\", path);\n if (options.contentType !== undefined) form.append(\"contentType\", options.contentType);\n form.append(\"upsert\", options.upsert === true ? \"true\" : \"false\");\n if (options.metadata !== undefined) form.append(\"metadata\", JSON.stringify(options.metadata));\n return request<StorageObject>(config, { method: \"POST\", path: bucketPath(config, bucket, \"/objects\"), body: form });\n },\n\n /**\n * A pre-authenticated GET URL for one object. `POST …/objects/sign`. `expiresIn` is required.\n * (A signed PUT is not offered: the gateway has no route for it yet.)\n */\n async createSignedUrl(path: string, options: SignedUrlOptions): Promise<Envelope<SignedUrl>> {\n requireObjectPath(path);\n requireExpiresIn(options?.expiresIn);\n return request<SignedUrl>(config, {\n method: \"POST\",\n path: bucketPath(config, bucket, \"/objects/sign\"),\n body: { path, expiresIn: options.expiresIn, ...(options.download !== undefined ? { download: options.download } : {}) },\n });\n },\n\n /** List objects, optionally under a prefix. `GET …/objects?prefix=`. */\n async list(options: { prefix?: string } = {}): Promise<Envelope<ReadonlyArray<StorageObject>>> {\n return request<ReadonlyArray<StorageObject>>(config, {\n method: \"GET\",\n path: bucketPath(config, bucket, \"/objects\"),\n ...(options.prefix !== undefined ? { query: { prefix: options.prefix } } : {}),\n });\n },\n\n /** Delete one object. `DELETE …/objects?path=`. */\n async remove(path: string): Promise<Envelope<RemovedObject>> {\n requireObjectPath(path);\n return request<RemovedObject>(config, { method: \"DELETE\", path: bucketPath(config, bucket, \"/objects\"), query: { path } });\n },\n };\n}\n\n/** Bucket operations; merged into `client.storage` next to `locations`. */\nexport function makeBucketOperations(config: HttpClientConfig) {\n return {\n /** List the project's buckets. `GET /@<projectSlug>/storage/buckets`. */\n async listBuckets(): Promise<Envelope<ReadonlyArray<StorageBucket>>> {\n return request<ReadonlyArray<StorageBucket>>(config, { method: \"GET\", path: bucketsPath(config) });\n },\n\n /** Read one bucket. `GET …/buckets/<name>`. */\n async getBucket(name: string): Promise<Envelope<StorageBucket>> {\n return request<StorageBucket>(config, { method: \"GET\", path: bucketPath(config, name) });\n },\n\n /**\n * Create a bucket. `POST …/buckets`. A name outside 3 to 63 lowercase letters, digits and hyphens is refused\n * (`INVALID_BUCKET_NAME`).\n */\n async createBucket(name: string, options: CreateBucketOptions = {}): Promise<Envelope<StorageBucket>> {\n return request<StorageBucket>(config, { method: \"POST\", path: bucketsPath(config), body: { name, ...options } });\n },\n\n /** Change a bucket. `PATCH …/buckets/<name>`. */\n async updateBucket(name: string, options: UpdateBucketOptions): Promise<Envelope<StorageBucket>> {\n return request<StorageBucket>(config, { method: \"PATCH\", path: bucketPath(config, name), body: options });\n },\n\n /**\n * Delete a bucket. `DELETE …/buckets/<name>`. A non-empty bucket is refused unless `empty: true`, which purges\n * its objects first.\n */\n async deleteBucket(name: string, options: { empty?: boolean } = {}): Promise<Envelope<DeletedBucket>> {\n return request<DeletedBucket>(config, {\n method: \"DELETE\",\n path: bucketPath(config, name),\n ...(options.empty === true ? { query: { empty: \"true\" } } : {}),\n });\n },\n\n /** A handle on one bucket for object operations: `from(\"avatars\").upload(...)`. */\n from(bucket: string) {\n return makeBucketHandle(config, bucket);\n },\n };\n}\n","/**\n * The provider's own name for a bucket's location (`providerRegion`), as opposed to the platform region (a short code\n * such as `de01`). It goes into hostnames (`s3.<r>.amazonaws.com`, `sts.<r>.amazonaws.com`, `s3.<r>.backblazeb2.com`),\n * so a value like `x.attacker.net#` would aim a SigV4-signed request at a host the caller chose. The gateway checks the\n * same closed grammar on write and again where each endpoint is built; checking it here first means a bad value is\n * refused before any request is sent and before a credential envelope is sealed.\n *\n * Grammars (the Step 0 ruling for the BYOS split):\n * - `s3` (AWS): `^[a-z]{2}(-gov)?-[a-z]+-\\d$` e.g. `us-east-1`, `us-gov-west-1`\n * - `b2`: `^[a-z]{2}-[a-z]+-\\d{3}$` e.g. `eu-central-003`\n * - `r2`: `auto` only\n * - `gcs`, `azure_blob`: lower-case letters, digits and `-`, 1 to 32 characters, first and last alphanumeric (the gateway's bound)\n * - `s3_compatible`, `minio`: the same closed charset as GCS and Azure. The ruling gives the AWS grammar only for an\n * S3-compatible store that uses an AWS endpoint; every other region name is accepted only if it cannot reshape a host.\n */\n\nimport { KError } from \"./kerror.ts\";\n\nexport type ProviderRegionProvider = \"s3\" | \"s3_compatible\" | \"gcs\" | \"azure_blob\" | \"minio\" | \"r2\" | \"b2\";\n\nconst CHARSET = /^[a-z0-9](?:[a-z0-9-]{0,30}[a-z0-9])?$/;\nconst GRAMMAR: Record<ProviderRegionProvider, (v: string) => boolean> = {\n s3: (v) => /^[a-z]{2}(-gov)?-[a-z]+-\\d$/.test(v),\n b2: (v) => /^[a-z]{2}-[a-z]+-\\d{3}$/.test(v),\n r2: (v) => v === \"auto\",\n gcs: (v) => CHARSET.test(v),\n azure_blob: (v) => CHARSET.test(v),\n s3_compatible: (v) => CHARSET.test(v),\n minio: (v) => CHARSET.test(v),\n};\n\n/** True if `value` is a well-formed provider region for `provider`; with no provider, the closed charset only. */\nexport function isProviderRegion(value: unknown, provider?: ProviderRegionProvider): boolean {\n if (typeof value !== \"string\" || value.length === 0) return false;\n return provider === undefined ? CHARSET.test(value) : GRAMMAR[provider](value);\n}\n\n/**\n * Throw `K9O_INVALID_FIELD_VALUE` (`reason: \"provider_region_invalid\"`, the gateway's own reason) unless `value` is a\n * well-formed provider region. The value is never echoed.\n */\nexport function assertProviderRegion(value: unknown, provider?: ProviderRegionProvider): void {\n if (isProviderRegion(value, provider)) return;\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message:\n provider === undefined\n ? \"providerRegion must be lower-case letters, digits and '-' (at most 32 characters)\"\n : `providerRegion is not a valid ${provider} region`,\n context: { field: \"providerRegion\", reason: \"provider_region_invalid\", ...(provider !== undefined ? { provider } : {}) },\n recommendation:\n provider === \"r2\" ? \"Use `auto` for R2.\" : \"Pass the provider's own region name (for example `us-east-1`), not the platform region (`de01`).\",\n });\n}\n","/**\n * `client.storage.locations.*` — storage locations: the customer's own object stores (Bring-Your-Own-Store),\n * registered once per project and then linked to buckets and Datasets. Per-project CRUD against\n * `/@<projectSlug>/storage/locations`; it replaces the withdrawn purpose-based `client.byos.*` /\n * `/@<projectSlug>/byos` (hard cutover: the old routes answer 404).\n *\n * Deliberately independent of `byos.ts` (the credential pre-create/reference helpers) and of\n * `client.kibo.vault.secrets` — a location's `credentialRef` is just a string here. The caller pre-creates the\n * credential separately (`k9o byos-cred create` / `client.kibo.vault.secrets.create`) and passes the resulting\n * `kibo://byos-creds/<secId>` reference in; this namespace never creates, reads or returns a credential.\n *\n * A location carries no \"purpose\": which bucket or Dataset uses it is decided at link time, not here.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport { KError } from \"./kerror.ts\";\nimport type { Envelope } from \"./envelope.ts\";\nimport { makeBucketOperations } from \"./storage-buckets.ts\";\nimport { assertProviderRegion } from \"./provider-region.ts\";\n\n/** Storage provider. */\nexport type StorageLocationProvider = \"s3\" | \"s3_compatible\" | \"gcs\" | \"azure_blob\" | \"minio\" | \"r2\" | \"b2\";\n/** Key-custody mode. */\nexport type StorageLocationCustodyMode = \"PLATFORM_MANAGED\" | \"BYOK\" | \"HYOK\";\n\n/**\n * Non-secret, provider-specific configuration. Keys the platform reads: `accountId` and `parentAccessKeyId`\n * (`r2`), `bucketId` (`b2`). The gateway stores them as given and the credential mint fails closed when a\n * required one is missing, so set them when you create the location.\n */\nexport type StorageLocationProviderParams = Record<string, string>;\n\n/** A storage location. */\nexport type StorageLocation = {\n id: string;\n projectId: string;\n provider: StorageLocationProvider;\n bucketName: string;\n /** The platform region (a 4-character short code such as `de01`), checked against the project's residency set. */\n region: string;\n /** The provider's own name for the bucket's location (`us-east-1`, `auto` for R2, the GCS or Azure location). Never residency-checked. */\n providerRegion: string;\n endpointOverride: string | null;\n /** The `kibo://byos-creds/<secId>` reference. The credential itself is never returned. */\n credentialRef: string;\n custodyMode: StorageLocationCustodyMode;\n providerParams: StorageLocationProviderParams;\n createdAt: string;\n /** `null` while the location is live. */\n retiredAt: string | null;\n};\n\n/** Input to register a location from a pre-created credential reference. */\nexport type CreateStorageLocationInput = {\n provider: StorageLocationProvider;\n bucketName: string;\n /** The platform region (short code), checked against the project's residency set. */\n region: string;\n /** The provider's own name for the bucket's location. Required; `auto` for R2. */\n providerRegion: string;\n endpointOverride?: string;\n credentialRef: string;\n custodyMode?: StorageLocationCustodyMode;\n providerParams?: StorageLocationProviderParams;\n};\n\n/**\n * Fields you may change on a live location. `provider` cannot change. Moving a location that is in use (its\n * bucket, region, providerRegion, endpoint, `providerParams` or `custodyMode`) is refused with `409 location_in_use`; rotating\n * the credential is allowed. A `custodyMode` change counts as a move because it re-states the custody claim for\n * data already stored there. `providerParams`, when given, REPLACES the whole map (send every key you want to keep).\n */\nexport type UpdateStorageLocationInput = {\n bucketName?: string;\n region?: string;\n providerRegion?: string;\n /** `null` clears a previously set override. */\n endpointOverride?: string | null;\n credentialRef?: string;\n custodyMode?: StorageLocationCustodyMode;\n providerParams?: StorageLocationProviderParams;\n};\n\n/** Result of retiring a location. */\nexport type RetiredStorageLocation = { id: string; status: \"retired\" };\n\n/**\n * Result of `test`. Today this is a dry run that echoes the location's coordinates; the live probe is not\n * built yet (`dependencyOn` names what it waits for).\n */\nexport type StorageLocationTestResult = {\n dryRun: boolean;\n locationId: string;\n provider: StorageLocationProvider;\n bucketName: string;\n region: string;\n providerRegion: string;\n endpointOverride: string | null;\n dependencyOn: string;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (config.projectSlug === undefined || config.projectSlug.length === 0) {\n throw new KError({\n code: \"K9O_MISSING_PROJECT_CONTEXT\",\n message: \"client.storage.locations requires a bound projectSlug (per-project resource)\",\n context: {},\n recommendation: \"Pass projectSlug when constructing the client.\",\n });\n }\n return config.projectSlug;\n}\n\nconst locationsPath = (config: HttpClientConfig, suffix = \"\"): string =>\n projectPath(requireProjectSlug(config), `storage/locations${suffix}`);\n\nexport function makeStorageNamespace(config: HttpClientConfig) {\n return {\n // Buckets and objects (storage-buckets.ts): createBucket, listBuckets, from(bucket).upload, ...\n ...makeBucketOperations(config),\n locations: {\n /** List the live storage locations of the bound project. `GET /@<projectSlug>/storage/locations`. */\n async list(): Promise<Envelope<ReadonlyArray<StorageLocation>>> {\n return request<ReadonlyArray<StorageLocation>>(config, { method: \"GET\", path: locationsPath(config) });\n },\n\n /**\n * Register a location. `POST /@<projectSlug>/storage/locations`. The region must be inside the project's\n * residency set (`400`, reason `region_outside_residency`).\n */\n async create(input: CreateStorageLocationInput): Promise<Envelope<StorageLocation>> {\n assertProviderRegion(input.providerRegion, input.provider);\n return request<StorageLocation>(config, { method: \"POST\", path: locationsPath(config), body: input });\n },\n\n /** Read one location. `GET /@<projectSlug>/storage/locations/<locationId>`. */\n async get(locationId: string): Promise<Envelope<StorageLocation>> {\n return request<StorageLocation>(config, {\n method: \"GET\",\n path: locationsPath(config, `/${encodeURIComponent(locationId)}`),\n });\n },\n\n /** Update a live location. `PATCH /@<projectSlug>/storage/locations/<locationId>`. */\n async update(locationId: string, patch: UpdateStorageLocationInput): Promise<Envelope<StorageLocation>> {\n // The provider of an existing location cannot change and is not in the patch, so only the closed charset is\n // checked here; the gateway applies the provider's own grammar.\n if (patch.providerRegion !== undefined) assertProviderRegion(patch.providerRegion);\n return request<StorageLocation>(config, {\n method: \"PATCH\",\n path: locationsPath(config, `/${encodeURIComponent(locationId)}`),\n body: patch,\n });\n },\n\n /**\n * Retire a location. `DELETE /@<projectSlug>/storage/locations/<locationId>`. Refused with\n * `409 location_in_use` while a bucket or any Dataset (retired ones included) still uses it.\n */\n async retire(locationId: string): Promise<Envelope<RetiredStorageLocation>> {\n return request<RetiredStorageLocation>(config, {\n method: \"DELETE\",\n path: locationsPath(config, `/${encodeURIComponent(locationId)}`),\n });\n },\n\n /** Dry-run check of a location. `POST /@<projectSlug>/storage/locations/<locationId>/test`. */\n async test(locationId: string): Promise<Envelope<StorageLocationTestResult>> {\n return request<StorageLocationTestResult>(config, {\n method: \"POST\",\n path: locationsPath(config, `/${encodeURIComponent(locationId)}/test`),\n });\n },\n },\n };\n}\n","/**\n * `client.metadata.*` — cross-surface metadata query (`k9o.metadata.*`).\n *\n * Client-side surface for `POST /@:projectSlug/metadata/query`. The wire shape is fixed here ahead of the\n * server route: until the gateway ships that route, calling `.execute()` returns a 404 rather than a result.\n * Once it is available, only `telemetry:*` surfaces return data at first; collection and storage metadata\n * follow as their server-side schemas land.\n *\n * `textSearch`/`vectorSearch` are explicitly a later increment (Inc 5) — not implemented\n * here; adding stub methods for an unspecified future mode would be speculative, not spec-grounded.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport { KError } from \"./kerror.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/** The three cross-surface slices. */\nexport type MetadataSlice = \"collection\" | \"storage\" | \"telemetry\";\n\n/** operator vocabulary (= JSON-policy set), mirrored verbatim from the gateway's\n * `metadata-query-parse.ts` so a typo can't silently pass client-side and fail only server-side. */\nexport const METADATA_OPERATORS = [\n \"eq\", \"neq\", \"gt\", \"gte\", \"lt\", \"lte\",\n \"contains\", \"startsWith\", \"endsWith\", \"in\", \"notIn\",\n \"and\", \"or\", \"not\",\n] as const;\nexport type MetadataOperator = (typeof METADATA_OPERATORS)[number];\n\n/** A surface label `<slice>:<scope>`, e.g. `collection:posts`, `storage:images`,\n * `telemetry:auth.session.created`. */\nexport type MetadataSurface = `${MetadataSlice}:${string}`;\n\nexport type MetadataWhereClause = {\n readonly field: string;\n readonly op: MetadataOperator;\n readonly value: unknown;\n};\n\n/**\n * One result row: \"each record carries its surface + scope + the queried metadata\n * fields plus a back-reference id\" — `recordId` (collection), `objectPath` (storage), or `eventId`\n * (telemetry), depending on which surface the row came from. Exact field names are provisional\n * pending Inc 2 landing a concrete response schema; kept loose (`metadata: Record<string, unknown>`)\n * rather than guessing a shape that isn't coined in code anywhere yet.\n */\nexport type MetadataQueryRecord = {\n surface: MetadataSurface;\n scope: string;\n recordId?: string;\n objectPath?: string;\n eventId?: string;\n metadata: Record<string, unknown>;\n};\n\nexport type MetadataQueryResult = {\n records: readonly MetadataQueryRecord[];\n nextCursor: string | null;\n};\n\n/** The `k9o.metadata.from(...).where(...).limit(...).execute()` builder. Immutable —\n * every chained call returns a new builder, so a partially-built query can be safely reused/branched. */\nexport type MetadataQueryBuilder = {\n where(field: string, op: MetadataOperator, value: unknown): MetadataQueryBuilder;\n limit(n: number): MetadataQueryBuilder;\n cursor(c: string | null): MetadataQueryBuilder;\n execute(): Promise<Envelope<MetadataQueryResult>>;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (config.projectSlug === undefined || config.projectSlug.length === 0) {\n throw new KError({\n code: \"K9O_MISSING_PROJECT_CONTEXT\",\n message: \"client.metadata requires a bound projectSlug (project data-plane resource,)\",\n context: {},\n recommendation: \"Pass projectSlug when constructing the client.\",\n });\n }\n return config.projectSlug;\n}\n\nfunction makeBuilder(\n config: HttpClientConfig,\n surfaces: readonly MetadataSurface[],\n where: readonly MetadataWhereClause[],\n limit: number | undefined,\n cursorValue: string | null,\n): MetadataQueryBuilder {\n return {\n where(field, op, value) {\n return makeBuilder(config, surfaces, [...where, { field, op, value }], limit, cursorValue);\n },\n limit(n) {\n return makeBuilder(config, surfaces, where, n, cursorValue);\n },\n cursor(c) {\n return makeBuilder(config, surfaces, where, limit, c);\n },\n async execute() {\n return request<MetadataQueryResult>(config, {\n method: \"POST\",\n path: projectPath(requireProjectSlug(config), \"metadata/query\"),\n body: {\n surfaces,\n where,\n ...(limit !== undefined ? { limit } : {}),\n cursor: cursorValue,\n },\n });\n },\n };\n}\n\nexport function makeMetadataNamespace(config: HttpClientConfig) {\n return {\n /** Start a cross-surface metadata query against one or more surfaces. */\n from(surface: MetadataSurface | readonly MetadataSurface[]): MetadataQueryBuilder {\n const surfaces = Array.isArray(surface) ? surface : [surface as MetadataSurface];\n if (surfaces.length === 0) {\n throw new KError({\n code: \"K9O_UNKNOWN_SURFACE\",\n message: \"client.metadata.from(...) requires at least one surface label.\",\n context: {},\n recommendation: \"Pass a surface like 'collection:posts', 'storage:images', or 'telemetry:auth.session.created'.\",\n });\n }\n return makeBuilder(config, surfaces, [], undefined, null);\n },\n };\n}\n","/**\n * Migration lifecycle SDK — `client.migrations.*`.\n *\n * Backed by the gateway migrations routes.\n * All routes are member-plane (`/@<projectSlug>/migrations/...`).\n *\n * Wire mapping:\n * - `apply({ migrations })` → POST /@<slug>/migrations/apply\n * - `list()` → GET /@<slug>/migrations\n * - `get(version)` → GET /@<slug>/migrations/<version>\n * - `queue({ migrations })` → POST /@<slug>/migrations/queue\n * - `listPending()` → GET /@<slug>/migrations/pending\n * - `applyPending(pendingId)` → POST /@<slug>/migrations/pending/<pendingId>/apply\n * - `rejectPending(pendingId)` → POST /@<slug>/migrations/pending/<pendingId>/reject\n * - `deletePending(pendingId)` → DELETE /@<slug>/migrations/pending/<pendingId>\n *\n * Migration shape — STRUCTURED\n * DECLARATIVE DDL, never raw SQL. Every schema change is a typed, key-tagged\n * operation, so schema drift is impossible at the SDK layer (the\n * invariant). Raw SQL is the separate runtime `client.query()` surface,\n * which cannot create/alter schema. The gateway checksums each migration and\n * stores it in `_sys.migrations`; already-applied versions are skipped on\n * re-run and mismatched checksums are rejected, preserving the drift invariant.\n *\n * Per-operation field shapes are grounded in the gateway DDL parser\n * (`services/gateway/src/db/migration-runner.ts`), NOT invented.\n *\n * Verified against the gateway DDL parser:\n * - `up`/`down` arrays — parser now iterates them (shipped `2.58.0-beta.1`).\n * - ColumnSpec protection attrs — live since `2.56.0`; `encrypted` is the\n * `true | { store, searchable }` union with `searchable` NESTED (not a\n * sibling); `blind_indexed` is the C-mode sibling. Aligned above.\n * - Op set FROZEN at 6 (no alter_column/rename_table/constraint at v2).\n * `rename_column` is a pending 7th — to be added once its field\n * names are finalised and the re-encryption pass ships.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/** Foreign-key reference on a column — compiles to a REFERENCES clause. */\nexport type ColumnReferences = {\n collection: string;\n on: string;\n on_delete?: \"CASCADE\" | \"RESTRICT\" | \"SET NULL\" | \"NO ACTION\";\n on_update?: \"CASCADE\" | \"RESTRICT\" | \"SET NULL\" | \"NO ACTION\";\n};\n\n/**\n * A column definition. `type` is the column-type vocabulary\n * (parser-owned; kept as `string` rather than a fabricated enum). The\n * protection attributes declare at-rest field encryption (gateway\n * shape verified vs the parser, live since `2.56.0`).\n */\nexport type ColumnSpec = {\n name: string;\n type: string;\n primary_key?: boolean;\n not_null?: boolean;\n unique?: boolean;\n default?: string;\n references?: ColumnReferences;\n /**\n * At-rest field encryption. `true` = inline-stored encrypted column;\n * the object form opts into a `store` (\"inline\" | \"vault\") and the D-mode\n * searchable-encryption index (`searchable`). NOTE: `searchable` is NESTED\n * here — it is NOT a sibling attribute.\n */\n encrypted?: true | { store: \"inline\" | \"vault\"; searchable?: boolean };\n /** C-mode: deterministic blind index for equality lookup over an encrypted column. */\n blind_indexed?: boolean;\n};\n\n/** An index definition. `name` defaults to `<table>_<cols>_idx`. */\nexport type IndexSpec = {\n name?: string;\n columns: ReadonlyArray<string>;\n unique?: boolean;\n};\n\n/**\n * A single declarative DDL operation — KEY-TAGGED (exactly one key set), the\n * shape the gateway applies. The v2 set is these 7 — no `alter_column`,\n * `rename_table`, or constraint ops at v2. `alter_table` is the BATCHED column\n * mutation (one op carries optional `add_columns[]` + `drop_columns[]`), live in\n * the gateway runner (`migration-runner.ts:156`).\n * `rename_column` remains a pending future op (its parser field names are not yet\n * finalised); NOTE / a `rename_column` on an ENCRYPTED column\n * is fail-closed-rejected (`K9O_ENCRYPTED_COLUMN_DECLARATION_INVALID`) pending the\n * re-encryption pass — to document when that op lands.\n */\nexport type Operation =\n | { create_table: { name: string; columns: ReadonlyArray<ColumnSpec>; indexes?: ReadonlyArray<IndexSpec> } }\n | { drop_table: string }\n | { add_column: { table: string; column: ColumnSpec } }\n | { drop_column: { table: string; column: string } }\n | { alter_table: { name: string; add_columns?: ReadonlyArray<ColumnSpec>; drop_columns?: ReadonlyArray<string> } }\n | { create_index: { table: string; index: IndexSpec } }\n | { drop_index: { name: string } };\n\n/** A declarative authorization/relationship rule (compiles to RLS USING + WITH\n * CHECK). The rule grammar is the policy-expression DSL. */\nexport type ActionRule = { rule?: unknown };\n\n/** A declared relationship for embedding/joins (references). */\nexport type RelationshipSpec = {\n collection: string;\n on: string;\n as: string;\n type?: \"inner\" | \"left\";\n};\n\n/** Per-collection policy block (RLS + relationships),. */\nexport type CollectionPolicy = {\n references?: ReadonlyArray<RelationshipSpec>;\n actions?: {\n select?: ActionRule;\n insert?: ActionRule;\n update?: ActionRule;\n delete?: ActionRule;\n };\n};\n\n/** Per-bucket storage policy block,. */\nexport type StorageBucketPolicy = {\n public?: boolean;\n actions?: {\n read?: ActionRule;\n upload?: ActionRule;\n delete?: ActionRule;\n list?: ActionRule;\n };\n};\n\n/** The optional `policy` section authored alongside a migration. */\nexport type MigrationPolicy = {\n collections?: Record<string, CollectionPolicy>;\n storage?: { buckets?: Record<string, StorageBucketPolicy> };\n};\n\n/**\n * A migration — a versioned, checksummed unit of structured DDL. `up` applies\n * the change; `down` reverses it. Both are operation arrays.\n */\nexport type Migration = {\n version: number;\n slug: string;\n up: ReadonlyArray<Operation>;\n down: ReadonlyArray<Operation>;\n policy?: MigrationPolicy;\n};\n\n/**\n * Applied-migration record returned by `list` + `get`.\n */\nexport type AppliedMigration = {\n version: number;\n slug: string;\n checksum: string;\n appliedAt: string;\n};\n\n/**\n * Pending migration record returned by `listPending`.\n */\nexport type PendingMigration = {\n pendingId: string;\n version: number;\n slug: string;\n checksum: string;\n submittedAt: string;\n submittedBy: string;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"migrations operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makeMigrationsNamespace(config: HttpClientConfig) {\n return {\n /** Apply migrations immediately (PROJECT_ADMIN minimum). */\n async apply(input: { migrations: ReadonlyArray<Migration> }): Promise<Envelope<{ applied: ReadonlyArray<AppliedMigration> }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, \"migrations/apply\"),\n body: input,\n });\n },\n\n /** List applied migrations on the project. */\n async list(): Promise<Envelope<ReadonlyArray<AppliedMigration>>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"migrations\"),\n });\n },\n\n /** Get a single applied migration by version. */\n async get(version: number): Promise<Envelope<AppliedMigration>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `migrations/${encodeURIComponent(String(version))}`),\n });\n },\n\n /** Queue migrations for maker-checker approval. */\n async queue(input: { migrations: ReadonlyArray<Migration> }): Promise<Envelope<{ pending: ReadonlyArray<PendingMigration> }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, \"migrations/queue\"),\n body: input,\n });\n },\n\n /** List pending (queued, not yet approved) migrations. */\n async listPending(): Promise<Envelope<ReadonlyArray<PendingMigration>>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"migrations/pending\"),\n });\n },\n\n /**\n * Apply a queued migration by id (same-actor fast path — floors at\n * PROJECT_ADMIN; a `pending_approval` row, i.e. a protected-collection\n * migration awaiting a distinct-admin's review, is refused here and\n * needs its own approval flow, not this call).\n */\n async applyPending(pendingId: string): Promise<Envelope<AppliedMigration>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `migrations/pending/${encodeURIComponent(pendingId)}/apply`),\n });\n },\n\n /** Reject a pending migration (transitions to rejected; does not apply). */\n async rejectPending(pendingId: string, input?: { reason?: string }): Promise<Envelope<{ rejected: boolean }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `migrations/pending/${encodeURIComponent(pendingId)}/reject`),\n body: input,\n });\n },\n\n /** Delete a pending migration from the queue. */\n async deletePending(pendingId: string): Promise<Envelope<{ deleted: boolean }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"DELETE\",\n path: projectPath(slug, `migrations/pending/${encodeURIComponent(pendingId)}`),\n });\n },\n };\n}\n","/**\n * Function lifecycle SDK — `client.functions.*`.\n *\n * Backed by the gateway functions and invoke routes.\n *\n * Wire mapping:\n * - `deploy({ name, runtime, code, ... })` → POST /@<slug>/functions\n * - `list()` → GET /@<slug>/functions\n * - `get(name)` → GET /@<slug>/functions/<name>\n * - `delete(name)` → DELETE /@<slug>/functions/<name>\n * - `invoke(name, payload)` → POST /@<slug>/functions/<name>/invoke\n *\n * Per: deploy requires PROJECT_ADMIN; invoke authority is per\n * function manifest. Per: deploy returns 202 with status\n * `deploying`; the function is ready when status flips to `active`.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/**\n * Function record returned by gateway endpoints.\n */\nexport type FunctionRecord = {\n /** `fn_<base62>`. */\n id: string;\n name: string;\n runtime: \"wasm\" | \"bun\" | \"node\";\n status: \"deploying\" | \"active\" | \"retired\" | \"failed\";\n tier: \"low\" | \"medium\" | \"high\";\n createdAt: string;\n updatedAt: string | null;\n};\n\n/**\n * Deploy input. The `code` field is the runtime bundle (base64-encoded\n * WASM or JS source).\n */\nexport type DeployFunctionInput = {\n name: string;\n runtime: \"wasm\" | \"bun\" | \"node\";\n code: string;\n tier?: \"low\" | \"medium\" | \"high\";\n config?: Record<string, unknown>;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"functions operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makeFunctionsNamespace(config: HttpClientConfig) {\n return {\n /** Deploy or redeploy a function. Returns the function record with status. */\n async deploy(input: DeployFunctionInput): Promise<Envelope<FunctionRecord>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, \"functions\"),\n body: input,\n });\n },\n\n /** List deployed functions (cursor pagination). */\n async list(opts?: { limit?: number; cursor?: string; status?: FunctionRecord[\"status\"] }): Promise<Envelope<ReadonlyArray<FunctionRecord>>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"functions\"),\n query: opts,\n });\n },\n\n /** Get a function by name. */\n async get(name: string): Promise<Envelope<FunctionRecord>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `functions/${encodeURIComponent(name)}`),\n });\n },\n\n /** Retire a function. Returns confirmation; the function name enters a 24h cooldown. */\n async delete(name: string): Promise<Envelope<{ retired: boolean; cooldownUntil: string }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"DELETE\",\n path: projectPath(slug, `functions/${encodeURIComponent(name)}`),\n });\n },\n\n /**\n * Invoke a function. The `payload` is passed to the function runtime\n * verbatim; the gateway returns whatever the function returns wrapped\n * in the standard envelope.\n *\n * Per: invoke authority is per-function (declared in the\n * function manifest). Per: streaming responses use the\n * subscription/async-iterator pattern; this method covers the\n * request-response variant only.\n */\n async invoke<TResult = unknown, TPayload = unknown>(name: string, payload: TPayload): Promise<Envelope<TResult>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `functions/${encodeURIComponent(name)}/invoke`),\n body: payload,\n });\n },\n };\n}\n","/**\n * Policy bundle lifecycle SDK — `client.policies.*`.\n *\n * Backed by the gateway policies routes.\n *\n * Wire mapping:\n * - `current()` → GET /@<slug>/policy (active policy)\n * - `list()` → GET /@<slug>/policies (all bundles)\n * - `create({...})` → POST /@<slug>/policies (draft bundle)\n * - `validate({...})` → POST /@<slug>/policies/validate (lint without persist)\n * - `get(bundleId)` → GET /@<slug>/policies/<id>\n * - `update(bundleId, patch)` → PATCH /@<slug>/policies/<id>\n * - `delete(bundleId)` → DELETE /@<slug>/policies/<id>\n * - `publish(bundleId)` → POST /@<slug>/policies/<id>/publish\n *\n * Per: only Pathmaker-class roles author policy; only\n * Custodian-class roles publish. `validate` is read-only and any role\n * with policy-read can lint a candidate bundle.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\nexport type PolicyBundle = {\n /** `pol_<base62>`. */\n id: string;\n name: string;\n version: number;\n status: \"draft\" | \"published\" | \"deactivated\";\n rules: Record<string, unknown>;\n createdAt: string;\n publishedAt: string | null;\n createdBy: string;\n};\n\nexport type CreatePolicyInput = {\n name: string;\n rules: Record<string, unknown>;\n};\n\nexport type UpdatePolicyInput = {\n name?: string;\n rules?: Record<string, unknown>;\n};\n\nexport type ValidatePolicyResult = {\n valid: boolean;\n errors: ReadonlyArray<{ rule: string; message: string }>;\n warnings: ReadonlyArray<{ rule: string; message: string }>;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"policies operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makePoliciesNamespace(config: HttpClientConfig) {\n return {\n /** Return the currently-active policy for the project. */\n async current(): Promise<Envelope<PolicyBundle | null>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"policy\"),\n });\n },\n\n /** List all policy bundles (draft + published + deactivated). */\n async list(opts?: { status?: PolicyBundle[\"status\"] | undefined; limit?: number | undefined; cursor?: string | undefined }): Promise<Envelope<ReadonlyArray<PolicyBundle>>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"policies\"),\n query: opts,\n });\n },\n\n /** Create a draft policy bundle. */\n async create(input: CreatePolicyInput): Promise<Envelope<PolicyBundle>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, \"policies\"),\n body: input,\n });\n },\n\n /** Lint a candidate rule set without persisting. */\n async validate(input: { rules: Record<string, unknown> }): Promise<Envelope<ValidatePolicyResult>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, \"policies/validate\"),\n body: input,\n });\n },\n\n /** Get a single bundle by id. */\n async get(bundleId: string): Promise<Envelope<PolicyBundle>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `policies/${encodeURIComponent(bundleId)}`),\n });\n },\n\n /** Patch a draft bundle. Cannot patch published bundles (publish→republish flow). */\n async update(bundleId: string, patch: UpdatePolicyInput): Promise<Envelope<PolicyBundle>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"PATCH\",\n path: projectPath(slug, `policies/${encodeURIComponent(bundleId)}`),\n body: patch,\n });\n },\n\n /** Delete a draft bundle. Cannot delete published bundles. */\n async delete(bundleId: string): Promise<Envelope<{ deleted: boolean }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"DELETE\",\n path: projectPath(slug, `policies/${encodeURIComponent(bundleId)}`),\n });\n },\n\n /** Publish a draft bundle — transitions to `published` + becomes active for the project. */\n async publish(bundleId: string): Promise<Envelope<PolicyBundle>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `policies/${encodeURIComponent(bundleId)}/publish`),\n });\n },\n };\n}\n","/**\n * Audit log query SDK — `client.audit.*`.\n *\n * Backed by the gateway audit-log routes.\n *\n * Wire mapping:\n * - `query({ since, until, type, actorId, targetKind, targetId, limit, cursor })`\n * → GET /@<slug>/audit-log?...\n *\n * The endpoint accepts cursor-paginated reverse-chronological queries.\n * `type` is the audit-event namespace (e.g. `data.write.access.insert`,\n * `gate.signin.success`) per the event-name taxonomy +\n * `feedback_error_code_namespace_boundary_and_prefix.md` cement.\n *\n * Returns audit events with full context payload — actorId / targetKind /\n * targetId / payload / occurredAt / requestId / traceId.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/**\n * Audit event record `_sys.audit_log` shape.\n */\nexport type AuditEvent = {\n id: string;\n /** Dotted namespace (e.g. `data.write.access.insert`). */\n type: string;\n actorId: string | null;\n targetKind: string | null;\n targetId: string | null;\n payload: Record<string, unknown>;\n occurredAt: string;\n requestId: string | null;\n traceId: string | null;\n};\n\nexport type AuditQueryOpts = {\n /** ISO 8601 lower bound (inclusive). */\n since?: string | undefined;\n /** ISO 8601 upper bound (exclusive). */\n until?: string | undefined;\n /** Filter by event type (exact match; future cycles may add prefix-match). */\n type?: string | undefined;\n /** Filter by actor. */\n actorId?: string | undefined;\n /** Filter by target resource kind. */\n targetKind?: string | undefined;\n /** Filter by target resource id. */\n targetId?: string | undefined;\n /** Page size (per-tier max bounded server-side). */\n limit?: number | undefined;\n /** Cursor from prior response. */\n cursor?: string | undefined;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"audit operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makeAuditNamespace(config: HttpClientConfig) {\n return {\n /**\n * Query the audit log. Returns reverse-chronological events matching\n * all supplied filters (AND composition).\n *\n * Per RBAC: requires `AUDIT_READER` role minimum; Custodian-\n * class roles inherit. Project-level audit is project-scoped (this\n * endpoint); platform-level audit is admin-only (separate surface).\n */\n async query(opts?: AuditQueryOpts): Promise<Envelope<ReadonlyArray<AuditEvent>>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"audit-log\"),\n query: opts,\n });\n },\n\n /**\n * Convenience: live-tail recent events. Currently single-shot read\n * with `since` defaulted to \"1 minute ago\"; subscription-mode tail\n * (SSE) lands when the streaming layer ships pattern.\n */\n async tail(opts?: { sinceMinutes?: number; limit?: number }): Promise<Envelope<ReadonlyArray<AuditEvent>>> {\n const slug = requireProjectSlug(config);\n const minutes = opts?.sinceMinutes ?? 1;\n const since = new Date(Date.now() - minutes * 60_000).toISOString();\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, \"audit-log\"),\n query: { since, limit: opts?.limit ?? 100 },\n });\n },\n };\n}\n","/**\n * Org lifecycle SDK — `client.orgs.*`.\n *\n * Backed by the gateway orgs routes.\n *\n * Wire mapping (all org-plane / platform-plane):\n * - `list()` → GET /orgs\n * - `get(orgSlug)` → GET /orgs/<orgSlug>\n * - `restore(orgId)` → POST /orgs/<orgId>/restore\n * - `current()` → GET /org\n *\n * The `current()` endpoint returns the org bound to the caller's session\n * context (via `x-k9o-org-slug` header or token claim). `get` addresses an\n * explicit org by its **slug** (slug-first management grammar) for\n * cross-org admin scenarios; most callers reach for `current()`.\n * `restore` is the one exception — it stays keyed by `orgId`, because a\n * soft-deleted org's slug is tombstoned and may have been reassigned.\n *\n *: org listing is scoped by the caller's accessible orgs\n * (most callers see exactly one — their own). Org creation is not available\n * through the SDK yet; `client.orgs.create()` will be added once sign-up\n * is exposed as an API).\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { orgPath, validateSlug } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\nexport type Org = {\n /** `org_<base62>`. */\n id: string;\n slug: string;\n name: string;\n status: \"active\" | \"suspended\" | \"soft-deleted\";\n createdAt: string;\n updatedAt: string | null;\n};\n\nexport function makeOrgsNamespace(config: HttpClientConfig) {\n return {\n /** List orgs accessible to the caller. */\n async list(): Promise<Envelope<ReadonlyArray<Org>>> {\n return request(config, {\n method: \"GET\",\n path: orgPath(\"orgs\"),\n });\n },\n\n /** Get a single org by slug. */\n async get(orgSlug: string): Promise<Envelope<Org>> {\n validateSlug(orgSlug, \"org\");\n return request(config, {\n method: \"GET\",\n path: orgPath(`orgs/${encodeURIComponent(orgSlug)}`),\n });\n },\n\n /** Restore a soft-deleted org. */\n async restore(orgId: string): Promise<Envelope<Org>> {\n return request(config, {\n method: \"POST\",\n path: orgPath(`orgs/${encodeURIComponent(orgId)}/restore`),\n });\n },\n\n /** Get the org bound to the caller's current session context. */\n async current(): Promise<Envelope<Org>> {\n return request(config, {\n method: \"GET\",\n path: orgPath(\"org\"),\n });\n },\n };\n}\n","/**\n * Org-plane SDK namespace — `client.org.*`.\n *\n * Covers org members, groups, SMTP, audit and gate administration.\n *\n * Distinct from `client.orgs` (collection-style; list/get/restore/current\n * across accessible orgs) — `client.org` is the singular bound-org\n * namespace with member / group / smtp / audit / gate sub-namespaces.\n *\n * Org-plane URL grammar: requests route against the\n * `<orgSlug>.api.k9o.io/` org subdomain WITHOUT the `@<projectSlug>/`\n * prefix used by project-plane requests. The gateway resolves the org\n * context from the subdomain.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { orgPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\nimport type { LLMModelId } from \"./compute/llms.ts\";\n\n// ----------------------------------------------------------------------\n// Types\n// ----------------------------------------------------------------------\n\nexport type OrgMember = {\n /** `u_<base62>`. */\n userId: string;\n email: string;\n /** Org-level role enum. */\n role: \"ORG_OWNER\" | \"ORG_ADMIN\" | \"ORG_BILLING_ADMIN\" | \"ORG_MEMBER\";\n joinedAt: string;\n status: \"active\" | \"invited\" | \"suspended\";\n};\n\nexport type OrgGroup = {\n /** `grp_<base62>`. */\n id: string;\n name: string;\n memberCount: number;\n createdAt: string;\n};\n\nexport type OrgRoleGrant = {\n /** `grt_<base62>`. */\n id: string;\n userId: string;\n role: \"ORG_ADMIN\" | \"ORG_BILLING_ADMIN\";\n grantedBy: string;\n grantedAt: string;\n revokedAt: string | null;\n revokedBy: string | null;\n viaDelegationId: string | null;\n};\n\n/**\n * Org-level audit event 6-event family.\n *\n * Event types (closed set at v2.1.132):\n * - `data.write.org.member_invited`\n * - `data.write.org.member_removed`\n * - `data.write.org.role_granted`\n * - `data.write.org.role_revoked`\n * - `data.write.org.idp_config_changed`\n * - `data.write.org.settings_updated`\n *\n * `targetKind` is `org` for all; `targetId` is the orgId.\n */\nexport type OrgAuditEvent = {\n id: string;\n type: string;\n actorId: string | null;\n targetKind: \"org\";\n targetId: string;\n payload: Record<string, unknown>;\n occurredAt: string;\n requestId: string | null;\n traceId: string | null;\n};\n\n/**\n * Org SMTP configuration. Sensitive fields (passwordRef)\n * are sequestered in Kibo enclave; the SDK stores only the reference.\n */\nexport type SmtpConfig = {\n host: string;\n port: number;\n username: string;\n /** Kibo enclave credential reference; opaque token. */\n passwordRef: string;\n fromEmail: string;\n fromName: string;\n encryption: \"none\" | \"starttls\" | \"tls\";\n replyToEmail?: string | undefined;\n};\n\nexport type SmtpTestEmailInput = {\n to: string;\n /** Optional override of the from address for the test send (defaults to fromEmail). */\n fromOverride?: string | undefined;\n};\n\nexport type SmtpTestEmailResult = {\n ok: boolean;\n /** Diagnostic message returned by the SMTP server (success or error detail). */\n diagnostic: string;\n /** ISO 8601 timestamp of the test attempt. */\n attemptedAt: string;\n};\n\nexport type OrgIdpProvider = {\n /** `idp_<base62>`. */\n id: string;\n name: string;\n /** Protocol/vendor (e.g. \"okta-saml\", \"azure-ad-oidc\", \"google-workspace\"). */\n kind: string;\n enabled: boolean;\n createdAt: string;\n};\n\nexport type CreateOrgIdpInput = {\n name: string;\n kind: string;\n config: Record<string, unknown>;\n};\n\n// ----------------------------------------------------------------------\n// Sub-namespace factories\n// ----------------------------------------------------------------------\n\nfunction makeMembersNamespace(config: HttpClientConfig) {\n return {\n /** GET /members (org-plane LIST). */\n async list(opts?: { limit?: number | undefined; cursor?: string | undefined; status?: OrgMember[\"status\"] | undefined }): Promise<Envelope<ReadonlyArray<OrgMember>>> {\n return request(config, { method: \"GET\", path: orgPath(\"members\"), query: opts });\n },\n\n /** POST /members — invite a new org member by email. */\n async invite(input: { email: string; role: OrgMember[\"role\"] }): Promise<Envelope<OrgMember>> {\n return request(config, { method: \"POST\", path: orgPath(\"members\"), body: input });\n },\n\n /** GET /members/<userId> — single-read (existing endpoint). */\n async get(userId: string): Promise<Envelope<OrgMember>> {\n return request(config, { method: \"GET\", path: orgPath(`members/${encodeURIComponent(userId)}`) });\n },\n\n /** DELETE /members/<userId> — remove a member from the org. */\n async remove(userId: string): Promise<Envelope<{ removed: boolean }>> {\n return request(config, { method: \"DELETE\", path: orgPath(`members/${encodeURIComponent(userId)}`) });\n },\n };\n}\n\nfunction makeGroupsNamespace(config: HttpClientConfig) {\n return {\n /** GET /groups (org-plane LIST). */\n async list(opts?: { limit?: number; cursor?: string }): Promise<Envelope<ReadonlyArray<OrgGroup>>> {\n return request(config, { method: \"GET\", path: orgPath(\"groups\"), query: opts });\n },\n\n /** POST /groups — create a new group. */\n async create(input: { name: string }): Promise<Envelope<OrgGroup>> {\n return request(config, { method: \"POST\", path: orgPath(\"groups\"), body: input });\n },\n\n /** GET /groups/<groupId> — single-read (pre-cement existing endpoint). */\n async get(groupId: string): Promise<Envelope<OrgGroup>> {\n return request(config, { method: \"GET\", path: orgPath(`groups/${encodeURIComponent(groupId)}`) });\n },\n\n /** DELETE /groups/<groupId> — remove a group. */\n async delete(groupId: string): Promise<Envelope<{ deleted: boolean }>> {\n return request(config, { method: \"DELETE\", path: orgPath(`groups/${encodeURIComponent(groupId)}`) });\n },\n };\n}\n\nfunction makeOrgAuditLogNamespace(config: HttpClientConfig) {\n return {\n /**\n * GET /audit-log (org-plane).\n * Distinct from project-plane `client.audit.query()` which routes to\n * `@<projectSlug>/audit-log`. Org-plane events cover the 6-event family\n * (member_invited/removed/role_granted/revoked/\n * idp_config_changed/settings_updated).\n */\n async query(opts?: {\n since?: string | undefined; until?: string | undefined; type?: string | undefined; actorId?: string | undefined;\n targetKind?: string | undefined; targetId?: string | undefined; limit?: number | undefined; cursor?: string | undefined;\n }): Promise<Envelope<ReadonlyArray<OrgAuditEvent>>> {\n return request(config, { method: \"GET\", path: orgPath(\"audit-log\"), query: opts });\n },\n\n /** Convenience: recent events (defaults to 5 minute window). */\n async tail(opts?: { sinceMinutes?: number; limit?: number }): Promise<Envelope<ReadonlyArray<OrgAuditEvent>>> {\n const minutes = opts?.sinceMinutes ?? 5;\n const since = new Date(Date.now() - minutes * 60_000).toISOString();\n return request(config, {\n method: \"GET\",\n path: orgPath(\"audit-log\"),\n query: { since, limit: opts?.limit ?? 100 },\n });\n },\n };\n}\n\nfunction makeOrgGateNamespace(config: HttpClientConfig) {\n return {\n roles: {\n /** GET /org-role-grants — list active grants ask 4. */\n async list(opts?: { userId?: string | undefined; role?: OrgRoleGrant[\"role\"] | undefined; includeRevoked?: boolean | undefined }): Promise<Envelope<ReadonlyArray<OrgRoleGrant>>> {\n return request(config, { method: \"GET\", path: orgPath(\"org-role-grants\"), query: opts });\n },\n\n /** POST /org-role-grants — grant an ORG_ADMIN or ORG_BILLING_ADMIN role. */\n async grant(input: { userId: string; role: OrgRoleGrant[\"role\"] }): Promise<Envelope<OrgRoleGrant>> {\n return request(config, { method: \"POST\", path: orgPath(\"org-role-grants\"), body: input });\n },\n\n /** GET /org-role-grants/<grantId> — single-read. */\n async get(grantId: string): Promise<Envelope<OrgRoleGrant>> {\n return request(config, { method: \"GET\", path: orgPath(`org-role-grants/${encodeURIComponent(grantId)}`) });\n },\n\n /** DELETE /org-role-grants/<grantId> — revoke a grant (soft delete; sets revokedAt). */\n async revoke(grantId: string): Promise<Envelope<OrgRoleGrant>> {\n return request(config, { method: \"DELETE\", path: orgPath(`org-role-grants/${encodeURIComponent(grantId)}`) });\n },\n },\n\n idpProviders: {\n /** GET /idp-providers — list configured org operator IdP providers ask 7. */\n async list(): Promise<Envelope<ReadonlyArray<OrgIdpProvider>>> {\n return request(config, { method: \"GET\", path: orgPath(\"idp-providers\") });\n },\n\n /** POST /idp-providers — create a new IdP integration. */\n async create(input: CreateOrgIdpInput): Promise<Envelope<OrgIdpProvider>> {\n return request(config, { method: \"POST\", path: orgPath(\"idp-providers\"), body: input });\n },\n\n /** GET /idp-providers/<idpId>. */\n async get(idpId: string): Promise<Envelope<OrgIdpProvider>> {\n return request(config, { method: \"GET\", path: orgPath(`idp-providers/${encodeURIComponent(idpId)}`) });\n },\n\n /** PATCH /idp-providers/<idpId> — update config or enable/disable. */\n async configure(idpId: string, patch: { name?: string; enabled?: boolean; config?: Record<string, unknown> }): Promise<Envelope<OrgIdpProvider>> {\n return request(config, { method: \"PATCH\", path: orgPath(`idp-providers/${encodeURIComponent(idpId)}`), body: patch });\n },\n\n /** DELETE /idp-providers/<idpId>. */\n async delete(idpId: string): Promise<Envelope<{ deleted: boolean }>> {\n return request(config, { method: \"DELETE\", path: orgPath(`idp-providers/${encodeURIComponent(idpId)}`) });\n },\n },\n };\n}\n\nfunction makeSmtpNamespace(config: HttpClientConfig) {\n return {\n /**\n * GET /org/smtp — read current SMTP config.\n * Returns null when no org-level SMTP is configured (falls back to\n * platform SMTP 3-tier cascade).\n */\n async get(): Promise<Envelope<SmtpConfig | null>> {\n return request(config, { method: \"GET\", path: orgPath(\"org/smtp\") });\n },\n\n /**\n * PATCH /orgs/<orgSlug> with `smtpConfig` body — set or update SMTP.\n * PATCH on the org resource accepts smtpConfig.\n * Passwords route through Kibo enclave — SDK accepts plaintext at\n * the SDK boundary; gateway stores the reference.\n */\n async set(config_: Omit<SmtpConfig, \"passwordRef\"> & { password: string }): Promise<Envelope<SmtpConfig>> {\n return request(config, { method: \"PATCH\", path: orgPath(\"org\"), body: { smtpConfig: config_ } });\n },\n\n /**\n * POST /org/smtp/test-email — send a diagnostic email to verify config.\n * 5/hour rate limit; RFC 5322 validation;\n * 3-tier resolution (platform→org→project) of effective SMTP.\n */\n async test(input: SmtpTestEmailInput): Promise<Envelope<SmtpTestEmailResult>> {\n return request(config, { method: \"POST\", path: orgPath(\"org/smtp/test-email\"), body: input });\n },\n\n /** PATCH /orgs/<orgSlug> with `smtpConfig: null` — clear org-level SMTP. */\n async unset(): Promise<Envelope<{ cleared: boolean }>> {\n return request(config, { method: \"PATCH\", path: orgPath(\"org\"), body: { smtpConfig: null } });\n },\n };\n}\n\nfunction makeDefaultLlmNamespace(config: HttpClientConfig) {\n return {\n /**\n * GET /org/default-llm — read the org-default LLM model id\n *. Returns `null` when no explicit default is set (gateway\n * falls back to `mistral-7b`). ORG_ADMIN read; tier-gated.\n */\n async get(): Promise<Envelope<LLMModelId | null>> {\n return request(config, { method: \"GET\", path: orgPath(\"org/default-llm\") });\n },\n\n /**\n * PATCH /org/default-llm — set the org-default LLM.\n * ORG_ADMIN only. The model must be available to the org's tier per\n * or the gateway returns K9O_TIER_FEATURE_GATED.\n */\n async set(input: { modelId: LLMModelId }): Promise<Envelope<LLMModelId>> {\n return request(config, { method: \"PATCH\", path: orgPath(\"org/default-llm\"), body: input });\n },\n };\n}\n\n// ----------------------------------------------------------------------\n// Top-level namespace\n// ----------------------------------------------------------------------\n\nexport function makeOrgNamespace(config: HttpClientConfig) {\n return {\n /** Member lifecycle — list / invite / get / remove. */\n members: makeMembersNamespace(config),\n /** Group lifecycle — list / create / get / delete. */\n groups: makeGroupsNamespace(config),\n /** Org-plane audit log — query / tail. Distinct from project-plane `client.audit`. */\n auditLog: makeOrgAuditLogNamespace(config),\n /** Gate (IAK) org-level surfaces — role-grants + IdP-providers. */\n gate: makeOrgGateNamespace(config),\n /** Org-level SMTP config — get / set / test / unset. */\n smtp: makeSmtpNamespace(config),\n /** Org-default LLM — get / set (ORG_ADMIN). */\n defaultLLM: makeDefaultLlmNamespace(config),\n\n /**\n * GET /org — read the current org (slug + name + status + settings).\n * Mirrors `client.orgs.current()` for symmetry; `client.org.get()` is\n * the singular-namespace convention for use within an org-bound client.\n */\n async get(): Promise<Envelope<{ id: string; slug: string; name: string; status: string; createdAt: string }>> {\n return request(config, { method: \"GET\", path: orgPath(\"org\") });\n },\n };\n}\n","/**\n * Operator-self SDK namespace — `client.me.*`.\n *\n * Distinct from tenant-\n * scoped surfaces: `/me/*` is the operator-self lane that does NOT\n * require org or project context.\n *\n * Wire mapping (gateway uses platform-plane / cross-org `/me/...` routes):\n * - `client.me.profile.get/update` → GET/PATCH /me\n * - `client.me.sessions.list/revoke` → GET/DELETE /me/sessions\n * - `client.me.apiTokens.list/create/delete` → GET/POST/DELETE /me/api-tokens (not available yet)\n * - `client.me.notifications.list/markRead` → GET/PATCH /me/notifications (not available yet)\n * - `client.me.auditLog.query` → GET /me/audit-log (not available yet)\n * - `client.me.dataExport.request` → POST /me/data-export (not available yet)\n *\n * Profile, sessions and MFA setup are served by the existing gateway routes\n * `me.ts` + `mfa.ts`.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { orgPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\nexport type MyProfile = {\n /** `u_<base62>`. */\n id: string;\n email: string;\n displayName: string | null;\n /** ISO 8601. */\n createdAt: string;\n /** Last activity timestamp. */\n lastActiveAt: string | null;\n};\n\nexport type MySession = {\n /** `sess_<base62>`. */\n id: string;\n /** Initial sign-in time. */\n createdAt: string;\n /** Most recent activity time. */\n lastSeenAt: string;\n userAgent: string | null;\n ipAddress: string | null;\n /** Whether this session is the one issuing the current request. */\n current: boolean;\n};\n\nexport type MyApiToken = {\n /** `tok_<base62>`. */\n id: string;\n name: string;\n /** ISO 8601. */\n createdAt: string;\n /** ISO 8601 or null for non-expiring tokens. */\n expiresAt: string | null;\n /** Last 4 chars for display. */\n suffix: string;\n scope: string;\n};\n\nexport type MyNotification = {\n id: string;\n type: string;\n payload: Record<string, unknown>;\n createdAt: string;\n readAt: string | null;\n};\n\nexport function makeMeNamespace(config: HttpClientConfig) {\n return {\n profile: {\n /** GET /me — operator profile (cross-org). */\n async get(): Promise<Envelope<MyProfile>> {\n return request(config, { method: \"GET\", path: orgPath(\"me\") });\n },\n\n /** PATCH /me — update mutable profile fields (displayName). */\n async update(patch: { displayName?: string | null }): Promise<Envelope<MyProfile>> {\n return request(config, { method: \"PATCH\", path: orgPath(\"me\"), body: patch });\n },\n },\n\n sessions: {\n /** GET /me/sessions — list active sessions for the operator. */\n async list(): Promise<Envelope<ReadonlyArray<MySession>>> {\n return request(config, { method: \"GET\", path: orgPath(\"me/sessions\") });\n },\n\n /** DELETE /me/sessions/<sessionId> — revoke a specific session. */\n async revoke(sessionId: string): Promise<Envelope<{ revoked: boolean }>> {\n return request(config, { method: \"DELETE\", path: orgPath(`me/sessions/${encodeURIComponent(sessionId)}`) });\n },\n\n /** DELETE /me/sessions (no path) — revoke all sessions except the current one. */\n async revokeAll(): Promise<Envelope<{ revoked: number }>> {\n return request(config, { method: \"DELETE\", path: orgPath(\"me/sessions\") });\n },\n },\n\n /**\n * API tokens for personal scripting. The gateway endpoints are not available yet,\n * so these methods return K9O_NOT_FOUND until they ship.\n */\n apiTokens: {\n async list(): Promise<Envelope<ReadonlyArray<MyApiToken>>> {\n return request(config, { method: \"GET\", path: orgPath(\"me/api-tokens\") });\n },\n\n async create(input: { name: string; expiresInDays?: number | undefined; scope?: string | undefined }): Promise<Envelope<MyApiToken & { token: string }>> {\n return request(config, { method: \"POST\", path: orgPath(\"me/api-tokens\"), body: input });\n },\n\n async delete(tokenId: string): Promise<Envelope<{ deleted: boolean }>> {\n return request(config, { method: \"DELETE\", path: orgPath(`me/api-tokens/${encodeURIComponent(tokenId)}`) });\n },\n },\n\n /**\n * Notifications — operator-targeted (account-level events). Forward-\n * cycle substrate; methods route correctly when gateway ships.\n */\n notifications: {\n async list(opts?: { unreadOnly?: boolean | undefined; limit?: number | undefined; cursor?: string | undefined }): Promise<Envelope<ReadonlyArray<MyNotification>>> {\n return request(config, { method: \"GET\", path: orgPath(\"me/notifications\"), query: opts });\n },\n\n async markRead(notificationId: string): Promise<Envelope<MyNotification>> {\n return request(config, { method: \"PATCH\", path: orgPath(`me/notifications/${encodeURIComponent(notificationId)}`), body: { read: true } });\n },\n\n async markAllRead(): Promise<Envelope<{ marked: number }>> {\n return request(config, { method: \"PATCH\", path: orgPath(\"me/notifications\"), body: { read: true } });\n },\n },\n\n /**\n * Operator-self audit log — actions performed BY this operator across\n * orgs. Distinct from `client.audit` (project-plane) and\n * `client.org.auditLog` (org-plane).\n */\n auditLog: {\n async query(opts?: { since?: string | undefined; until?: string | undefined; type?: string | undefined; limit?: number | undefined; cursor?: string | undefined }): Promise<Envelope<ReadonlyArray<{ id: string; type: string; occurredAt: string; payload: Record<string, unknown> }>>> {\n return request(config, { method: \"GET\", path: orgPath(\"me/audit-log\"), query: opts });\n },\n },\n\n /**\n * Personal data export per GDPR-style requests. Returns a job id\n * the operator polls for completion.\n */\n dataExport: {\n async request(input?: { format?: \"json\" | \"csv\" }): Promise<Envelope<{ jobId: string; status: \"queued\" | \"in-progress\" | \"ready\" }>> {\n return request(config, { method: \"POST\", path: orgPath(\"me/data-export\"), body: input ?? {} });\n },\n\n async status(jobId: string): Promise<Envelope<{ jobId: string; status: \"queued\" | \"in-progress\" | \"ready\" | \"failed\"; downloadUrl: string | null }>> {\n return request(config, { method: \"GET\", path: orgPath(`me/data-export/${encodeURIComponent(jobId)}`) });\n },\n },\n };\n}\n","/**\n * Studio Workflows SDK — `client.studio.workflows.*`.\n *\n * Workflows substrate. Mirrors\n * `_sys.workflows` + `_sys.workflow_runs` row shapes.\n *\n * Wire mapping (project-plane;):\n * - list() → GET /@<slug>/workflows\n * - create(workflow) → POST /@<slug>/workflows\n * - read(id) → GET /@<slug>/workflows/<wfl-id>\n * - update(id, updates) → PATCH /@<slug>/workflows/<wfl-id>\n * - delete(id) → DELETE /@<slug>/workflows/<wfl-id>\n * - trigger(id, triggerContext) → POST /@<slug>/workflows/<wfl-id>/runs\n * - runs.list(id) → GET /@<slug>/workflows/<wfl-id>/runs\n * - runs.read(id, runId) → GET /@<slug>/workflows/<wfl-id>/runs/<wfr-id>\n * - runs.cancel(id, runId) → POST /@<slug>/workflows/<wfl-id>/runs/<wfr-id>/cancel\n *\n * Per RBAC: create/update/delete/trigger/cancel require\n * PROJECT_AUTHOR; list/read/runs read against all cohort roles subject\n * to RLS. Per, surfaces 6 K9O_WORKFLOW_* error codes (see\n * `WORKFLOW_ERROR_CODES`); callers narrow on `error.code`.\n */\n\nimport { request, type HttpClientConfig } from \"../http.ts\";\nimport { projectPath } from \"../url-grammar.ts\";\nimport type { Envelope } from \"../envelope.ts\";\n\n// ----------------------------------------------------------------------\n// Enums (closed at v2 launch +; extensible v2.x)\n// ----------------------------------------------------------------------\n\n/** 5-trigger catalogue. */\nexport type WorkflowTriggerType =\n | \"view_row_event\"\n | \"form_submission\"\n | \"scheduled\"\n | \"manual\"\n | \"webhook\";\n\n/** 9-action catalogue. */\nexport type WorkflowActionType =\n | \"write_collection\"\n | \"read_collection\"\n | \"invoke_function\"\n | \"invoke_extension\"\n | \"llm_inference\"\n | \"send_notification\"\n | \"http_request\"\n | \"approval_step\"\n | \"branch\";\n\nexport type WorkflowStatus = \"active\" | \"archived\" | \"draft\";\n\nexport type WorkflowRunStatus =\n | \"pending\"\n | \"running\"\n | \"succeeded\"\n | \"failed\"\n | \"cancelled\";\n\n/** A single step in the `actions` chain. */\nexport type WorkflowAction = {\n index: number;\n action_type: WorkflowActionType;\n config: Record<string, unknown>;\n retry?: { maxAttempts: number; backoffStrategy?: string };\n condition?: Record<string, unknown>;\n /** Sibling steps with parallel:true execute concurrently. */\n parallel?: boolean;\n};\n\n// ----------------------------------------------------------------------\n// Resource shapes (mirror _sys.workflows + _sys.workflow_runs rows)\n// ----------------------------------------------------------------------\n\n/** Workflow record `_sys.workflows` row. */\nexport type Workflow = {\n /** `wfl_<base62>`. */\n id: string;\n projectId: string;\n name: string;\n description: string;\n status: WorkflowStatus;\n triggerType: WorkflowTriggerType;\n /** Shape varies per triggerType. */\n triggerConfig: Record<string, unknown>;\n /** Chain definition. */\n actions: ReadonlyArray<WorkflowAction>;\n /** Approver-step participant resolution. */\n rbacBinding: Record<string, unknown>;\n authoredBy: string;\n authoredAt: string;\n updatedBy: string;\n updatedAt: string;\n};\n\n/** Per-step status entry in a run `per_step_status`. */\nexport type WorkflowRunStep = {\n stepIndex: number;\n actionType: WorkflowActionType;\n status: \"running\" | \"succeeded\" | \"failed\" | \"awaiting_approval\";\n startedAt: string;\n completedAt?: string | null;\n error?: Record<string, unknown> | null;\n outputSummary?: unknown;\n costSubtotal?: number;\n};\n\n/** Workflow run record `_sys.workflow_runs` row. */\nexport type WorkflowRun = {\n /** `wfr_<base62>`. */\n id: string;\n workflowId: string;\n projectId: string;\n status: WorkflowRunStatus;\n triggerContext: Record<string, unknown>;\n perStepStatus: ReadonlyArray<WorkflowRunStep>;\n costAccountingTotal: number;\n errorContext?: Record<string, unknown> | null;\n startedAt: string;\n completedAt: string | null;\n firedBy: string;\n};\n\n/** Create input — omits server-assigned fields. */\nexport type CreateWorkflowInput = {\n name: string;\n description?: string;\n status?: WorkflowStatus;\n triggerType: WorkflowTriggerType;\n triggerConfig: Record<string, unknown>;\n actions: ReadonlyArray<WorkflowAction>;\n rbacBinding?: Record<string, unknown>;\n};\n\nexport type UpdateWorkflowInput = Partial<\n Pick<\n CreateWorkflowInput,\n \"name\" | \"description\" | \"status\" | \"triggerType\" | \"triggerConfig\" | \"actions\" | \"rbacBinding\"\n >\n>;\n\nexport type WorkflowListFilters = {\n limit?: number;\n cursor?: string;\n status?: WorkflowStatus;\n triggerType?: WorkflowTriggerType;\n};\n\nexport type WorkflowRunListFilters = {\n limit?: number;\n cursor?: string;\n status?: WorkflowRunStatus;\n};\n\n/**\n * 6 K9O_WORKFLOW_* error codes. KError code-space is\n * open; these constants document the well-known codes for narrowing\n * (`if (e.code === WORKFLOW_ERROR_CODES.RUN_NOT_CANCELLABLE)`).\n */\nexport const WORKFLOW_ERROR_CODES = {\n NOT_FOUND: \"K9O_WORKFLOW_NOT_FOUND\",\n TRIGGER_INVALID: \"K9O_WORKFLOW_TRIGGER_INVALID\",\n ACTION_INVALID: \"K9O_WORKFLOW_ACTION_INVALID\",\n RUN_NOT_FOUND: \"K9O_WORKFLOW_RUN_NOT_FOUND\",\n RUN_NOT_CANCELLABLE: \"K9O_WORKFLOW_RUN_NOT_CANCELLABLE\",\n WEBHOOK_SIGNATURE_INVALID: \"K9O_WORKFLOW_WEBHOOK_SIGNATURE_INVALID\",\n} as const;\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"studio.workflows operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nfunction makeRunsNamespace(config: HttpClientConfig) {\n return {\n /** GET /@<slug>/workflows/<wfl-id>/runs — cursor-paginated runs list. */\n async list(workflowId: string, filters?: WorkflowRunListFilters): Promise<Envelope<ReadonlyArray<WorkflowRun>>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}/runs`),\n query: filters,\n });\n },\n\n /** GET /@<slug>/workflows/<wfl-id>/runs/<wfr-id> — run detail (per-step + cost). */\n async read(workflowId: string, runId: string): Promise<Envelope<WorkflowRun>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}`),\n });\n },\n\n /** POST /@<slug>/workflows/<wfl-id>/runs/<wfr-id>/cancel — cancel pending or running run. */\n async cancel(workflowId: string, runId: string): Promise<Envelope<WorkflowRun>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/cancel`),\n });\n },\n };\n}\n\nexport function makeWorkflowsNamespace(config: HttpClientConfig) {\n return {\n /** GET /@<slug>/workflows — list workflows (cursor pagination). */\n async list(filters?: WorkflowListFilters): Promise<Envelope<ReadonlyArray<Workflow>>> {\n const slug = requireProjectSlug(config);\n return request(config, { method: \"GET\", path: projectPath(slug, \"workflows\"), query: filters });\n },\n\n /** POST /@<slug>/workflows — create a workflow. Requires PROJECT_AUTHOR. */\n async create(workflow: CreateWorkflowInput): Promise<Envelope<Workflow>> {\n const slug = requireProjectSlug(config);\n return request(config, { method: \"POST\", path: projectPath(slug, \"workflows\"), body: workflow });\n },\n\n /** GET /@<slug>/workflows/<wfl-id> — read a workflow. */\n async read(workflowId: string): Promise<Envelope<Workflow>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}`),\n });\n },\n\n /** PATCH /@<slug>/workflows/<wfl-id> — update a workflow. Requires PROJECT_AUTHOR. */\n async update(workflowId: string, updates: UpdateWorkflowInput): Promise<Envelope<Workflow>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"PATCH\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}`),\n body: updates,\n });\n },\n\n /** DELETE /@<slug>/workflows/<wfl-id> — delete a workflow. Requires PROJECT_AUTHOR. */\n async delete(workflowId: string): Promise<Envelope<{ deleted: boolean }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"DELETE\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}`),\n });\n },\n\n /**\n * POST /@<slug>/workflows/<wfl-id>/runs — manual-trigger a run.\n * Valid only for `triggerType: 'manual'` workflows.\n * Requires PROJECT_AUTHOR. Returns the materialised WorkflowRun.\n */\n async trigger(workflowId: string, triggerContext: Record<string, unknown> = {}): Promise<Envelope<WorkflowRun>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `workflows/${encodeURIComponent(workflowId)}/runs`),\n body: triggerContext,\n });\n },\n\n /** Run sub-namespace — list / read / cancel runs of a workflow. */\n runs: makeRunsNamespace(config),\n };\n}\n","/**\n * Studio Dashboards SDK — `client.studio.dashboards.*`.\n *\n * Dashboards persisted authoring substrate.\n * Mirrors `_sys.dashboards` row shape.\n *\n * Wire mapping (project-plane;):\n * - list() → GET /@<slug>/dashboards\n * - create(dashboard) → POST /@<slug>/dashboards\n * - read(id) → GET /@<slug>/dashboards/<dsh-id>\n * - update(id, updates) → PATCH /@<slug>/dashboards/<dsh-id>\n * - delete(id) → DELETE /@<slug>/dashboards/<dsh-id>\n * - pin(id) → POST /@<slug>/dashboards/<dsh-id>/pin\n * - unpin(id) → POST /@<slug>/dashboards/<dsh-id>/unpin\n *\n * Per RBAC: create/update/delete/pin/unpin require\n * PROJECT_AUTHOR; list/read read against all cohort roles subject\n * to RLS. Per, surfaces 2 K9O_DASHBOARD_* codes.\n */\n\nimport { request, type HttpClientConfig } from \"../http.ts\";\nimport { projectPath } from \"../url-grammar.ts\";\nimport type { Envelope } from \"../envelope.ts\";\n\n// ----------------------------------------------------------------------\n// Enums (closed at v2 launch +)\n// ----------------------------------------------------------------------\n\n/** 9-widget catalogue. */\nexport type WidgetType =\n | \"kpi_card\"\n | \"bar_chart\"\n | \"line_chart\"\n | \"pie_chart\"\n | \"data_table\"\n | \"filter_dropdown\"\n | \"filter_date_range\"\n | \"text_panel\"\n | \"workflow_status\";\n\n/** Widget data source modes. */\nexport type WidgetDataSourceMode = \"view\" | \"query\" | \"workflow\" | \"rollup\" | \"form\";\n\nexport type DashboardStatus = \"active\" | \"archived\" | \"draft\";\n\n/** A widget config entry in the `widgets` array. */\nexport type Widget = {\n id: string;\n widgetType: WidgetType;\n title?: string;\n dataSource: {\n mode: WidgetDataSourceMode;\n /** Resolved per mode: viewId / queryId / workflowId / rollupSlug / formId. */\n config: Record<string, unknown>;\n };\n /** Widget-local config (display options, thresholds, etc.). */\n config?: Record<string, unknown>;\n};\n\n// ----------------------------------------------------------------------\n// Resource shapes (mirror _sys.dashboards row)\n// ----------------------------------------------------------------------\n\n/** Dashboard record `_sys.dashboards` row. */\nexport type Dashboard = {\n /** `dsh_<base62>`. */\n id: string;\n projectId: string;\n name: string;\n description: string;\n status: DashboardStatus;\n /** Widget positions + sizes per output-03 layout schema. */\n layoutGrid: Record<string, unknown>;\n widgets: ReadonlyArray<Widget>;\n /** Dashboard-level filter widgets cascade to per-widget data sources. */\n filterConfig: Record<string, unknown>;\n /** Pathmaker org-pin per output-03; surfaces in Workspace sidebar. */\n pinnedToWorkspace: boolean;\n rbacBinding: Record<string, unknown>;\n authoredBy: string;\n authoredAt: string;\n updatedBy: string;\n updatedAt: string;\n};\n\nexport type CreateDashboardInput = {\n name: string;\n description?: string;\n status?: DashboardStatus;\n layoutGrid?: Record<string, unknown>;\n widgets?: ReadonlyArray<Widget>;\n filterConfig?: Record<string, unknown>;\n rbacBinding?: Record<string, unknown>;\n};\n\nexport type UpdateDashboardInput = Partial<CreateDashboardInput>;\n\nexport type DashboardListFilters = {\n limit?: number;\n cursor?: string;\n status?: DashboardStatus;\n pinnedToWorkspace?: boolean;\n};\n\n/** 2 K9O_DASHBOARD_* error codes. */\nexport const DASHBOARD_ERROR_CODES = {\n NOT_FOUND: \"K9O_DASHBOARD_NOT_FOUND\",\n WIDGET_INVALID: \"K9O_DASHBOARD_WIDGET_INVALID\",\n} as const;\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"studio.dashboards operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makeDashboardsNamespace(config: HttpClientConfig) {\n return {\n /** GET /@<slug>/dashboards — list dashboards (cursor pagination). */\n async list(filters?: DashboardListFilters): Promise<Envelope<ReadonlyArray<Dashboard>>> {\n const slug = requireProjectSlug(config);\n return request(config, { method: \"GET\", path: projectPath(slug, \"dashboards\"), query: filters });\n },\n\n /** POST /@<slug>/dashboards — create a dashboard. Requires PROJECT_AUTHOR. */\n async create(dashboard: CreateDashboardInput): Promise<Envelope<Dashboard>> {\n const slug = requireProjectSlug(config);\n return request(config, { method: \"POST\", path: projectPath(slug, \"dashboards\"), body: dashboard });\n },\n\n /** GET /@<slug>/dashboards/<dsh-id> — read a dashboard. */\n async read(dashboardId: string): Promise<Envelope<Dashboard>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `dashboards/${encodeURIComponent(dashboardId)}`),\n });\n },\n\n /** PATCH /@<slug>/dashboards/<dsh-id> — update a dashboard. Requires PROJECT_AUTHOR. */\n async update(dashboardId: string, updates: UpdateDashboardInput): Promise<Envelope<Dashboard>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"PATCH\",\n path: projectPath(slug, `dashboards/${encodeURIComponent(dashboardId)}`),\n body: updates,\n });\n },\n\n /** DELETE /@<slug>/dashboards/<dsh-id> — delete a dashboard. Requires PROJECT_AUTHOR. */\n async delete(dashboardId: string): Promise<Envelope<{ deleted: boolean }>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"DELETE\",\n path: projectPath(slug, `dashboards/${encodeURIComponent(dashboardId)}`),\n });\n },\n\n /** POST /@<slug>/dashboards/<dsh-id>/pin — pin to Workspace sidebar. Requires PROJECT_AUTHOR. */\n async pin(dashboardId: string): Promise<Envelope<Dashboard>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `dashboards/${encodeURIComponent(dashboardId)}/pin`),\n });\n },\n\n /** POST /@<slug>/dashboards/<dsh-id>/unpin — unpin. Requires PROJECT_AUTHOR. */\n async unpin(dashboardId: string): Promise<Envelope<Dashboard>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `dashboards/${encodeURIComponent(dashboardId)}/unpin`),\n });\n },\n };\n}\n","/**\n * Studio namespace — `client.studio.*`.\n *\n * Groups the Pathmaker-authored Studio surfaces: dashboards and workflows.\n */\n\nimport type { HttpClientConfig } from \"../http.ts\";\nimport { makeWorkflowsNamespace } from \"./workflows.ts\";\nimport { makeDashboardsNamespace } from \"./dashboards.ts\";\n\nexport function makeStudioNamespace(config: HttpClientConfig) {\n return {\n /** Workflow lifecycle + runs — `client.studio.workflows.*`. */\n workflows: makeWorkflowsNamespace(config),\n /** Dashboard lifecycle + widget data — `client.studio.dashboards.*`. */\n dashboards: makeDashboardsNamespace(config),\n };\n}\n","/**\n * Minimal SSE (Server-Sent Events) stream parser — internal.\n *\n * Used by:\n * - `client.compute.llms.invokeStream()` (`/invoke-stream`)\n * - `client.realtime.subscribe()` SSE transport fallback\n *\n * Parses an SSE byte stream (a `ReadableStream<Uint8Array>` from a fetch\n * `Response.body`) into an async iterable of parsed `data:` payloads.\n * Each event's `data:` field is JSON-parsed; events whose data is the\n * sentinel `[DONE]` terminate the stream (OpenAI-compatible convention,\n * matched by the gateway's streaming surfaces).\n *\n * Per the SDK-abstracted-primitive discipline\n * (`feedback_sdk_abstracted_primitive_default_to_richer_interaction.md`),\n * transport mechanics stay internal; consumers see a clean async iterable.\n */\n\n/**\n * Parse an SSE stream into an async iterable of JSON-decoded `data:`\n * payloads. Multi-line `data:` fields are concatenated with `\\n` per the\n * SSE spec; the assembled payload is `JSON.parse`d. Non-JSON payloads\n * yield the raw string.\n */\nexport async function* parseSseStream<T>(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<T, void, void> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n // Events are separated by a blank line (\\n\\n). Process complete events.\n let sepIndex: number;\n while ((sepIndex = indexOfEventBoundary(buffer)) !== -1) {\n const rawEvent = buffer.slice(0, sepIndex);\n buffer = buffer.slice(sepIndex).replace(/^(\\r?\\n)+/, \"\");\n const payload = extractData(rawEvent);\n if (payload === null) continue;\n if (payload === \"[DONE]\") return;\n yield decodePayload<T>(payload);\n }\n }\n\n // Flush any trailing event without a terminating blank line.\n const tail = buffer.trim();\n if (tail.length > 0) {\n const payload = extractData(tail);\n if (payload !== null && payload !== \"[DONE]\") {\n yield decodePayload<T>(payload);\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction indexOfEventBoundary(buffer: string): number {\n const lf = buffer.indexOf(\"\\n\\n\");\n const crlf = buffer.indexOf(\"\\r\\n\\r\\n\");\n if (lf === -1) return crlf;\n if (crlf === -1) return lf;\n return Math.min(lf, crlf);\n}\n\n/** Extract + concatenate `data:` lines from a single raw SSE event block. */\nfunction extractData(rawEvent: string): string | null {\n const lines = rawEvent.split(/\\r?\\n/);\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.startsWith(\":\")) continue; // comment / heartbeat\n if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(5).replace(/^ /, \"\"));\n }\n }\n if (dataLines.length === 0) return null;\n return dataLines.join(\"\\n\");\n}\n\nfunction decodePayload<T>(payload: string): T {\n try {\n return JSON.parse(payload) as T;\n } catch {\n return payload as unknown as T;\n }\n}\n","/**\n * Compute LLMs SDK — `client.compute.llms.*`.\n *\n * Compute LLMs registry. Curated 9-model library\n * + 4-endpoint family + per-model tier-gating.\n *\n * Wire mapping (project-plane;):\n * - list() → GET /@<slug>/compute/llms\n * - read(modelId) → GET /@<slug>/compute/llms/<model-id>\n * - invoke(modelId, ...) → POST /@<slug>/compute/llms/<model-id>/invoke\n * - invokeStream(modelId,...) → POST /@<slug>/compute/llms/<model-id>/invoke-stream (SSE)\n *\n * Per RBAC: list/read against all cohort roles; invoke +\n * invokeStream require PROJECT_AUTHOR or PROJECT_ADMIN (LLM cost gate).\n * Per, surfaces K9O_LLM_PROVIDER_UNAVAILABLE (503) +\n * reuses K9O_MODEL_NOT_DECLARED / K9O_TIER_FEATURE_GATED /\n * K9O_AGENT_INFERENCE_TIMEOUT.\n */\n\nimport { request, requestStream, type HttpClientConfig } from \"../http.ts\";\nimport { projectPath } from \"../url-grammar.ts\";\nimport type { Envelope } from \"../envelope.ts\";\nimport { parseSseStream } from \"../internal/sse.ts\";\n\n/** Curated 9-model closed enum at v2 launch (extensible v2.x). */\nexport type LLMModelId =\n | \"mistral-7b\"\n | \"mistral-8x7b\"\n | \"llama-3-8b\"\n | \"llama-3-70b\"\n | \"claude-3-5-sonnet\"\n | \"gpt-4o\"\n | \"gpt-4o-mini\"\n | \"text-embedding-3-small\"\n | \"text-embedding-3-large\";\n\nexport type LLMProviderClass = \"self-hosted\" | \"external\";\nexport type LLMModality = \"text-completion\" | \"text-completion+tool-use\" | \"embeddings\";\n\n/** Model metadata + (cost transparency). */\nexport type LLMModel = {\n id: LLMModelId;\n providerClass: LLMProviderClass;\n modality: LLMModality;\n /** Minimum tier gate (e.g. \"base-camp\", \"ascent\", \"ridge\"). */\n tierGate: string;\n contextWindow: number;\n capabilities: ReadonlyArray<string>;\n /** Per-model token cost for cost-transparency. */\n costPerMillionInputTokens: number;\n costPerMillionOutputTokens: number;\n};\n\n/** Inference parameters (passed through to provider). */\nexport type LLMInvokeParams = {\n maxTokens?: number;\n temperature?: number;\n topP?: number;\n stop?: ReadonlyArray<string>;\n [key: string]: unknown;\n};\n\n/** Synchronous inference response `/invoke`. */\nexport type LLMResponse = {\n completion: string;\n tokensUsed: number;\n latencyMs: number;\n};\n\n/** Streaming chunk `/invoke-stream` (SSE per-token). */\nexport type LLMStreamChunk = {\n /** Incremental completion delta. */\n delta: string;\n /** True on the terminal chunk. */\n done?: boolean;\n /** Populated on terminal chunk. */\n tokensUsed?: number;\n};\n\nexport type LLMInvokeInput = {\n prompt: string;\n params?: LLMInvokeParams;\n};\n\n/** Error code coined in (others reused). */\nexport const LLM_ERROR_CODES = {\n PROVIDER_UNAVAILABLE: \"K9O_LLM_PROVIDER_UNAVAILABLE\",\n} as const;\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"compute.llms operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makeLlmsNamespace(config: HttpClientConfig) {\n return {\n /** GET /@<slug>/compute/llms — list models available to the project tier. */\n async list(opts?: { modality?: LLMModality; providerClass?: LLMProviderClass }): Promise<Envelope<ReadonlyArray<LLMModel>>> {\n const slug = requireProjectSlug(config);\n return request(config, { method: \"GET\", path: projectPath(slug, \"compute/llms\"), query: opts });\n },\n\n /** GET /@<slug>/compute/llms/<model-id> — read single model metadata + cost. */\n async read(modelId: LLMModelId | string): Promise<Envelope<LLMModel>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"GET\",\n path: projectPath(slug, `compute/llms/${encodeURIComponent(modelId)}`),\n });\n },\n\n /**\n * POST /@<slug>/compute/llms/<model-id>/invoke — synchronous inference.\n * Requires PROJECT_AUTHOR or PROJECT_ADMIN (LLM cost gate).\n */\n async invoke(modelId: LLMModelId | string, input: LLMInvokeInput): Promise<Envelope<LLMResponse>> {\n const slug = requireProjectSlug(config);\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, `compute/llms/${encodeURIComponent(modelId)}/invoke`),\n body: { prompt: input.prompt, params: input.params },\n });\n },\n\n /**\n * POST /@<slug>/compute/llms/<model-id>/invoke-stream — streaming\n * inference (SSE; per-token delta for low-latency UX).\n * Returns an async iterable of `LLMStreamChunk` — caller writes\n * `for await (const chunk of client.compute.llms.invokeStream(...))`.\n * The SDK handles SSE framing internally per\n * `feedback_sdk_abstracted_primitive_default_to_richer_interaction.md`.\n */\n async *invokeStream(modelId: LLMModelId | string, input: LLMInvokeInput): AsyncGenerator<LLMStreamChunk, void, void> {\n const slug = requireProjectSlug(config);\n const response = await requestStream(config, {\n method: \"POST\",\n path: projectPath(slug, `compute/llms/${encodeURIComponent(modelId)}/invoke-stream`),\n body: { prompt: input.prompt, params: input.params },\n accept: \"text/event-stream\",\n });\n // requestStream guarantees a non-null body on 2xx.\n yield* parseSseStream<LLMStreamChunk>(response.body as ReadableStream<Uint8Array>);\n },\n };\n}\n\nexport function makeComputeNamespace(config: HttpClientConfig) {\n return {\n /** LLM registry + inference — `client.compute.llms.*`. */\n llms: makeLlmsNamespace(config),\n };\n}\n","/**\n * `client.ai.*` — platform AI primitives (`k9o.ai.embed()` is a platform primitive, not sugar over\n * `context.embed`).\n *\n * Wire mapping (project-plane):\n * - embed({ model?, input }) → POST /@<slug>/ai/embeddings body { model?, input: string | string[] }\n * → { data: { embeddings: number[][], model, dimensions }, meta }\n *\n * Callers are an extension (authority is the `(ai, embed, \"*\")` manifest grant) or a project member's own\n * backend; the gateway refuses an end user's client. Bounds (enforced by the gateway, not here): at most 64\n * inputs, each non-empty, at most 256 KiB of input per request, at most 4 requests in flight per project.\n * The platform adds nothing to the input: callers add the model's task prefixes themselves. The SDK sends the\n * input exactly as given and never puts it in an error.\n */\n\nimport { request, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport type { Envelope } from \"./envelope.ts\";\n\n/** The one declared embedding model today. A different `model` is refused with `K9O_MODEL_NOT_DECLARED`. */\nexport type EmbeddingModelId = \"nomic-embed-text-v1.5\";\n\nexport type EmbedInput = {\n /** Optional; defaults server-side to the one declared embedding model. */\n model?: EmbeddingModelId | (string & {});\n /** One string, or an array of strings; the result has one vector per string, in order. */\n input: string | ReadonlyArray<string>;\n};\n\nexport type EmbedResult = {\n /** One vector per input string, in input order. */\n embeddings: number[][];\n model: string;\n dimensions: number;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"ai operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\nexport function makeAiNamespace(config: HttpClientConfig) {\n return {\n /** POST /@<slug>/ai/embeddings — embed one or more strings. */\n async embed(input: EmbedInput): Promise<Envelope<EmbedResult>> {\n const slug = requireProjectSlug(config);\n const body: { model?: string; input: string | string[] } = {\n input: typeof input.input === \"string\" ? input.input : [...input.input],\n };\n if (input.model !== undefined) body.model = input.model;\n return request(config, { method: \"POST\", path: projectPath(slug, \"ai/embeddings\"), body });\n },\n };\n}\n","/**\n * Realtime Subscriptions SDK — `client.realtime.*`.\n *\n * Realtime Subscriptions ALL-LIVE primitive.\n *\n * `client.realtime.subscribe(topic, options?)` returns an async iterable\n * yielding `RealtimeEvent`s — the caller writes idiomatic\n * `for await (const event of client.realtime.subscribe(topic)) { ... }`.\n *\n * Per `feedback_sdk_abstracted_primitive_default_to_richer_interaction.md`\n * +: the SDK chooses the transport (WebSocket primary → SSE\n * → poll), transparently. SPLIT (polling) is the SDK-internal fallback\n * when WebSocket / SSE are unavailable — NOT a consumer-side design\n * choice. The consumer sees one uniform async iterable regardless.\n *\n * Wire mapping (project-plane;):\n * - subscribe → GET /@<slug>/realtime/subscribe?topic=<t>&filter=<jsonb> (WS/SSE upgrade)\n * - replay → POST /@<slug>/realtime/replay { topic, fromSequence, untilSequence?, limit? }\n *\n * Per, `filter` + RLS compose (filter narrows, RLS gates).\n * Per, surfaces no new codes — reuses K9O_INVALID_FILTER +\n * K9O_SUBSCRIPTION_LIMIT_EXCEEDED + K9O_TIER_FEATURE_GATED.\n */\n\nimport { request, requestStream, type HttpClientConfig } from \"./http.ts\";\nimport { projectPath } from \"./url-grammar.ts\";\nimport { KError } from \"./kerror.ts\";\nimport type { Envelope } from \"./envelope.ts\";\nimport { parseSseStream } from \"./internal/sse.ts\";\n\n// ----------------------------------------------------------------------\n// Topic catalogue (closed 6-family enum)\n// ----------------------------------------------------------------------\n\n/**\n * The 6 closed subscription topic families. Concrete\n * topic strings carry a dynamic segment (collection name, resource id,\n * event family) — use `realtimeTopic.*` builders to construct them.\n */\nexport type RealtimeTopicFamily =\n | \"collections\"\n | \"studio.workflows.runs\"\n | \"studio.queries.executed\"\n | \"studio.dashboards.refresh\"\n | \"forge.functions.invocations\"\n | \"audit.org\";\n\n/** A concrete topic string, e.g. `studio.dashboards.refresh.dsh_abc`. */\nexport type RealtimeTopic = string;\n\n/**\n * Typed builders for the 6 topic families. Prefer these\n * over hand-built strings for compile-time family safety.\n */\nexport const realtimeTopic = {\n /** `collections.<collection>.*` — row insert / update / delete events. */\n collection(collection: string): RealtimeTopic {\n return `collections.${collection}.*`;\n },\n /** `studio.workflows.runs.*` — run started / step_changed / approval_pending / completed. */\n workflowRuns(): RealtimeTopic {\n return \"studio.workflows.runs.*\";\n },\n /** `studio.queries.executed.<query-id>` — query execute events. */\n queryExecuted(queryId: string): RealtimeTopic {\n return `studio.queries.executed.${queryId}`;\n },\n /** `studio.dashboards.refresh.<dashboard-id>` — widget data refresh. */\n dashboardRefresh(dashboardId: string): RealtimeTopic {\n return `studio.dashboards.refresh.${dashboardId}`;\n },\n /** `forge.functions.invocations.<function-id>` — invoked / completed / failed. */\n functionInvocations(functionId: string): RealtimeTopic {\n return `forge.functions.invocations.${functionId}`;\n },\n /** `audit.org.<event-family>` — org-plane audit events. */\n auditOrg(eventFamily: string): RealtimeTopic {\n return `audit.org.${eventFamily}`;\n },\n} as const;\n\n// ----------------------------------------------------------------------\n// Event + filter shapes\n// ----------------------------------------------------------------------\n\n/** Per-topic filter predicate (vocabulary). */\nexport type RealtimeFilter = Record<string, unknown>;\n\n/** A single realtime event delivered on a subscription. */\nexport type RealtimeEvent<T = unknown> = {\n topic: RealtimeTopic;\n /** Event type within the topic family (e.g. `row_inserted`, `workflow.run.completed`). */\n type: string;\n /** Monotonic sequence number — use as `fromSequence` for replay catch-up. */\n sequence: number;\n payload: T;\n occurredAt: string;\n};\n\nexport type SubscribeOptions = {\n filter?: RealtimeFilter;\n /** Abort the subscription (closes the underlying transport). */\n signal?: AbortSignal;\n /**\n * Force a transport instead of the WebSocket → SSE → poll cascade.\n * Mainly for tests + constrained runtimes. Omit for production —\n * the SDK picks the richest available transport.\n */\n transport?: RealtimeTransportKind;\n /** Poll-transport interval in ms (default 2000). Only used when polling. */\n pollIntervalMs?: number;\n};\n\nexport type RealtimeTransportKind = \"websocket\" | \"sse\" | \"poll\";\n\n/**\n * A live subscription. It is itself an async iterable (`for await`) and\n * exposes `close()` for explicit teardown + `transport` for diagnostics.\n */\nexport type RealtimeSubscription<T = unknown> = AsyncIterable<RealtimeEvent<T>> & {\n /** Stop the subscription + release the underlying transport. */\n close(): void;\n /** The transport actually selected (post-fallback). */\n readonly transport: RealtimeTransportKind;\n};\n\nexport type ReplayInput = {\n topic: RealtimeTopic;\n filter?: RealtimeFilter;\n fromSequence: number;\n untilSequence?: number;\n limit?: number;\n};\n\nfunction requireProjectSlug(config: HttpClientConfig): string {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n throw new Error(\"realtime operations require projectSlug bound on the client\");\n }\n return config.projectSlug;\n}\n\n/** Pick the richest transport available in this runtime. */\nfunction selectTransport(forced?: RealtimeTransportKind): RealtimeTransportKind {\n if (forced) return forced;\n if (typeof (globalThis as { WebSocket?: unknown }).WebSocket === \"function\") return \"websocket\";\n // SSE rides on fetch streaming, which the http layer already requires.\n return \"sse\";\n}\n\n/** Convert an http(s) baseUrl to a ws(s) URL for the WebSocket transport. */\nfunction toWebSocketUrl(baseUrl: string, path: string, query: Record<string, string>): string {\n const trimmed = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const wsBase = trimmed.replace(/^http/, \"ws\");\n const qs = new URLSearchParams(query).toString();\n return `${wsBase}${path}${qs ? `?${qs}` : \"\"}`;\n}\n\n/** WebSocket transport — primary. Bridges socket → async queue. */\nasync function* websocketTransport<T>(\n config: HttpClientConfig,\n topic: RealtimeTopic,\n options: SubscribeOptions,\n closed: { value: boolean },\n): AsyncGenerator<RealtimeEvent<T>, void, void> {\n const slug = requireProjectSlug(config);\n const query: Record<string, string> = { topic };\n if (options.filter) query.filter = JSON.stringify(options.filter);\n if (config.apiKey) query.access_token = config.apiKey; // WS can't set Authorization header\n const url = toWebSocketUrl(config.baseUrl, projectPath(slug, \"realtime/subscribe\"), query);\n const WS = (globalThis as { WebSocket: new (url: string) => WebSocket }).WebSocket;\n const socket = new WS(url);\n\n const queue: RealtimeEvent<T>[] = [];\n let resolveNext: (() => void) | null = null;\n let socketClosed = false;\n let socketError: Error | null = null;\n\n const wake = () => {\n if (resolveNext) {\n resolveNext();\n resolveNext = null;\n }\n };\n socket.onmessage = (ev: MessageEvent) => {\n try {\n queue.push(JSON.parse(typeof ev.data === \"string\" ? ev.data : String(ev.data)) as RealtimeEvent<T>);\n } catch {\n /* ignore malformed frame */\n }\n wake();\n };\n socket.onerror = () => {\n socketError = new Error(\"realtime websocket transport error\");\n wake();\n };\n socket.onclose = () => {\n socketClosed = true;\n wake();\n };\n options.signal?.addEventListener(\"abort\", () => socket.close());\n\n try {\n while (!closed.value) {\n if (queue.length > 0) {\n yield queue.shift() as RealtimeEvent<T>;\n continue;\n }\n if (socketClosed) {\n if (socketError) throw socketError;\n return;\n }\n await new Promise<void>((resolve) => {\n resolveNext = resolve;\n });\n }\n } finally {\n try {\n socket.close();\n } catch {\n /* already closed */\n }\n }\n}\n\n/** SSE transport — fallback. Rides on fetch streaming. */\nasync function* sseTransport<T>(\n config: HttpClientConfig,\n topic: RealtimeTopic,\n options: SubscribeOptions,\n closed: { value: boolean },\n): AsyncGenerator<RealtimeEvent<T>, void, void> {\n const slug = requireProjectSlug(config);\n const query: Record<string, string | number | boolean | undefined> = { topic };\n if (options.filter) query.filter = JSON.stringify(options.filter);\n const response = await requestStream(config, {\n method: \"GET\",\n path: projectPath(slug, \"realtime/subscribe\"),\n query,\n accept: \"text/event-stream\",\n });\n for await (const event of parseSseStream<RealtimeEvent<T>>(response.body as ReadableStream<Uint8Array>)) {\n if (closed.value || options.signal?.aborted) return;\n yield event;\n }\n}\n\n/** Poll transport — last-resort fallback (SPLIT, SDK-internal). */\nasync function* pollTransport<T>(\n config: HttpClientConfig,\n topic: RealtimeTopic,\n options: SubscribeOptions,\n closed: { value: boolean },\n): AsyncGenerator<RealtimeEvent<T>, void, void> {\n const slug = requireProjectSlug(config);\n const interval = options.pollIntervalMs ?? 2000;\n let cursor = 0;\n while (!closed.value && !options.signal?.aborted) {\n const { data } = await request<ReadonlyArray<RealtimeEvent<T>>>(config, {\n method: \"POST\",\n path: projectPath(slug, \"realtime/replay\"),\n body: { topic, filter: options.filter, fromSequence: cursor },\n });\n for (const event of data ?? []) {\n if (closed.value || options.signal?.aborted) return;\n cursor = Math.max(cursor, event.sequence + 1);\n yield event;\n }\n if (closed.value || options.signal?.aborted) return;\n await new Promise<void>((resolve) => setTimeout(resolve, interval));\n }\n}\n\nexport function makeRealtimeNamespace(config: HttpClientConfig) {\n return {\n /**\n * Subscribe to a topic. Returns a `RealtimeSubscription` — an async\n * iterable of `RealtimeEvent`s. The SDK selects the richest available\n * transport (WebSocket → SSE → poll); the caller's\n * `for await` loop is transport-agnostic.\n *\n * ```ts\n * const sub = client.realtime.subscribe(\n * realtimeTopic.dashboardRefresh(\"dsh_abc\"),\n * );\n * for await (const event of sub) {\n * if (event.type === \"dashboard.widget.data_refreshed\") rerender(event.payload);\n * }\n * ```\n */\n subscribe<T = unknown>(topic: RealtimeTopic, options: SubscribeOptions = {}): RealtimeSubscription<T> {\n requireProjectSlug(config);\n const transport = selectTransport(options.transport);\n const closed = { value: false };\n\n const iterate = (): AsyncGenerator<RealtimeEvent<T>, void, void> => {\n switch (transport) {\n case \"websocket\":\n return websocketTransport<T>(config, topic, options, closed);\n case \"poll\":\n return pollTransport<T>(config, topic, options, closed);\n case \"sse\":\n default:\n return sseTransport<T>(config, topic, options, closed);\n }\n };\n\n let active: AsyncGenerator<RealtimeEvent<T>, void, void> | null = null;\n return {\n transport,\n [Symbol.asyncIterator]() {\n active = iterate();\n return active;\n },\n close() {\n closed.value = true;\n void active?.return(undefined);\n },\n };\n },\n\n /**\n * One-shot historical replay — catch up on missed\n * events from `fromSequence`. Capped at 10k events server-side;\n * paginate via the returned events' `sequence`. Use the highest\n * `sequence` you've seen as the next `fromSequence`.\n */\n async replay<T = unknown>(input: ReplayInput): Promise<Envelope<ReadonlyArray<RealtimeEvent<T>>>> {\n const slug = requireProjectSlug(config);\n if (!Number.isInteger(input.fromSequence) || input.fromSequence < 0) {\n throw new KError({\n code: \"K9O_INVALID_FILTER\",\n message: \"replay fromSequence must be a non-negative integer\",\n context: { fromSequence: input.fromSequence },\n recommendation: \"Pass the highest sequence number you have already observed (or 0 to replay from the start).\",\n });\n }\n return request(config, {\n method: \"POST\",\n path: projectPath(slug, \"realtime/replay\"),\n body: {\n topic: input.topic,\n filter: input.filter,\n fromSequence: input.fromSequence,\n untilSequence: input.untilSequence,\n limit: input.limit,\n },\n });\n },\n };\n}\n","/**\n * Pillar composition: `@k9o/core` ↔ `@k9o/gate`.\n *\n * `@k9o/core` composes `@k9o/gate` as the `client.gate` namespace on\n * the K9oClient, sharing the same `baseUrl` + `projectSlug` config.\n *\n * `@k9o/gate` remains independently importable for Auth0-parity\n * standalone deployments (Trojan Horse motion); the bridge here is the\n * composition path when the caller imports `@k9o/core` and wants the\n * full platform surface.\n *\n * Mode defaults to `native` for the composition path — Native is the\n * mode that pairs with the broader Kilimanjaro billing model per\n * `@k9o/gate/mode.ts`. Standalone customers should import\n * `@k9o/gate` directly and call `createGateClient({ mode: 'standalone', ... })`.\n *\n * KError vs GateError alignment is still open.\n * Until then both error types remain shape-compatible (`code` /\n * `message` / `context` / `recommendation` fields are identical),\n * and caller code that narrows on `error.code` works against either.\n */\n\nimport { createGateClient, type GateClient } from \"@k9o/gate\";\nimport type { HttpClientConfig } from \"./http.ts\";\nimport { KError } from \"./kerror.ts\";\n\n/**\n * Build the composed `client.gate` namespace bound to the K9oClient's\n * baseUrl + projectSlug. Requires `projectSlug` to be set on the\n * client config — gate operations are inherently project-scoped per\n * URL grammar.\n *\n * Returns `null` when projectSlug is not bound — the K9oClient may be\n * constructed for org-plane operations only (e.g. `client.orgs.list()`\n * or `client.projects.create()`), in which case gate operations are\n * not available until a per-project client is constructed.\n */\nexport function makeGateBridge(config: HttpClientConfig): GateClient | null {\n if (typeof config.projectSlug !== \"string\" || config.projectSlug.length === 0) {\n return null;\n }\n // Spread optional fields only when defined — GateConfig's partnerToken\n // + fetch are non-optional-undefined under exactOptionalPropertyTypes.\n return createGateClient({\n mode: \"native\",\n baseUrl: config.baseUrl,\n projectSlug: config.projectSlug,\n ...(config.apiKey !== undefined ? { partnerToken: config.apiKey } : {}),\n ...(config.fetch !== undefined ? { fetch: config.fetch } : {}),\n });\n}\n\n/**\n * Throw a helpful error when `client.gate` is accessed but projectSlug\n * is not bound. Wraps the null-return from `makeGateBridge` so callers\n * get a typed `K9O_MISSING_PROJECT_CONTEXT` rather than a null deref.\n */\nexport function gateNotAvailable(): never {\n throw new KError({\n code: \"K9O_MISSING_PROJECT_CONTEXT\",\n message: \"client.gate requires projectSlug bound on the createClient options\",\n context: {},\n recommendation: \"Pass `projectSlug` in createClient options. For multi-project apps, construct one client per project context.\",\n });\n}\n","/**\n * Pillar composition: `@k9o/core` ↔ `@k9o/extensions`.\n *\n * Re-exports the `k9o.extension(slug)` factory from `@k9o/extensions`.\n *\n * `@k9o/extensions` exports a `k9o` namespace with `extension(slug)`\n * factory returning typed bindings for Trailblazer/Anchor/Keystone\n * class extensions (baked in at SDK publish time). Circuit-class\n * (Long Tail) extensions use the install-time `k9o codegen` tool\n * path (a) OR raw HTTP / vendor-SDK fallback per path (b).\n *\n * The bridge re-exports the factory directly — it is config-free\n * (extension stubs do not require HTTP routing yet). Once per-method dispatch\n * ships, the bridge will thread baseUrl + auth into the extension runtime;\n * until then the re-export is a thin pass-through.\n */\n\nimport { k9o as extensionsNamespace, type ExtensionSlug, type Extension } from \"@k9o/extensions\";\n\nexport { extensionsNamespace, type ExtensionSlug, type Extension };\n\n/**\n * Build the composed `client.extensions` namespace. Currently a thin\n * re-export of the `@k9o/extensions` `k9o.extension(slug)` factory.\n * Config-free for now; it will use the client HTTP config once runtime\n * dispatch ships.\n */\nexport function makeExtensionsBridge() {\n return {\n /** Resolve a typed extension instance by slug. See `@k9o/extensions` for the factory contract. */\n extension: extensionsNamespace.extension,\n };\n}\n","/**\n * `@k9o/core` — Kilimanjaro platform SDK entry point.\n *\n * Customer-facing surface. The `createClient(options)`\n * factory returns a `K9oClient` instance with namespaces:\n *\n * - `client.from(collection)` — data-plane DSL\n * - `client.projects` — project lifecycle\n * - `client.gate`, `client.extensions`, `client.migrations`, `client.functions`, `client.policies`,\n * `client.audit`, `client.orgs` and the other namespaces on the client type\n *\n * `@k9o/core` composes `@k9o/gate` and `@k9o/extensions` and adds client construction and the data-plane surface.\n * The SDK shape stays stable whether pillars are imported directly or\n * through `@k9o/core` — only the package boundary moves.\n *\n * Every async method throws `KError` on non-2xx\n * gateway responses, transport failures, or SDK-side validation errors.\n * Caller code narrows on `error.code` per the closed taxonomy.\n *\n * Canonical usage:\n *\n * ```typescript\n * import { createClient, KError } from \"@k9o/core\";\n *\n * // `orgSlug` selects your organization's host (https://acme.api.k9o.io); do not also pass `baseUrl`.\n * const client = createClient({\n * apiKey: process.env.K9O_API_KEY,\n * orgSlug: \"acme\",\n * projectSlug: \"member-portal\",\n * });\n *\n * try {\n * const { data, meta } = await client.from(\"posts\").select().limit(10);\n * console.log(data, meta.cursor.next);\n * } catch (e) {\n * if (e instanceof KError && e.code === \"K9O_TIER_CAP_HIT\") {\n * console.warn(e.message, e.recommendation);\n * }\n * throw e;\n * }\n * ```\n */\n\nimport { resolveBaseUrl } from \"./url-grammar.ts\";\nimport type { HttpClientConfig } from \"./http.ts\";\nimport { makeFromFactory } from \"./data/from.ts\";\nimport { makeProjectsNamespace } from \"./projects.ts\";\nimport { makeStorageNamespace } from \"./storage-locations.ts\";\nexport type {\n StorageBucket, CreateBucketOptions, UpdateBucketOptions, StorageObject, UploadOptions, SignedUrlOptions,\n SignedUrl, RemovedObject, DeletedBucket,\n} from \"./storage-buckets.ts\";\nimport { makeMetadataNamespace } from \"./metadata.ts\";\nimport { makeMigrationsNamespace } from \"./migrations.ts\";\nimport { makeFunctionsNamespace } from \"./functions.ts\";\nimport { makePoliciesNamespace } from \"./policies.ts\";\nimport { makeAuditNamespace } from \"./audit.ts\";\nimport { makeOrgsNamespace } from \"./orgs.ts\";\nimport { makeOrgNamespace } from \"./org.ts\";\nimport { makeMeNamespace } from \"./me.ts\";\nimport { makeStudioNamespace } from \"./studio/index.ts\";\nimport { makeComputeNamespace } from \"./compute/llms.ts\";\nimport { makeAiNamespace } from \"./ai.ts\";\nimport { makeRealtimeNamespace } from \"./realtime.ts\";\nimport { makeGateBridge, gateNotAvailable } from \"./gate-bridge.ts\";\nimport { makeExtensionsBridge } from \"./extensions-bridge.ts\";\nimport type { GateClient } from \"@k9o/gate\";\nimport { createKiboClient, type KiboClient } from \"@k9o/kibo\";\nimport type { CreateClientOptions } from \"./types.ts\";\n\nexport { KError, kerrorFromWire, type KErrorWire } from \"./kerror.ts\";\nexport {\n type Envelope,\n type MetaCursor,\n type MetaSubscription,\n type MetaIdempotency,\n type MetaWarning,\n type MetaCost,\n type MetaTiming,\n type MetaContext,\n type PaginatedEnvelope,\n} from \"./envelope.ts\";\nexport {\n validateBaseUrl,\n resolveBaseUrl,\n validateSlug,\n projectPath,\n orgPath,\n platformPath,\n} from \"./url-grammar.ts\";\nexport type {\n CreateClientOptions,\n RetryConfig,\n FilterOp,\n} from \"./types.ts\";\nexport type { Project, CreateProjectInput, UpdateProjectInput } from \"./projects.ts\";\nexport {\n BYOS_CRED_REF_PREFIX,\n BYOS_CRED_FORMAT_VERSION,\n BYOS_CRED_VAULT_NAME_PREFIX,\n BYOS_PROVIDER_SCHEME,\n encodeByosCredential,\n byosCredentialRef,\n byosCredVaultName,\n type ByosCredProvider,\n type ByosCredInput,\n} from \"./byos.ts\";\nexport type {\n StorageLocation, StorageLocationProvider, StorageLocationCustodyMode, StorageLocationProviderParams,\n CreateStorageLocationInput, UpdateStorageLocationInput, RetiredStorageLocation, StorageLocationTestResult,\n} from \"./storage-locations.ts\";\nexport {\n METADATA_OPERATORS,\n type MetadataSlice, type MetadataOperator, type MetadataSurface,\n type MetadataWhereClause, type MetadataQueryRecord, type MetadataQueryResult,\n type MetadataQueryBuilder,\n} from \"./metadata.ts\";\nexport type {\n Migration, AppliedMigration, PendingMigration,\n Operation, ColumnSpec, IndexSpec, ColumnReferences,\n MigrationPolicy, CollectionPolicy, StorageBucketPolicy, RelationshipSpec, ActionRule,\n} from \"./migrations.ts\";\nexport type { FunctionRecord, DeployFunctionInput } from \"./functions.ts\";\nexport type { PolicyBundle, CreatePolicyInput, UpdatePolicyInput, ValidatePolicyResult } from \"./policies.ts\";\nexport type { AuditEvent, AuditQueryOpts } from \"./audit.ts\";\nexport type { Org } from \"./orgs.ts\";\nexport type {\n OrgMember,\n OrgGroup,\n OrgRoleGrant,\n OrgAuditEvent,\n SmtpConfig,\n SmtpTestEmailInput,\n SmtpTestEmailResult,\n OrgIdpProvider,\n CreateOrgIdpInput,\n} from \"./org.ts\";\nexport type {\n MyProfile,\n MySession,\n MyApiToken,\n MyNotification,\n} from \"./me.ts\";\nexport type { ExtensionSlug, Extension } from \"./extensions-bridge.ts\";\nexport type { GateClient } from \"@k9o/gate\";\nexport type {\n KiboClient, KmsProvider, StoreZkDekInput, ZkDekHandle, ZkDekRecord,\n SecretVisibility, CreateSecretInput, SecretSummary,\n ListSecretsInput, ListSecretsResult, AttestationTier, RevealChallenge, RevealSecretResult,\n UpdateSecretInput, UpdateSecretResult, RotateSecretResult, MoveSecretResult,\n} from \"@k9o/kibo\";\n\n// Studio surfaces (workflows + dashboards)\nexport {\n WORKFLOW_ERROR_CODES,\n type Workflow,\n type WorkflowRun,\n type WorkflowRunStep,\n type WorkflowAction,\n type WorkflowStatus,\n type WorkflowRunStatus,\n type WorkflowTriggerType,\n type WorkflowActionType,\n type CreateWorkflowInput,\n type UpdateWorkflowInput,\n type WorkflowListFilters,\n type WorkflowRunListFilters,\n} from \"./studio/workflows.ts\";\nexport {\n DASHBOARD_ERROR_CODES,\n type Dashboard,\n type Widget,\n type WidgetType,\n type WidgetDataSourceMode,\n type DashboardStatus,\n type CreateDashboardInput,\n type UpdateDashboardInput,\n type DashboardListFilters,\n} from \"./studio/dashboards.ts\";\n\n// Compute LLMs\nexport {\n LLM_ERROR_CODES,\n type LLMModelId,\n type LLMModel,\n type LLMModality,\n type LLMProviderClass,\n type LLMInvokeParams,\n type LLMInvokeInput,\n type LLMResponse,\n type LLMStreamChunk,\n} from \"./compute/llms.ts\";\n\nexport type { EmbedInput, EmbedResult, EmbeddingModelId } from \"./ai.ts\";\n\nexport { assertProviderRegion, isProviderRegion, type ProviderRegionProvider } from \"./provider-region.ts\";\n\n// Realtime subscriptions\nexport {\n realtimeTopic,\n type RealtimeTopic,\n type RealtimeTopicFamily,\n type RealtimeFilter,\n type RealtimeEvent,\n type RealtimeSubscription,\n type RealtimeTransportKind,\n type SubscribeOptions,\n type ReplayInput,\n} from \"./realtime.ts\";\n\n/**\n * The client returned by `createClient`. Namespaces hang off the\n * instance — composed from per-resource factories that share the\n * bound HTTP config.\n */\nexport type K9oClient = {\n /** Data-plane DSL — `client.from(collection).select()` etc. */\n from: ReturnType<typeof makeFromFactory>;\n /** Project lifecycle — `client.projects.list()` etc. */\n projects: ReturnType<typeof makeProjectsNamespace>;\n /** Storage locations — `client.storage.locations.create({..., credentialRef})` etc. Independent of\n * `client.kibo.vault.secrets` (credential pre-create): this namespace only registers a caller-supplied\n * `credentialRef` string, never creates or resolves one. */\n storage: ReturnType<typeof makeStorageNamespace>;\n /** Cross-surface metadata query — `client.metadata.from(...).where(...).execute()`. Client-side\n * only until the gateway's Inc-2 route lands; see `metadata.ts` for status. */\n metadata: ReturnType<typeof makeMetadataNamespace>;\n /** Migration lifecycle — `client.migrations.apply()` etc. */\n migrations: ReturnType<typeof makeMigrationsNamespace>;\n /** Function deploy + invoke — `client.functions.deploy()` etc. */\n functions: ReturnType<typeof makeFunctionsNamespace>;\n /** Policy bundle lifecycle — `client.policies.publish()` etc. */\n policies: ReturnType<typeof makePoliciesNamespace>;\n /** Audit log queries — `client.audit.query()` etc. */\n audit: ReturnType<typeof makeAuditNamespace>;\n /** Org lifecycle — `client.orgs.list()` etc. (collection-style across accessible orgs) */\n orgs: ReturnType<typeof makeOrgsNamespace>;\n /** Org-bound namespace — `client.org.members`, `client.org.groups`, `client.org.smtp`, `client.org.auditLog`, `client.org.gate`. */\n org: ReturnType<typeof makeOrgNamespace>;\n /** Operator-self namespace — `client.me.profile`, `client.me.sessions`, etc. Cross-org; no tenant context required. */\n me: ReturnType<typeof makeMeNamespace>;\n /** Studio surfaces — `client.studio.workflows.*` + `client.studio.dashboards.*`. */\n studio: ReturnType<typeof makeStudioNamespace>;\n /** Compute surfaces — `client.compute.llms.*`. */\n compute: ReturnType<typeof makeComputeNamespace>;\n /** Platform AI primitives — `client.ai.embed({ model?, input })`. */\n ai: ReturnType<typeof makeAiNamespace>;\n /** Realtime subscriptions — `client.realtime.subscribe()` / `.replay()`. */\n realtime: ReturnType<typeof makeRealtimeNamespace>;\n /** Gate (Identity-Aware Kernel) — composed from `@k9o/gate`. Available when projectSlug is bound on the client. */\n readonly gate: GateClient;\n /** Kibo (Zero-Knowledge vault) — composed from `@k9o/kibo`. `client.kibo.vault.zkDeks.*` (F.5); project-scoped methods self-guard the project context. */\n readonly kibo: KiboClient;\n /** Extensions consumption — composed from `@k9o/extensions`. `client.extensions.extension(slug)` returns typed extension bindings. */\n extensions: ReturnType<typeof makeExtensionsBridge>;\n /** Bound config — exposed for advanced use (custom HTTP per-call). */\n readonly config: Readonly<HttpClientConfig>;\n};\n\n/**\n * Construct a `K9oClient` bound to the supplied gateway baseUrl + auth\n * + project context. Validates the baseUrl at construct time\n * — path-bearing baseUrls throw `K9O_INVALID_BASE_URL` synchronously.\n */\nexport function createClient(options: CreateClientOptions): K9oClient {\n const baseUrl = resolveBaseUrl(options.baseUrl, options.orgSlug);\n const config: HttpClientConfig = {\n baseUrl,\n apiKey: options.apiKey,\n projectSlug: options.projectSlug,\n orgSlug: options.orgSlug,\n fetch: options.fetch,\n defaultHeaders: options.defaultHeaders,\n retryConfig: options.retryConfig,\n };\n const gateBridge = makeGateBridge(config);\n return {\n from: makeFromFactory(config),\n projects: makeProjectsNamespace(config),\n storage: makeStorageNamespace(config),\n metadata: makeMetadataNamespace(config),\n migrations: makeMigrationsNamespace(config),\n functions: makeFunctionsNamespace(config),\n policies: makePoliciesNamespace(config),\n audit: makeAuditNamespace(config),\n orgs: makeOrgsNamespace(config),\n org: makeOrgNamespace(config),\n me: makeMeNamespace(config),\n studio: makeStudioNamespace(config),\n compute: makeComputeNamespace(config),\n ai: makeAiNamespace(config),\n realtime: makeRealtimeNamespace(config),\n // gate is a proxy — null when projectSlug isn't bound; surfacing a\n // helpful K9O_MISSING_PROJECT_CONTEXT instead of a null deref when\n // the caller reaches for any gate method without project context.\n get gate() {\n if (gateBridge === null) return gateNotAvailable();\n return gateBridge;\n },\n extensions: makeExtensionsBridge(),\n kibo: createKiboClient(config),\n config: Object.freeze({ ...config }),\n };\n}\n","/**\n * BYOS (Bring-Your-Own-Store) credential-reference wire format — the client-side counterpart of the\n * gateway's B2 seal-plane gate (mirrors `services/gateway/src/analytics/\n * byos-credential-ref.ts` + `byos-credential-resolver.ts`) plus the 5-provider envelope shapes from the\n * provisioning spec — each provider's long-lived cred is\n * revealed CORE-side via an already-wired scheme that reads one exact field shape.\n *\n * The customer PRE-CREATES their cloud credential as a vault secret under their OWN auth, then binds\n * only a `kibo://byos-creds/<secId>` reference — the gateway never handles the raw long-lived cloud\n * credential at bind time (`byos-cred create`, `packages/cli/src/commands/byos-cred.ts`).\n */\n\nimport { KError } from \"./kerror.ts\";\nimport { assertProviderRegion } from \"./provider-region.ts\";\n\n/** The reference scheme the gateway's `assertByosCredentialRef` accepts at bind time. */\nexport const BYOS_CRED_REF_PREFIX = \"kibo://byos-creds/\";\n\n/**\n * The reserved vault SECRET-NAME namespace `byos-cred create` always stores under (distinct from\n * {@link BYOS_CRED_REF_PREFIX}, the `kibo://` reference scheme formed from the resulting secret id).\n * `SecretRecord` has no class/purpose column — `name` is the only vault-stored,\n * non-caller-asserted field the reveal endpoint's class gate can check authoritatively to tell \"this\n * is a BYOS credential\" and refuse revealing an install-scoped secret through the BYOS reveal path\n * (closing a receipt-bypass). `byos-cred create` enforces this prefix unconditionally —\n * it is not a convention callers opt into.\n */\nexport const BYOS_CRED_VAULT_NAME_PREFIX = \"byos-creds/\";\n\n/** The allowed charset for the caller-given part of a BYOS vault secret name (after stripping\n * {@link BYOS_CRED_VAULT_NAME_PREFIX} if present) — hygiene, not a security boundary (the seal is\n * customer-plane-scoped and the reveal resolves by vault-generated secId, never by name), but an\n * unvalidated name could otherwise land a secret at an odd vault path. */\nconst VAULT_NAME_SEGMENT = /^[a-z0-9._-]+(?:\\/[a-z0-9._-]+)*$/;\n\n/** Prefix a caller-given secret name with {@link BYOS_CRED_VAULT_NAME_PREFIX} if it isn't already\n * under it. Idempotent so re-running with an already-prefixed name doesn't double-nest.\n * Two independent checks, not one: a literal `..` substring is rejected\n * outright (traversal), separately from {@link VAULT_NAME_SEGMENT} restricting the charset to\n * `[a-z0-9._/-]` (hygiene) — the charset still permits a lone `.`, which is not itself a traversal\n * token and is not what blocks `..`. */\nexport function byosCredVaultName(name: string): string {\n const suffix = name.startsWith(BYOS_CRED_VAULT_NAME_PREFIX) ? name.slice(BYOS_CRED_VAULT_NAME_PREFIX.length) : name;\n if (suffix.length === 0 || suffix.includes(\"..\") || !VAULT_NAME_SEGMENT.test(suffix)) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"a BYOS credential name must be non-empty, lowercase alphanumeric/._- per path segment, and must not contain '..'\",\n context: { field: \"name\" },\n recommendation: \"Use a name like 's3-prod' or 'team/s3-prod' — no '..', no uppercase, no other punctuation.\",\n });\n }\n return `${BYOS_CRED_VAULT_NAME_PREFIX}${suffix}`;\n}\n\n/** The sealed BYOS credential format version (pin `v`, fail-closed on\n * an unrecognised version so a future cred shape never silently mis-parses as v1). */\nexport const BYOS_CRED_FORMAT_VERSION = 1;\n\n/** The CORE-mintable providers — each maps to exactly one wired reveal scheme.\n * `azure_blob` has no envelope shape yet (not in the provisioning spec). */\nexport type ByosCredProvider = \"s3\" | \"s3_compatible\" | \"minio\" | \"gcs\" | \"b2\" | \"r2\";\n\n/** provider → WIRED reveal scheme — informational; not itself sent on the wire (the\n * scheme name IS part of each envelope below). */\nexport const BYOS_PROVIDER_SCHEME: Record<ByosCredProvider, string> = {\n s3: \"aws_sigv4\",\n s3_compatible: \"aws_sigv4\",\n minio: \"aws_sigv4\",\n gcs: \"gcp_workload_identity\",\n b2: \"http_basic\",\n r2: \"bearer\",\n};\n\ntype SigV4Input = {\n provider: \"s3\" | \"s3_compatible\" | \"minio\";\n accessKeyId: string;\n secretAccessKey: string;\n /** The provider's STS-signing region the CORE mint signs its STS request against (`us-east-1`), NOT a platform region. */\n providerRegion: string;\n /** Present only to be rejected — a sealed cred must be long-lived. */\n sessionToken?: string | undefined;\n};\n\ntype GcsInput = {\n provider: \"gcs\";\n /** The service account's PKCS8 private key, PEM-encoded. */\n privateKeyPem: string;\n /** The service account's email — the mint's `clientId`. */\n clientId: string;\n};\n\ntype B2Input = {\n provider: \"b2\";\n /** The B2 master key's `keyId` — sealed as `username` (RFC 7617; must not contain `:`). */\n keyId: string;\n /** The B2 master key's `appKey` — sealed as `password`. */\n appKey: string;\n};\n\ntype R2Input = {\n provider: \"r2\";\n /** The Cloudflare API token — sealed as `token`. */\n apiToken: string;\n};\n\n/** Discriminated input to {@link encodeByosCredential} — one shape per CORE-mintable provider. */\nexport type ByosCredInput = SigV4Input | GcsInput | B2Input | R2Input;\n\nfunction rejectTempCred(sessionToken: string | undefined): void {\n if (typeof sessionToken === \"string\" && sessionToken.length > 0) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message:\n \"cannot seal a temporary BYOS credential (a sessionToken expires and would invalidate the credentialRef once sealed); supply a long-lived access key\",\n context: { field: \"sessionToken\" },\n recommendation: \"Create a bucket-scoped, long-lived IAM access key for this credential instead of a temporary/STS one.\",\n });\n }\n}\n\n/**\n * Encode a customer cloud credential to the exact versioned JSON string the vault secret's `value`\n * must carry, per provider:\n *\n * - s3 / s3_compatible / minio: `{v:1, scheme:\"aws_sigv4\", service:\"sts\", providerRegion, accessKeyId, secretAccessKey}`\n * 🔴 `service` MUST be `\"sts\"` — the long-lived cred signs ONLY the STS mint; the CORE\n * mint fail-closes on `service !== \"sts\"`. Not caller-configurable.\n * - gcs: `{v:1, scheme:\"gcp_workload_identity\", privateKeyPem, clientId}`\n * - b2: `{v:1, scheme:\"http_basic\", username, password}` — 🔴 the B2 master's `keyId` seals as\n * `username`, `appKey` as `password` (RFC 7617 field names, not B2's native ones); throws if\n * `keyId` contains `:` (RFC 7617 forbids it in `username`).\n * - r2: `{v:1, scheme:\"bearer\", token}`\n *\n * 🔴 Rejects a temporary/session credential on the `aws_sigv4` path —\n * a `sessionToken` expires and would silently invalidate the `credentialRef` once sealed, so this\n * refuses to encode one rather than deferring to the gateway's own reveal-time rejection. The other\n * three schemes have no analogous temporary-credential field in this envelope shape.\n */\nexport function encodeByosCredential(input: ByosCredInput): string {\n switch (input.provider) {\n case \"s3\":\n case \"s3_compatible\":\n case \"minio\": {\n rejectTempCred(input.sessionToken);\n // Sealed into the envelope and later put into hostnames by the mint: refuse a malformed one before it is sealed.\n assertProviderRegion(input.providerRegion, input.provider);\n return JSON.stringify({\n v: BYOS_CRED_FORMAT_VERSION,\n scheme: \"aws_sigv4\",\n service: \"sts\",\n providerRegion: input.providerRegion,\n accessKeyId: input.accessKeyId,\n secretAccessKey: input.secretAccessKey,\n });\n }\n case \"gcs\":\n return JSON.stringify({\n v: BYOS_CRED_FORMAT_VERSION,\n scheme: \"gcp_workload_identity\",\n privateKeyPem: input.privateKeyPem,\n clientId: input.clientId,\n });\n case \"b2\": {\n if (input.keyId.includes(\":\")) {\n throw new KError({\n code: \"K9O_INVALID_FIELD_VALUE\",\n message: \"a B2 master keyId sealed as the http_basic username must not contain ':' (RFC 7617)\",\n context: { field: \"keyId\" },\n recommendation: null,\n });\n }\n return JSON.stringify({\n v: BYOS_CRED_FORMAT_VERSION,\n scheme: \"http_basic\",\n username: input.keyId,\n password: input.appKey,\n });\n }\n case \"r2\":\n return JSON.stringify({\n v: BYOS_CRED_FORMAT_VERSION,\n scheme: \"bearer\",\n token: input.apiToken,\n });\n }\n}\n\n/** Form the `kibo://byos-creds/<secId>` reference from a vault secret id — the inverse of the\n * gateway's `byosCredentialSecId`. */\nexport function byosCredentialRef(secId: string): string {\n return `${BYOS_CRED_REF_PREFIX}${secId}`;\n}\n"],"mappings":"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","names":["requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug","requireProjectSlug"]}
|