@myna-sh/cli 0.3.0 → 0.4.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/README.md +1 -1
- package/dist/main.js +32 -3
- package/dist/main.js.map +1 -1
- package/package.json +3 -3
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main.ts","../../sdk/src/errors.ts","../../sdk/src/http.ts","../../sdk/src/management.ts","../../sdk/src/codegen.ts","../src/auth-check.ts","../src/config.ts","../src/output.ts","../src/client.ts","../src/runtime.ts","../src/util.ts","../src/commands/auth.ts","../src/commands/workspace.ts","../src/commands/schema.ts","../src/schema-loader.ts","../../schema/src/canonical.ts","../src/dsl-emit.ts","../src/content-files.ts","../src/commands/entries.ts","../src/commands/changes.ts","../src/commands/previews.ts","../src/commands/assets.ts","../../shared/src/ids.ts","../../shared/src/dates.ts","../../shared/src/origins.ts","../../shared/src/plans.ts","../../shared/src/rank.ts","../../shared/src/release.ts","../src/commands/admin.ts","../src/commands/doctor.ts","../src/version.ts","../src/commands/sync.ts"],"sourcesContent":["import { Command, CommanderError } from \"commander\";\nimport { registerAuth } from \"./commands/auth.js\";\nimport { registerWorkspace } from \"./commands/workspace.js\";\nimport { registerSchema } from \"./commands/schema.js\";\nimport { registerEntries } from \"./commands/entries.js\";\nimport { registerChanges } from \"./commands/changes.js\";\nimport { registerPreviews } from \"./commands/previews.js\";\nimport { registerAssets } from \"./commands/assets.js\";\nimport { registerAdmin } from \"./commands/admin.js\";\nimport { registerDoctor } from \"./commands/doctor.js\";\nimport { registerSync } from \"./commands/sync.js\";\nimport { VERSION } from \"./version.js\";\n\nexport { VERSION };\n\nconst GLOBAL_VALUE_FLAGS = new Set([\"--project\", \"--organization\", \"--token\", \"--api-url\"]);\nconst GLOBAL_BOOL_FLAGS = new Set([\"--json\", \"--no-interactive\", \"--interactive\"]);\n\n/**\n * Hoist global flags (which may appear anywhere) to the front so Commander,\n * which only recognizes them on the root program, always parses them.\n */\nfunction normalizeGlobals(argv: string[]): string[] {\n const [node, script, ...rest] = argv;\n const globals: string[] = [];\n const remaining: string[] = [];\n for (let i = 0; i < rest.length; i++) {\n const arg = rest[i]!;\n const eq = arg.indexOf(\"=\");\n const name = eq === -1 ? arg : arg.slice(0, eq);\n if (GLOBAL_BOOL_FLAGS.has(name)) {\n globals.push(arg);\n } else if (GLOBAL_VALUE_FLAGS.has(name)) {\n if (eq === -1) {\n globals.push(arg);\n if (i + 1 < rest.length) globals.push(rest[++i]!);\n } else {\n globals.push(arg);\n }\n } else {\n remaining.push(arg);\n }\n }\n return [node!, script!, ...globals, ...remaining];\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n program\n .name(\"myna\")\n .description(\"Myna — content infrastructure for developers and agents\")\n .version(VERSION, \"-v, --version\")\n .option(\"--json\", \"emit a single machine-readable JSON value on stdout\")\n .option(\"--project <ref>\", \"project id or slug\")\n .option(\"--organization <ref>\", \"organization id or slug\")\n .option(\"--token <token>\", \"API token (overrides stored credentials)\")\n .option(\"--api-url <url>\", \"API base URL\")\n .option(\"--no-interactive\", \"disable prompts and browser opening\")\n .showHelpAfterError();\n\n registerAuth(program);\n registerDoctor(program);\n registerWorkspace(program);\n registerSchema(program);\n registerEntries(program);\n registerSync(program);\n registerChanges(program);\n registerPreviews(program);\n registerAssets(program);\n registerAdmin(program);\n\n return program;\n}\n\nexport async function main(argv: string[] = process.argv): Promise<void> {\n const program = buildProgram();\n program.exitOverride();\n try {\n await program.parseAsync(normalizeGlobals(argv));\n } catch (error) {\n if (error instanceof CommanderError) {\n if (\n error.code === \"commander.helpDisplayed\" ||\n error.code === \"commander.version\" ||\n error.code === \"commander.help\"\n ) {\n process.exitCode = 0;\n return;\n }\n process.exitCode = 2;\n return;\n }\n process.stderr.write(`error: ${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n }\n}\n","import type { FieldErrorContract, ProblemDetailsContract } from \"../../api-contracts/src/common.js\";\n\n/**\n * Error thrown by both SDK clients when the API returns a non-2xx response.\n * Carries the parsed RFC 9457 problem-details document so callers can branch on\n * the stable `code`, inspect field-level `fields`, and surface the `requestId`.\n */\nexport class MynaApiError extends Error {\n /** HTTP status code. */\n readonly status: number;\n /** Stable machine-readable error code (e.g. `VALIDATION_FAILED`). */\n readonly code: string;\n /** RFC 9457 `type` URI. */\n readonly type: string | undefined;\n /** Human-facing title. */\n readonly title: string;\n /** Longer human-facing detail, when provided. */\n readonly detail: string | undefined;\n /** Server request id for support/correlation. */\n readonly requestId: string | undefined;\n /** Field-level validation errors, when present. */\n readonly fields: FieldErrorContract[] | undefined;\n /** The full parsed problem document (or a synthesized one). */\n readonly problem: ProblemDetailsContract;\n\n constructor(problem: ProblemDetailsContract) {\n super(problem.detail ?? problem.title ?? `Request failed (${problem.status})`);\n this.name = \"MynaApiError\";\n this.status = problem.status;\n this.code = problem.code;\n this.type = problem.type;\n this.title = problem.title;\n this.detail = problem.detail;\n this.requestId = problem.requestId;\n this.fields = problem.fields;\n this.problem = problem;\n Object.setPrototypeOf(this, MynaApiError.prototype);\n }\n\n static is(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n }\n}\n\n/** Type guard for `MynaApiError`. */\nexport function isMynaApiError(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n}\n\n/** Build a `MynaApiError` from an arbitrary response body and status. */\nexport function problemFromResponse(status: number, body: unknown, fallbackTitle: string): MynaApiError {\n if (body && typeof body === \"object\" && \"code\" in body && \"status\" in body) {\n return new MynaApiError(body as ProblemDetailsContract);\n }\n const detail =\n body && typeof body === \"object\" && \"error\" in body && typeof (body as { error: unknown }).error === \"string\"\n ? (body as { error: string }).error\n : typeof body === \"string\" && body\n ? body\n : undefined;\n return new MynaApiError({\n type: \"about:blank\",\n title: fallbackTitle,\n status,\n code: status >= 500 ? \"INTERNAL\" : \"REQUEST_FAILED\",\n detail,\n } as ProblemDetailsContract);\n}\n","import { problemFromResponse } from \"./errors.js\";\n\n/** A fetch-compatible function. */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface RetryOptions {\n /**\n * Maximum number of retries (in addition to the first attempt).\n * Defaults to 3 on a server and 1 in a browser — see `defaultMaxRetries`.\n */\n maxRetries?: number;\n /** Base backoff in milliseconds (exponential). Default 200. */\n baseDelayMs?: number;\n /** Cap on any single backoff. Default 5000. */\n maxDelayMs?: number;\n /**\n * Retries for transport-level failures (`fetch` rejecting outright).\n * Defaults to 1, and to 0 in a browser.\n *\n * In a browser these are usually permanent, not transient: a blocked CORS\n * response, a disallowed origin, an extension cancelling the request. They\n * are indistinguishable from a dropped connection — `fetch` rejects with an\n * opaque `TypeError` either way — so retrying converts one clear failure into\n * an identical wall of them, which is what buries the real cause.\n */\n maxNetworkRetries?: number;\n}\n\n/** Browsers get conservative retry defaults; servers keep the aggressive ones. */\nfunction inBrowser(): boolean {\n return typeof globalThis === \"object\" && \"document\" in globalThis;\n}\n\nfunction defaultMaxRetries(): number {\n return inBrowser() ? 1 : 3;\n}\n\nfunction defaultMaxNetworkRetries(): number {\n return inBrowser() ? 0 : 1;\n}\n\nexport interface HttpClientOptions {\n /** Base URL including the version prefix, e.g. `https://api.myna.sh/v1`. */\n baseUrl: string;\n /** Bearer credential (API key, preview token, or CLI token). */\n token?: string | undefined;\n /** Custom fetch implementation (browser/undici/node). */\n fetch?: FetchLike | undefined;\n /** Extra default headers merged into every request. */\n headers?: Record<string, string> | undefined;\n /** Retry policy. Retries apply to safe reads and idempotent mutations only. */\n retry?: RetryOptions | undefined;\n}\n\nexport interface RequestOptions {\n query?: Record<string, unknown> | undefined;\n body?: unknown;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n /** Sending an idempotency key makes a mutation eligible for automatic retry. */\n idempotencyKey?: string | undefined;\n /** Override the bearer token for a single request (e.g. a preview token). */\n token?: string | undefined;\n}\n\nconst RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);\nconst SAFE_METHODS = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n\nfunction resolveFetch(custom?: FetchLike): FetchLike {\n if (custom) return custom;\n if (typeof globalThis.fetch === \"function\") return globalThis.fetch.bind(globalThis) as FetchLike;\n throw new Error(\"No fetch implementation available. Pass `fetch` to the Myna client.\");\n}\n\n/** Serialize a query object, supporting nested `filter[field][op]` shapes. */\nexport function buildQuery(query: Record<string, unknown> | undefined): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n const append = (key: string, value: unknown): void => {\n if (value === undefined || value === null) return;\n if (Array.isArray(value)) {\n params.set(key, value.join(\",\"));\n return;\n }\n if (typeof value === \"object\") {\n for (const [op, v] of Object.entries(value as Record<string, unknown>)) {\n append(`${key}[${op}]`, v);\n }\n return;\n }\n params.set(key, String(value));\n };\n for (const [key, value] of Object.entries(query)) append(key, value);\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason ?? new Error(\"Aborted\"));\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason ?? new Error(\"Aborted\"));\n },\n { once: true },\n );\n });\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly token: string | undefined;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly retry: Required<RetryOptions>;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.token = options.token;\n this.fetchImpl = resolveFetch(options.fetch);\n this.defaultHeaders = options.headers ?? {};\n this.retry = {\n maxRetries: options.retry?.maxRetries ?? defaultMaxRetries(),\n baseDelayMs: options.retry?.baseDelayMs ?? 200,\n maxDelayMs: options.retry?.maxDelayMs ?? 5000,\n maxNetworkRetries: options.retry?.maxNetworkRetries ?? defaultMaxNetworkRetries(),\n };\n }\n\n /**\n * Share one in-flight request between identical concurrent safe reads.\n *\n * Several components asking for the same collection on first paint is the\n * normal shape of a page, not a mistake, and issuing N identical requests\n * multiplies both latency and any failure. Only GET/HEAD are pooled, and only\n * while in flight — this is request coalescing, not a cache.\n */\n private readonly inFlight = new Map<string, Promise<Response>>();\n\n private dedupe(key: string, run: () => Promise<Response>): Promise<Response> {\n const existing = this.inFlight.get(key);\n // Each caller needs its own Response: a body can only be read once.\n if (existing) return existing.then((response) => response.clone());\n const started = run();\n this.inFlight.set(key, started);\n const cleanup = (): void => {\n if (this.inFlight.get(key) === started) this.inFlight.delete(key);\n };\n started.then(cleanup, cleanup);\n return started.then((response) => response.clone());\n }\n\n /** Perform a request and unwrap the `{ data }` envelope. */\n async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n if (raw.status === 204 || raw.status === 304) return undefined as T;\n const parsed = (await raw.json().catch(() => undefined)) as { data?: T } | undefined;\n return (parsed && \"data\" in parsed ? parsed.data : (parsed as unknown)) as T;\n }\n\n /** Perform a request and return the full parsed body (envelope included). */\n async requestEnvelope<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n return (await raw.json().catch(() => ({}))) as T;\n }\n\n /** Low-level request with retries; throws `MynaApiError` on non-2xx. */\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const url = `${this.baseUrl}${path}${buildQuery(options.query)}`;\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...this.defaultHeaders,\n ...options.headers,\n };\n const token = options.token ?? this.token;\n if (token) headers.authorization = `Bearer ${token}`;\n\n let payload: BodyInit | undefined;\n if (options.body !== undefined) {\n if (options.body instanceof Uint8Array || typeof options.body === \"string\") {\n payload = options.body as BodyInit;\n } else {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(options.body);\n }\n }\n if (options.idempotencyKey) headers[\"idempotency-key\"] = options.idempotencyKey;\n\n const upper = method.toUpperCase();\n const safe = SAFE_METHODS.has(upper);\n const idempotent = safe || Boolean(options.idempotencyKey);\n const init: RequestInit = { method, headers };\n if (payload !== undefined) init.body = payload;\n if (options.signal) init.signal = options.signal;\n\n // Coalesce identical concurrent safe reads. Requests carrying a signal opt\n // out: one caller aborting must not cancel another's request.\n if (safe && !options.signal && (upper === \"GET\" || upper === \"HEAD\")) {\n const key = `${upper} ${url} ${token ?? \"\"}`;\n return this.dedupe(key, () => this.attempt(url, init, idempotent, options));\n }\n return this.attempt(url, init, idempotent, options);\n }\n\n private async attempt(\n url: string,\n init: RequestInit,\n idempotent: boolean,\n options: RequestOptions,\n ): Promise<Response> {\n let attempt = 0;\n let networkAttempt = 0;\n for (;;) {\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (error) {\n // A rejected fetch is a transport failure, budgeted separately from\n // HTTP-level retries: in a browser it is usually permanent (CORS, a\n // blocked request), and repeating it only multiplies the noise.\n if (\n idempotent &&\n networkAttempt < this.retry.maxNetworkRetries &&\n attempt < this.retry.maxRetries &&\n !isAbort(error)\n ) {\n await sleep(this.backoff(attempt), options.signal);\n attempt++;\n networkAttempt++;\n continue;\n }\n throw error;\n }\n\n if (response.ok) return response;\n\n if (idempotent && RETRYABLE_STATUS.has(response.status) && attempt < this.retry.maxRetries) {\n const retryAfter = retryAfterMs(response);\n await sleep(retryAfter ?? this.backoff(attempt), options.signal);\n attempt++;\n continue;\n }\n\n const body = await response.json().catch(() => undefined);\n throw problemFromResponse(response.status, body, response.statusText || \"Request failed\");\n }\n }\n\n private backoff(attempt: number): number {\n const base = Math.min(this.retry.baseDelayMs * 2 ** attempt, this.retry.maxDelayMs);\n return Math.round(base * (0.5 + Math.random() * 0.5));\n }\n}\n\nfunction retryAfterMs(response: Response): number | undefined {\n const header = response.headers.get(\"retry-after\");\n if (!header) return undefined;\n const seconds = Number(header);\n return Number.isFinite(seconds) ? seconds * 1000 : undefined;\n}\n\nfunction isAbort(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n );\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type {\n AcceptInvitationResponse,\n ApiKeyContract,\n CreateApiKeyRequest,\n CreateApiKeyResponse,\n CreateInvitationRequest,\n CreateOrganizationRequest,\n InvitationContract,\n MemberContract,\n OrganizationContract,\n UpdateMemberRequest,\n UpdateOrganizationRequest,\n} from \"../../api-contracts/src/organizations.js\";\nimport type { ActivityEventContract } from \"../../api-contracts/src/activity.js\";\nimport type {\n AssetContract,\n CompleteUploadResponse,\n CreateUploadRequest,\n CreateUploadResponse,\n ReplaceAssetRequest,\n UpdateAssetRequest,\n} from \"../../api-contracts/src/assets.js\";\nimport type {\n BillingResponse,\n CheckoutRequest,\n CheckoutResponse,\n PortalResponse,\n} from \"../../api-contracts/src/billing.js\";\nimport type {\n ChangeSetCheckContract,\n ChangeSetCommentContract,\n ChangeSetContract,\n ChangeSetReviewContract,\n CreateChangeSetCommentRequest,\n CreateChangeSetRequest,\n RequestReviewRequest,\n ReviewDecisionRequest,\n RunChecksResponse,\n UpdateChangeSetRequest,\n} from \"../../api-contracts/src/change-sets.js\";\nimport type {\n CollectionContract,\n CollectionVersionContract,\n SchemaDiffResponse,\n SchemaDriftResponse,\n SchemaPushResponse,\n} from \"../../api-contracts/src/collections.js\";\nimport type {\n BulkEntriesRequest,\n BulkEntriesResponse,\n EntryContract,\n EntryReferencesResponse,\n ImportEntriesRequest,\n ImportEntriesResponse,\n ReorderEntriesRequest,\n ReorderEntriesResponse,\n RestoreRevisionResponse,\n RevisionContract,\n} from \"../../api-contracts/src/entries.js\";\nimport type { CreatePreviewRequest, PreviewContract } from \"../../api-contracts/src/previews.js\";\nimport type {\n CorsCheckResponse,\n CreateProjectRequest,\n CreateSavedViewRequest,\n ProjectContract,\n ProjectExportResponse,\n SavedViewContract,\n UpdateProjectRequest,\n} from \"../../api-contracts/src/projects.js\";\nimport type { UsageResponse } from \"../../api-contracts/src/usage.js\";\nimport type {\n CreateWebhookRequest,\n CreateWebhookResponse,\n UpdateWebhookRequest,\n WebhookDeliveryContract,\n WebhookEndpointContract,\n} from \"../../api-contracts/src/webhooks.js\";\nimport { HttpClient, type FetchLike, type RetryOptions } from \"./http.js\";\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface ManagementClientOptions {\n /** Management/CLI credential (`myna_sk_...`). */\n token: string;\n /** API origin. Defaults to `https://api.myna.sh`. */\n apiUrl?: string;\n fetch?: FetchLike;\n retry?: RetryOptions;\n /**\n * Idempotency-key factory for mutations. Defaults to a random UUID per call.\n * Pass a stable value to make a specific mutation replay-safe.\n */\n idempotencyKey?: () => string;\n}\n\nexport interface ListOptions {\n limit?: number;\n cursor?: string;\n signal?: AbortSignal;\n}\n\nexport interface Page<T> {\n data: T[];\n nextCursor: string | null;\n}\n\nexport interface UploadAssetMeta {\n filename?: string;\n contentType?: string;\n /** Override the automatically detected byte length. */\n byteSize?: number;\n}\n\n/** Bytes or a filesystem path accepted by `uploadAsset`. */\nexport type AssetInput = string | Uint8Array | ArrayBuffer;\n\n/**\n * Server-only management client (SPEC 12). Typed wrappers over the full\n * management API surface. Mutations automatically carry an `Idempotency-Key`.\n */\nexport class ManagementClient {\n private readonly http: HttpClient;\n private readonly newIdempotencyKey: () => string;\n private readonly fetchImpl: FetchLike;\n\n constructor(options: ManagementClientOptions) {\n if (!options.token) throw new Error(\"createManagementClient: `token` is required.\");\n this.newIdempotencyKey = options.idempotencyKey ?? (() => randomUUID());\n this.fetchImpl = options.fetch ?? ((input, init) => fetch(input, init));\n this.http = new HttpClient({\n baseUrl: `${(options.apiUrl ?? DEFAULT_API_URL).replace(/\\/+$/, \"\")}/v1`,\n token: options.token,\n fetch: options.fetch,\n retry: options.retry,\n });\n }\n\n // Convenience: idempotency key for a mutation.\n private idem(): string {\n return this.newIdempotencyKey();\n }\n\n private get<T>(path: string, query?: Record<string, unknown>, signal?: AbortSignal): Promise<T> {\n return this.http.request<T>(\"GET\", path, { query, signal });\n }\n\n /**\n * Paged GET. Extra filters are merged into the query rather than appended to\n * the path: the client builds its own query string from `options.query`, so a\n * path that already carries one produces `?a=1?limit=25` — a second `?` that\n * silently becomes part of the previous value.\n */\n private async page<T>(\n path: string,\n opts: ListOptions = {},\n filters: Record<string, unknown> = {},\n ): Promise<Page<T>> {\n const body = await this.http.requestEnvelope<{ data: T[]; pagination: { nextCursor: string | null } }>(\n \"GET\",\n path,\n { query: { ...filters, limit: opts.limit, cursor: opts.cursor }, signal: opts.signal },\n );\n return { data: body.data, nextCursor: body.pagination?.nextCursor ?? null };\n }\n\n private mutate<T>(method: string, path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.http.request<T>(method, path, { body, query, idempotencyKey: this.idem() });\n }\n\n // --- Organizations --------------------------------------------------------\n readonly organizations = {\n list: (signal?: AbortSignal): Promise<OrganizationContract[]> =>\n this.get<OrganizationContract[]>(\"/organizations\", undefined, signal),\n create: (body: CreateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"POST\", \"/organizations\", body),\n get: (organization: string, signal?: AbortSignal): Promise<OrganizationContract> =>\n this.get<OrganizationContract>(`/organizations/${enc(organization)}`, undefined, signal),\n update: (organization: string, body: UpdateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"PATCH\", `/organizations/${enc(organization)}`, body),\n delete: (organization: string): Promise<{ ok: boolean; recoverableForDays: number }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}`),\n export: (organization: string): Promise<{ jobId: string; storageKey: string; downloadUrl: string; ready: boolean }> =>\n this.mutate(\"POST\", `/organizations/${enc(organization)}/export`),\n usage: (organization: string, signal?: AbortSignal): Promise<UsageResponse> =>\n this.get<UsageResponse>(`/organizations/${enc(organization)}/usage`, undefined, signal),\n };\n\n // --- Members & invitations ------------------------------------------------\n readonly members = {\n list: (organization: string, signal?: AbortSignal): Promise<MemberContract[]> =>\n this.get<MemberContract[]>(`/organizations/${enc(organization)}/members`, undefined, signal),\n update: (organization: string, user: string, body: UpdateMemberRequest): Promise<{ ok: boolean }> =>\n this.mutate(\"PATCH\", `/organizations/${enc(organization)}/members/${enc(user)}`, body),\n remove: (organization: string, user: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/members/${enc(user)}`),\n };\n\n readonly invitations = {\n list: (organization: string, signal?: AbortSignal): Promise<InvitationContract[]> =>\n this.get<InvitationContract[]>(`/organizations/${enc(organization)}/invitations`, undefined, signal),\n create: (organization: string, body: CreateInvitationRequest): Promise<InvitationContract> =>\n this.mutate<InvitationContract>(\"POST\", `/organizations/${enc(organization)}/invitations`, body),\n revoke: (organization: string, invitation: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/invitations/${enc(invitation)}`),\n accept: (token: string): Promise<AcceptInvitationResponse> =>\n this.mutate<AcceptInvitationResponse>(\"POST\", `/invitations/${enc(token)}/accept`),\n };\n\n // --- Projects -------------------------------------------------------------\n readonly projects = {\n list: (organization: string, signal?: AbortSignal): Promise<ProjectContract[]> =>\n this.get<ProjectContract[]>(`/organizations/${enc(organization)}/projects`, undefined, signal),\n create: (organization: string, body: CreateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/organizations/${enc(organization)}/projects`, body),\n get: (project: string, signal?: AbortSignal): Promise<ProjectContract> =>\n this.get<ProjectContract>(`/projects/${enc(project)}`, undefined, signal),\n update: (project: string, body: UpdateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"PATCH\", `/projects/${enc(project)}`, body),\n archive: (project: string): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/projects/${enc(project)}/archive`),\n /** Full project export: schemas, entries (draft + published), asset metadata. */\n export: (project: string, signal?: AbortSignal): Promise<ProjectExportResponse> =>\n this.get<ProjectExportResponse>(`/projects/${enc(project)}/export`, undefined, signal),\n /** Why a browser at `origin` can or cannot read this project's content. */\n corsCheck: (\n project: string,\n origin: string,\n collection?: string,\n signal?: AbortSignal,\n ): Promise<CorsCheckResponse> =>\n this.get<CorsCheckResponse>(\n `/projects/${enc(project)}/cors-check`,\n collection ? { origin, collection } : { origin },\n signal,\n ),\n views: (project: string, signal?: AbortSignal): Promise<SavedViewContract[]> =>\n this.get<SavedViewContract[]>(`/projects/${enc(project)}/views`, undefined, signal),\n createView: (project: string, body: CreateSavedViewRequest): Promise<SavedViewContract> =>\n this.mutate<SavedViewContract>(\"POST\", `/projects/${enc(project)}/views`, body),\n deleteView: (project: string, view: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/views/${enc(view)}`),\n };\n\n // --- Schema ---------------------------------------------------------------\n readonly schema = {\n collections: (project: string, signal?: AbortSignal): Promise<CollectionContract[]> =>\n this.get<CollectionContract[]>(`/projects/${enc(project)}/collections`, undefined, signal),\n collection: (project: string, key: string, signal?: AbortSignal): Promise<CollectionContract> =>\n this.get<CollectionContract>(`/projects/${enc(project)}/collections/${enc(key)}`, undefined, signal),\n versions: (project: string, key: string, signal?: AbortSignal): Promise<CollectionVersionContract[]> =>\n this.get<CollectionVersionContract[]>(`/projects/${enc(project)}/collections/${enc(key)}/versions`, undefined, signal),\n diff: (project: string, collections: Record<string, unknown>[]): Promise<SchemaDiffResponse> =>\n this.mutate<SchemaDiffResponse>(\"POST\", `/projects/${enc(project)}/schema/diff`, { collections }),\n push: (\n project: string,\n collections: Record<string, unknown>[],\n opts: { allowDestructive?: boolean; changeSummary?: string } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/push`, {\n collections,\n allowDestructive: opts.allowDestructive ?? false,\n changeSummary: opts.changeSummary,\n }),\n // Environments as projects\n drift: (project: string, against: string, signal?: AbortSignal): Promise<SchemaDriftResponse> =>\n this.get<SchemaDriftResponse>(`/projects/${enc(project)}/schema/drift`, { against }, signal),\n promote: (\n project: string,\n fromProject: string,\n opts: { allowDestructive?: boolean } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/promote`, {\n fromProject,\n allowDestructive: opts.allowDestructive ?? false,\n confirm: true,\n }),\n };\n\n // --- Entries & revisions --------------------------------------------------\n readonly entries = {\n list: (\n project: string,\n opts: ListOptions & { collection?: string; status?: string } = {},\n ): Promise<Page<EntryContract>> =>\n this.page<EntryContract>(`/projects/${enc(project)}/entries`, opts, {\n collection: opts.collection,\n status: opts.status,\n }),\n create: (\n project: string,\n body: { collection: string; slug?: string; data: Record<string, unknown>; changeSetId?: string; changeSummary?: string },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries`, body),\n get: (project: string, entry: string, signal?: AbortSignal): Promise<EntryContract> =>\n this.get<EntryContract>(`/projects/${enc(project)}/entries/${enc(entry)}`, undefined, signal),\n update: (\n project: string,\n entry: string,\n body: {\n data?: Record<string, unknown>;\n slug?: string;\n expectedRevisionId?: string;\n changeSetId?: string;\n changeSummary?: string;\n },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"PATCH\", `/projects/${enc(project)}/entries/${enc(entry)}`, body),\n delete: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/entries/${enc(entry)}`, undefined, { changeSetId }),\n unpublish: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/unpublish`, undefined, { changeSetId }),\n restore: (project: string, entry: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/restore`),\n duplicate: (project: string, entry: string, changeSetId?: string): Promise<EntryContract> =>\n this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/duplicate`, {\n changeSetId,\n }),\n bulk: (project: string, body: BulkEntriesRequest): Promise<BulkEntriesResponse> =>\n this.mutate<BulkEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/bulk`, body),\n /**\n * Set a collection's editorial order. Not staged on a change set — ranks\n * are arrangement rather than content and take effect immediately, which\n * is why `confirm` is required.\n */\n reorder: (\n project: string,\n collection: string,\n body: Omit<ReorderEntriesRequest, \"confirm\">,\n ): Promise<ReorderEntriesResponse> =>\n this.mutate<ReorderEntriesResponse>(\n \"POST\",\n `/projects/${enc(project)}/collections/${enc(collection)}/reorder`,\n { ...body, confirm: true },\n ),\n import: (project: string, body: ImportEntriesRequest): Promise<ImportEntriesResponse> =>\n this.mutate<ImportEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/import`, body),\n references: (project: string, entry: string, signal?: AbortSignal): Promise<EntryReferencesResponse> =>\n this.get<EntryReferencesResponse>(`/projects/${enc(project)}/entries/${enc(entry)}/references`, undefined, signal),\n revisions: (project: string, entry: string, signal?: AbortSignal): Promise<RevisionContract[]> =>\n this.get<RevisionContract[]>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions`, undefined, signal),\n revision: (project: string, entry: string, revision: string, signal?: AbortSignal): Promise<RevisionContract> =>\n this.get<RevisionContract>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}`, undefined, signal),\n restoreRevision: (project: string, entry: string, revision: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\n \"POST\",\n `/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}/restore`,\n ),\n };\n\n // --- Change sets ----------------------------------------------------------\n readonly changeSets = {\n list: (project: string, opts: ListOptions & { status?: string } = {}): Promise<Page<ChangeSetContract>> =>\n this.page<ChangeSetContract>(`/projects/${enc(project)}/change-sets`, opts, { status: opts.status }),\n create: (project: string, body: CreateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets`, body),\n get: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetContract> =>\n this.get<ChangeSetContract>(`/projects/${enc(project)}/change-sets/${enc(changeSet)}`, undefined, signal),\n update: (project: string, changeSet: string, body: UpdateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"PATCH\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}`, body),\n validate: (project: string, changeSet: string): Promise<{ valid: boolean; errors: ValidationIssue[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/validate`),\n publish: (\n project: string,\n changeSet: string,\n ): Promise<{ changeSet: ChangeSetContract; publishedEntryIds: string[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/publish`, { confirm: true }),\n close: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/close`),\n // Scheduled publishing\n schedule: (project: string, changeSet: string, publishAt: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`, {\n publishAt,\n }),\n cancelSchedule: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"DELETE\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`),\n // Reviews & approvals\n reviews: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetReviewContract[]> =>\n this.get<ChangeSetReviewContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`,\n undefined,\n signal,\n ),\n requestReview: (project: string, changeSet: string, body: RequestReviewRequest): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`, body),\n removeReviewer: (project: string, changeSet: string, reviewer: string): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"DELETE\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews/${enc(reviewer)}`,\n ),\n approve: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/approve`, body),\n requestChanges: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/request-changes`,\n body,\n ),\n // Comments\n comments: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCommentContract[]> =>\n this.get<ChangeSetCommentContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`,\n undefined,\n signal,\n ),\n comment: (project: string, changeSet: string, body: CreateChangeSetCommentRequest): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`, body),\n resolveComment: (project: string, changeSet: string, comment: string, resolved = true): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\n \"PATCH\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments/${enc(comment)}`,\n { resolved },\n ),\n // Automated checks\n checks: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCheckContract[]> =>\n this.get<ChangeSetCheckContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks`,\n undefined,\n signal,\n ),\n runChecks: (project: string, changeSet: string): Promise<RunChecksResponse> =>\n this.mutate<RunChecksResponse>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/run`),\n };\n\n // --- Previews -------------------------------------------------------------\n readonly previews = {\n create: (project: string, body: CreatePreviewRequest): Promise<PreviewContract> =>\n this.mutate<PreviewContract>(\"POST\", `/projects/${enc(project)}/previews`, body),\n list: (project: string, signal?: AbortSignal): Promise<PreviewContract[]> =>\n this.get<PreviewContract[]>(`/projects/${enc(project)}/previews`, undefined, signal),\n revoke: (project: string, preview: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/previews/${enc(preview)}`),\n };\n\n // --- Assets ---------------------------------------------------------------\n readonly assets = {\n createUpload: (project: string, body: CreateUploadRequest): Promise<CreateUploadResponse> =>\n this.mutate<CreateUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads`, body),\n completeUpload: (project: string, upload: string): Promise<AssetContract> =>\n this.mutate<CompleteUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads/${enc(upload)}/complete`).then(\n (r) => r.asset,\n ),\n list: (project: string, opts: ListOptions = {}): Promise<Page<AssetContract>> =>\n this.page<AssetContract>(`/projects/${enc(project)}/assets`, opts),\n get: (project: string, asset: string, signal?: AbortSignal): Promise<AssetContract> =>\n this.get<AssetContract>(`/projects/${enc(project)}/assets/${enc(asset)}`, undefined, signal),\n usage: (project: string, asset: string, signal?: AbortSignal): Promise<{ asset: AssetContract; usage: { entryIds: string[] } }> =>\n this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, { usage: \"true\" }, signal),\n update: (project: string, asset: string, body: UpdateAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"PATCH\", `/projects/${enc(project)}/assets/${enc(asset)}`, body),\n replace: (project: string, asset: string, body: ReplaceAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"POST\", `/projects/${enc(project)}/assets/${enc(asset)}/replace`, body),\n delete: (project: string, asset: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/assets/${enc(asset)}`),\n /** Full presigned upload flow: create → PUT bytes → complete. */\n upload: (project: string, input: AssetInput, meta: UploadAssetMeta = {}): Promise<AssetContract> =>\n this.uploadAsset(project, input, meta),\n };\n\n // --- API keys -------------------------------------------------------------\n readonly apiKeys = {\n listForOrganization: (organization: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/organizations/${enc(organization)}/api-keys`, undefined, signal),\n createForOrganization: (organization: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/organizations/${enc(organization)}/api-keys`, body),\n revokeForOrganization: (organization: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/api-keys/${enc(key)}`),\n listForProject: (project: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/projects/${enc(project)}/api-keys`, undefined, signal),\n createForProject: (project: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/projects/${enc(project)}/api-keys`, body),\n revokeForProject: (project: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/api-keys/${enc(key)}`),\n };\n\n // --- Webhooks -------------------------------------------------------------\n readonly webhooks = {\n list: (project: string, signal?: AbortSignal): Promise<WebhookEndpointContract[]> =>\n this.get<WebhookEndpointContract[]>(`/projects/${enc(project)}/webhooks`, undefined, signal),\n create: (project: string, body: CreateWebhookRequest): Promise<CreateWebhookResponse> =>\n this.mutate<CreateWebhookResponse>(\"POST\", `/projects/${enc(project)}/webhooks`, body),\n update: (project: string, webhook: string, body: UpdateWebhookRequest): Promise<WebhookEndpointContract> =>\n this.mutate<WebhookEndpointContract>(\"PATCH\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`, body),\n delete: (project: string, webhook: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`),\n deliveries: (project: string, webhook: string, signal?: AbortSignal): Promise<WebhookDeliveryContract[]> =>\n this.get<WebhookDeliveryContract[]>(`/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries`, undefined, signal),\n retry: (project: string, webhook: string, delivery: string): Promise<{ ok: boolean }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries/${enc(delivery)}/retry`),\n };\n\n // --- Activity -------------------------------------------------------------\n activity(\n project: string,\n opts: ListOptions & { actorType?: string; action?: string; targetType?: string; from?: string; to?: string } = {},\n ): Promise<Page<ActivityEventContract>> {\n return this.page<ActivityEventContract>(`/projects/${enc(project)}/activity`, opts, {\n actorType: opts.actorType,\n action: opts.action,\n targetType: opts.targetType,\n from: opts.from,\n to: opts.to,\n });\n }\n\n // --- Billing --------------------------------------------------------------\n readonly billing = {\n status: (organization: string, signal?: AbortSignal): Promise<BillingResponse> =>\n this.get<BillingResponse>(`/organizations/${enc(organization)}/billing`, undefined, signal),\n checkout: (organization: string, body: CheckoutRequest): Promise<CheckoutResponse> =>\n this.mutate<CheckoutResponse>(\"POST\", `/organizations/${enc(organization)}/billing/checkout`, body),\n portal: (organization: string): Promise<PortalResponse> =>\n this.mutate<PortalResponse>(\"POST\", `/organizations/${enc(organization)}/billing/portal`),\n };\n\n // --- Upload helper --------------------------------------------------------\n private async uploadAsset(project: string, input: AssetInput, meta: UploadAssetMeta): Promise<AssetContract> {\n const { bytes, filename } = await readInput(input, meta.filename);\n const contentType = meta.contentType ?? guessContentType(filename);\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n\n const upload = await this.assets.createUpload(project, {\n filename,\n contentType,\n byteSize: meta.byteSize ?? bytes.byteLength,\n checksum,\n });\n\n // The presigned URL is absolute (storage host) and must bypass the API base.\n const put = await this.fetchImpl(upload.url, {\n method: upload.method,\n headers: upload.headers,\n body: bytes as unknown as BodyInit,\n });\n if (!put.ok) {\n throw new Error(`Asset upload PUT failed with status ${put.status}.`);\n }\n\n return this.assets.completeUpload(project, upload.uploadId);\n }\n}\n\ninterface ValidationIssue {\n resourceType: string;\n resourceId: string;\n path: string;\n message: string;\n code?: string;\n}\n\nasync function readInput(input: AssetInput, filenameOverride?: string): Promise<{ bytes: Uint8Array; filename: string }> {\n if (typeof input === \"string\") {\n const bytes = await readFile(input);\n return { bytes: new Uint8Array(bytes), filename: filenameOverride ?? basename(input) };\n }\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n return { bytes, filename: filenameOverride ?? \"upload.bin\" };\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n pdf: \"application/pdf\",\n json: \"application/json\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n csv: \"text/csv\",\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n};\n\nfunction guessContentType(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"\";\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n\n/** Create a management client. */\nexport function createManagementClient(options: ManagementClientOptions): ManagementClient {\n return new ManagementClient(options);\n}\n\nexport { generateTypes, generateTypesModule } from \"./codegen.js\";\nexport { MynaApiError, isMynaApiError } from \"./errors.js\";\nexport type { FetchLike, RetryOptions } from \"./http.js\";\n","import type {\n CollectionSchema,\n FieldDef,\n ListItem,\n ObjectField,\n} from \"../../schema/src/types.js\";\n\n/**\n * Deterministic TypeScript type generation from canonical collection schemas\n * (SPEC 12). Pure and stable: the same input always yields byte-identical\n * output, and no user-written files are touched. Consumed by `myna types\n * generate`.\n */\nexport function generateTypes(collections: CollectionSchema[]): string {\n const sorted = [...collections].sort((a, b) => a.name.localeCompare(b.name));\n const blocks: string[] = [];\n\n for (const collection of sorted) {\n blocks.push(renderInterface(collection));\n }\n\n const registry = sorted.map((c) => registryEntry(c)).join(\"\\n\");\n\n const header = [\n \"// Generated by `myna types generate`. Do not edit by hand.\",\n \"// This file is safe to commit and regenerate.\",\n \"\",\n ].join(\"\\n\");\n\n return `${header}${blocks.join(\"\\n\\n\")}\\n\\n${REGISTRY_DOC}\\nexport interface MynaCollections {\\n${registry}\\n}\\n`;\n}\n\nconst REGISTRY_DOC = [\n \"/**\",\n \" * Collection registry consumed by `createMyna<MynaCollections>()`.\",\n \" *\",\n \" * `fields` types the entry payload; `sortable` and `reference` carry the\",\n \" * distinctions the field types alone cannot express — a markdown body and a\",\n \" * text title are both `string`, but only one of them can be ordered on.\",\n \" */\",\n].join(\"\\n\");\n\n/**\n * Fields the query engine can order and filter by: scalars, excluding localized\n * fields, which hold one value per locale rather than a comparable value. This\n * mirrors `SCALAR_TYPES` in the API's public content service; the two must agree\n * or the types will promise a query the server rejects.\n */\nconst SORTABLE_TYPES = new Set([\"text\", \"number\", \"boolean\", \"date\", \"datetime\", \"slug\"]);\n\nfunction registryEntry(collection: CollectionSchema): string {\n const sortable = collection.fields\n .filter((f) => SORTABLE_TYPES.has(f.type) && !f.localized)\n .map((f) => JSON.stringify(f.key));\n const references = collection.fields\n .filter((f) => f.type === \"reference\")\n .map((f) => JSON.stringify(f.key));\n return [\n ` ${JSON.stringify(collection.name)}: {`,\n ` fields: ${pascal(collection.name)};`,\n ` sortable: ${sortable.length > 0 ? sortable.join(\" | \") : \"never\"};`,\n ` reference: ${references.length > 0 ? references.join(\" | \") : \"never\"};`,\n ` };`,\n ].join(\"\\n\");\n}\n\nfunction renderInterface(collection: CollectionSchema): string {\n const name = pascal(collection.name);\n const lines = collection.fields.map((f) => renderField(f, 1));\n const label = collection.label ? ` ${collection.label}` : \"\";\n return `/**${label} (${collection.kind}) */\\nexport interface ${name} {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction renderField(field: FieldDef, depth: number): string {\n const indent = \" \".repeat(depth);\n const optional = field.required ? \"\" : \"?\";\n const doc = field.description ? `${indent}/** ${escapeComment(field.description)} */\\n` : \"\";\n const base = fieldType(field, depth);\n // Localized fields store one value per project locale.\n const type = field.localized ? `{ [locale: string]: ${base} }` : base;\n return `${doc}${indent}${safeKey(field.key)}${optional}: ${type};`;\n}\n\nfunction fieldType(field: FieldDef, depth: number): string {\n switch (field.type) {\n case \"text\":\n return field.enum && field.enum.length > 0 ? field.enum.map((v) => JSON.stringify(v)).join(\" | \") : \"string\";\n case \"slug\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"asset\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"reference\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"object\":\n return renderObject(field, depth);\n case \"list\":\n return `${listItemType(field.item, depth)}[]`;\n case \"richText\":\n return \"RichTextDoc\";\n case \"blocks\": {\n // Discriminated union over the allowed block components.\n const inner = \" \".repeat(depth + 1);\n const options = field.blocks.map((b) => {\n const lines = b.fields.map((f) => renderField(f, depth + 2));\n return `{ type: ${JSON.stringify(b.key)}; fields: {\\n${lines.join(\"\\n\")}\\n${inner}} }`;\n });\n return `Array<\\n${inner}${options.join(`\\n${inner}| `)}\\n${\" \".repeat(depth)}>`;\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction renderObject(field: ObjectField, depth: number): string {\n const lines = field.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n}\n\nfunction listItemType(item: ListItem, depth: number): string {\n switch (item.kind) {\n case \"text\":\n return item.enum && item.enum.length > 0 ? `(${item.enum.map((v) => JSON.stringify(v)).join(\" | \")})` : \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"reference\":\n return \"string\";\n case \"asset\":\n return \"string\";\n case \"object\": {\n const lines = item.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n }\n default:\n return \"unknown\";\n }\n}\n\nconst JSON_VALUE = [\n \"export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\",\n \"\",\n \"/** Portable rich-text document tree (never rendered HTML). */\",\n \"export interface RichTextDoc { type: \\\"doc\\\"; content: Array<{ type: string; [key: string]: unknown }>; }\",\n].join(\"\\n\");\n\n/** Generate types plus the shared `JsonValue` helper as a standalone module. */\nexport function generateTypesModule(collections: CollectionSchema[]): string {\n return `${JSON_VALUE}\\n\\n${generateTypes(collections)}`;\n}\n\nfunction pascal(key: string): string {\n return key\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction safeKey(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction escapeComment(text: string): string {\n return text.replace(/\\*\\//g, \"*\\\\/\");\n}\n","import type { MetaResponse, WhoamiResponse } from \"@myna-sh/api-contracts\";\nimport type { TokenSource } from \"./config.js\";\n\n/**\n * Credential and server checks shared by `whoami`, `auth verify`, and `doctor`.\n *\n * The rule these enforce: **a stored credential is not an authenticated one.**\n * Reporting \"authenticated\" because a token file exists is how an agent ends up\n * confidently issuing calls that every endpoint answers with 401. Everything\n * here validates against the API and reports presence and validity as separate\n * facts.\n */\n\nexport interface CredentialStatus {\n apiUrl: string;\n /** A credential was found (flag, environment, or stored). */\n credentialPresent: boolean;\n /** The API accepted it. False whenever it was not verified successfully. */\n credentialValid: boolean;\n source: TokenSource;\n identity: WhoamiResponse | null;\n /** Why validation failed, when it did. */\n error: { code: string; detail: string } | null;\n}\n\ninterface ProblemBody {\n code?: string;\n detail?: string;\n title?: string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction timeoutSignal(ms: number): AbortSignal {\n return AbortSignal.timeout(ms);\n}\n\n/**\n * Read the server's capability descriptor. Returns undefined when the API is\n * unreachable or too old to expose `/v1/meta`, which callers report as its own\n * diagnosis rather than conflating with an auth failure.\n */\nexport async function fetchMeta(\n apiUrl: string,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n): Promise<MetaResponse | undefined> {\n try {\n const res = await fetch(`${apiUrl}/v1/meta`, {\n headers: { accept: \"application/json\" },\n signal: timeoutSignal(timeoutMs),\n });\n if (!res.ok) return undefined;\n const body = (await res.json()) as { data?: MetaResponse };\n return body.data;\n } catch {\n return undefined;\n }\n}\n\n/** Validate a credential against the API. Never throws: the failure is the answer. */\nexport async function checkCredential(\n apiUrl: string,\n token: string | undefined,\n source: TokenSource,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n): Promise<CredentialStatus> {\n const base: CredentialStatus = {\n apiUrl,\n credentialPresent: Boolean(token),\n credentialValid: false,\n source,\n identity: null,\n error: null,\n };\n\n if (!token) {\n return { ...base, error: { code: \"NO_CREDENTIAL\", detail: \"No credential found.\" } };\n }\n\n try {\n const res = await fetch(`${apiUrl}/v1/auth/whoami`, {\n headers: { authorization: `Bearer ${token}`, accept: \"application/json\" },\n signal: timeoutSignal(timeoutMs),\n });\n const body = (await res.json().catch(() => ({}))) as { data?: WhoamiResponse } & ProblemBody;\n if (!res.ok || !body.data) {\n return {\n ...base,\n error: {\n code: body.code ?? `HTTP_${res.status}`,\n detail: body.detail ?? body.title ?? `The API rejected the credential (${res.status}).`,\n },\n };\n }\n return { ...base, credentialValid: true, identity: body.data };\n } catch (error) {\n // Unreachable API is not an invalid credential. Say which one it is.\n return {\n ...base,\n error: {\n code: \"UNREACHABLE\",\n detail: `Could not reach ${apiUrl}: ${error instanceof Error ? error.message : String(error)}`,\n },\n };\n }\n}\n\n/** Human-readable one-liner for an identity. */\nexport function describeIdentity(identity: WhoamiResponse): string {\n switch (identity.credential) {\n case \"user\":\n return `user ${identity.user.username ?? identity.user.email}`;\n case \"api_key\":\n return `API key${identity.label ? ` \"${identity.label}\"` : \"\"} (${identity.scopes.length} scope(s))`;\n case \"preview\":\n return \"preview token\";\n }\n}\n\n/** Scopes carried by the credential, or undefined when scopes do not apply. */\nexport function scopesOf(identity: WhoamiResponse | null): string[] | undefined {\n return identity?.credential === \"api_key\" ? identity.scopes : undefined;\n}\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync, rmSync } from \"node:fs\";\nimport { homedir, platform } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\n/**\n * Configuration resolution and credential storage (SPEC 11).\n *\n * Resolution order for every value: explicit flag > environment variable >\n * linked project (`.myna/project.json`) > user default (`config.json`).\n * Credentials are never written to the linked project file; they live in the OS\n * keychain when possible, otherwise a `0600` config file.\n */\n\nexport const DEFAULT_API_URL = \"https://api.myna.sh\";\nconst KEYCHAIN_SERVICE = \"sh.myna.cli\";\n\nexport interface GlobalFlags {\n apiUrl?: string;\n project?: string;\n organization?: string;\n token?: string;\n json?: boolean;\n interactive?: boolean;\n}\n\nexport interface LinkedProject {\n project: string;\n organization?: string;\n apiUrl?: string;\n}\n\nexport interface UserConfig {\n apiUrl?: string;\n defaultOrganization?: string;\n defaultProject?: string;\n}\n\n/** Where the active credential came from — reported by `whoami` and `doctor`. */\nexport type TokenSource = \"flag\" | \"environment\" | \"stored\" | \"none\";\n\nexport interface ResolvedContext {\n apiUrl: string;\n token: string | undefined;\n tokenSource: TokenSource;\n project: string | undefined;\n organization: string | undefined;\n json: boolean;\n interactive: boolean;\n linked: LinkedProject | undefined;\n linkedRoot: string | undefined;\n}\n\nfunction configDir(): string {\n const base = process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\");\n return join(base, \"myna\");\n}\n\nfunction configFile(): string {\n return join(configDir(), \"config.json\");\n}\n\nfunction credentialsFile(): string {\n return join(configDir(), \"credentials.json\");\n}\n\nexport function readUserConfig(): UserConfig {\n try {\n return JSON.parse(readFileSync(configFile(), \"utf8\")) as UserConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeUserConfig(patch: Partial<UserConfig>): UserConfig {\n const current = readUserConfig();\n const next = { ...current, ...patch };\n ensureDir(configDir());\n writeFileSync(configFile(), JSON.stringify(next, null, 2) + \"\\n\");\n return next;\n}\n\nfunction ensureDir(dir: string): void {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true, mode: 0o700 });\n}\n\n// --- Linked project ---------------------------------------------------------\n\nexport function findLinkedProject(startDir = process.cwd()): { linked: LinkedProject; root: string } | undefined {\n let dir = resolve(startDir);\n for (;;) {\n const file = join(dir, \".myna\", \"project.json\");\n if (existsSync(file)) {\n try {\n const linked = JSON.parse(readFileSync(file, \"utf8\")) as LinkedProject;\n return { linked, root: dir };\n } catch {\n return undefined;\n }\n }\n const parent = dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n\nexport function writeLinkedProject(root: string, linked: LinkedProject): void {\n const dir = join(root, \".myna\");\n ensureDir(dir);\n writeFileSync(join(dir, \"project.json\"), JSON.stringify(linked, null, 2) + \"\\n\");\n}\n\nexport function removeLinkedProject(root: string): boolean {\n const file = join(root, \".myna\", \"project.json\");\n if (existsSync(file)) {\n rmSync(file);\n return true;\n }\n return false;\n}\n\n// --- Credential storage -----------------------------------------------------\n\nfunction isMac(): boolean {\n return platform() === \"darwin\";\n}\n\nfunction keychainAccount(apiUrl: string): string {\n return apiUrl.replace(/\\/+$/, \"\");\n}\n\nexport function storeToken(apiUrl: string, token: string): \"keychain\" | \"file\" {\n const account = keychainAccount(apiUrl);\n if (isMac()) {\n try {\n execFileSync(\n \"security\",\n [\"add-generic-password\", \"-U\", \"-s\", KEYCHAIN_SERVICE, \"-a\", account, \"-w\", token],\n { stdio: \"ignore\" },\n );\n return \"keychain\";\n } catch {\n // Fall through to file storage.\n }\n }\n const file = credentialsFile();\n const store = readCredentialFile();\n store[account] = token;\n ensureDir(configDir());\n writeFileSync(file, JSON.stringify(store, null, 2) + \"\\n\");\n chmodSync(file, 0o600);\n return \"file\";\n}\n\nexport function loadToken(apiUrl: string): string | undefined {\n const account = keychainAccount(apiUrl);\n if (isMac()) {\n try {\n const out = execFileSync(\n \"security\",\n [\"find-generic-password\", \"-s\", KEYCHAIN_SERVICE, \"-a\", account, \"-w\"],\n { stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n const token = out.toString(\"utf8\").trim();\n if (token) return token;\n } catch {\n // Not in keychain; try file.\n }\n }\n return readCredentialFile()[account];\n}\n\nexport function clearToken(apiUrl: string): void {\n const account = keychainAccount(apiUrl);\n if (isMac()) {\n try {\n execFileSync(\"security\", [\"delete-generic-password\", \"-s\", KEYCHAIN_SERVICE, \"-a\", account], {\n stdio: \"ignore\",\n });\n } catch {\n // Ignore.\n }\n }\n const store = readCredentialFile();\n if (account in store) {\n delete store[account];\n writeFileSync(credentialsFile(), JSON.stringify(store, null, 2) + \"\\n\");\n chmodSync(credentialsFile(), 0o600);\n }\n}\n\nfunction readCredentialFile(): Record<string, string> {\n try {\n return JSON.parse(readFileSync(credentialsFile(), \"utf8\")) as Record<string, string>;\n } catch {\n return {};\n }\n}\n\n// --- Resolution -------------------------------------------------------------\n\nexport function resolveContext(flags: GlobalFlags): ResolvedContext {\n const link = findLinkedProject();\n const user = readUserConfig();\n\n const apiUrl =\n flags.apiUrl ??\n process.env.MYNA_API_URL ??\n link?.linked.apiUrl ??\n user.apiUrl ??\n DEFAULT_API_URL;\n\n const stored = loadToken(apiUrl);\n const token = flags.token ?? process.env.MYNA_TOKEN ?? stored;\n const tokenSource: TokenSource = flags.token\n ? \"flag\"\n : process.env.MYNA_TOKEN\n ? \"environment\"\n : stored\n ? \"stored\"\n : \"none\";\n\n const project =\n flags.project ??\n process.env.MYNA_PROJECT ??\n link?.linked.project ??\n user.defaultProject;\n\n const organization =\n flags.organization ??\n process.env.MYNA_ORGANIZATION ??\n link?.linked.organization ??\n user.defaultOrganization;\n\n return {\n apiUrl: apiUrl.replace(/\\/+$/, \"\"),\n token,\n tokenSource,\n project,\n organization,\n json: Boolean(flags.json),\n interactive: flags.interactive !== false && process.stdout.isTTY === true,\n linked: link?.linked,\n linkedRoot: link?.root,\n };\n}\n","import { isMynaApiError } from \"@myna-sh/sdk/management\";\n\n/** Structured output, tables, and exit-code discipline (SPEC 11). */\n\nexport const CLI_JSON_VERSION = 1;\n\n/** Usage error → exit code 2. */\nexport class UsageError extends Error {}\n\n/** Operational error → exit code 1. */\nexport class CliError extends Error {}\n\nexport interface OutputMode {\n json: boolean;\n}\n\nlet mode: OutputMode = { json: false };\n\nexport function setOutputMode(next: OutputMode): void {\n mode = next;\n}\n\nexport function isJson(): boolean {\n return mode.json;\n}\n\n/** Diagnostics go to stderr and are suppressed in JSON mode. */\nexport function diag(message: string): void {\n if (!mode.json) process.stderr.write(message + \"\\n\");\n}\n\n/** Emit the single result value. JSON mode prints one versioned document. */\nexport function emit(value: unknown, human?: () => void): void {\n if (mode.json) {\n process.stdout.write(JSON.stringify({ version: CLI_JSON_VERSION, data: value }) + \"\\n\");\n return;\n }\n if (human) {\n human();\n } else {\n process.stdout.write(prettyValue(value) + \"\\n\");\n }\n}\n\n/** Render an error and return the process exit code. */\nexport function reportError(error: unknown): number {\n if (isMynaApiError(error)) {\n const problem = {\n code: error.code,\n status: error.status,\n title: error.title,\n detail: error.detail,\n requestId: error.requestId,\n fields: error.fields,\n };\n if (mode.json) {\n process.stdout.write(JSON.stringify({ version: CLI_JSON_VERSION, error: problem }) + \"\\n\");\n } else {\n process.stderr.write(`error: ${error.code} — ${error.detail ?? error.title}\\n`);\n for (const f of error.fields ?? []) {\n process.stderr.write(` · ${f.path}: ${f.message}\\n`);\n }\n if (error.requestId) process.stderr.write(` requestId: ${error.requestId}\\n`);\n }\n return 1;\n }\n\n const usage = error instanceof UsageError;\n const message = error instanceof Error ? error.message : String(error);\n if (mode.json) {\n process.stdout.write(\n JSON.stringify({ version: CLI_JSON_VERSION, error: { code: usage ? \"USAGE\" : \"ERROR\", detail: message } }) + \"\\n\",\n );\n } else {\n process.stderr.write(`error: ${message}\\n`);\n }\n return usage ? 2 : 1;\n}\n\n// --- Human tables -----------------------------------------------------------\n\nexport interface Column<T> {\n header: string;\n value: (row: T) => string;\n}\n\nexport function table<T>(rows: T[], columns: Column<T>[]): void {\n if (rows.length === 0) {\n process.stdout.write(\"(none)\\n\");\n return;\n }\n const headers = columns.map((c) => c.header);\n const cells = rows.map((r) => columns.map((c) => c.value(r) ?? \"\"));\n const widths = headers.map((h, i) => Math.max(h.length, ...cells.map((row) => stripLen(row[i] ?? \"\"))));\n const line = (values: string[]): string =>\n values.map((v, i) => pad(v, widths[i] ?? v.length)).join(\" \").replace(/\\s+$/, \"\");\n process.stdout.write(line(headers) + \"\\n\");\n process.stdout.write(widths.map((w) => \"─\".repeat(w)).join(\" \") + \"\\n\");\n for (const row of cells) process.stdout.write(line(row) + \"\\n\");\n}\n\nexport function keyValues(pairs: Array<[string, string]>): void {\n const width = Math.max(...pairs.map(([k]) => k.length));\n for (const [k, v] of pairs) {\n process.stdout.write(`${pad(k + \":\", width + 1)} ${v}\\n`);\n }\n}\n\nfunction pad(value: string, width: number): string {\n const len = stripLen(value);\n return len >= width ? value : value + \" \".repeat(width - len);\n}\n\nfunction stripLen(value: string): number {\n return value.length;\n}\n\nfunction prettyValue(value: unknown): string {\n if (typeof value === \"string\") return value;\n return JSON.stringify(value, null, 2);\n}\n","import { createManagementClient, type ManagementClient } from \"@myna-sh/sdk/management\";\nimport { resolveContext, type GlobalFlags, type ResolvedContext } from \"./config.js\";\nimport { CliError, UsageError } from \"./output.js\";\n\n/** Per-command context: resolved config plus lazily-built API clients. */\nexport interface Ctx extends ResolvedContext {\n management(): ManagementClient;\n requireProject(): string;\n requireOrganization(): string;\n}\n\nexport function buildContext(flags: GlobalFlags): Ctx {\n const resolved = resolveContext(flags);\n let mgmt: ManagementClient | undefined;\n\n return {\n ...resolved,\n management(): ManagementClient {\n if (!resolved.token) {\n throw new CliError(\"Not authenticated. Run `myna login` or pass --token / set MYNA_TOKEN.\");\n }\n mgmt ??= createManagementClient({ token: resolved.token, apiUrl: resolved.apiUrl });\n return mgmt;\n },\n requireProject(): string {\n if (!resolved.project) {\n throw new UsageError(\"No project selected. Pass --project, set MYNA_PROJECT, or run `myna link`.\");\n }\n return resolved.project;\n },\n requireOrganization(): string {\n if (!resolved.organization) {\n throw new UsageError(\"No organization selected. Pass --organization or set a default with `myna organizations use`.\");\n }\n return resolved.organization;\n },\n };\n}\n","import type { Command } from \"commander\";\nimport { buildContext, type Ctx } from \"./client.js\";\nimport type { GlobalFlags } from \"./config.js\";\nimport { reportError, setOutputMode } from \"./output.js\";\n\n/**\n * Wrap a command action: build the resolved context, set the output mode from\n * `--json`, run the handler, and translate thrown errors into exit codes.\n */\nexport function handle(\n fn: (ctx: Ctx, args: unknown[], opts: Record<string, unknown>) => Promise<void>,\n): (...cbArgs: unknown[]) => Promise<void> {\n return async (...cbArgs: unknown[]): Promise<void> => {\n const command = cbArgs[cbArgs.length - 1] as Command;\n const ctx = buildContext(command.optsWithGlobals() as GlobalFlags);\n setOutputMode({ json: ctx.json });\n try {\n await fn(ctx, command.processedArgs as unknown[], command.opts());\n } catch (error) {\n process.exitCode = reportError(error);\n }\n };\n}\n","import { execFile } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { platform } from \"node:os\";\nimport type { ManagementClient } from \"@myna-sh/sdk/management\";\nimport { CliError, UsageError } from \"./output.js\";\n\n/** Parse `--data <json-or-@file>` into an object. */\nexport function parseData(input: string | undefined): Record<string, unknown> {\n if (!input) return {};\n const raw = input.startsWith(\"@\") ? readFileSync(input.slice(1), \"utf8\") : input;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n throw new UsageError(`Invalid JSON for --data: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new UsageError(\"--data must be a JSON object.\");\n }\n return parsed as Record<string, unknown>;\n}\n\n/** Apply `--set path=value` assignments (dot paths, JSON-or-string values). */\nexport function applySets(target: Record<string, unknown>, sets: string[] | undefined): Record<string, unknown> {\n if (!sets) return target;\n for (const assignment of sets) {\n const eq = assignment.indexOf(\"=\");\n if (eq === -1) throw new UsageError(`Invalid --set \"${assignment}\". Expected path=value.`);\n const path = assignment.slice(0, eq);\n const rawValue = assignment.slice(eq + 1);\n let value: unknown;\n try {\n value = JSON.parse(rawValue);\n } catch {\n value = rawValue;\n }\n setPath(target, path.split(\".\"), value);\n }\n return target;\n}\n\nfunction setPath(obj: Record<string, unknown>, parts: string[], value: unknown): void {\n let cursor: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i]!;\n if (typeof cursor[key] !== \"object\" || cursor[key] === null) cursor[key] = {};\n cursor = cursor[key] as Record<string, unknown>;\n }\n cursor[parts[parts.length - 1]!] = value;\n}\n\n/** Open a URL in the default browser (best effort; never throws). */\nexport function openBrowser(url: string): void {\n const cmd = platform() === \"darwin\" ? \"open\" : platform() === \"win32\" ? \"cmd\" : \"xdg-open\";\n const args = platform() === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n execFile(cmd, args, () => undefined);\n}\n\nexport interface EntryRef {\n collection?: string;\n slugOrId: string;\n}\n\n/** Parse `<collection>/<slug-or-id>` or a bare entry id. */\nexport function parseEntryRef(ref: string): EntryRef {\n if (ref.startsWith(\"ent_\") && !ref.includes(\"/\")) return { slugOrId: ref };\n const slash = ref.indexOf(\"/\");\n if (slash === -1) return { slugOrId: ref };\n return { collection: ref.slice(0, slash), slugOrId: ref.slice(slash + 1) };\n}\n\n/** Resolve an entry ref to a concrete entry id, listing by slug when needed. */\nexport async function resolveEntryId(\n mgmt: ManagementClient,\n project: string,\n ref: string,\n): Promise<string> {\n const parsed = parseEntryRef(ref);\n if (parsed.slugOrId.startsWith(\"ent_\")) return parsed.slugOrId;\n if (!parsed.collection) {\n throw new UsageError(`Provide the entry as <collection>/<slug> or an ent_ id (got \"${ref}\").`);\n }\n let cursor: string | undefined;\n for (let guard = 0; guard < 50; guard++) {\n const page = await mgmt.entries.list(project, { collection: parsed.collection, limit: 100, cursor });\n const match = page.data.find((e) => e.slug === parsed.slugOrId || e.id === parsed.slugOrId);\n if (match) return match.id;\n if (!page.nextCursor) break;\n cursor = page.nextCursor;\n }\n throw new CliError(`Entry not found: ${ref}`);\n}\n","import type { Command } from \"commander\";\nimport { isMynaApiError } from \"@myna-sh/sdk/management\";\nimport { checkCredential, describeIdentity } from \"../auth-check.js\";\nimport { clearToken, loadToken, storeToken } from \"../config.js\";\nimport { CliError, diag, emit, keyValues } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\n\ninterface DeviceStart {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n interval: number;\n}\n\ninterface DeviceToken {\n status: \"pending\" | \"approved\" | \"denied\" | \"expired\";\n token?: string;\n}\n\nasync function apiPost<T>(apiUrl: string, path: string, body: unknown): Promise<T> {\n const res = await fetch(`${apiUrl}/v1${path}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"application/json\" },\n body: JSON.stringify(body),\n });\n const json = (await res.json().catch(() => ({}))) as { data?: T; detail?: string };\n if (!res.ok) throw new CliError(json.detail ?? `Request failed (${res.status}).`);\n return json.data as T;\n}\n\nconst sleep = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));\n\nfunction startDevice(apiUrl: string): Promise<DeviceStart> {\n return apiPost<DeviceStart>(apiUrl, \"/auth/device\", {});\n}\n\nfunction pollDevice(apiUrl: string, deviceCode: string): Promise<DeviceToken> {\n return apiPost<DeviceToken>(apiUrl, `/auth/device/${deviceCode}/token`, { deviceCode });\n}\n\nexport function registerAuth(program: Command): void {\n const login = program\n .command(\"login\")\n .description(\"Authenticate via the browser device-authorization flow\")\n .action(\n handle(async (ctx) => {\n const start = await startDevice(ctx.apiUrl);\n diag(`\\n To authenticate, open:\\n ${start.verificationUri}\\n and enter the code: ${start.userCode}\\n`);\n if (ctx.interactive) openBrowser(start.verificationUri);\n\n const deadline = Date.now() + start.expiresIn * 1000;\n let token: string | undefined;\n while (Date.now() < deadline) {\n await sleep(Math.max(1, start.interval) * 1000);\n const poll = await pollDevice(ctx.apiUrl, start.deviceCode);\n if (poll.status === \"approved\" && poll.token) {\n token = poll.token;\n break;\n }\n if (poll.status === \"denied\" || poll.status === \"expired\") {\n throw new CliError(`Authorization ${poll.status}.`);\n }\n }\n if (!token) throw new CliError(\"Device authorization timed out.\");\n\n const location = storeToken(ctx.apiUrl, token);\n diag(` Stored credential (${location}).`);\n emit(\n { ok: true, apiUrl: ctx.apiUrl, storage: location },\n () => process.stdout.write(`Logged in to ${ctx.apiUrl}\\n`),\n );\n }),\n );\n\n /**\n * Non-blocking halves of the same flow.\n *\n * `myna login` blocks until a human approves in a browser, which is useless\n * to an automated caller: it cannot surface the code to whoever must approve\n * it, and it cannot do anything else while waiting. Splitting start from poll\n * lets a caller print the verification URI, hand it to a human, and poll on\n * its own schedule.\n */\n login\n .command(\"start\")\n .description(\"Begin device authorization and print the code without waiting\")\n .action(\n handle(async (ctx) => {\n const start = await startDevice(ctx.apiUrl);\n emit(\n {\n deviceCode: start.deviceCode,\n userCode: start.userCode,\n verificationUri: start.verificationUri,\n expiresIn: start.expiresIn,\n interval: start.interval,\n apiUrl: ctx.apiUrl,\n },\n () => {\n process.stdout.write(`${start.verificationUri}\\n`);\n diag(` Enter the code: ${start.userCode}`);\n diag(` Then run: myna login poll ${start.deviceCode}`);\n },\n );\n }),\n );\n\n login\n .command(\"poll\")\n .description(\"Check a pending device authorization once, or wait for it\")\n .argument(\"<device-code>\", \"device code from `myna login start`\")\n .option(\"--wait\", \"keep polling until approved, denied, or expired\", false)\n .option(\"--interval <seconds>\", \"seconds between attempts when waiting\", \"2\")\n .option(\"--timeout <seconds>\", \"give up after this long when waiting\", \"300\")\n .action(\n handle(async (ctx, args, opts) => {\n const deviceCode = args[0] as string;\n const wait = Boolean(opts.wait);\n const interval = Math.max(1, Number(opts.interval)) * 1000;\n const deadline = Date.now() + Math.max(1, Number(opts.timeout)) * 1000;\n\n for (;;) {\n const poll = await pollDevice(ctx.apiUrl, deviceCode);\n\n if (poll.status === \"approved\" && poll.token) {\n const location = storeToken(ctx.apiUrl, poll.token);\n emit(\n { status: \"approved\", stored: true, storage: location, apiUrl: ctx.apiUrl },\n () => process.stdout.write(`Logged in to ${ctx.apiUrl} (stored in ${location})\\n`),\n );\n return;\n }\n\n if (poll.status === \"denied\" || poll.status === \"expired\") {\n // A terminal answer is a result, not a crash: report it in the same\n // shape as success so a caller can branch on `status`.\n emit({ status: poll.status, stored: false, apiUrl: ctx.apiUrl }, () =>\n process.stderr.write(`Authorization ${poll.status}.\\n`),\n );\n process.exitCode = 1;\n return;\n }\n\n if (!wait) {\n emit({ status: \"pending\", stored: false, apiUrl: ctx.apiUrl }, () =>\n process.stdout.write(\"pending\\n\"),\n );\n return;\n }\n\n if (Date.now() + interval > deadline) {\n emit({ status: \"timeout\", stored: false, apiUrl: ctx.apiUrl }, () =>\n process.stderr.write(\"Timed out waiting for approval.\\n\"),\n );\n process.exitCode = 1;\n return;\n }\n await sleep(interval);\n }\n }),\n );\n\n program\n .command(\"logout\")\n .description(\"Remove the stored credential for the current API URL\")\n .action(\n handle(async (ctx) => {\n clearToken(ctx.apiUrl);\n emit({ ok: true }, () => process.stdout.write(`Logged out of ${ctx.apiUrl}\\n`));\n }),\n );\n\n const auth = program.command(\"auth\").description(\"Inspect and verify credentials\");\n\n /**\n * The machine-readable counterpart to `whoami`: always exits 0 with a\n * definite answer, so a caller can branch on `credentialValid` instead of\n * parsing an error.\n */\n auth\n .command(\"verify\")\n .description(\"Check whether the current credential actually works\")\n .action(\n handle(async (ctx) => {\n const status = await checkCredential(ctx.apiUrl, ctx.token, ctx.tokenSource);\n emit(status, () => {\n keyValues([\n [\"API\", status.apiUrl],\n [\"Credential present\", status.credentialPresent ? \"yes\" : \"no\"],\n [\"Credential valid\", status.credentialValid ? \"yes\" : \"no\"],\n [\"Source\", status.source],\n [\"Identity\", status.identity ? describeIdentity(status.identity) : \"—\"],\n ]);\n if (status.error) process.stderr.write(`\\n${status.error.code}: ${status.error.detail}\\n`);\n });\n }),\n );\n\n program\n .command(\"whoami\")\n .description(\"Show the authenticated identity, validating it against the API\")\n .action(\n handle(async (ctx) => {\n const status = await checkCredential(ctx.apiUrl, ctx.token ?? loadToken(ctx.apiUrl), ctx.tokenSource);\n\n let organization: { name: string; role: string; slug: string } | undefined;\n if (status.credentialValid && ctx.organization) {\n organization = await ctx\n .management()\n .organizations.get(ctx.organization)\n .then((o) => ({ name: o.name, role: o.role, slug: o.slug }))\n .catch((e: unknown) => {\n if (isMynaApiError(e)) return undefined;\n throw e;\n });\n }\n\n emit({ ...status, organization: organization ?? null }, () => {\n const pairs: Array<[string, string]> = [\n [\"API\", status.apiUrl],\n [\"Credential present\", status.credentialPresent ? \"yes\" : \"no\"],\n [\"Credential valid\", status.credentialValid ? \"yes\" : \"no\"],\n ];\n if (status.identity) pairs.push([\"Identity\", describeIdentity(status.identity)]);\n if (organization) pairs.push([\"Organization\", `${organization.name} (${organization.role})`]);\n keyValues(pairs);\n if (status.error) {\n process.stderr.write(`\\n${status.error.detail}\\n`);\n if (status.error.code !== \"UNREACHABLE\") {\n process.stderr.write(\"Run `myna login` to authenticate again.\\n\");\n }\n }\n });\n\n // Presence without validity is the failure the old behavior hid.\n if (!status.credentialValid) process.exitCode = 1;\n }),\n );\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport {\n findLinkedProject,\n loadToken,\n removeLinkedProject,\n writeLinkedProject,\n DEFAULT_API_URL,\n} from \"../config.js\";\nimport { CliError, UsageError, diag, emit, keyValues } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\n\nconst EXAMPLE_SCHEMA = `import { collection, field } from \"@myna-sh/sdk/schema\";\n\n/**\n * Example collection. Edit freely, then run:\n * myna schema diff\n * myna schema push\n */\nexport const posts = collection({\n name: \"posts\",\n label: \"Blog posts\",\n visibility: \"public\",\n titleField: \"title\",\n path: \"/blog/{slug}\",\n fields: {\n title: field.text({ required: true, maxLength: 120 }),\n slug: field.slug({ from: \"title\", required: true }),\n description: field.text({ multiline: true }),\n body: field.markdown({ required: true }),\n cover: field.asset({ allowed: [\"image/*\"] }),\n publishedAt: field.datetime(),\n },\n});\n`;\n\nfunction appUrlFor(apiUrl: string): string {\n try {\n const url = new URL(apiUrl);\n if (url.hostname.startsWith(\"api.\")) {\n url.hostname = \"app.\" + url.hostname.slice(4);\n return url.origin;\n }\n return apiUrl;\n } catch {\n return apiUrl;\n }\n}\n\nexport function registerWorkspace(program: Command): void {\n program\n .command(\"init\")\n .description(\"Scaffold a local `myna/` schema directory (and link if a project is set)\")\n .option(\"--schema-dir <dir>\", \"schema directory\", \"myna\")\n .action(\n handle(async (ctx, _args, opts) => {\n const dir = (opts.schemaDir as string) ?? \"myna\";\n mkdirSync(dir, { recursive: true });\n const file = join(dir, \"posts.ts\");\n const created: string[] = [];\n if (!existsSync(file)) {\n writeFileSync(file, EXAMPLE_SCHEMA);\n created.push(file);\n }\n let linked = false;\n if (ctx.project) {\n writeLinkedProject(process.cwd(), {\n project: ctx.project,\n organization: ctx.organization,\n ...(ctx.apiUrl !== DEFAULT_API_URL ? { apiUrl: ctx.apiUrl } : {}),\n });\n created.push(\".myna/project.json\");\n linked = true;\n }\n emit({ schemaDir: dir, created, linked }, () => {\n diag(`Initialized ${dir}/`);\n for (const c of created) process.stdout.write(` created ${c}\\n`);\n if (!linked) process.stdout.write(` run \\`myna link --project <ref>\\` to link a project\\n`);\n });\n }),\n );\n\n program\n .command(\"link\")\n .description(\"Link the current directory to a project (writes .myna/project.json, no secrets)\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const project = (args[0] as string | undefined) ?? ctx.project;\n if (!project) throw new UsageError(\"Provide a project: `myna link <project>` or --project.\");\n // Validate the project exists and capture its organization.\n const resolved = await ctx.management().projects.get(project);\n writeLinkedProject(process.cwd(), {\n project,\n organization: ctx.organization ?? resolved.organizationId,\n ...(ctx.apiUrl !== DEFAULT_API_URL ? { apiUrl: ctx.apiUrl } : {}),\n });\n emit({ linked: true, project: resolved.slug, organizationId: resolved.organizationId }, () =>\n process.stdout.write(`Linked to ${resolved.name} (${resolved.slug})\\n`),\n );\n }),\n );\n\n program\n .command(\"unlink\")\n .description(\"Remove the project link from the current directory tree\")\n .action(\n handle(async () => {\n const found = findLinkedProject();\n if (!found) throw new CliError(\"No linked project found.\");\n removeLinkedProject(found.root);\n emit({ unlinked: true }, () => process.stdout.write(`Unlinked ${found.linked.project}\\n`));\n }),\n );\n\n program\n .command(\"status\")\n .description(\"Show the resolved configuration and project link\")\n .action(\n handle(async (ctx) => {\n // `status` reads local configuration only — it deliberately makes no\n // network call. It therefore reports whether a credential is *present*,\n // never whether it works: use `myna auth verify` or `myna doctor` for\n // that. Calling mere presence \"authenticated\" is what let an expired\n // credential look healthy.\n const credentialPresent = Boolean(ctx.token ?? loadToken(ctx.apiUrl));\n emit(\n {\n apiUrl: ctx.apiUrl,\n credentialPresent,\n credentialSource: ctx.tokenSource,\n project: ctx.project ?? null,\n organization: ctx.organization ?? null,\n linkedRoot: ctx.linkedRoot ?? null,\n },\n () => {\n keyValues([\n [\"API URL\", ctx.apiUrl],\n [\"Credential present\", credentialPresent ? `yes (${ctx.tokenSource})` : \"no\"],\n [\"Project\", ctx.project ?? \"(none)\"],\n [\"Organization\", ctx.organization ?? \"(none)\"],\n [\"Linked at\", ctx.linkedRoot ?? \"(none)\"],\n ]);\n if (credentialPresent) diag(\"\\nNot verified against the API. Run `myna auth verify`.\");\n },\n );\n }),\n );\n\n program\n .command(\"open\")\n .description(\"Open the current project in the dashboard\")\n .action(\n handle(async (ctx) => {\n const app = appUrlFor(ctx.apiUrl);\n const path = ctx.organization && ctx.project ? `/${ctx.organization}/${ctx.project}` : \"\";\n const url = `${app}${path}`;\n if (ctx.interactive) openBrowser(url);\n emit({ url }, () => process.stdout.write(`${url}\\n`));\n }),\n );\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { isMynaApiError, generateTypesModule } from \"@myna-sh/sdk/management\";\nimport type { CollectionSchema } from \"@myna-sh/schema\";\nimport { CliError, UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { canonicalJson, loadLocalSchemas, schemaDirFor } from \"../schema-loader.js\";\nimport { schemaToDsl } from \"../dsl-emit.js\";\nimport type { Ctx } from \"../client.js\";\n\n/** Fetch deployed canonical schemas (latest version per collection). */\nasync function deployedSchemas(ctx: Ctx, project: string): Promise<CollectionSchema[]> {\n const mgmt = ctx.management();\n const collections = await mgmt.schema.collections(project);\n const out: CollectionSchema[] = [];\n for (const c of collections) {\n const versions = await mgmt.schema.versions(project, c.key);\n const latest = versions[0];\n if (latest) out.push(latest.schemaJson as unknown as CollectionSchema);\n }\n return out.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function registerSchema(program: Command): void {\n const schema = program.command(\"schema\").description(\"Inspect and deploy code-owned schemas\");\n\n schema\n .command(\"inspect\")\n .description(\"Show deployed collections, or one collection's fields\")\n .argument(\"[collection]\", \"collection key\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const key = args[0] as string | undefined;\n if (!key) {\n const collections = await ctx.management().schema.collections(project);\n emit(collections, () =>\n table(collections, [\n { header: \"KEY\", value: (c) => c.key },\n { header: \"NAME\", value: (c) => c.displayName },\n { header: \"KIND\", value: (c) => c.kind },\n { header: \"VISIBILITY\", value: (c) => c.visibility },\n ]),\n );\n return;\n }\n const versions = await ctx.management().schema.versions(project, key);\n const latest = versions[0];\n if (!latest) throw new CliError(`Collection ${key} has no versions.`);\n const s = latest.schemaJson as unknown as CollectionSchema;\n emit({ collection: key, version: latest.version, schema: s }, () => {\n diag(`${key} — v${latest.version} (${s.kind}, ${s.visibility})`);\n table(s.fields, [\n { header: \"FIELD\", value: (f) => f.key },\n { header: \"TYPE\", value: (f) => f.type },\n { header: \"REQUIRED\", value: (f) => (f.required ? \"yes\" : \"\") },\n ]);\n });\n }),\n );\n\n schema\n .command(\"pull\")\n .description(\"Write deployed schemas to local DSL files\")\n .option(\"--schema-dir <dir>\", \"target schema directory\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n const schemas = await deployedSchemas(ctx, project);\n mkdirSync(dir, { recursive: true });\n const written: string[] = [];\n for (const s of schemas) {\n const file = join(dir, `${s.name}.ts`);\n writeFileSync(file, schemaToDsl(s));\n written.push(file);\n }\n emit({ pulled: schemas.length, files: written }, () => {\n for (const f of written) process.stdout.write(` wrote ${f}\\n`);\n });\n }),\n );\n\n schema\n .command(\"diff\")\n .description(\"Diff local schemas against the deployed schemas\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n const local = await loadLocalSchemas(dir);\n const result = await ctx.management().schema.diff(project, canonicalJson(local));\n emit(result, () => renderDiff(result));\n }),\n );\n\n schema\n .command(\"drift\")\n .description(\"Show schema drift between this project and another (e.g. staging)\")\n .requiredOption(\"--against <project>\", \"project id or slug to compare with\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const result = await ctx.management().schema.drift(project, opts.against as string);\n emit(result, () => {\n if (result.inSync) diag(\"Schemas are in sync.\");\n else {\n diag(`${result.ops.length} op(s) of drift (${result.classification}):`);\n for (const op of result.ops) {\n process.stderr.write(` ${op.kind} ${op.collection}${op.field ? `.${op.field}` : \"\"} — ${op.detail}\\n`);\n }\n }\n });\n if (!result.inSync) process.exitCode = 1;\n }),\n );\n\n schema\n .command(\"promote\")\n .description(\"Promote another project's deployed schemas into this project\")\n .requiredOption(\"--from <project>\", \"source project id or slug\")\n .option(\"--allow-destructive\", \"permit destructive schema changes\", false)\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const result = await ctx.management().schema.promote(project, opts.from as string, {\n allowDestructive: Boolean(opts.allowDestructive),\n });\n emit(result, () => {\n renderDiff(result.diff);\n diag(result.applied ? `Promoted ${result.versions.length} version(s).` : \"Nothing to promote.\");\n });\n }),\n );\n\n schema\n .command(\"push\")\n .description(\"Apply local schemas, creating immutable versions\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .option(\"--allow-destructive\", \"permit destructive schema changes\", false)\n .option(\"--summary <text>\", \"change summary\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n const local = await loadLocalSchemas(dir);\n const collections = canonicalJson(local);\n const allowDestructive = Boolean(opts.allowDestructive);\n\n const plan = await ctx.management().schema.diff(project, collections);\n if (!ctx.json) renderDiff(plan);\n\n if (plan.hasDestructive && !allowDestructive) {\n throw new UsageError(\n \"This change is destructive. Re-run with --allow-destructive to proceed.\",\n );\n }\n if (plan.ops.length === 0) {\n emit({ applied: false, reason: \"no-changes\", diff: plan }, () => diag(\"No schema changes to apply.\"));\n return;\n }\n\n const pushed = await ctx\n .management()\n .schema.push(project, collections, { allowDestructive, changeSummary: opts.summary as string | undefined })\n .catch((error: unknown) => {\n if (isMynaApiError(error) && error.code === \"SCHEMA_CHANGE_DESTRUCTIVE\") {\n throw new UsageError(\"Destructive schema change rejected. Pass --allow-destructive.\");\n }\n throw error;\n });\n emit(pushed, () =>\n diag(`Applied ${pushed.versions.length} schema version(s) (${pushed.diff.classification}).`),\n );\n }),\n );\n\n const types = program.command(\"types\").description(\"Generate content types\");\n types\n .command(\"generate\")\n .description(\"Generate deterministic TypeScript types from schemas\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .option(\"--deployed\", \"use deployed schemas instead of local files\", false)\n .option(\"--out <file>\", \"write to a file instead of stdout\")\n .action(\n handle(async (ctx, _args, opts) => {\n let schemas: CollectionSchema[];\n if (opts.deployed) {\n schemas = await deployedSchemas(ctx, ctx.requireProject());\n } else {\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n schemas = await loadLocalSchemas(dir);\n }\n const code = generateTypesModule(schemas);\n const out = opts.out as string | undefined;\n if (out) {\n writeFileSync(out, code);\n emit({ written: out, collections: schemas.length }, () => diag(`Wrote ${out}`));\n } else if (ctx.json) {\n emit({ code, collections: schemas.length });\n } else {\n process.stdout.write(code);\n }\n }),\n );\n}\n\ninterface DiffLike {\n ops: Array<{ kind: string; collection: string; field?: string; classification: string; detail: string }>;\n classification: string;\n hasDestructive: boolean;\n contentValidationErrors: Array<{ collection: string; path: string; message: string }>;\n}\n\nfunction renderDiff(diff: DiffLike): void {\n if (diff.ops.length === 0) {\n diag(\"No changes.\");\n return;\n }\n for (const op of diff.ops) {\n const marker = op.classification === \"destructive\" ? \"!\" : op.classification === \"conditionally_destructive\" ? \"~\" : \"+\";\n const target = op.field ? `${op.collection}.${op.field}` : op.collection;\n process.stdout.write(` ${marker} ${op.kind} ${target} — ${op.detail}\\n`);\n }\n process.stdout.write(` classification: ${diff.classification}\\n`);\n for (const err of diff.contentValidationErrors) {\n process.stderr.write(` content error: ${err.collection} ${err.path} — ${err.message}\\n`);\n }\n}\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { build, type Plugin } from \"esbuild\";\nimport { toCanonical, type CollectionSchema } from \"@myna-sh/schema\";\nimport { CliError } from \"./output.js\";\n\n/**\n * Load local schema definitions through a controlled esbuild bundle-to-memory,\n * then import the compiled module (SPEC 7 / 11). Each `.ts`/`.js`/`.mjs` file in\n * the schema directory may default-export a collection, export an array of\n * collections, or export several named collections.\n */\n\nexport const DEFAULT_SCHEMA_DIR = \"myna\";\n\n/**\n * Resolve DSL imports in user schema files to the copy bundled with the CLI\n * (`dsl.ts`, built to a sibling `dsl.js`). Schema loading therefore works\n * without `@myna-sh/sdk` installed, and canonicalization always runs against\n * the exact DSL version this CLI ships.\n */\nfunction dslAliasPlugin(): Plugin {\n let dslPath = fileURLToPath(new URL(\"./dsl.js\", import.meta.url));\n if (!existsSync(dslPath)) dslPath = dslPath.replace(/\\.js$/, \".ts\");\n return {\n name: \"myna-dsl-alias\",\n setup(builder) {\n builder.onResolve({ filter: /^@myna-sh\\/(schema|sdk\\/schema)$/ }, () => ({\n path: dslPath,\n }));\n },\n };\n}\n\nfunction looksLikeCollection(value: unknown): value is CollectionSchema {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { name?: unknown }).name === \"string\" &&\n Array.isArray((value as { fields?: unknown }).fields)\n );\n}\n\nfunction collectFromModule(mod: Record<string, unknown>, out: Map<string, CollectionSchema>): void {\n const consider = (value: unknown): void => {\n if (Array.isArray(value)) {\n for (const v of value) consider(v);\n return;\n }\n if (looksLikeCollection(value)) out.set(value.name, value);\n };\n for (const value of Object.values(mod)) consider(value);\n}\n\nfunction listSchemaFiles(dir: string): string[] {\n const files: string[] = [];\n for (const entry of readdirSync(dir)) {\n if (entry.startsWith(\".\") || entry === \"node_modules\" || entry === \"dist\") continue;\n const full = join(dir, entry);\n const st = statSync(full);\n if (st.isDirectory()) {\n files.push(...listSchemaFiles(full));\n } else if (/\\.(ts|mts|js|mjs)$/.test(entry) && !/\\.d\\.ts$/.test(entry)) {\n files.push(full);\n }\n }\n return files.sort();\n}\n\nexport async function loadLocalSchemas(schemaDir = DEFAULT_SCHEMA_DIR): Promise<CollectionSchema[]> {\n const dir = resolve(schemaDir);\n if (!existsSync(dir)) {\n throw new CliError(`Schema directory not found: ${schemaDir}. Run \\`myna init\\` to scaffold it.`);\n }\n const files = listSchemaFiles(dir);\n if (files.length === 0) {\n throw new CliError(`No schema files found in ${schemaDir}.`);\n }\n\n const collections = new Map<string, CollectionSchema>();\n for (const file of files) {\n const result = await build({\n entryPoints: [file],\n bundle: true,\n write: false,\n format: \"esm\",\n platform: \"node\",\n target: \"node20\",\n logLevel: \"silent\",\n absWorkingDir: process.cwd(),\n plugins: [dslAliasPlugin()],\n }).catch((error: unknown) => {\n throw new CliError(`Failed to compile ${file}: ${error instanceof Error ? error.message : String(error)}`);\n });\n\n const code = result.outputFiles[0]?.text ?? \"\";\n const dataUrl = `data:text/javascript;base64,${Buffer.from(code).toString(\"base64\")}`;\n const mod = (await import(dataUrl)) as Record<string, unknown>;\n collectFromModule(mod, collections);\n }\n\n if (collections.size === 0) {\n throw new CliError(\"No collections were exported from the schema directory.\");\n }\n\n return [...collections.values()]\n .map((c) => toCanonical(c))\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function canonicalJson(schemas: CollectionSchema[]): Record<string, unknown>[] {\n return schemas.map((s) => s as unknown as Record<string, unknown>);\n}\n\n/** Resolve the schema directory relative to the linked project root if set. */\nexport function schemaDirFor(root: string | undefined, override?: string): string {\n if (override) return override;\n if (root) {\n const candidate = join(root, DEFAULT_SCHEMA_DIR);\n if (existsSync(candidate)) return candidate;\n }\n return DEFAULT_SCHEMA_DIR;\n}\n","import type { CollectionSchema } from \"./types.js\";\n\n/**\n * Deterministic JSON serialization: object keys are emitted in sorted order,\n * arrays preserve their order (field order is significant). Produces a stable\n * string suitable for hashing and equality checks.\n */\nexport function canonicalStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortValue);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n const v = (value as Record<string, unknown>)[key];\n if (v === undefined) continue;\n out[key] = sortValue(v);\n }\n return out;\n }\n return value;\n}\n\n/**\n * Return a deep-cloned, canonically-ordered copy of a schema. This is the exact\n * shape persisted as `collection_versions.schema_json`.\n */\nexport function toCanonical(schema: CollectionSchema): CollectionSchema {\n return JSON.parse(canonicalStringify(schema)) as CollectionSchema;\n}\n","import type { CollectionSchema, FieldDef, ListItem } from \"@myna-sh/schema\";\n\n/**\n * Emit editable `@myna-sh/sdk/schema` DSL source from a canonical collection schema.\n * Used by `myna schema pull` to materialize deployed schemas as local TS.\n */\nexport function schemaToDsl(schema: CollectionSchema): string {\n const opts: string[] = [\n `name: ${str(schema.name)}`,\n `label: ${str(schema.label)}`,\n ];\n if (schema.kind !== \"collection\") opts.push(`kind: ${str(schema.kind)}`);\n opts.push(`visibility: ${str(schema.visibility)}`);\n if (schema.titleField) opts.push(`titleField: ${str(schema.titleField)}`);\n if (schema.path) opts.push(`path: ${str(schema.path)}`);\n\n const fieldLines = schema.fields.map((f) => ` ${ident(f.key)}: ${emitField(f)},`).join(\"\\n\");\n\n return [\n `import { collection, field, item } from \"@myna-sh/sdk/schema\";`,\n ``,\n `export const ${varName(schema.name)} = collection({`,\n ` ${opts.join(\",\\n \")},`,\n ` fields: {`,\n fieldLines,\n ` },`,\n `});`,\n ``,\n ].join(\"\\n\");\n}\n\nfunction emitField(field: FieldDef): string {\n const o: Record<string, unknown> = {};\n if (field.label && field.label !== field.key) o.label = field.label;\n if (field.description) o.description = field.description;\n if (field.required) o.required = true;\n\n switch (field.type) {\n case \"text\":\n assign(o, { multiline: field.multiline || undefined, minLength: field.minLength, maxLength: field.maxLength, pattern: field.pattern, enum: field.enum, default: field.default });\n return call(\"text\", o);\n case \"slug\":\n assign(o, { from: field.from });\n return call(\"slug\", o);\n case \"markdown\":\n assign(o, { minLength: field.minLength, maxLength: field.maxLength, default: field.default });\n return call(\"markdown\", o);\n case \"number\":\n assign(o, { integer: field.integer || undefined, min: field.min, max: field.max, default: field.default });\n return call(\"number\", o);\n case \"boolean\":\n assign(o, { default: field.default });\n return call(\"boolean\", o);\n case \"date\":\n case \"datetime\":\n assign(o, { min: field.min, max: field.max, default: field.default });\n return call(field.type, o);\n case \"json\":\n assign(o, { default: field.default });\n return call(\"json\", o);\n case \"asset\":\n assign(o, { allowed: field.allowed, multiple: field.multiple || undefined });\n return call(\"asset\", o);\n case \"reference\":\n assign(o, { to: field.target, multiple: field.multiple || undefined });\n return call(\"reference\", o);\n case \"object\": {\n const inner = field.fields.map((f) => ` ${ident(f.key)}: ${emitField(f)}`).join(\",\\n\");\n o.fields = `__RAW__{\\n${inner},\\n }`;\n return call(\"object\", o);\n }\n case \"list\":\n o.of = `__RAW__${emitItem(field.item)}`;\n assign(o, { minItems: field.minItems, maxItems: field.maxItems });\n return call(\"list\", o);\n default:\n return `field.json({})`;\n }\n}\n\nfunction emitItem(item: ListItem): string {\n switch (item.kind) {\n case \"reference\":\n return `item.reference({ to: ${str(item.target)} })`;\n case \"asset\":\n return `item.asset({ allowed: ${JSON.stringify(item.allowed)} })`;\n case \"object\": {\n const inner = item.fields.map((f) => ` ${ident(f.key)}: ${emitField(f)}`).join(\",\\n\");\n return `item.object({ fields: {\\n${inner},\\n } })`;\n }\n default:\n return `item.${item.kind}()`;\n }\n}\n\nfunction call(name: string, opts: Record<string, unknown>): string {\n const entries = Object.entries(opts);\n if (entries.length === 0) return `field.${name}()`;\n const body = entries.map(([k, v]) => `${ident(k)}: ${literal(v)}`).join(\", \");\n return `field.${name}({ ${body} })`;\n}\n\nfunction assign(target: Record<string, unknown>, values: Record<string, unknown>): void {\n for (const [k, v] of Object.entries(values)) {\n if (v !== undefined) target[k] = v;\n }\n}\n\nfunction literal(value: unknown): string {\n if (typeof value === \"string\" && value.startsWith(\"__RAW__\")) return value.slice(\"__RAW__\".length);\n return JSON.stringify(value);\n}\n\nfunction str(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction ident(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction varName(name: string): string {\n const camel = name.replace(/[-_\\s]+(.)/g, (_, c: string) => c.toUpperCase());\n return /^[A-Za-z_$]/.test(camel) ? camel : `_${camel}`;\n}\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport { basename, extname, join } from \"node:path\";\nimport { UsageError } from \"./output.js\";\n\n/**\n * Reading content from files: JSON documents and Markdown-with-frontmatter\n * directories, normalized into the rows the import API accepts.\n *\n * Migrating a site usually means the content already exists as files. Without\n * a reader here, every migration starts by writing a throwaway script to walk a\n * directory and reshape it — which is exactly the orchestration this is meant\n * to remove.\n */\n\nexport interface ContentRow {\n slug?: string;\n data: Record<string, unknown>;\n /** Where the row came from, for error messages that point at a file. */\n source: string;\n}\n\nexport type ContentFormat = \"json\" | \"markdown\";\n\n/** Guess the format from a path: a directory of `.md` files, or a JSON file. */\nexport async function detectFormat(path: string): Promise<ContentFormat> {\n const info = await stat(path).catch(() => undefined);\n if (!info) throw new UsageError(`No such file or directory: ${path}`);\n if (info.isDirectory()) return \"markdown\";\n return extname(path).toLowerCase() === \".json\" ? \"json\" : \"markdown\";\n}\n\n/**\n * Parse a frontmatter block.\n *\n * Deliberately a small subset of YAML — quoted and bare scalars, numbers,\n * booleans, null, and inline `[a, b]` arrays — because that is what content\n * frontmatter actually contains. Anything outside it fails loudly rather than\n * being silently misread, since a value quietly parsed as the wrong type\n * becomes a validation error pointing at the wrong place.\n */\nexport function parseFrontmatter(raw: string, source: string): { meta: Record<string, unknown>; body: string } {\n if (!raw.startsWith(\"---\")) return { meta: {}, body: raw };\n const end = raw.indexOf(\"\\n---\", 3);\n if (end === -1) throw new UsageError(`${source}: unterminated frontmatter block.`);\n const block = raw.slice(raw.indexOf(\"\\n\") + 1, end);\n const body = raw.slice(raw.indexOf(\"\\n\", end + 1) + 1);\n\n const meta: Record<string, unknown> = {};\n for (const [lineNumber, line] of block.split(\"\\n\").entries()) {\n if (!line.trim() || line.trimStart().startsWith(\"#\")) continue;\n const separator = line.indexOf(\":\");\n if (separator === -1) {\n throw new UsageError(`${source}:${lineNumber + 2}: expected \"key: value\" in frontmatter.`);\n }\n const key = line.slice(0, separator).trim();\n meta[key] = parseScalar(line.slice(separator + 1).trim());\n }\n return { meta, body };\n}\n\nfunction parseScalar(value: string): unknown {\n if (value === \"\" || value === \"null\" || value === \"~\") return null;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n const inner = value.slice(1, -1).trim();\n return inner === \"\" ? [] : inner.split(\",\").map((item) => parseScalar(item.trim()));\n }\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n return value.slice(1, -1);\n }\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) return Number(value);\n return value;\n}\n\n/** Read a JSON import file: `{ collection, entries: [...] }` or a bare array. */\nexport async function readJsonRows(\n file: string,\n): Promise<{ collection?: string; rows: ContentRow[] }> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(await readFile(file, \"utf8\"));\n } catch (error) {\n throw new UsageError(`${file}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n const toRow = (value: unknown, index: number): ContentRow => {\n if (typeof value !== \"object\" || value === null) {\n throw new UsageError(`${file}: entry ${index} is not an object.`);\n }\n const record = value as Record<string, unknown>;\n // Accept both `{ slug, data }` and a bare field object.\n if (record.data && typeof record.data === \"object\") {\n return {\n slug: typeof record.slug === \"string\" ? record.slug : undefined,\n data: record.data as Record<string, unknown>,\n source: `${file}#${index}`,\n };\n }\n return {\n slug: typeof record.slug === \"string\" ? record.slug : undefined,\n data: record,\n source: `${file}#${index}`,\n };\n };\n\n if (Array.isArray(parsed)) {\n return { rows: parsed.map(toRow) };\n }\n const doc = parsed as { collection?: unknown; entries?: unknown };\n if (!Array.isArray(doc.entries)) {\n throw new UsageError(`${file}: expected { \"collection\": \"...\", \"entries\": [...] } or a JSON array.`);\n }\n return {\n collection: typeof doc.collection === \"string\" ? doc.collection : undefined,\n rows: doc.entries.map(toRow),\n };\n}\n\n/**\n * Read a directory of Markdown files as rows.\n *\n * The filename becomes the slug and the document body is placed on `bodyField`,\n * so a conventional content directory imports without a mapping file.\n */\nexport async function readMarkdownRows(dir: string, bodyField: string): Promise<ContentRow[]> {\n const info = await stat(dir).catch(() => undefined);\n const files = info?.isDirectory()\n ? (await readdir(dir))\n .filter((name) => [\".md\", \".markdown\"].includes(extname(name).toLowerCase()))\n .sort()\n .map((name) => join(dir, name))\n : [dir];\n\n if (files.length === 0) throw new UsageError(`No .md files found in ${dir}`);\n\n const rows: ContentRow[] = [];\n for (const file of files) {\n const raw = await readFile(file, \"utf8\");\n const { meta, body } = parseFrontmatter(raw, file);\n const slug = typeof meta.slug === \"string\" ? meta.slug : basename(file, extname(file));\n rows.push({\n slug,\n data: { ...meta, slug, [bodyField]: body.trim() },\n source: file,\n });\n }\n return rows;\n}\n\n/** Read rows from a file or directory in the requested (or detected) format. */\nexport async function readContentRows(\n path: string,\n opts: { format?: ContentFormat; bodyField: string },\n): Promise<{ collection?: string; rows: ContentRow[] }> {\n const format = opts.format ?? (await detectFormat(path));\n if (format === \"json\") return readJsonRows(path);\n return { rows: await readMarkdownRows(path, opts.bodyField) };\n}\n","import type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { readContentRows, type ContentFormat } from \"../content-files.js\";\nimport { applySets, parseData, resolveEntryId } from \"../util.js\";\n\n/** Accept the documented spelling and the shorter one people reach for. */\nfunction parseFormat(value: string | undefined): ContentFormat | undefined {\n if (!value) return undefined;\n if (value === \"json\") return \"json\";\n if (value === \"markdown-frontmatter\" || value === \"markdown\" || value === \"md\") return \"markdown\";\n throw new UsageError(\"--format must be json or markdown-frontmatter.\");\n}\n\nexport function registerEntries(program: Command): void {\n const entries = program.command(\"entries\").description(\"Create, read, update, and manage entries\");\n\n entries\n .command(\"list\")\n .description(\"List entries in a collection\")\n .argument(\"<collection>\", \"collection key\")\n .option(\"--status <status>\", \"filter by status\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .option(\"--cursor <cursor>\", \"pagination cursor\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().entries.list(project, {\n collection: args[0] as string,\n status: opts.status as string | undefined,\n limit: Number(opts.limit),\n cursor: opts.cursor as string | undefined,\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (e) => e.id },\n { header: \"SLUG\", value: (e) => e.slug ?? \"\" },\n { header: \"STATUS\", value: (e) => e.status },\n { header: \"UPDATED\", value: (e) => e.updatedAt },\n ]),\n );\n }),\n );\n\n entries\n .command(\"get\")\n .description(\"Get one entry by <collection>/<slug-or-id>\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const entry = await ctx.management().entries.get(project, id);\n emit(entry);\n }),\n );\n\n entries\n .command(\"create\")\n .description(\"Create an entry\")\n .argument(\"<collection>\", \"collection key\")\n .option(\"--data <json-or-@file>\", \"entry data as JSON or @file\")\n .option(\"--set <path=value...>\", \"set individual fields\", collect, [])\n .option(\"--slug <slug>\", \"explicit slug\")\n .option(\"--change-set <id>\", \"attach to a change set\")\n .option(\"--summary <text>\", \"change summary\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const data = applySets(parseData(opts.data as string | undefined), opts.set as string[]);\n const entry = await ctx.management().entries.create(project, {\n collection: args[0] as string,\n data,\n slug: opts.slug as string | undefined,\n changeSetId: opts.changeSet as string | undefined,\n changeSummary: opts.summary as string | undefined,\n });\n emit(entry, () => diag(`Created ${entry.id} (${entry.status}).`));\n }),\n );\n\n entries\n .command(\"update\")\n .description(\"Update an entry\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--data <json-or-@file>\", \"replacement data as JSON or @file\")\n .option(\"--set <path=value...>\", \"set individual fields\", collect, [])\n .option(\"--slug <slug>\", \"new slug\")\n .option(\"--expected-revision <id>\", \"optimistic concurrency guard\")\n .option(\"--change-set <id>\", \"attach to a change set\")\n .option(\"--summary <text>\", \"change summary\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const sets = opts.set as string[];\n let data: Record<string, unknown> | undefined;\n if (opts.data !== undefined || sets.length > 0) {\n const base = opts.data !== undefined ? parseData(opts.data as string) : (await ctx.management().entries.get(project, id)).data;\n data = applySets(base, sets);\n }\n if (!data && !opts.slug) throw new UsageError(\"Nothing to update. Pass --data, --set, or --slug.\");\n const entry = await ctx.management().entries.update(project, id, {\n data,\n slug: opts.slug as string | undefined,\n expectedRevisionId: opts.expectedRevision as string | undefined,\n changeSetId: opts.changeSet as string | undefined,\n changeSummary: opts.summary as string | undefined,\n });\n emit(entry, () => diag(`Updated ${entry.id} (${entry.status}).`));\n }),\n );\n\n entries\n .command(\"delete\")\n .description(\"Stage an entry deletion on a change set\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--confirm-delete\", \"required consequence flag\", false)\n .option(\"--change-set <id>\", \"attach to a change set\")\n .action(\n handle(async (ctx, args, opts) => {\n if (!opts.confirmDelete) throw new UsageError(\"Deletion requires --confirm-delete.\");\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const result = await ctx.management().entries.delete(project, id, opts.changeSet as string | undefined);\n emit(result, () => diag(`Staged delete of ${id} on change set ${result.changeSetId}.`));\n }),\n );\n\n entries\n .command(\"unpublish\")\n .description(\"Stage an entry unpublish on a change set\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--change-set <id>\", \"attach to a change set\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const result = await ctx.management().entries.unpublish(project, id, opts.changeSet as string | undefined);\n emit(result, () => diag(`Staged unpublish of ${id} on change set ${result.changeSetId}.`));\n }),\n );\n\n entries\n .command(\"revisions\")\n .description(\"List an entry's revisions\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const revisions = await ctx.management().entries.revisions(project, id);\n emit(revisions, () =>\n table(revisions, [\n { header: \"ID\", value: (r) => r.id },\n { header: \"#\", value: (r) => String(r.revisionNumber) },\n { header: \"BY\", value: (r) => r.createdByType },\n { header: \"CREATED\", value: (r) => r.createdAt },\n ]),\n );\n }),\n );\n\n entries\n .command(\"duplicate\")\n .description(\"Duplicate an entry into a new draft\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--change-set <id>\", \"stage on an explicit change set\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const entry = await ctx.management().entries.duplicate(project, id, opts.changeSet as string | undefined);\n emit(entry, () => diag(`Duplicated into ${entry.id} (${entry.slug ?? \"no slug\"}).`));\n }),\n );\n\n entries\n .command(\"bulk\")\n .description(\"Stage a delete or unpublish for many entries at once\")\n .requiredOption(\"--action <action>\", \"delete or unpublish\")\n .requiredOption(\"--ids <ids>\", \"comma-separated entry ids\")\n .option(\"--change-set <id>\", \"stage on an explicit change set\")\n .action(\n handle(async (ctx, _args, opts) => {\n const action = opts.action as string;\n if (action !== \"delete\" && action !== \"unpublish\") {\n throw new UsageError(\"--action must be delete or unpublish.\");\n }\n const project = ctx.requireProject();\n const result = await ctx.management().entries.bulk(project, {\n action,\n entryIds: (opts.ids as string).split(\",\").map((s) => s.trim()).filter(Boolean),\n changeSetId: opts.changeSet as string | undefined,\n });\n emit(result, () =>\n table(result.results, [\n { header: \"ENTRY\", value: (r) => r.entryId },\n { header: \"OK\", value: (r) => (r.ok ? \"yes\" : \"no\") },\n { header: \"CHANGE SET\", value: (r) => r.changeSetId ?? \"—\" },\n { header: \"ERROR\", value: (r) => r.error ?? \"\" },\n ]),\n );\n if (result.results.some((r) => !r.ok)) process.exitCode = 1;\n }),\n );\n\n entries\n .command(\"import\")\n .description(\"Import entries from JSON or a Markdown directory, with dry-run validation\")\n .argument(\"<path>\", \"JSON file, or a directory of Markdown files with frontmatter\")\n .option(\"--collection <key>\", \"target collection (required unless the JSON file names one)\")\n .option(\"--format <format>\", \"json or markdown-frontmatter (detected from the path by default)\")\n .option(\"--body-field <key>\", \"field that receives the Markdown body\", \"body\")\n .option(\"--change-set <id>\", \"stage onto an existing change set instead of a new one\")\n .option(\"--mode <mode>\", \"upsert (default) updates rows whose slug exists; create rejects them\", \"upsert\")\n .option(\"--dry-run\", \"validate without writing anything\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const format = parseFormat(opts.format as string | undefined);\n const mode = opts.mode as string;\n if (mode !== \"upsert\" && mode !== \"create\") {\n throw new UsageError(\"--mode must be upsert or create.\");\n }\n\n const source = await readContentRows(args[0] as string, {\n format,\n bodyField: opts.bodyField as string,\n });\n const collection = (opts.collection as string | undefined) ?? source.collection;\n if (!collection) {\n throw new UsageError(\"No collection. Pass --collection, or use a JSON file with a `collection` key.\");\n }\n if (source.rows.length === 0) throw new UsageError(\"Nothing to import.\");\n\n const result = await ctx.management().entries.import(project, {\n collection,\n entries: source.rows.map((r) => (r.slug ? { slug: r.slug, data: r.data } : { data: r.data })),\n dryRun: Boolean(opts.dryRun),\n changeSetId: opts.changeSet as string | undefined,\n mode,\n });\n\n emit(result, () => {\n const s = result.summary;\n const counts = `${s.created} created, ${s.updated} updated, ${s.unchanged} unchanged, ${s.invalid} invalid, ${s.skipped} skipped`;\n diag(\n result.dryRun\n ? `Dry run (${result.valid ? \"would apply\" : \"blocked\"}): ${counts}.`\n : `Imported into change set ${result.changeSetId}: ${counts}.`,\n );\n for (const row of result.results.filter((r) => r.outcome === \"invalid\")) {\n const where = source.rows[row.index]?.source ?? `row ${row.index}`;\n for (const e of row.errors ?? []) {\n process.stderr.write(` ${where}: ${e.path || \"(entry)\"} ${e.message}\\n`);\n }\n }\n });\n if (!result.valid) process.exitCode = 1;\n }),\n );\n\n entries\n .command(\"reorder\")\n .description(\"Set a collection's editorial order (applies immediately; not staged)\")\n .argument(\"<collection>\", \"collection key\")\n .option(\"--slugs <list>\", \"comma-separated slugs or ids, in the desired order\")\n .option(\"--move <ref>\", \"reposition a single entry\")\n .option(\"--before <ref>\", \"with --move: place immediately before this entry\")\n .option(\"--after <ref>\", \"with --move: place immediately after this entry\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const collection = args[0] as string;\n const slugs = opts.slugs as string | undefined;\n const move = opts.move as string | undefined;\n if (Boolean(slugs) === Boolean(move)) {\n throw new UsageError(\"Provide either --slugs or --move.\");\n }\n if (!move && (opts.before || opts.after)) {\n throw new UsageError(\"--before and --after only apply with --move.\");\n }\n\n const body = slugs\n ? { order: slugs.split(\",\").map((s) => s.trim()).filter(Boolean) }\n : {\n move: {\n entry: move!,\n ...(opts.before ? { before: opts.before as string } : {}),\n ...(opts.after ? { after: opts.after as string } : {}),\n },\n };\n\n const result = await ctx.management().entries.reorder(project, collection, body);\n emit(result, () => {\n diag(\n `Reordered ${result.collection}: ${result.writes} row(s) written. ` +\n \"Ordering is not staged — this is live for readers now.\",\n );\n table(result.updated, [\n { header: \"ENTRY\", value: (r) => r.slug ?? r.id },\n { header: \"RANK\", value: (r) => r.rank },\n ]);\n });\n }),\n );\n\n entries\n .command(\"references\")\n .description(\"Show which entries reference this one and what it references\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const refs = await ctx.management().entries.references(project, id);\n emit(refs, () => {\n diag(`Referenced by ${refs.referencedBy.length} entr(y/ies):`);\n table(refs.referencedBy, [\n { header: \"ENTRY\", value: (r) => `${r.collectionKey}/${r.slug ?? r.id}` },\n { header: \"IN DRAFT\", value: (r) => (r.inDraft ? \"yes\" : \"no\") },\n { header: \"IN PUBLISHED\", value: (r) => (r.inPublished ? \"yes\" : \"no\") },\n ]);\n diag(`References ${refs.references.length} entr(y/ies):`);\n table(refs.references, [\n { header: \"ENTRY\", value: (r) => (r.collectionKey ? `${r.collectionKey}/${r.slug ?? r.id}` : r.id) },\n { header: \"STATE\", value: (r) => (!r.exists ? \"missing\" : r.published ? \"published\" : \"unpublished\") },\n ]);\n });\n }),\n );\n\n entries\n .command(\"restore\")\n .description(\"Restore a historical revision into a new draft\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .requiredOption(\"--revision <id>\", \"revision id to restore\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const result = await ctx.management().entries.restoreRevision(project, id, opts.revision as string);\n emit(result, () => diag(`Restored revision ${opts.revision as string} into ${result.revision.id}.`));\n }),\n );\n}\n\nfunction collect(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n","import type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\n\nexport function registerChanges(program: Command): void {\n const changes = program.command(\"changes\").description(\"Manage change sets: validate, preview, publish\");\n\n changes\n .command(\"list\")\n .description(\"List change sets\")\n .option(\"--status <status>\", \"filter by status\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().changeSets.list(project, {\n status: opts.status as string | undefined,\n limit: Number(opts.limit),\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (c) => c.id },\n { header: \"TITLE\", value: (c) => c.title },\n { header: \"STATUS\", value: (c) => c.status },\n { header: \"ITEMS\", value: (c) => String(c.items.length) },\n ]),\n );\n }),\n );\n\n changes\n .command(\"create\")\n .description(\"Create a change set\")\n .requiredOption(\"--title <title>\", \"change set title\")\n .option(\"--description <text>\", \"change set description\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const cs = await ctx.management().changeSets.create(project, {\n title: opts.title as string,\n description: opts.description as string | undefined,\n });\n emit(cs, () => diag(`Created change set ${cs.id}.`));\n }),\n );\n\n changes\n .command(\"inspect\")\n .description(\"Show a change set and its items\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const cs = await ctx.management().changeSets.get(project, args[0] as string);\n emit(cs, () => {\n diag(`${cs.title} — ${cs.status}`);\n table(cs.items, [\n { header: \"TYPE\", value: (i) => i.resourceType },\n { header: \"RESOURCE\", value: (i) => i.resourceId },\n { header: \"OP\", value: (i) => i.operation },\n ]);\n });\n }),\n );\n\n changes\n .command(\"validate\")\n .description(\"Validate a change set against deployed schemas\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const result = await ctx.management().changeSets.validate(project, args[0] as string);\n emit(result, () => {\n if (result.valid) {\n diag(\"valid\");\n } else {\n for (const e of result.errors) {\n process.stderr.write(` ${e.resourceId} ${e.path} — ${e.message}\\n`);\n }\n }\n });\n if (!result.valid) process.exitCode = 1;\n }),\n );\n\n changes\n .command(\"preview\")\n .description(\"Create a preview for a change set\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const preview = await ctx.management().previews.create(project, { changeSetId: args[0] as string });\n emit(preview, () => {\n process.stdout.write(`${preview.url}\\n`);\n diag(`fallback: ${preview.fallbackUrl}`);\n });\n }),\n );\n\n changes\n .command(\"publish\")\n .description(\"Atomically publish a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--confirm-publish\", \"required consequence flag\", false)\n .action(\n handle(async (ctx, args, opts) => {\n if (!opts.confirmPublish) throw new UsageError(\"Publishing requires --confirm-publish.\");\n const project = ctx.requireProject();\n const result = await ctx.management().changeSets.publish(project, args[0] as string);\n emit(result, () =>\n diag(`Published ${result.publishedEntryIds.length} entr(y/ies): ${result.publishedEntryIds.join(\", \")}`),\n );\n }),\n );\n\n changes\n .command(\"close\")\n .description(\"Close a change set without publishing\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const cs = await ctx.management().changeSets.close(project, args[0] as string);\n emit(cs, () => diag(`Closed ${cs.id}.`));\n }),\n );\n\n changes\n .command(\"schedule\")\n .description(\"Schedule, reschedule, or cancel a change set's publish\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--at <datetime>\", \"ISO 8601 datetime to publish at\")\n .option(\"--cancel\", \"cancel the scheduled publish\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n if (Boolean(opts.at) === Boolean(opts.cancel)) {\n throw new UsageError(\"Provide exactly one of --at <datetime> or --cancel.\");\n }\n const client = ctx.management();\n const cs = opts.cancel\n ? await client.changeSets.cancelSchedule(project, args[0] as string)\n : await client.changeSets.schedule(project, args[0] as string, new Date(opts.at as string).toISOString());\n emit(cs, () =>\n diag(cs.scheduledAt ? `Scheduled to publish at ${cs.scheduledAt}.` : \"Schedule cancelled.\"),\n );\n }),\n );\n\n changes\n .command(\"reviews\")\n .description(\"List reviews and approvals for a change set\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.reviews(project, args[0] as string);\n emit(reviews, () =>\n table(reviews, [\n { header: \"REVIEWER\", value: (r) => `${r.reviewerType}:${r.reviewerId}` },\n { header: \"STATUS\", value: (r) => r.status },\n { header: \"STALE\", value: (r) => (r.stale ? \"yes\" : \"no\") },\n { header: \"DECIDED\", value: (r) => r.decidedAt ?? \"—\" },\n ]),\n );\n }),\n );\n\n changes\n .command(\"request-review\")\n .description(\"Assign a reviewer to a change set\")\n .argument(\"<id>\", \"change set id\")\n .requiredOption(\"--reviewer <id>\", \"reviewer id (user, api key, or agent id)\")\n .option(\"--reviewer-type <type>\", \"reviewer actor type\", \"user\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.requestReview(project, args[0] as string, {\n reviewerType: opts.reviewerType as \"user\" | \"api_key\" | \"agent\" | \"system\",\n reviewerId: opts.reviewer as string,\n });\n emit(reviews, () => diag(`Requested review from ${opts.reviewer as string}.`));\n }),\n );\n\n changes\n .command(\"approve\")\n .description(\"Approve a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--comment <text>\", \"optional review comment\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.approve(project, args[0] as string, {\n comment: opts.comment as string | undefined,\n });\n emit(reviews, () => diag(\"Approved.\"));\n }),\n );\n\n changes\n .command(\"request-changes\")\n .description(\"Request changes on a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--comment <text>\", \"optional review comment\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.requestChanges(project, args[0] as string, {\n comment: opts.comment as string | undefined,\n });\n emit(reviews, () => diag(\"Requested changes.\"));\n }),\n );\n\n changes\n .command(\"comments\")\n .description(\"List comments on a change set\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const comments = await ctx.management().changeSets.comments(project, args[0] as string);\n emit(comments, () =>\n table(comments, [\n { header: \"AUTHOR\", value: (c) => `${c.authorType}:${c.authorId ?? \"—\"}` },\n { header: \"ANCHOR\", value: (c) => (c.resourceId ? `${c.resourceId}${c.fieldPath ? `#${c.fieldPath}` : \"\"}` : \"—\") },\n { header: \"RESOLVED\", value: (c) => (c.resolvedAt ? \"yes\" : \"no\") },\n { header: \"BODY\", value: (c) => (c.body.length > 60 ? `${c.body.slice(0, 57)}...` : c.body) },\n ]),\n );\n }),\n );\n\n changes\n .command(\"comment\")\n .description(\"Comment on a change set (optionally anchored to a field)\")\n .argument(\"<id>\", \"change set id\")\n .argument(\"<body>\", \"comment body\")\n .option(\"--entry <id>\", \"anchor to an entry in the change set\")\n .option(\"--field <path>\", \"anchor to a field path, e.g. fields.title\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const comment = await ctx.management().changeSets.comment(project, args[0] as string, {\n body: args[1] as string,\n resourceType: opts.entry ? \"entry\" : undefined,\n resourceId: opts.entry as string | undefined,\n fieldPath: opts.field as string | undefined,\n });\n emit(comment, () => diag(`Commented ${comment.id}.`));\n }),\n );\n\n changes\n .command(\"checks\")\n .description(\"Show the latest check run for a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--run\", \"run checks before showing results\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const client = ctx.management();\n const checks = opts.run\n ? (await client.changeSets.runChecks(project, args[0] as string)).checks\n : await client.changeSets.checks(project, args[0] as string);\n emit(checks, () =>\n table(checks, [\n { header: \"CHECK\", value: (c) => c.name },\n { header: \"STATUS\", value: (c) => c.status },\n { header: \"STALE\", value: (c) => (c.stale ? \"yes\" : \"no\") },\n { header: \"ISSUES\", value: (c) => String(c.details?.length ?? 0) },\n ]),\n );\n if (checks.some((c) => c.status === \"failed\")) process.exitCode = 1;\n }),\n );\n}\n","import type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\nimport type { Ctx } from \"../client.js\";\nimport type { CreatePreviewRequest } from \"@myna-sh/api-contracts\";\n\nfunction previewTarget(ref: string): CreatePreviewRequest {\n if (ref.startsWith(\"chs_\")) return { changeSetId: ref };\n if (ref.startsWith(\"ent_\")) return { entryId: ref };\n throw new UsageError(`Preview target must be a change-set (chs_) or entry (ent_) id: ${ref}`);\n}\n\nasync function create(ctx: Ctx, ref: string) {\n return ctx.management().previews.create(ctx.requireProject(), previewTarget(ref));\n}\n\nexport function registerPreviews(program: Command): void {\n const preview = program.command(\"preview\").description(\"Create and manage preview links\");\n\n preview\n .command(\"create\")\n .description(\"Create a preview for a change set or entry\")\n .argument(\"<change-set-or-entry>\", \"chs_ or ent_ id\")\n .action(\n handle(async (ctx, args) => {\n const p = await create(ctx, args[0] as string);\n emit(p, () => {\n process.stdout.write(`${p.url}\\n`);\n diag(`fallback: ${p.fallbackUrl}`);\n });\n }),\n );\n\n preview\n .command(\"open\")\n .description(\"Create a preview and open it in the browser\")\n .argument(\"<change-set-or-entry>\", \"chs_ or ent_ id\")\n .action(\n handle(async (ctx, args) => {\n const p = await create(ctx, args[0] as string);\n if (ctx.interactive) openBrowser(p.url);\n emit(p, () => process.stdout.write(`${p.url}\\n`));\n }),\n );\n\n preview\n .command(\"list\")\n .description(\"List preview tokens for the project\")\n .action(\n handle(async (ctx) => {\n const previews = await ctx.management().previews.list(ctx.requireProject());\n emit(previews, () =>\n table(previews, [\n { header: \"ID\", value: (p) => p.id },\n { header: \"SCOPE\", value: (p) => p.changeSetId ?? p.entryId ?? \"\" },\n { header: \"EXPIRES\", value: (p) => p.expiresAt },\n { header: \"REVOKED\", value: (p) => (p.revokedAt ? \"yes\" : \"\") },\n ]),\n );\n }),\n );\n\n preview\n .command(\"revoke\")\n .description(\"Revoke a preview token\")\n .argument(\"<id>\", \"preview id (prv_)\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().previews.revoke(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Revoked ${args[0] as string}.`));\n }),\n );\n}\n","import type { Command } from \"commander\";\nimport type { AssetContract } from \"@myna-sh/api-contracts\";\nimport { UsageError, diag, emit, keyValues, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\n\nexport function registerAssets(program: Command): void {\n const assets = program.command(\"assets\").description(\"Upload and manage assets\");\n\n assets\n .command(\"upload\")\n .description(\"Upload one or more files via the presigned flow\")\n .argument(\"<path...>\", \"file path(s)\")\n .option(\"--alt <text>\", \"default alt text applied to each asset\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const paths = args[0] as string[];\n const uploaded: AssetContract[] = [];\n for (const path of paths) {\n diag(`uploading ${path} …`);\n let asset = await ctx.management().assets.upload(project, path);\n if (opts.alt) asset = await ctx.management().assets.update(project, asset.id, { defaultAlt: opts.alt as string });\n uploaded.push(asset);\n }\n emit(uploaded.length === 1 ? uploaded[0] : uploaded, () =>\n table(uploaded, [\n { header: \"ID\", value: (a) => a.id },\n { header: \"FILENAME\", value: (a) => a.displayFilename },\n { header: \"TYPE\", value: (a) => a.contentType },\n { header: \"SIZE\", value: (a) => String(a.byteSize) },\n { header: \"STATE\", value: (a) => a.state },\n ]),\n );\n }),\n );\n\n assets\n .command(\"list\")\n .description(\"List assets\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .option(\"--cursor <cursor>\", \"pagination cursor\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().assets.list(project, {\n limit: Number(opts.limit),\n cursor: opts.cursor as string | undefined,\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (a) => a.id },\n { header: \"FILENAME\", value: (a) => a.displayFilename },\n { header: \"TYPE\", value: (a) => a.contentType },\n { header: \"STATE\", value: (a) => a.state },\n ]),\n );\n }),\n );\n\n assets\n .command(\"inspect\")\n .description(\"Show an asset and its usage\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const result = await ctx.management().assets.usage(project, args[0] as string);\n emit(result, () => {\n keyValues([\n [\"ID\", result.asset.id],\n [\"Filename\", result.asset.displayFilename],\n [\"Type\", result.asset.contentType],\n [\"Size\", String(result.asset.byteSize)],\n [\"State\", result.asset.state],\n [\"URL\", result.asset.url],\n [\"Referenced by\", result.usage.entryIds.join(\", \") || \"(none)\"],\n ]);\n });\n }),\n );\n\n assets\n .command(\"delete\")\n .description(\"Soft-delete an asset\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .option(\"--confirm-delete\", \"required consequence flag\", false)\n .action(\n handle(async (ctx, args, opts) => {\n if (!opts.confirmDelete) throw new UsageError(\"Deletion requires --confirm-delete.\");\n await ctx.management().assets.delete(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Deleted ${args[0] as string}.`));\n }),\n );\n}\n","import { ulid } from \"ulid\";\n\n/**\n * Prefixed, monotonic, URL-safe application identifiers.\n *\n * Every resource has a stable short prefix. The body is a lowercased ULID,\n * which is monotonic (time-ordered), URL-safe (Crockford base32), and globally\n * unique. Example: `usr_01jb& ...` lowercased.\n */\nexport const ID_PREFIXES = {\n user: \"usr\",\n oauthAccount: \"oau\",\n session: \"ses\",\n organization: \"org\",\n organizationMember: \"mem\",\n organizationInvitation: \"inv\",\n project: \"prj\",\n projectOrigin: \"por\",\n apiKey: \"key\",\n collection: \"col\",\n collectionVersion: \"clv\",\n entry: \"ent\",\n entrySlugAlias: \"als\",\n entryRevision: \"rev\",\n changeSet: \"chs\",\n changeSetItem: \"csi\",\n changeSetReview: \"csr\",\n changeSetComment: \"csc\",\n changeSetCheck: \"chk\",\n asset: \"ast\",\n assetUpload: \"upl\",\n savedView: \"viw\",\n previewToken: \"prv\",\n webhookEndpoint: \"whk\",\n webhookEvent: \"whe\",\n webhookDelivery: \"whd\",\n auditEvent: \"aud\",\n job: \"job\",\n idempotencyKey: \"idm\",\n billingCustomer: \"bcu\",\n billingSubscription: \"bsu\",\n billingProviderEvent: \"evt\",\n usagePeriod: \"usp\",\n} as const;\n\nexport type IdResource = keyof typeof ID_PREFIXES;\nexport type IdPrefix = (typeof ID_PREFIXES)[IdResource];\n\n/**\n * A branded string type for prefixed IDs of a given resource.\n * `PrefixedId<\"user\">` narrows to `` `usr_${string}` ``.\n */\nexport type PrefixedId<R extends IdResource> = `${(typeof ID_PREFIXES)[R]}_${string}`;\n\n/** Generate a new prefixed monotonic ID for a resource kind. */\nexport function newId<R extends IdResource>(resource: R): PrefixedId<R> {\n const prefix = ID_PREFIXES[resource];\n return `${prefix}_${ulid().toLowerCase()}` as PrefixedId<R>;\n}\n\n/** Generate a new ID from a raw prefix string (escape hatch). */\nexport function newIdWithPrefix(prefix: string): string {\n return `${prefix}_${ulid().toLowerCase()}`;\n}\n\nconst PREFIX_SET: ReadonlySet<string> = new Set(Object.values(ID_PREFIXES));\n\n/** Split a prefixed ID into `{ prefix, body }`, or `null` if malformed. */\nexport function parseId(id: string): { prefix: string; body: string } | null {\n const idx = id.indexOf(\"_\");\n if (idx <= 0 || idx === id.length - 1) return null;\n return { prefix: id.slice(0, idx), body: id.slice(idx + 1) };\n}\n\n/** True if `id` is a well-formed ID for the given resource kind. */\nexport function isId<R extends IdResource>(resource: R, id: string): id is PrefixedId<R> {\n const parsed = parseId(id);\n return parsed !== null && parsed.prefix === ID_PREFIXES[resource];\n}\n\n/** True if `id` carries any known Myna resource prefix. */\nexport function isKnownId(id: string): boolean {\n const parsed = parseId(id);\n return parsed !== null && PREFIX_SET.has(parsed.prefix);\n}\n","/** UTC / date utilities. All Myna timestamps are UTC. */\n\n/** Current instant. */\nexport function now(): Date {\n return new Date();\n}\n\n/** ISO-8601 UTC string (millisecond precision). */\nexport function toIso(date: Date): string {\n return date.toISOString();\n}\n\n/** Parse an ISO string; returns `null` when invalid. */\nexport function parseIso(value: string): Date | null {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nexport function addSeconds(date: Date, seconds: number): Date {\n return new Date(date.getTime() + seconds * 1000);\n}\n\nexport function addDays(date: Date, days: number): Date {\n return addSeconds(date, days * 86_400);\n}\n\nexport function isPast(date: Date, reference: Date = now()): boolean {\n return date.getTime() < reference.getTime();\n}\n\n/** Start of the current UTC calendar month (used for Free-plan usage periods). */\nexport function startOfUtcMonth(date: Date = now()): Date {\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1, 0, 0, 0, 0));\n}\n\n/** Start of the next UTC calendar month. */\nexport function startOfNextUtcMonth(date: Date = now()): Date {\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 1, 0, 0, 0, 0));\n}\n\nexport const SECONDS = 1;\nexport const MINUTES = 60;\nexport const HOURS = 60 * 60;\nexport const DAYS = 24 * 60 * 60;\n","/**\n * Browser origin normalization.\n *\n * An `Origin` request header is always exactly `scheme://host[:port]` — never a\n * trailing slash, never a path. What people configure is whatever their address\n * bar showed them, which usually *does* carry a trailing slash. Comparing the\n * two as raw strings means a perfectly reasonable `https://example.com/` never\n * matches the `https://example.com` the browser sends, and CORS fails with no\n * error anywhere: the API returns 200, the browser discards the response, and\n * the developer sees an unexplained network failure.\n *\n * Normalizing both sides of that comparison is what makes configuration behave\n * the way people expect.\n */\n\n/**\n * Reduce a user-supplied origin to its canonical `scheme://host[:port]` form.\n * Returns undefined for anything that is not an http(s) URL.\n *\n * Paths, queries, and fragments are dropped rather than rejected: someone who\n * pastes `https://example.com/blog` means that site, and refusing it teaches\n * nothing.\n */\nexport function normalizeOrigin(value: string): string | undefined {\n try {\n const url = new URL(value.trim());\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return undefined;\n // `URL.origin` is already the canonical form and drops the default port.\n return url.origin;\n } catch {\n return undefined;\n }\n}\n\n/** Normalize a list, dropping unparseable entries and duplicates, order preserved. */\nexport function normalizeOrigins(values: readonly string[]): string[] {\n const seen = new Set<string>();\n for (const value of values) {\n const normalized = normalizeOrigin(value);\n if (normalized) seen.add(normalized);\n }\n return [...seen];\n}\n","/**\n * Plan and entitlement constants (SPEC section 16).\n *\n * Polar identifiers never drive authorization directly; they map to these\n * internal plan keys and entitlements.\n */\n\nexport const PLAN_KEYS = [\"free\", \"pro\"] as const;\nexport type PlanKey = (typeof PLAN_KEYS)[number];\n\n/** Metered usage metrics tracked per organization. */\nexport const USAGE_METRICS = [\n \"public_api_requests\",\n \"storage_bytes\",\n \"asset_bandwidth_bytes\",\n \"webhook_deliveries\",\n] as const;\nexport type UsageMetric = (typeof USAGE_METRICS)[number];\n\nconst GB = 1024 ** 3;\nconst MB = 1024 ** 2;\n\nexport interface PlanEntitlements {\n key: PlanKey;\n /** Display price for UI only; billing is owned by Polar. */\n priceEurMonthly: number;\n priceEurYearly: number | null;\n maxProjects: number;\n maxMembers: number;\n /** Hard storage allowance in bytes. */\n storageBytes: number;\n /** Soft monthly asset bandwidth allowance in bytes. */\n monthlyBandwidthBytes: number;\n /** Soft monthly public content API request allowance. */\n monthlyPublicApiRequests: number;\n maxWebhookEndpoints: number;\n /** Revision retention in days; `null` means indefinite. */\n revisionRetentionDays: number | null;\n /** Per-file upload ceiling in bytes. */\n maxUploadBytes: number;\n}\n\nexport const PLANS: Record<PlanKey, PlanEntitlements> = {\n free: {\n key: \"free\",\n priceEurMonthly: 0,\n priceEurYearly: 0,\n maxProjects: 2,\n maxMembers: 2,\n storageBytes: 1 * GB,\n monthlyBandwidthBytes: 25 * GB,\n monthlyPublicApiRequests: 10_000,\n maxWebhookEndpoints: 1,\n revisionRetentionDays: 30,\n maxUploadBytes: 50 * MB,\n },\n pro: {\n key: \"pro\",\n priceEurMonthly: 9,\n priceEurYearly: 90,\n maxProjects: 10,\n maxMembers: 5,\n storageBytes: 10 * GB,\n monthlyBandwidthBytes: 250 * GB,\n monthlyPublicApiRequests: 500_000,\n maxWebhookEndpoints: 10,\n revisionRetentionDays: null,\n maxUploadBytes: 250 * MB,\n },\n};\n\nexport function planFor(key: PlanKey): PlanEntitlements {\n return PLANS[key];\n}\n\n/** Soft-limit warning thresholds for metered usage (SPEC 16). */\nexport const USAGE_THRESHOLDS = {\n warn: 0.8,\n atLimit: 1.0,\n throttle: 1.2,\n} as const;\n\n/** Failed-payment grace windows in days (SPEC 16). */\nexport const DUNNING = {\n fullAccessUntilDay: 7,\n restrictedUntilDay: 14,\n downgradeAtDay: 15,\n} as const;\n\n/** Soft-deletion / recovery windows in days. */\nexport const RETENTION = {\n organizationDeletionDays: 30,\n assetDeletionDays: 30,\n pendingUploadHours: 24,\n previewTokenDefaultHours: 24,\n previewTokenMaxDays: 7,\n sessionDays: 30,\n} as const;\n","/**\n * Fractional ranking for editorial ordering.\n *\n * Ranks are strings compared lexicographically, and between any two of them\n * another can always be generated: `\"a0\" < \"a1\" < \"a1V\" < \"a2\"`. That property\n * is the whole point. A numeric `order` field means moving one entry rewrites\n * the position of every entry after it — reordering twenty projects produces\n * twenty revisions, nineteen of which record no editorial decision and bury the\n * one that does. A subdividable string means one move touches one row.\n *\n * Two invariants make it work, and both are maintained by the generators here:\n *\n * 1. A rank is never empty.\n * 2. A rank never ends in the smallest digit. Without this, `\"0\"` could exist,\n * and nothing sorts before `\"0\"` — inserting at the top would be impossible.\n */\n\nconst DIGITS = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nconst MIN_DIGIT = DIGITS[0]!;\nconst LAST_INDEX = DIGITS.length - 1;\n/** Midpoint digit, used whenever an unconstrained choice is needed. */\nconst MID_DIGIT = DIGITS[Math.floor(DIGITS.length / 2)]!;\n\nexport class RankError extends Error {}\n\nfunction indexOf(digit: string): number {\n const index = DIGITS.indexOf(digit);\n if (index === -1) throw new RankError(`\"${digit}\" is not a valid rank digit.`);\n return index;\n}\n\n/** A rank strictly greater than `after` (which may be an empty suffix). */\nfunction rankAfterSuffix(after: string): string {\n let prefix = \"\";\n for (let i = 0; ; i++) {\n if (i >= after.length) {\n // Everything consumed: any appended digit sorts after a proper prefix.\n return prefix + MID_DIGIT;\n }\n const index = indexOf(after[i]!);\n if (index < LAST_INDEX) {\n // Halfway between this digit and the top; never the smallest digit.\n return prefix + DIGITS[Math.floor((index + DIGITS.length) / 2)]!;\n }\n // Already the largest digit — keep it and decide at the next position.\n prefix += after[i]!;\n }\n}\n\n/** A rank strictly less than `before`. */\nfunction rankBeforeString(before: string): string {\n let prefix = \"\";\n for (let i = 0; ; i++) {\n if (i >= before.length) {\n // Only reachable if `before` is all smallest-digits, which invariant 2\n // forbids. Guard rather than loop forever on corrupted data.\n throw new RankError(`Cannot rank before \"${before}\".`);\n }\n const index = indexOf(before[i]!);\n if (index > 1) return prefix + DIGITS[Math.floor(index / 2)]!;\n if (index === 1) {\n // Anything starting with the smallest digit sorts first; append a\n // non-smallest digit so invariant 2 holds.\n return prefix + MIN_DIGIT + MID_DIGIT;\n }\n prefix += MIN_DIGIT;\n }\n}\n\n/**\n * A rank strictly between `a` and `b`. `null` means unbounded on that side.\n * Throws when `a >= b`, which would have no answer.\n */\nexport function rankBetween(a: string | null, b: string | null): string {\n if (a !== null && b !== null && a >= b) {\n throw new RankError(`Cannot rank between \"${a}\" and \"${b}\": out of order.`);\n }\n if (a === null && b === null) return MID_DIGIT;\n if (a === null) return rankBeforeString(b!);\n if (b === null) return rankAfterSuffix(a);\n\n let prefix = \"\";\n for (let i = 0; ; i++) {\n // A shorter `a` behaves as if padded with the smallest digit.\n const digitA = i < a.length ? a[i]! : MIN_DIGIT;\n const digitB = i < b.length ? b[i] : undefined;\n\n if (digitB !== undefined && digitA === digitB) {\n prefix += digitA;\n continue;\n }\n\n const indexA = indexOf(digitA);\n const indexB = digitB !== undefined ? indexOf(digitB) : DIGITS.length;\n\n if (indexB - indexA > 1) {\n // Room between them: take the middle. It exceeds `a` and precedes `b`,\n // and is never the smallest digit because the gap is at least two.\n return prefix + DIGITS[Math.floor((indexA + indexB) / 2)]!;\n }\n\n // Adjacent digits leave no room here. Stay on `a`'s branch — anything under\n // it sorts before `b` — and go past `a`'s remainder.\n return prefix + digitA + rankAfterSuffix(a.slice(i + 1));\n }\n}\n\n/** Largest width to spread a sequence over; 62^4 stays well inside safe integers. */\nconst MAX_WIDTH = 4;\n\n/**\n * Evenly spaced ranks for `count` items, for a full (re)ordering.\n *\n * Spread across the digit space rather than generated by repeated append:\n * appending halves the remaining room each time, so a 200-item collection would\n * end up with 30-character ranks. Even spacing keeps them at two or three\n * characters and leaves room between every neighbouring pair for later\n * single-item moves.\n */\nexport function rankSequence(count: number): string[] {\n if (count <= 0) return [];\n\n let width = 1;\n while (width < MAX_WIDTH && Math.floor(DIGITS.length ** width / (count + 1)) < 2) {\n width += 1;\n }\n const step = Math.floor(DIGITS.length ** width / (count + 1));\n if (step < 1) {\n // More items than the widest spread can separate: fall back to subdivision,\n // which always works even though the ranks grow longer.\n const ranks: string[] = [];\n let previous: string | null = null;\n for (let i = 0; i < count; i++) {\n previous = rankBetween(previous, null);\n ranks.push(previous);\n }\n return ranks;\n }\n\n const ranks: string[] = [];\n for (let i = 1; i <= count; i++) {\n let value = i * step;\n let encoded = \"\";\n for (let d = 0; d < width; d++) {\n encoded = DIGITS[value % DIGITS.length]! + encoded;\n value = Math.floor(value / DIGITS.length);\n }\n // Fixed-width encoding already sorts correctly; a trailing smallest digit\n // would break invariant 2, and appending keeps it below the next value.\n ranks.push(encoded.endsWith(MIN_DIGIT) ? encoded + MID_DIGIT : encoded);\n }\n return ranks;\n}\n\n/** True when `value` is a well-formed rank. */\nexport function isValidRank(value: string): boolean {\n if (value.length === 0) return false;\n if (value.endsWith(MIN_DIGIT)) return false;\n return [...value].every((digit) => DIGITS.includes(digit));\n}\n","/**\n * Release and compatibility contract.\n *\n * `@myna-sh/sdk`, `@myna-sh/cli`, and `@myna-sh/mcp` ship as one lockstep\n * version: they are always published together from the same commit and always\n * carry the same version number. `scripts/check-versions.mjs` enforces that in\n * CI, and `scripts/set-version.mjs` is the only supported way to bump it.\n *\n * The API declares what it speaks through `GET /v1/meta`, so a client never has\n * to guess. `myna doctor` reads it to tell an operator — or an agent — exactly\n * which side is out of date.\n */\n\n/**\n * Dated version of the HTTP API surface. Bump it when request or response\n * shapes change in a way a client can observe. Additive, backward-compatible\n * changes do not need a bump; they are announced through `API_CAPABILITIES`.\n */\nexport const API_VERSION = \"2026-07-24\";\n\n/**\n * Oldest `@myna-sh/{sdk,cli,mcp}` release this API still supports. Clients\n * below this must upgrade; the API does not promise correct behavior for them.\n * Raising this is a breaking change and needs an `API_VERSION` bump.\n */\nexport const MIN_CLIENT_VERSION = \"0.2.0\";\n\n/**\n * Feature flags a client can detect before calling. Add an entry the moment a\n * feature ships; never remove one without bumping `API_VERSION`, because\n * clients branch on these.\n */\nexport const API_CAPABILITIES = [\n \"assets\",\n /** `GET /v1/auth/whoami` reports an API key's scopes and label. */\n \"auth.whoami.scopes\",\n \"billing\",\n \"change-sets\",\n \"change-sets.checks\",\n \"change-sets.comments\",\n \"change-sets.ready-for-review\",\n \"change-sets.reviews\",\n \"change-sets.schedule\",\n \"entries.bulk\",\n \"entries.duplicate\",\n \"entries.import\",\n /** Import matches by slug, updates in place, and skips identical rows. */\n \"entries.import.upsert\",\n /** Fractional-rank editorial ordering; a move writes one row. */\n \"entries.reorder\",\n \"entries.references\",\n \"entries.restore\",\n \"localization\",\n \"previews\",\n /** `?preview=<token>` on content reads composes published + change-set state. */\n \"previews.overlay\",\n \"projects.cors-check\",\n \"projects.export\",\n \"projects.origins\",\n \"projects.views\",\n \"schema.drift\",\n \"schema.promote\",\n \"schema.push\",\n \"webhooks\",\n] as const;\n\nexport type ApiCapability = (typeof API_CAPABILITIES)[number];\n\n/** Parsed semantic version. Pre-release and build metadata are ignored. */\nexport interface SemVer {\n major: number;\n minor: number;\n patch: number;\n}\n\n/** Parse `1.2.3` (with optional `v` prefix and pre-release suffix). */\nexport function parseSemVer(version: string): SemVer | undefined {\n const match = /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/.exec(version.trim());\n if (!match) return undefined;\n return { major: Number(match[1]), minor: Number(match[2]), patch: Number(match[3]) };\n}\n\n/** Compare two versions: negative if `a` is older, 0 if equal, positive if newer. */\nexport function compareSemVer(a: string, b: string): number {\n const left = parseSemVer(a);\n const right = parseSemVer(b);\n if (!left || !right) throw new Error(`Cannot compare versions \"${a}\" and \"${b}\".`);\n return left.major - right.major || left.minor - right.minor || left.patch - right.patch;\n}\n\n/** True when `version` is at least `minimum`. */\nexport function satisfiesMinimum(version: string, minimum: string): boolean {\n return compareSemVer(version, minimum) >= 0;\n}\n","import type { Command } from \"commander\";\nimport type { ApiKeyScope, OrgRole, UpdateProjectRequest, WebhookEventType } from \"@myna-sh/api-contracts\";\nimport { normalizeOrigin } from \"@myna-sh/shared\";\nimport { writeUserConfig } from \"../config.js\";\nimport { UsageError, diag, emit, keyValues, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\n\nfunction csv<T extends string>(value: string): T[] {\n return value.split(\",\").map((s) => s.trim()).filter(Boolean) as T[];\n}\n\nexport function registerAdmin(program: Command): void {\n registerOrganizations(program);\n registerProjects(program);\n registerCors(program);\n registerKeys(program);\n registerMembers(program);\n registerWebhooks(program);\n registerActivity(program);\n registerBilling(program);\n}\n\nfunction registerOrganizations(program: Command): void {\n const orgs = program.command(\"organizations\").alias(\"orgs\").description(\"Manage organizations\");\n\n orgs\n .command(\"list\")\n .description(\"List organizations you belong to\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().organizations.list();\n emit(list, () =>\n table(list, [\n { header: \"SLUG\", value: (o) => o.slug },\n { header: \"NAME\", value: (o) => o.name },\n { header: \"ROLE\", value: (o) => o.role },\n { header: \"PLAN\", value: (o) => o.planKey },\n ]),\n );\n }),\n );\n\n orgs\n .command(\"create\")\n .description(\"Create an organization\")\n .requiredOption(\"--name <name>\", \"organization name\")\n .option(\"--slug <slug>\", \"organization slug\")\n .action(\n handle(async (ctx, _args, opts) => {\n const org = await ctx.management().organizations.create({\n name: opts.name as string,\n slug: opts.slug as string | undefined,\n });\n emit(org, () => diag(`Created ${org.slug} (${org.id}).`));\n }),\n );\n\n orgs\n .command(\"use\")\n .description(\"Set the default organization\")\n .argument(\"<slug>\", \"organization slug or id\")\n .action(\n handle(async (_ctx, args) => {\n writeUserConfig({ defaultOrganization: args[0] as string });\n emit({ defaultOrganization: args[0] as string }, () => diag(`Default organization set to ${args[0] as string}.`));\n }),\n );\n}\n\nfunction registerProjects(program: Command): void {\n const projects = program.command(\"projects\").description(\"Manage projects\");\n\n projects\n .command(\"list\")\n .description(\"List projects in the organization\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().projects.list(ctx.requireOrganization());\n emit(list, () =>\n table(list, [\n { header: \"SLUG\", value: (p) => p.slug },\n { header: \"NAME\", value: (p) => p.name },\n { header: \"PUBLIC API\", value: (p) => (p.publicApiEnabled ? \"on\" : \"off\") },\n { header: \"ARCHIVED\", value: (p) => (p.archivedAt ? \"yes\" : \"\") },\n ]),\n );\n }),\n );\n\n projects\n .command(\"create\")\n .description(\"Create a project\")\n .requiredOption(\"--name <name>\", \"project name\")\n .option(\"--slug <slug>\", \"project slug\")\n .option(\"--timezone <tz>\", \"project timezone\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = await ctx.management().projects.create(ctx.requireOrganization(), {\n name: opts.name as string,\n slug: opts.slug as string | undefined,\n timezone: opts.timezone as string | undefined,\n });\n emit(project, () => diag(`Created ${project.slug} (${project.id}).`));\n }),\n );\n\n projects\n .command(\"inspect\")\n .description(\"Show project details\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n emit(project, () =>\n keyValues([\n [\"ID\", project.id],\n [\"Name\", project.name],\n [\"Slug\", project.slug],\n [\"Timezone\", project.timezone],\n [\"Public API\", project.publicApiEnabled ? \"on\" : \"off\"],\n [\"Origins\", project.origins.join(\", \") || \"(none)\"],\n ]),\n );\n }),\n );\n\n projects\n .command(\"export\")\n .description(\"Export the full project (schemas, entries, asset metadata) as JSON\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const data = await ctx.management().projects.export(ref);\n process.stdout.write(`${JSON.stringify(data, null, 2)}\\n`);\n }),\n );\n\n projects\n .command(\"update\")\n .description(\"Update project settings\")\n .argument(\"[project]\", \"project id or slug\")\n .option(\"--name <name>\", \"project name\")\n .option(\"--timezone <timezone>\", \"IANA timezone\")\n .option(\"--public-api <state>\", \"public API state (on|off)\")\n .option(\"--default-preview-template <template>\", \"default preview URL template\")\n .option(\"--clear-default-preview-template\", \"remove the default preview URL template\")\n .option(\"--origins <urls>\", \"comma-separated allowed origins\")\n .option(\"--clear-origins\", \"remove all allowed origins\")\n .action(\n handle(async (ctx, args, opts) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const patch: UpdateProjectRequest = {};\n if (opts.name !== undefined) patch.name = opts.name as string;\n if (opts.timezone !== undefined) patch.timezone = opts.timezone as string;\n if (opts.publicApi !== undefined) {\n const state = String(opts.publicApi).toLowerCase();\n if (![\"on\", \"off\", \"true\", \"false\"].includes(state)) {\n throw new UsageError(\"--public-api must be on or off.\");\n }\n patch.publicApiEnabled = state === \"on\" || state === \"true\";\n }\n if (opts.defaultPreviewTemplate !== undefined && opts.clearDefaultPreviewTemplate) {\n throw new UsageError(\"Use either --default-preview-template or --clear-default-preview-template, not both.\");\n }\n if (opts.defaultPreviewTemplate !== undefined) {\n patch.defaultPreviewTemplate = opts.defaultPreviewTemplate as string;\n }\n if (opts.clearDefaultPreviewTemplate) patch.defaultPreviewTemplate = null;\n if (opts.origins !== undefined && opts.clearOrigins) {\n throw new UsageError(\"Use either --origins or --clear-origins, not both.\");\n }\n if (opts.origins !== undefined) patch.origins = csv<string>(opts.origins as string);\n if (opts.clearOrigins) patch.origins = [];\n if (Object.keys(patch).length === 0) {\n throw new UsageError(\"Specify at least one project setting to update.\");\n }\n const project = await ctx.management().projects.update(ref, patch);\n emit(project, () => diag(`Updated ${project.slug}.`));\n }),\n );\n\n /**\n * Incremental origin management.\n *\n * `projects update --origins` replaces the whole list, so adding one site\n * means restating every other — and forgetting one silently breaks a live\n * page. These read the current list and write back the change.\n */\n const origins = projects.command(\"origins\").description(\"Manage allowed browser origins\");\n\n origins\n .command(\"list\")\n .description(\"List the project's allowed browser origins\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n emit(project.origins, () =>\n table(\n project.origins.map((origin) => ({ origin })),\n [{ header: \"ORIGIN\", value: (r) => r.origin }],\n ),\n );\n }),\n );\n\n origins\n .command(\"add\")\n .description(\"Allow one or more browser origins\")\n .argument(\"<origins...>\", \"origins, e.g. https://example.com\")\n .option(\"--project <ref>\", \"project id or slug\")\n .action(\n handle(async (ctx, args, opts) => {\n const ref = (opts.project as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n const requested = (args[0] as string[]).map(normalizeOne);\n const next = [...new Set([...project.origins, ...requested])];\n const added = requested.filter((o) => !project.origins.includes(o));\n if (added.length === 0) {\n emit({ origins: project.origins, added: [] }, () => diag(\"Already allowed; nothing to do.\"));\n return;\n }\n const updated = await ctx.management().projects.update(ref, { origins: next });\n emit({ origins: updated.origins, added }, () =>\n diag(`Allowed ${added.join(\", \")} on ${updated.slug}.`),\n );\n }),\n );\n\n origins\n .command(\"remove\")\n .description(\"Stop allowing one or more browser origins\")\n .argument(\"<origins...>\", \"origins to remove\")\n .option(\"--project <ref>\", \"project id or slug\")\n .action(\n handle(async (ctx, args, opts) => {\n const ref = (opts.project as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n const requested = (args[0] as string[]).map(normalizeOne);\n const next = project.origins.filter((o) => !requested.includes(o));\n const removed = project.origins.filter((o) => requested.includes(o));\n if (removed.length === 0) {\n emit({ origins: project.origins, removed: [] }, () => diag(\"Not configured; nothing to do.\"));\n return;\n }\n const updated = await ctx.management().projects.update(ref, { origins: next });\n emit({ origins: updated.origins, removed }, () =>\n diag(`Removed ${removed.join(\", \")} from ${updated.slug}.`),\n );\n }),\n );\n\n projects\n .command(\"archive\")\n .description(\"Archive a project\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.archive(ref);\n emit(project, () => diag(`Archived ${project.slug}.`));\n }),\n );\n}\n\n/** Canonicalize an origin the same way the API does, failing loudly on nonsense. */\nfunction normalizeOne(value: string): string {\n const normalized = normalizeOrigin(value);\n if (!normalized) throw new UsageError(`\"${value}\" is not a valid http(s) origin.`);\n return normalized;\n}\n\nfunction registerCors(program: Command): void {\n program\n .command(\"cors\")\n .description(\"Diagnose browser access to published content\")\n .command(\"check\")\n .description(\"Explain whether a browser at an origin can read this project\")\n .requiredOption(\"--origin <url>\", \"the browser origin to test\")\n .option(\"--collection <key>\", \"also check a specific collection's visibility\")\n .option(\"--project <ref>\", \"project id or slug\")\n .action(\n handle(async (ctx, _args, opts) => {\n const ref = (opts.project as string | undefined) ?? ctx.requireProject();\n const result = await ctx\n .management()\n .projects.corsCheck(ref, opts.origin as string, opts.collection as string | undefined);\n emit(result, () => {\n for (const c of result.checks) {\n process.stdout.write(`${c.ok ? \"✓\" : \"✗\"} ${c.detail}\\n`);\n }\n if (!result.allowed) {\n const failed = result.checks.find((c) => !c.ok);\n if (failed?.id === \"origin\") {\n diag(`\\nAllow it with: myna projects origins add ${result.origin}`);\n } else if (failed?.id === \"publicApi\") {\n diag(\"\\nEnable it with: myna projects update --public-api on\");\n }\n }\n });\n if (!result.allowed) process.exitCode = 1;\n }),\n );\n}\n\nfunction registerKeys(program: Command): void {\n const keys = program.command(\"keys\").description(\"Manage API keys\");\n\n keys\n .command(\"list\")\n .description(\"List API keys for the project (or organization with --org-scope)\")\n .option(\"--org-scope\", \"list organization-scoped keys\", false)\n .action(\n handle(async (ctx, _args, opts) => {\n const list = opts.orgScope\n ? await ctx.management().apiKeys.listForOrganization(ctx.requireOrganization())\n : await ctx.management().apiKeys.listForProject(ctx.requireProject());\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (k) => k.id },\n { header: \"NAME\", value: (k) => k.name },\n { header: \"SCOPES\", value: (k) => k.scopes.join(\",\") },\n { header: \"REVOKED\", value: (k) => (k.revokedAt ? \"yes\" : \"\") },\n ]),\n );\n }),\n );\n\n keys\n .command(\"create\")\n .description(\"Create an API key (project-scoped by default)\")\n .requiredOption(\"--name <name>\", \"key name\")\n .requiredOption(\"--scopes <scopes>\", \"comma-separated scopes\")\n .option(\"--label <label>\", \"agent/integration label\")\n .option(\"--org-scope\", \"create an organization-scoped key\", false)\n .option(\"--expires-at <iso>\", \"expiry (ISO 8601)\")\n .action(\n handle(async (ctx, _args, opts) => {\n const body = {\n name: opts.name as string,\n scopes: csv<ApiKeyScope>(opts.scopes as string),\n label: opts.label as string | undefined,\n expiresAt: opts.expiresAt as string | undefined,\n };\n const result = opts.orgScope\n ? await ctx.management().apiKeys.createForOrganization(ctx.requireOrganization(), body)\n : await ctx.management().apiKeys.createForProject(ctx.requireProject(), body);\n emit(result, () => {\n diag(\"Store this secret now — it will not be shown again.\");\n keyValues([\n [\"ID\", result.key.id],\n [\"Name\", result.key.name],\n [\"Secret\", result.secret],\n ]);\n });\n }),\n );\n\n keys\n .command(\"revoke\")\n .description(\"Revoke an API key\")\n .argument(\"<id>\", \"key id (key_)\")\n .option(\"--org-scope\", \"revoke an organization-scoped key\", false)\n .action(\n handle(async (ctx, args, opts) => {\n if (opts.orgScope) {\n await ctx.management().apiKeys.revokeForOrganization(ctx.requireOrganization(), args[0] as string);\n } else {\n await ctx.management().apiKeys.revokeForProject(ctx.requireProject(), args[0] as string);\n }\n emit({ ok: true }, () => diag(`Revoked ${args[0] as string}.`));\n }),\n );\n}\n\nfunction registerMembers(program: Command): void {\n const members = program.command(\"members\").description(\"Manage organization members\");\n\n members\n .command(\"list\")\n .description(\"List members and pending invitations\")\n .action(\n handle(async (ctx) => {\n const org = ctx.requireOrganization();\n const [list, invites] = await Promise.all([\n ctx.management().members.list(org),\n ctx.management().invitations.list(org).catch(() => []),\n ]);\n emit({ members: list, invitations: invites }, () => {\n table(list, [\n { header: \"USER\", value: (m) => m.username ?? m.userId },\n { header: \"EMAIL\", value: (m) => m.email },\n { header: \"ROLE\", value: (m) => m.role },\n ]);\n if (invites.length > 0) {\n diag(\"\\nPending invitations:\");\n table(invites, [\n { header: \"EMAIL\", value: (i) => i.email },\n { header: \"ROLE\", value: (i) => i.role },\n { header: \"EXPIRES\", value: (i) => i.expiresAt },\n ]);\n }\n });\n }),\n );\n\n members\n .command(\"invite\")\n .description(\"Invite a member by email\")\n .requiredOption(\"--email <email>\", \"invitee email\")\n .requiredOption(\"--role <role>\", \"role (admin|editor|viewer)\")\n .action(\n handle(async (ctx, _args, opts) => {\n const invite = await ctx.management().invitations.create(ctx.requireOrganization(), {\n email: opts.email as string,\n role: opts.role as Exclude<OrgRole, \"owner\">,\n });\n emit(invite, () => diag(`Invited ${invite.email} as ${invite.role}.`));\n }),\n );\n\n members\n .command(\"update\")\n .description(\"Update a member's role\")\n .argument(\"<user>\", \"user id\")\n .requiredOption(\"--role <role>\", \"new role\")\n .action(\n handle(async (ctx, args, opts) => {\n await ctx.management().members.update(ctx.requireOrganization(), args[0] as string, {\n role: opts.role as OrgRole,\n });\n emit({ ok: true }, () => diag(`Updated ${args[0] as string} to ${opts.role as string}.`));\n }),\n );\n\n members\n .command(\"remove\")\n .description(\"Remove a member\")\n .argument(\"<user>\", \"user id\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().members.remove(ctx.requireOrganization(), args[0] as string);\n emit({ ok: true }, () => diag(`Removed ${args[0] as string}.`));\n }),\n );\n}\n\nfunction registerWebhooks(program: Command): void {\n const webhooks = program.command(\"webhooks\").description(\"Manage webhook endpoints\");\n\n webhooks\n .command(\"list\")\n .description(\"List webhook endpoints\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().webhooks.list(ctx.requireProject());\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (w) => w.id },\n { header: \"URL\", value: (w) => w.url },\n { header: \"EVENTS\", value: (w) => w.events.join(\",\") },\n { header: \"ENABLED\", value: (w) => (w.enabled ? \"yes\" : \"no\") },\n ]),\n );\n }),\n );\n\n webhooks\n .command(\"create\")\n .description(\"Create a webhook endpoint\")\n .requiredOption(\"--url <url>\", \"endpoint URL\")\n .requiredOption(\"--events <events>\", \"comma-separated event types\")\n .action(\n handle(async (ctx, _args, opts) => {\n const result = await ctx.management().webhooks.create(ctx.requireProject(), {\n url: opts.url as string,\n events: csv<WebhookEventType>(opts.events as string),\n enabled: true,\n });\n emit(result, () => {\n diag(\"Store this signing secret now — it will not be shown again.\");\n keyValues([\n [\"ID\", result.endpoint.id],\n [\"URL\", result.endpoint.url],\n [\"Signing secret\", result.signingSecret],\n ]);\n });\n }),\n );\n\n webhooks\n .command(\"update\")\n .description(\"Update a webhook endpoint\")\n .argument(\"<id>\", \"webhook id\")\n .option(\"--url <url>\", \"new URL\")\n .option(\"--events <events>\", \"comma-separated event types\")\n .option(\"--enabled <bool>\", \"enable/disable (true|false)\")\n .action(\n handle(async (ctx, args, opts) => {\n const patch: { url?: string; events?: WebhookEventType[]; enabled?: boolean } = {};\n if (opts.url) patch.url = opts.url as string;\n if (opts.events) patch.events = csv<WebhookEventType>(opts.events as string);\n if (opts.enabled !== undefined) patch.enabled = opts.enabled === \"true\";\n const endpoint = await ctx.management().webhooks.update(ctx.requireProject(), args[0] as string, patch);\n emit(endpoint, () => diag(`Updated ${endpoint.id}.`));\n }),\n );\n\n webhooks\n .command(\"delete\")\n .description(\"Delete a webhook endpoint\")\n .argument(\"<id>\", \"webhook id\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().webhooks.delete(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Deleted ${args[0] as string}.`));\n }),\n );\n\n webhooks\n .command(\"deliveries\")\n .description(\"List recent deliveries for a webhook\")\n .argument(\"<id>\", \"webhook id\")\n .action(\n handle(async (ctx, args) => {\n const list = await ctx.management().webhooks.deliveries(ctx.requireProject(), args[0] as string);\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (d) => d.id },\n { header: \"EVENT\", value: (d) => d.eventType },\n { header: \"ATTEMPT\", value: (d) => String(d.attempt) },\n { header: \"STATUS\", value: (d) => d.status },\n { header: \"HTTP\", value: (d) => (d.responseStatus ? String(d.responseStatus) : \"\") },\n ]),\n );\n }),\n );\n\n webhooks\n .command(\"retry\")\n .description(\"Retry a webhook delivery\")\n .argument(\"<webhook>\", \"webhook id\")\n .argument(\"<delivery>\", \"delivery id\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().webhooks.retry(ctx.requireProject(), args[0] as string, args[1] as string);\n emit({ ok: true }, () => diag(`Retrying delivery ${args[1] as string}.`));\n }),\n );\n}\n\nfunction registerActivity(program: Command): void {\n program\n .command(\"activity\")\n .description(\"Show the project activity feed\")\n .option(\"--actor-type <type>\", \"filter by actor type\")\n .option(\"--action <action>\", \"filter by action\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .action(\n handle(async (ctx, _args, opts) => {\n const page = await ctx.management().activity(ctx.requireProject(), {\n actorType: opts.actorType as string | undefined,\n action: opts.action as string | undefined,\n limit: Number(opts.limit),\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"WHEN\", value: (a) => a.createdAt },\n { header: \"ACTOR\", value: (a) => a.actorType },\n { header: \"ACTION\", value: (a) => a.action },\n { header: \"TARGET\", value: (a) => `${a.targetType ?? \"\"} ${a.targetId ?? \"\"}`.trim() },\n ]),\n );\n }),\n );\n}\n\nfunction registerBilling(program: Command): void {\n const billing = program.command(\"billing\").description(\"Billing status and management\");\n\n billing\n .command(\"status\")\n .description(\"Show the organization's plan and usage\")\n .action(\n handle(async (ctx) => {\n const org = ctx.requireOrganization();\n const [status, usage] = await Promise.all([\n ctx.management().billing.status(org),\n ctx.management().organizations.usage(org).catch(() => undefined),\n ]);\n emit({ billing: status, usage }, () => {\n keyValues([\n [\"Plan\", status.subscription.planKey],\n [\"Status\", status.subscription.status],\n [\"Provider customer\", status.hasProviderCustomer ? \"yes\" : \"no\"],\n ]);\n if (usage) {\n diag(\"\\nUsage:\");\n table(usage.metrics, [\n { header: \"METRIC\", value: (m) => m.metric },\n { header: \"USED\", value: (m) => String(m.quantity) },\n { header: \"LIMIT\", value: (m) => (m.limit === null ? \"∞\" : String(m.limit)) },\n ]);\n }\n });\n }),\n );\n\n billing\n .command(\"upgrade\")\n .description(\"Start a Pro checkout\")\n .option(\"--interval <interval>\", \"month|year\", \"month\")\n .action(\n handle(async (ctx, _args, opts) => {\n const result = await ctx.management().billing.checkout(ctx.requireOrganization(), {\n interval: (opts.interval as \"month\" | \"year\") ?? \"month\",\n });\n if (ctx.interactive) openBrowser(result.checkoutUrl);\n emit(result, () => process.stdout.write(`${result.checkoutUrl}\\n`));\n }),\n );\n\n billing\n .command(\"portal\")\n .description(\"Open the billing portal\")\n .action(\n handle(async (ctx) => {\n const result = await ctx.management().billing.portal(ctx.requireOrganization());\n if (ctx.interactive) openBrowser(result.portalUrl);\n emit(result, () => process.stdout.write(`${result.portalUrl}\\n`));\n }),\n );\n}\n","import { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { generateTypesModule, isMynaApiError } from \"@myna-sh/sdk/management\";\nimport { compareSemVer, normalizeOrigin, parseSemVer } from \"@myna-sh/shared\";\nimport type { CollectionSchema } from \"@myna-sh/schema\";\nimport { checkCredential, describeIdentity, fetchMeta, scopesOf } from \"../auth-check.js\";\nimport type { Ctx } from \"../client.js\";\nimport { diag, emit } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { loadLocalSchemas, schemaDirFor } from \"../schema-loader.js\";\nimport { VERSION } from \"../version.js\";\n\n/**\n * `myna doctor` — one command that answers \"why isn't this working?\".\n *\n * Every check reports the same shape so an agent can act on it without parsing\n * prose: an id, a status, what was observed, and the command that fixes it.\n * Checks never throw; a check that cannot run reports `skip` with the reason,\n * because a diagnostic that dies on the first problem cannot diagnose the rest.\n */\n\ntype Status = \"pass\" | \"warn\" | \"fail\" | \"skip\";\n\ninterface Check {\n id: string;\n title: string;\n status: Status;\n detail: string;\n remedy?: string;\n}\n\nconst NPM_REGISTRY = \"https://registry.npmjs.org\";\nconst SCAN_IGNORE = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \".react-router\", \".turbo\", \"coverage\"]);\n\n/**\n * Both markers must be present to call a file \"generated types\".\n *\n * Matching the header alone also matches any source file that merely mentions\n * it — including this one, which is exactly the false positive that shipped the\n * first time. Requiring the emitted registry interface as well keeps the test\n * on output rather than on prose.\n */\nconst GENERATED_MARKERS = [\n \"// Generated by `myna types generate`. Do not edit by hand.\",\n \"export interface MynaCollections {\",\n];\n\nfunction looksGenerated(contents: string): boolean {\n return GENERATED_MARKERS.every((marker) => contents.includes(marker));\n}\n\nfunction check(id: string, title: string, status: Status, detail: string, remedy?: string): Check {\n return remedy ? { id, title, status, detail, remedy } : { id, title, status, detail };\n}\n\n/** Latest published version, or undefined when npm is unreachable. */\nasync function latestPublished(pkg: string): Promise<string | undefined> {\n try {\n const res = await fetch(`${NPM_REGISTRY}/${pkg}/latest`, {\n headers: { accept: \"application/json\" },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) return undefined;\n const body = (await res.json()) as { version?: string };\n return body.version;\n } catch {\n return undefined;\n }\n}\n\nasync function checkCliVersion(): Promise<Check> {\n if (!parseSemVer(VERSION)) {\n return check(\n \"cli.version\",\n \"CLI version\",\n \"warn\",\n `Running an unreleased build (${VERSION}).`,\n \"Install a published release: npm install -g @myna-sh/cli\",\n );\n }\n const latest = await latestPublished(\"@myna-sh/cli\");\n if (!latest) {\n return check(\"cli.version\", \"CLI version\", \"skip\", `${VERSION} (could not reach npm to compare).`);\n }\n const behind = compareSemVer(VERSION, latest) < 0;\n return behind\n ? check(\n \"cli.version\",\n \"CLI version\",\n \"warn\",\n `${VERSION} is behind the latest release ${latest}.`,\n `npm install -g @myna-sh/cli@${latest}`,\n )\n : check(\"cli.version\", \"CLI version\", \"pass\", `${VERSION} is current.`);\n}\n\nfunction checkApi(meta: Awaited<ReturnType<typeof fetchMeta>>, apiUrl: string): Check[] {\n if (!meta) {\n return [\n check(\n \"api.reachable\",\n \"API reachable\",\n \"fail\",\n `No capability descriptor from ${apiUrl}/v1/meta.`,\n \"Check --api-url / MYNA_API_URL and network access. An API older than 0.2.0 does not serve /v1/meta.\",\n ),\n ];\n }\n\n const checks = [\n check(\"api.reachable\", \"API reachable\", \"pass\", `${apiUrl} speaks API ${meta.apiVersion}.`),\n ];\n\n if (!parseSemVer(VERSION)) {\n checks.push(\n check(\"api.compatibility\", \"Client compatibility\", \"skip\", \"Unreleased CLI build; nothing to compare.\"),\n );\n return checks;\n }\n\n const supported = compareSemVer(VERSION, meta.minClientVersion) >= 0;\n checks.push(\n supported\n ? check(\n \"api.compatibility\",\n \"Client compatibility\",\n \"pass\",\n `CLI ${VERSION} meets the minimum supported client ${meta.minClientVersion}.`,\n )\n : check(\n \"api.compatibility\",\n \"Client compatibility\",\n \"fail\",\n `CLI ${VERSION} is older than the minimum client ${meta.minClientVersion} this API supports.`,\n `npm install -g @myna-sh/cli@latest`,\n ),\n );\n return checks;\n}\n\nasync function checkAuth(ctx: Ctx): Promise<Check[]> {\n const status = await checkCredential(ctx.apiUrl, ctx.token, ctx.tokenSource);\n\n if (!status.credentialPresent) {\n return [\n check(\"auth.credential\", \"Credential\", \"fail\", \"No credential found.\", \"myna login\"),\n ];\n }\n if (!status.credentialValid) {\n return [\n check(\n \"auth.credential\",\n \"Credential\",\n \"fail\",\n // The distinction the old `whoami` collapsed.\n `A credential is present (from ${status.source}) but the API rejected it: ${status.error?.detail ?? \"unknown reason\"}.`,\n status.error?.code === \"UNREACHABLE\" ? undefined : \"myna login\",\n ),\n ];\n }\n\n const checks = [\n check(\"auth.credential\", \"Credential\", \"pass\", `Valid — ${describeIdentity(status.identity!)}.`),\n ];\n\n const scopes = scopesOf(status.identity);\n if (scopes) {\n checks.push(\n scopes.length > 0\n ? check(\"auth.scopes\", \"Key scopes\", \"pass\", scopes.join(\", \"))\n : check(\n \"auth.scopes\",\n \"Key scopes\",\n \"fail\",\n \"The key carries no scopes, so every authorized call will be denied.\",\n \"Mint a scoped key: myna keys create --scopes content:read,content:write\",\n ),\n );\n }\n return checks;\n}\n\nasync function checkProject(ctx: Ctx): Promise<Check[]> {\n if (!ctx.project) {\n return [\n check(\n \"project.link\",\n \"Project\",\n \"warn\",\n \"No project selected.\",\n \"myna link --project <project>, or pass --project\",\n ),\n ];\n }\n try {\n const project = await ctx.management().projects.get(ctx.project);\n const where = ctx.linkedRoot ? ` (linked at ${ctx.linkedRoot})` : \"\";\n return [\n check(\"project.link\", \"Project\", \"pass\", `${project.slug}${where}.`),\n project.publicApiEnabled\n ? check(\"project.publicApi\", \"Public API\", \"pass\", \"Enabled.\")\n : check(\n \"project.publicApi\",\n \"Public API\",\n \"warn\",\n \"Disabled — browser and unauthenticated reads will 404.\",\n \"myna projects update --public-api\",\n ),\n ];\n } catch (error) {\n const detail = isMynaApiError(error)\n ? `${error.code} — ${error.detail ?? error.title}`\n : error instanceof Error\n ? error.message\n : String(error);\n return [\n check(\n \"project.link\",\n \"Project\",\n \"fail\",\n `Cannot read project \"${ctx.project}\": ${detail}`,\n \"Check the project ref and that your credential has access to it.\",\n ),\n ];\n }\n}\n\nasync function checkOrigin(ctx: Ctx, origin: string): Promise<Check> {\n const canonical = normalizeOrigin(origin);\n if (!canonical) {\n return check(\"origins\", \"Browser origin\", \"fail\", `\"${origin}\" is not a valid http(s) origin.`);\n }\n if (!ctx.project) {\n return check(\"origins\", \"Browser origin\", \"skip\", \"No project selected.\");\n }\n try {\n const project = await ctx.management().projects.get(ctx.project);\n // Compare canonical forms: a configured trailing slash is the same origin.\n const allowed = project.origins.some((o) => normalizeOrigin(o) === canonical);\n return allowed\n ? check(\"origins\", \"Browser origin\", \"pass\", `${canonical} is allowed on ${project.slug}.`)\n : check(\n \"origins\",\n \"Browser origin\",\n \"fail\",\n `${canonical} is not allowed on ${project.slug}. A browser will discard responses from it. Configured: ${\n project.origins.length > 0 ? project.origins.join(\", \") : \"(none)\"\n }`,\n `myna projects update --origins ${[...project.origins, canonical].join(\",\")}`,\n );\n } catch {\n return check(\"origins\", \"Browser origin\", \"skip\", \"Could not read the project's origins.\");\n }\n}\n\nasync function checkSchema(ctx: Ctx, schemaDir: string | undefined): Promise<Check> {\n const dir = schemaDirFor(ctx.linkedRoot, schemaDir);\n if (!existsSync(dir)) {\n return check(\"schema.drift\", \"Local schema\", \"skip\", `No schema directory at ${dir}.`);\n }\n if (!ctx.project) {\n return check(\"schema.drift\", \"Local schema\", \"skip\", \"No project selected.\");\n }\n let local: CollectionSchema[];\n try {\n local = await loadLocalSchemas(dir);\n } catch (error) {\n return check(\n \"schema.drift\",\n \"Local schema\",\n \"fail\",\n `Could not load schemas from ${dir}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n if (local.length === 0) {\n return check(\"schema.drift\", \"Local schema\", \"skip\", `No collections defined in ${dir}.`);\n }\n try {\n const diff = await ctx\n .management()\n .schema.diff(ctx.project, local as unknown as Record<string, unknown>[]);\n return diff.ops.length === 0\n ? check(\"schema.drift\", \"Local schema\", \"pass\", `${local.length} collection(s) match the deployed schema.`)\n : check(\n \"schema.drift\",\n \"Local schema\",\n \"warn\",\n `${diff.ops.length} undeployed change(s) (${diff.classification}).`,\n \"myna schema diff, then myna schema push\",\n );\n } catch (error) {\n return check(\n \"schema.drift\",\n \"Local schema\",\n \"skip\",\n `Could not diff against the deployed schema: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/** Shallow scan for a file written by `myna types generate`. */\nfunction findGeneratedTypes(root: string, depth = 4): string | undefined {\n let entries: string[];\n try {\n entries = readdirSync(root);\n } catch {\n return undefined;\n }\n const dirs: string[] = [];\n for (const entry of entries) {\n if (SCAN_IGNORE.has(entry) || entry.startsWith(\".\")) continue;\n const full = join(root, entry);\n let stats;\n try {\n stats = statSync(full);\n } catch {\n continue;\n }\n if (stats.isDirectory()) {\n dirs.push(full);\n continue;\n }\n if (!/\\.(ts|d\\.ts)$/.test(entry)) continue;\n try {\n if (looksGenerated(readFileSync(full, \"utf8\"))) return full;\n } catch {\n // Unreadable file; keep scanning.\n }\n }\n if (depth <= 0) return undefined;\n for (const dir of dirs) {\n const found = findGeneratedTypes(dir, depth - 1);\n if (found) return found;\n }\n return undefined;\n}\n\nasync function checkTypes(ctx: Ctx, explicit: string | undefined, schemaDir: string | undefined): Promise<Check> {\n const root = ctx.linkedRoot ?? process.cwd();\n const file = explicit ?? findGeneratedTypes(root);\n if (!file) {\n return check(\"types.freshness\", \"Generated types\", \"skip\", \"No generated types file found.\");\n }\n if (!existsSync(file)) {\n return check(\"types.freshness\", \"Generated types\", \"fail\", `${file} does not exist.`);\n }\n\n const dir = schemaDirFor(ctx.linkedRoot, schemaDir);\n if (!existsSync(dir)) {\n return check(\"types.freshness\", \"Generated types\", \"skip\", `Found ${file} but no schema directory to compare against.`);\n }\n\n try {\n const expected = generateTypesModule(await loadLocalSchemas(dir));\n // Codegen is deterministic, so an exact match is a real freshness signal.\n return readFileSync(file, \"utf8\") === expected\n ? check(\"types.freshness\", \"Generated types\", \"pass\", `${file} matches the local schema.`)\n : check(\n \"types.freshness\",\n \"Generated types\",\n \"warn\",\n `${file} is out of date with the local schema.`,\n `myna types generate --out ${file}`,\n );\n } catch (error) {\n return check(\n \"types.freshness\",\n \"Generated types\",\n \"skip\",\n `Could not regenerate types for comparison: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nconst ICON: Record<Status, string> = { pass: \"✓\", warn: \"!\", fail: \"✗\", skip: \"–\" };\n\nexport function registerDoctor(program: Command): void {\n program\n .command(\"doctor\")\n .description(\"Diagnose CLI, API, credential, project, schema, and origin configuration\")\n .option(\"--origin <url>\", \"also check whether this browser origin is allowed\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .option(\"--types <file>\", \"generated types file to check for freshness\")\n .action(\n handle(async (ctx, _args, opts) => {\n const checks: Check[] = [];\n\n checks.push(await checkCliVersion());\n\n const meta = await fetchMeta(ctx.apiUrl);\n checks.push(...checkApi(meta, ctx.apiUrl));\n\n const auth = await checkAuth(ctx);\n checks.push(...auth);\n\n // Everything below needs a working credential; running it without one\n // produces a wall of failures that all restate the same cause.\n const authed = auth[0]?.status === \"pass\";\n if (authed) {\n checks.push(...(await checkProject(ctx)));\n checks.push(await checkSchema(ctx, opts.schemaDir as string | undefined));\n checks.push(await checkTypes(ctx, opts.types as string | undefined, opts.schemaDir as string | undefined));\n if (opts.origin) checks.push(await checkOrigin(ctx, opts.origin as string));\n } else {\n const deferred: Array<[string, string]> = [\n [\"project.link\", \"Project\"],\n [\"schema.drift\", \"Local schema\"],\n [\"types.freshness\", \"Generated types\"],\n ];\n for (const [id, title] of deferred) {\n checks.push(check(id, title, \"skip\", \"Requires a valid credential.\"));\n }\n }\n\n const failed = checks.filter((c) => c.status === \"fail\").length;\n const warned = checks.filter((c) => c.status === \"warn\").length;\n\n emit({ ok: failed === 0, failed, warned, checks }, () => {\n for (const c of checks) {\n process.stdout.write(`${ICON[c.status]} ${c.title}: ${c.detail}\\n`);\n if (c.remedy && c.status !== \"pass\") process.stdout.write(` → ${c.remedy}\\n`);\n }\n diag(\n failed === 0\n ? warned === 0\n ? \"\\nAll checks passed.\"\n : `\\n${warned} warning(s), no failures.`\n : `\\n${failed} failure(s), ${warned} warning(s).`,\n );\n });\n\n if (failed > 0) process.exitCode = 1;\n }),\n );\n}\n","/**\n * Build-time version stamp.\n *\n * `tsup` substitutes `__MYNA_VERSION__` with the value from `package.json`\n * (see `tsup.config.ts`), so a published binary can never disagree with the\n * package it was published from — the drift class simply stops existing.\n * Running from source (tsx, `turbo dev`) leaves the identifier undefined and\n * falls back to a marker that is obviously not a release.\n */\ndeclare const __MYNA_VERSION__: string | undefined;\n\nexport const VERSION: string =\n typeof __MYNA_VERSION__ === \"string\" ? __MYNA_VERSION__ : \"0.0.0-dev\";\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { readContentRows, type ContentFormat } from \"../content-files.js\";\nimport type { Ctx } from \"../client.js\";\n\n/**\n * `myna sync` — reconcile a content directory into a collection.\n *\n * Migrating a site otherwise means writing a throwaway script that walks files\n * and drives the API once per entry. This does the whole reconciliation in one\n * staged change set: rows that exist are updated, rows that match byte for byte\n * are left alone, new rows are created, and — only when asked — entries with no\n * corresponding file are staged for deletion.\n *\n * Nothing publishes. The result is a change set to review.\n */\n\ninterface SyncPlanEntry {\n collection: string;\n path: string;\n}\n\nasync function isDirectory(path: string): Promise<boolean> {\n const info = await stat(path).catch(() => undefined);\n return Boolean(info?.isDirectory());\n}\n\n/**\n * Work out what to sync.\n *\n * With `--collection`, the directory is that collection's content. Without it,\n * each immediate subdirectory is a collection named after it — the layout most\n * content repositories already have.\n */\nasync function planDirectories(dir: string, collection: string | undefined): Promise<SyncPlanEntry[]> {\n if (!(await isDirectory(dir))) {\n if (!collection) throw new UsageError(\"Syncing a single file needs --collection.\");\n return [{ collection, path: dir }];\n }\n if (collection) return [{ collection, path: dir }];\n\n const children = await readdir(dir);\n const plan: SyncPlanEntry[] = [];\n for (const name of children.sort()) {\n if (name.startsWith(\".\")) continue;\n const full = join(dir, name);\n if (await isDirectory(full)) plan.push({ collection: name, path: full });\n }\n if (plan.length === 0) {\n throw new UsageError(\n `No collection subdirectories in ${dir}. Pass --collection to sync it as one collection.`,\n );\n }\n return plan;\n}\n\nexport function registerSync(program: Command): void {\n program\n .command(\"sync\")\n .description(\"Reconcile a content directory into collections, staged on one change set\")\n .argument(\"<dir>\", \"content directory\")\n .option(\"--collection <key>\", \"treat the directory as one collection instead of one per subdirectory\")\n .option(\"--format <format>\", \"json or markdown-frontmatter (detected from the files by default)\")\n .option(\"--body-field <key>\", \"field that receives the Markdown body\", \"body\")\n .option(\"--change-set <id>\", \"stage onto an existing change set\")\n .option(\"--dry-run\", \"report what would change without writing\", false)\n .option(\"--delete-missing\", \"also stage deletion of entries with no matching file\", false)\n .option(\"--confirm-delete\", \"required consequence flag for --delete-missing\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const dryRun = Boolean(opts.dryRun);\n const deleteMissing = Boolean(opts.deleteMissing);\n if (deleteMissing && !opts.confirmDelete && !dryRun) {\n throw new UsageError(\"--delete-missing removes published content. Add --confirm-delete, or use --dry-run.\");\n }\n\n const plan = await planDirectories(args[0] as string, opts.collection as string | undefined);\n const mgmt = ctx.management();\n\n // One change set for the whole sync, so a migration reviews and\n // publishes as a single decision rather than one per collection.\n let changeSetId = opts.changeSet as string | undefined;\n\n const report: {\n collection: string;\n created: number;\n updated: number;\n unchanged: number;\n invalid: number;\n deleted: number;\n deletedSlugs: string[];\n }[] = [];\n let failed = false;\n\n for (const target of plan) {\n const source = await readContentRows(target.path, {\n format: parseFormat(opts.format as string | undefined),\n bodyField: opts.bodyField as string,\n });\n if (source.rows.length === 0) continue;\n\n const result = await mgmt.entries.import(project, {\n collection: target.collection,\n entries: source.rows.map((r) => (r.slug ? { slug: r.slug, data: r.data } : { data: r.data })),\n dryRun,\n changeSetId,\n mode: \"upsert\",\n });\n if (!result.valid) {\n failed = true;\n for (const row of result.results.filter((r) => r.outcome === \"invalid\")) {\n const where = source.rows[row.index]?.source ?? `row ${row.index}`;\n for (const e of row.errors ?? []) {\n process.stderr.write(` ${where}: ${e.path || \"(entry)\"} ${e.message}\\n`);\n }\n }\n }\n // Reuse the change set the first import created for the rest.\n changeSetId ??= result.changeSetId ?? undefined;\n\n let deleted = 0;\n let deletedSlugs: string[] = [];\n if (deleteMissing && result.valid) {\n const staged = await stageMissingDeletions(\n ctx,\n project,\n target.collection,\n new Set(source.rows.map((r) => r.slug).filter((s): s is string => Boolean(s))),\n changeSetId,\n dryRun,\n );\n deleted = staged.count;\n deletedSlugs = staged.slugs;\n // Deletions can be the only thing a sync does; without capturing\n // their change set the run would report \"nothing to do\" while\n // having staged removals.\n changeSetId ??= staged.changeSetId;\n }\n\n report.push({\n collection: target.collection,\n created: result.summary.created,\n updated: result.summary.updated,\n unchanged: result.summary.unchanged,\n invalid: result.summary.invalid,\n deleted,\n deletedSlugs,\n });\n }\n\n emit({ dryRun, changeSetId: changeSetId ?? null, collections: report, ok: !failed }, () => {\n table(report, [\n { header: \"COLLECTION\", value: (r) => r.collection },\n { header: \"CREATED\", value: (r) => String(r.created) },\n { header: \"UPDATED\", value: (r) => String(r.updated) },\n { header: \"UNCHANGED\", value: (r) => String(r.unchanged) },\n { header: \"DELETED\", value: (r) => String(r.deleted) },\n { header: \"INVALID\", value: (r) => String(r.invalid) },\n ]);\n // A destructive operation must name what it removes. A count alone\n // reads as harmless right up until it is not.\n const removals = report.flatMap((r) => r.deletedSlugs.map((slug) => `${r.collection}/${slug}`));\n if (removals.length > 0) {\n diag(`\\n${dryRun ? \"Would stage\" : \"Staged\"} deletion of ${removals.length} entr(y/ies) with no file:`);\n for (const slug of removals) diag(` − ${slug}`);\n }\n if (dryRun) {\n diag(\"\\nDry run — nothing was written.\");\n } else if (changeSetId) {\n diag(`\\nStaged on change set ${changeSetId}. Review and publish it to go live.`);\n } else {\n diag(\"\\nNothing to do — every file already matches.\");\n }\n });\n\n if (failed) process.exitCode = 1;\n }),\n );\n}\n\n/** Stage deletion of entries whose slug has no file. */\nasync function stageMissingDeletions(\n ctx: Ctx,\n project: string,\n collection: string,\n presentSlugs: Set<string>,\n changeSetId: string | undefined,\n dryRun: boolean,\n): Promise<{ count: number; slugs: string[]; changeSetId: string | undefined }> {\n const mgmt = ctx.management();\n const missing: { id: string; slug: string }[] = [];\n let cursor: string | undefined;\n do {\n const page = await mgmt.entries.list(project, { collection, limit: 100, cursor });\n for (const entry of page.data) {\n if (entry.slug && !presentSlugs.has(entry.slug)) missing.push({ id: entry.id, slug: entry.slug });\n }\n cursor = page.nextCursor ?? undefined;\n } while (cursor);\n\n const slugs = missing.map((m) => m.slug).sort();\n if (missing.length === 0 || dryRun) return { count: missing.length, slugs, changeSetId };\n\n const result = await mgmt.entries.bulk(project, {\n action: \"delete\",\n entryIds: missing.map((m) => m.id),\n changeSetId,\n });\n const succeeded = result.results.filter((r) => r.ok);\n return {\n count: succeeded.length,\n slugs,\n changeSetId: changeSetId ?? succeeded.find((r) => r.changeSetId)?.changeSetId,\n };\n}\n\nfunction parseFormat(value: string | undefined): ContentFormat | undefined {\n if (!value) return undefined;\n if (value === \"json\") return \"json\";\n if (value === \"markdown-frontmatter\" || value === \"markdown\" || value === \"md\") return \"markdown\";\n throw new UsageError(\"--format must be json or markdown-frontmatter.\");\n}\n"],"mappings":"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","names":["resolve","bytes","DEFAULT_API_URL","readFileSync","platform","readFileSync","platform","sleep","existsSync","mkdirSync","writeFileSync","join","mkdirSync","join","existsSync","writeFileSync","DEFAULT_API_URL","mkdirSync","writeFileSync","join","existsSync","join","resolve","existsSync","join","resolve","mkdirSync","join","writeFileSync","readFile","basename","join","readFile","join","basename","mode","existsSync","readFileSync","readdirSync","statSync","join","existsSync","readdirSync","join","statSync","readFileSync","readdir","stat","join","stat","readdir","join","parseFormat"]}
|
|
1
|
+
{"version":3,"sources":["../src/main.ts","../../sdk/src/errors.ts","../../sdk/src/http.ts","../../sdk/src/management.ts","../../sdk/src/codegen.ts","../src/auth-check.ts","../src/config.ts","../src/output.ts","../src/client.ts","../src/runtime.ts","../src/util.ts","../src/commands/auth.ts","../src/commands/workspace.ts","../src/commands/schema.ts","../src/schema-loader.ts","../../schema/src/canonical.ts","../src/dsl-emit.ts","../src/content-files.ts","../src/commands/entries.ts","../src/commands/changes.ts","../src/commands/previews.ts","../src/commands/assets.ts","../../shared/src/ids.ts","../../shared/src/dates.ts","../../shared/src/origins.ts","../../shared/src/plans.ts","../../shared/src/rank.ts","../../shared/src/release.ts","../src/commands/admin.ts","../src/commands/doctor.ts","../src/version.ts","../src/commands/sync.ts"],"sourcesContent":["import { Command, CommanderError } from \"commander\";\nimport { registerAuth } from \"./commands/auth.js\";\nimport { registerWorkspace } from \"./commands/workspace.js\";\nimport { registerSchema } from \"./commands/schema.js\";\nimport { registerEntries } from \"./commands/entries.js\";\nimport { registerChanges } from \"./commands/changes.js\";\nimport { registerPreviews } from \"./commands/previews.js\";\nimport { registerAssets } from \"./commands/assets.js\";\nimport { registerAdmin } from \"./commands/admin.js\";\nimport { registerDoctor } from \"./commands/doctor.js\";\nimport { registerSync } from \"./commands/sync.js\";\nimport { VERSION } from \"./version.js\";\n\nexport { VERSION };\n\nconst GLOBAL_VALUE_FLAGS = new Set([\"--project\", \"--organization\", \"--token\", \"--api-url\"]);\nconst GLOBAL_BOOL_FLAGS = new Set([\"--json\", \"--no-interactive\", \"--interactive\"]);\n\n/**\n * Hoist global flags (which may appear anywhere) to the front so Commander,\n * which only recognizes them on the root program, always parses them.\n */\nfunction normalizeGlobals(argv: string[]): string[] {\n const [node, script, ...rest] = argv;\n const globals: string[] = [];\n const remaining: string[] = [];\n for (let i = 0; i < rest.length; i++) {\n const arg = rest[i]!;\n const eq = arg.indexOf(\"=\");\n const name = eq === -1 ? arg : arg.slice(0, eq);\n if (GLOBAL_BOOL_FLAGS.has(name)) {\n globals.push(arg);\n } else if (GLOBAL_VALUE_FLAGS.has(name)) {\n if (eq === -1) {\n globals.push(arg);\n if (i + 1 < rest.length) globals.push(rest[++i]!);\n } else {\n globals.push(arg);\n }\n } else {\n remaining.push(arg);\n }\n }\n return [node!, script!, ...globals, ...remaining];\n}\n\nexport function buildProgram(): Command {\n const program = new Command();\n program\n .name(\"myna\")\n .description(\"Myna — content infrastructure for developers and agents\")\n .version(VERSION, \"-v, --version\")\n .option(\"--json\", \"emit a single machine-readable JSON value on stdout\")\n .option(\"--project <ref>\", \"project id or slug\")\n .option(\"--organization <ref>\", \"organization id or slug\")\n .option(\"--token <token>\", \"API token (overrides stored credentials)\")\n .option(\"--api-url <url>\", \"API base URL\")\n .option(\"--no-interactive\", \"disable prompts and browser opening\")\n .showHelpAfterError();\n\n registerAuth(program);\n registerDoctor(program);\n registerWorkspace(program);\n registerSchema(program);\n registerEntries(program);\n registerSync(program);\n registerChanges(program);\n registerPreviews(program);\n registerAssets(program);\n registerAdmin(program);\n\n return program;\n}\n\nexport async function main(argv: string[] = process.argv): Promise<void> {\n const program = buildProgram();\n program.exitOverride();\n try {\n await program.parseAsync(normalizeGlobals(argv));\n } catch (error) {\n if (error instanceof CommanderError) {\n if (\n error.code === \"commander.helpDisplayed\" ||\n error.code === \"commander.version\" ||\n error.code === \"commander.help\"\n ) {\n process.exitCode = 0;\n return;\n }\n process.exitCode = 2;\n return;\n }\n process.stderr.write(`error: ${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n }\n}\n","import type { FieldErrorContract, ProblemDetailsContract } from \"../../api-contracts/src/common.js\";\n\n/**\n * Error thrown by both SDK clients when the API returns a non-2xx response.\n * Carries the parsed RFC 9457 problem-details document so callers can branch on\n * the stable `code`, inspect field-level `fields`, and surface the `requestId`.\n */\nexport class MynaApiError extends Error {\n /** HTTP status code. */\n readonly status: number;\n /** Stable machine-readable error code (e.g. `VALIDATION_FAILED`). */\n readonly code: string;\n /** RFC 9457 `type` URI. */\n readonly type: string | undefined;\n /** Human-facing title. */\n readonly title: string;\n /** Longer human-facing detail, when provided. */\n readonly detail: string | undefined;\n /** Server request id for support/correlation. */\n readonly requestId: string | undefined;\n /** Field-level validation errors, when present. */\n readonly fields: FieldErrorContract[] | undefined;\n /** The full parsed problem document (or a synthesized one). */\n readonly problem: ProblemDetailsContract;\n\n constructor(problem: ProblemDetailsContract) {\n super(problem.detail ?? problem.title ?? `Request failed (${problem.status})`);\n this.name = \"MynaApiError\";\n this.status = problem.status;\n this.code = problem.code;\n this.type = problem.type;\n this.title = problem.title;\n this.detail = problem.detail;\n this.requestId = problem.requestId;\n this.fields = problem.fields;\n this.problem = problem;\n Object.setPrototypeOf(this, MynaApiError.prototype);\n }\n\n static is(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n }\n}\n\n/** Type guard for `MynaApiError`. */\nexport function isMynaApiError(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n}\n\n/** Build a `MynaApiError` from an arbitrary response body and status. */\nexport function problemFromResponse(status: number, body: unknown, fallbackTitle: string): MynaApiError {\n if (body && typeof body === \"object\" && \"code\" in body && \"status\" in body) {\n return new MynaApiError(body as ProblemDetailsContract);\n }\n const detail =\n body && typeof body === \"object\" && \"error\" in body && typeof (body as { error: unknown }).error === \"string\"\n ? (body as { error: string }).error\n : typeof body === \"string\" && body\n ? body\n : undefined;\n return new MynaApiError({\n type: \"about:blank\",\n title: fallbackTitle,\n status,\n code: status >= 500 ? \"INTERNAL\" : \"REQUEST_FAILED\",\n detail,\n } as ProblemDetailsContract);\n}\n","import { problemFromResponse } from \"./errors.js\";\n\n/** A fetch-compatible function. */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface RetryOptions {\n /**\n * Maximum number of retries (in addition to the first attempt).\n * Defaults to 3 on a server and 1 in a browser — see `defaultMaxRetries`.\n */\n maxRetries?: number;\n /** Base backoff in milliseconds (exponential). Default 200. */\n baseDelayMs?: number;\n /** Cap on any single backoff. Default 5000. */\n maxDelayMs?: number;\n /**\n * Retries for transport-level failures (`fetch` rejecting outright).\n * Defaults to 1, and to 0 in a browser.\n *\n * In a browser these are usually permanent, not transient: a blocked CORS\n * response, a disallowed origin, an extension cancelling the request. They\n * are indistinguishable from a dropped connection — `fetch` rejects with an\n * opaque `TypeError` either way — so retrying converts one clear failure into\n * an identical wall of them, which is what buries the real cause.\n */\n maxNetworkRetries?: number;\n}\n\n/** Browsers get conservative retry defaults; servers keep the aggressive ones. */\nfunction inBrowser(): boolean {\n return typeof globalThis === \"object\" && \"document\" in globalThis;\n}\n\nfunction defaultMaxRetries(): number {\n return inBrowser() ? 1 : 3;\n}\n\nfunction defaultMaxNetworkRetries(): number {\n return inBrowser() ? 0 : 1;\n}\n\nexport interface HttpClientOptions {\n /** Base URL including the version prefix, e.g. `https://api.myna.sh/v1`. */\n baseUrl: string;\n /** Bearer credential (API key, preview token, or CLI token). */\n token?: string | undefined;\n /** Custom fetch implementation (browser/undici/node). */\n fetch?: FetchLike | undefined;\n /** Extra default headers merged into every request. */\n headers?: Record<string, string> | undefined;\n /** Retry policy. Retries apply to safe reads and idempotent mutations only. */\n retry?: RetryOptions | undefined;\n}\n\nexport interface RequestOptions {\n query?: Record<string, unknown> | undefined;\n body?: unknown;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n /** Sending an idempotency key makes a mutation eligible for automatic retry. */\n idempotencyKey?: string | undefined;\n /** Override the bearer token for a single request (e.g. a preview token). */\n token?: string | undefined;\n}\n\nconst RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);\nconst SAFE_METHODS = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n\nfunction resolveFetch(custom?: FetchLike): FetchLike {\n if (custom) return custom;\n if (typeof globalThis.fetch === \"function\") return globalThis.fetch.bind(globalThis) as FetchLike;\n throw new Error(\"No fetch implementation available. Pass `fetch` to the Myna client.\");\n}\n\n/** Serialize a query object, supporting nested `filter[field][op]` shapes. */\nexport function buildQuery(query: Record<string, unknown> | undefined): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n const append = (key: string, value: unknown): void => {\n if (value === undefined || value === null) return;\n if (Array.isArray(value)) {\n params.set(key, value.join(\",\"));\n return;\n }\n if (typeof value === \"object\") {\n for (const [op, v] of Object.entries(value as Record<string, unknown>)) {\n append(`${key}[${op}]`, v);\n }\n return;\n }\n params.set(key, String(value));\n };\n for (const [key, value] of Object.entries(query)) append(key, value);\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason ?? new Error(\"Aborted\"));\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason ?? new Error(\"Aborted\"));\n },\n { once: true },\n );\n });\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly token: string | undefined;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly retry: Required<RetryOptions>;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.token = options.token;\n this.fetchImpl = resolveFetch(options.fetch);\n this.defaultHeaders = options.headers ?? {};\n this.retry = {\n maxRetries: options.retry?.maxRetries ?? defaultMaxRetries(),\n baseDelayMs: options.retry?.baseDelayMs ?? 200,\n maxDelayMs: options.retry?.maxDelayMs ?? 5000,\n maxNetworkRetries: options.retry?.maxNetworkRetries ?? defaultMaxNetworkRetries(),\n };\n }\n\n /**\n * Share one in-flight request between identical concurrent safe reads.\n *\n * Several components asking for the same collection on first paint is the\n * normal shape of a page, not a mistake, and issuing N identical requests\n * multiplies both latency and any failure. Only GET/HEAD are pooled, and only\n * while in flight — this is request coalescing, not a cache.\n */\n private readonly inFlight = new Map<string, Promise<Response>>();\n\n private dedupe(key: string, run: () => Promise<Response>): Promise<Response> {\n const existing = this.inFlight.get(key);\n // Each caller needs its own Response: a body can only be read once.\n if (existing) return existing.then((response) => response.clone());\n const started = run();\n this.inFlight.set(key, started);\n const cleanup = (): void => {\n if (this.inFlight.get(key) === started) this.inFlight.delete(key);\n };\n started.then(cleanup, cleanup);\n return started.then((response) => response.clone());\n }\n\n /** Perform a request and unwrap the `{ data }` envelope. */\n async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n if (raw.status === 204 || raw.status === 304) return undefined as T;\n const parsed = (await raw.json().catch(() => undefined)) as { data?: T } | undefined;\n return (parsed && \"data\" in parsed ? parsed.data : (parsed as unknown)) as T;\n }\n\n /** Perform a request and return the full parsed body (envelope included). */\n async requestEnvelope<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n return (await raw.json().catch(() => ({}))) as T;\n }\n\n /** Low-level request with retries; throws `MynaApiError` on non-2xx. */\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const url = `${this.baseUrl}${path}${buildQuery(options.query)}`;\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...this.defaultHeaders,\n ...options.headers,\n };\n const token = options.token ?? this.token;\n if (token) headers.authorization = `Bearer ${token}`;\n\n let payload: BodyInit | undefined;\n if (options.body !== undefined) {\n if (options.body instanceof Uint8Array || typeof options.body === \"string\") {\n payload = options.body as BodyInit;\n } else {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(options.body);\n }\n }\n if (options.idempotencyKey) headers[\"idempotency-key\"] = options.idempotencyKey;\n\n const upper = method.toUpperCase();\n const safe = SAFE_METHODS.has(upper);\n const idempotent = safe || Boolean(options.idempotencyKey);\n const init: RequestInit = { method, headers };\n if (payload !== undefined) init.body = payload;\n if (options.signal) init.signal = options.signal;\n\n // Coalesce identical concurrent safe reads. Requests carrying a signal opt\n // out: one caller aborting must not cancel another's request.\n if (safe && !options.signal && (upper === \"GET\" || upper === \"HEAD\")) {\n const key = `${upper} ${url} ${token ?? \"\"}`;\n return this.dedupe(key, () => this.attempt(url, init, idempotent, options));\n }\n return this.attempt(url, init, idempotent, options);\n }\n\n private async attempt(\n url: string,\n init: RequestInit,\n idempotent: boolean,\n options: RequestOptions,\n ): Promise<Response> {\n let attempt = 0;\n let networkAttempt = 0;\n for (;;) {\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (error) {\n // A rejected fetch is a transport failure, budgeted separately from\n // HTTP-level retries: in a browser it is usually permanent (CORS, a\n // blocked request), and repeating it only multiplies the noise.\n if (\n idempotent &&\n networkAttempt < this.retry.maxNetworkRetries &&\n attempt < this.retry.maxRetries &&\n !isAbort(error)\n ) {\n await sleep(this.backoff(attempt), options.signal);\n attempt++;\n networkAttempt++;\n continue;\n }\n throw error;\n }\n\n if (response.ok) return response;\n\n if (idempotent && RETRYABLE_STATUS.has(response.status) && attempt < this.retry.maxRetries) {\n const retryAfter = retryAfterMs(response);\n await sleep(retryAfter ?? this.backoff(attempt), options.signal);\n attempt++;\n continue;\n }\n\n const body = await response.json().catch(() => undefined);\n throw problemFromResponse(response.status, body, response.statusText || \"Request failed\");\n }\n }\n\n private backoff(attempt: number): number {\n const base = Math.min(this.retry.baseDelayMs * 2 ** attempt, this.retry.maxDelayMs);\n return Math.round(base * (0.5 + Math.random() * 0.5));\n }\n}\n\nfunction retryAfterMs(response: Response): number | undefined {\n const header = response.headers.get(\"retry-after\");\n if (!header) return undefined;\n const seconds = Number(header);\n return Number.isFinite(seconds) ? seconds * 1000 : undefined;\n}\n\nfunction isAbort(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n );\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type {\n AcceptInvitationResponse,\n ApiKeyContract,\n CreateApiKeyRequest,\n CreateApiKeyResponse,\n CreateInvitationRequest,\n CreateOrganizationRequest,\n InvitationContract,\n MemberContract,\n OrganizationContract,\n UpdateMemberRequest,\n UpdateOrganizationRequest,\n} from \"../../api-contracts/src/organizations.js\";\nimport type { ActivityEventContract } from \"../../api-contracts/src/activity.js\";\nimport type {\n AssetContract,\n CompleteUploadResponse,\n CreateUploadRequest,\n CreateUploadResponse,\n ReplaceAssetRequest,\n UpdateAssetRequest,\n} from \"../../api-contracts/src/assets.js\";\nimport type {\n BillingResponse,\n CheckoutRequest,\n CheckoutResponse,\n PortalResponse,\n} from \"../../api-contracts/src/billing.js\";\nimport type {\n ChangeSetCheckContract,\n ChangeSetCommentContract,\n ChangeSetContract,\n ChangeSetReviewContract,\n CreateChangeSetCommentRequest,\n CreateChangeSetRequest,\n RequestReviewRequest,\n ReviewDecisionRequest,\n RunChecksResponse,\n UpdateChangeSetRequest,\n} from \"../../api-contracts/src/change-sets.js\";\nimport type {\n CollectionContract,\n CollectionVersionContract,\n SchemaDiffResponse,\n SchemaDriftResponse,\n SchemaPushResponse,\n} from \"../../api-contracts/src/collections.js\";\nimport type {\n BulkEntriesRequest,\n BulkEntriesResponse,\n EntryContract,\n EntryReferencesResponse,\n ImportEntriesRequest,\n ImportEntriesResponse,\n ReorderEntriesRequest,\n ReorderEntriesResponse,\n RestoreRevisionResponse,\n RevisionContract,\n} from \"../../api-contracts/src/entries.js\";\nimport type { CreatePreviewRequest, PreviewContract } from \"../../api-contracts/src/previews.js\";\nimport type {\n CorsCheckResponse,\n CreateProjectRequest,\n CreateSavedViewRequest,\n ProjectContract,\n ProjectExportResponse,\n SavedViewContract,\n UpdateProjectRequest,\n} from \"../../api-contracts/src/projects.js\";\nimport type { UsageResponse } from \"../../api-contracts/src/usage.js\";\nimport type {\n CreateWebhookRequest,\n CreateWebhookResponse,\n UpdateWebhookRequest,\n WebhookDeliveryContract,\n WebhookEndpointContract,\n} from \"../../api-contracts/src/webhooks.js\";\nimport { HttpClient, type FetchLike, type RetryOptions } from \"./http.js\";\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface ManagementClientOptions {\n /** Management/CLI credential (`myna_sk_...`). */\n token: string;\n /** API origin. Defaults to `https://api.myna.sh`. */\n apiUrl?: string;\n fetch?: FetchLike;\n retry?: RetryOptions;\n /**\n * Idempotency-key factory for mutations. Defaults to a random UUID per call.\n * Pass a stable value to make a specific mutation replay-safe.\n */\n idempotencyKey?: () => string;\n}\n\nexport interface ListOptions {\n limit?: number;\n cursor?: string;\n signal?: AbortSignal;\n}\n\nexport interface Page<T> {\n data: T[];\n nextCursor: string | null;\n}\n\nexport interface UploadAssetMeta {\n filename?: string;\n contentType?: string;\n /** Override the automatically detected byte length. */\n byteSize?: number;\n}\n\n/** Bytes or a filesystem path accepted by `uploadAsset`. */\nexport type AssetInput = string | Uint8Array | ArrayBuffer;\n\n/**\n * Server-only management client (SPEC 12). Typed wrappers over the full\n * management API surface. Mutations automatically carry an `Idempotency-Key`.\n */\nexport class ManagementClient {\n private readonly http: HttpClient;\n private readonly newIdempotencyKey: () => string;\n private readonly fetchImpl: FetchLike;\n\n constructor(options: ManagementClientOptions) {\n if (!options.token) throw new Error(\"createManagementClient: `token` is required.\");\n this.newIdempotencyKey = options.idempotencyKey ?? (() => randomUUID());\n this.fetchImpl = options.fetch ?? ((input, init) => fetch(input, init));\n this.http = new HttpClient({\n baseUrl: `${(options.apiUrl ?? DEFAULT_API_URL).replace(/\\/+$/, \"\")}/v1`,\n token: options.token,\n fetch: options.fetch,\n retry: options.retry,\n });\n }\n\n // Convenience: idempotency key for a mutation.\n private idem(): string {\n return this.newIdempotencyKey();\n }\n\n private get<T>(path: string, query?: Record<string, unknown>, signal?: AbortSignal): Promise<T> {\n return this.http.request<T>(\"GET\", path, { query, signal });\n }\n\n /**\n * Paged GET. Extra filters are merged into the query rather than appended to\n * the path: the client builds its own query string from `options.query`, so a\n * path that already carries one produces `?a=1?limit=25` — a second `?` that\n * silently becomes part of the previous value.\n */\n private async page<T>(\n path: string,\n opts: ListOptions = {},\n filters: Record<string, unknown> = {},\n ): Promise<Page<T>> {\n const body = await this.http.requestEnvelope<{ data: T[]; pagination: { nextCursor: string | null } }>(\n \"GET\",\n path,\n { query: { ...filters, limit: opts.limit, cursor: opts.cursor }, signal: opts.signal },\n );\n return { data: body.data, nextCursor: body.pagination?.nextCursor ?? null };\n }\n\n private mutate<T>(method: string, path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.http.request<T>(method, path, { body, query, idempotencyKey: this.idem() });\n }\n\n // --- Organizations --------------------------------------------------------\n readonly organizations = {\n list: (signal?: AbortSignal): Promise<OrganizationContract[]> =>\n this.get<OrganizationContract[]>(\"/organizations\", undefined, signal),\n create: (body: CreateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"POST\", \"/organizations\", body),\n get: (organization: string, signal?: AbortSignal): Promise<OrganizationContract> =>\n this.get<OrganizationContract>(`/organizations/${enc(organization)}`, undefined, signal),\n update: (organization: string, body: UpdateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"PATCH\", `/organizations/${enc(organization)}`, body),\n delete: (organization: string): Promise<{ ok: boolean; recoverableForDays: number }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}`),\n export: (organization: string): Promise<{ jobId: string; storageKey: string; downloadUrl: string; ready: boolean }> =>\n this.mutate(\"POST\", `/organizations/${enc(organization)}/export`),\n usage: (organization: string, signal?: AbortSignal): Promise<UsageResponse> =>\n this.get<UsageResponse>(`/organizations/${enc(organization)}/usage`, undefined, signal),\n };\n\n // --- Members & invitations ------------------------------------------------\n readonly members = {\n list: (organization: string, signal?: AbortSignal): Promise<MemberContract[]> =>\n this.get<MemberContract[]>(`/organizations/${enc(organization)}/members`, undefined, signal),\n update: (organization: string, user: string, body: UpdateMemberRequest): Promise<{ ok: boolean }> =>\n this.mutate(\"PATCH\", `/organizations/${enc(organization)}/members/${enc(user)}`, body),\n remove: (organization: string, user: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/members/${enc(user)}`),\n };\n\n readonly invitations = {\n list: (organization: string, signal?: AbortSignal): Promise<InvitationContract[]> =>\n this.get<InvitationContract[]>(`/organizations/${enc(organization)}/invitations`, undefined, signal),\n create: (organization: string, body: CreateInvitationRequest): Promise<InvitationContract> =>\n this.mutate<InvitationContract>(\"POST\", `/organizations/${enc(organization)}/invitations`, body),\n revoke: (organization: string, invitation: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/invitations/${enc(invitation)}`),\n accept: (token: string): Promise<AcceptInvitationResponse> =>\n this.mutate<AcceptInvitationResponse>(\"POST\", `/invitations/${enc(token)}/accept`),\n };\n\n // --- Projects -------------------------------------------------------------\n readonly projects = {\n list: (organization: string, signal?: AbortSignal): Promise<ProjectContract[]> =>\n this.get<ProjectContract[]>(`/organizations/${enc(organization)}/projects`, undefined, signal),\n create: (organization: string, body: CreateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/organizations/${enc(organization)}/projects`, body),\n get: (project: string, signal?: AbortSignal): Promise<ProjectContract> =>\n this.get<ProjectContract>(`/projects/${enc(project)}`, undefined, signal),\n update: (project: string, body: UpdateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"PATCH\", `/projects/${enc(project)}`, body),\n archive: (project: string): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/projects/${enc(project)}/archive`),\n /** Full project export: schemas, entries (draft + published), asset metadata. */\n export: (project: string, signal?: AbortSignal): Promise<ProjectExportResponse> =>\n this.get<ProjectExportResponse>(`/projects/${enc(project)}/export`, undefined, signal),\n /** Why a browser at `origin` can or cannot read this project's content. */\n corsCheck: (\n project: string,\n origin: string,\n collection?: string,\n signal?: AbortSignal,\n ): Promise<CorsCheckResponse> =>\n this.get<CorsCheckResponse>(\n `/projects/${enc(project)}/cors-check`,\n collection ? { origin, collection } : { origin },\n signal,\n ),\n views: (project: string, signal?: AbortSignal): Promise<SavedViewContract[]> =>\n this.get<SavedViewContract[]>(`/projects/${enc(project)}/views`, undefined, signal),\n createView: (project: string, body: CreateSavedViewRequest): Promise<SavedViewContract> =>\n this.mutate<SavedViewContract>(\"POST\", `/projects/${enc(project)}/views`, body),\n deleteView: (project: string, view: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/views/${enc(view)}`),\n };\n\n // --- Schema ---------------------------------------------------------------\n readonly schema = {\n collections: (project: string, signal?: AbortSignal): Promise<CollectionContract[]> =>\n this.get<CollectionContract[]>(`/projects/${enc(project)}/collections`, undefined, signal),\n collection: (project: string, key: string, signal?: AbortSignal): Promise<CollectionContract> =>\n this.get<CollectionContract>(`/projects/${enc(project)}/collections/${enc(key)}`, undefined, signal),\n versions: (project: string, key: string, signal?: AbortSignal): Promise<CollectionVersionContract[]> =>\n this.get<CollectionVersionContract[]>(`/projects/${enc(project)}/collections/${enc(key)}/versions`, undefined, signal),\n diff: (project: string, collections: Record<string, unknown>[]): Promise<SchemaDiffResponse> =>\n this.mutate<SchemaDiffResponse>(\"POST\", `/projects/${enc(project)}/schema/diff`, { collections }),\n push: (\n project: string,\n collections: Record<string, unknown>[],\n opts: { allowDestructive?: boolean; changeSummary?: string } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/push`, {\n collections,\n allowDestructive: opts.allowDestructive ?? false,\n changeSummary: opts.changeSummary,\n }),\n // Environments as projects\n drift: (project: string, against: string, signal?: AbortSignal): Promise<SchemaDriftResponse> =>\n this.get<SchemaDriftResponse>(`/projects/${enc(project)}/schema/drift`, { against }, signal),\n promote: (\n project: string,\n fromProject: string,\n opts: { allowDestructive?: boolean } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/promote`, {\n fromProject,\n allowDestructive: opts.allowDestructive ?? false,\n confirm: true,\n }),\n };\n\n // --- Entries & revisions --------------------------------------------------\n readonly entries = {\n list: (\n project: string,\n opts: ListOptions & { collection?: string; status?: string } = {},\n ): Promise<Page<EntryContract>> =>\n this.page<EntryContract>(`/projects/${enc(project)}/entries`, opts, {\n collection: opts.collection,\n status: opts.status,\n }),\n create: (\n project: string,\n body: { collection: string; slug?: string; data: Record<string, unknown>; changeSetId?: string; changeSummary?: string },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries`, body),\n get: (project: string, entry: string, signal?: AbortSignal): Promise<EntryContract> =>\n this.get<EntryContract>(`/projects/${enc(project)}/entries/${enc(entry)}`, undefined, signal),\n update: (\n project: string,\n entry: string,\n body: {\n data?: Record<string, unknown>;\n slug?: string;\n expectedRevisionId?: string;\n changeSetId?: string;\n changeSummary?: string;\n },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"PATCH\", `/projects/${enc(project)}/entries/${enc(entry)}`, body),\n delete: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/entries/${enc(entry)}`, undefined, { changeSetId }),\n unpublish: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/unpublish`, undefined, { changeSetId }),\n restore: (project: string, entry: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/restore`),\n duplicate: (project: string, entry: string, changeSetId?: string): Promise<EntryContract> =>\n this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/duplicate`, {\n changeSetId,\n }),\n bulk: (project: string, body: BulkEntriesRequest): Promise<BulkEntriesResponse> =>\n this.mutate<BulkEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/bulk`, body),\n /**\n * Set a collection's editorial order. Not staged on a change set — ranks\n * are arrangement rather than content and take effect immediately, which\n * is why `confirm` is required.\n */\n reorder: (\n project: string,\n collection: string,\n body: Omit<ReorderEntriesRequest, \"confirm\">,\n ): Promise<ReorderEntriesResponse> =>\n this.mutate<ReorderEntriesResponse>(\n \"POST\",\n `/projects/${enc(project)}/collections/${enc(collection)}/reorder`,\n { ...body, confirm: true },\n ),\n import: (project: string, body: ImportEntriesRequest): Promise<ImportEntriesResponse> =>\n this.mutate<ImportEntriesResponse>(\"POST\", `/projects/${enc(project)}/entries/import`, body),\n references: (project: string, entry: string, signal?: AbortSignal): Promise<EntryReferencesResponse> =>\n this.get<EntryReferencesResponse>(`/projects/${enc(project)}/entries/${enc(entry)}/references`, undefined, signal),\n revisions: (project: string, entry: string, signal?: AbortSignal): Promise<RevisionContract[]> =>\n this.get<RevisionContract[]>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions`, undefined, signal),\n revision: (project: string, entry: string, revision: string, signal?: AbortSignal): Promise<RevisionContract> =>\n this.get<RevisionContract>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}`, undefined, signal),\n restoreRevision: (project: string, entry: string, revision: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\n \"POST\",\n `/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}/restore`,\n ),\n };\n\n // --- Change sets ----------------------------------------------------------\n readonly changeSets = {\n list: (project: string, opts: ListOptions & { status?: string } = {}): Promise<Page<ChangeSetContract>> =>\n this.page<ChangeSetContract>(`/projects/${enc(project)}/change-sets`, opts, { status: opts.status }),\n create: (project: string, body: CreateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets`, body),\n get: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetContract> =>\n this.get<ChangeSetContract>(`/projects/${enc(project)}/change-sets/${enc(changeSet)}`, undefined, signal),\n update: (project: string, changeSet: string, body: UpdateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"PATCH\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}`, body),\n validate: (project: string, changeSet: string): Promise<{ valid: boolean; errors: ValidationIssue[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/validate`),\n publish: (\n project: string,\n changeSet: string,\n ): Promise<{ changeSet: ChangeSetContract; publishedEntryIds: string[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/publish`, { confirm: true }),\n close: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/close`),\n // Scheduled publishing\n schedule: (project: string, changeSet: string, publishAt: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`, {\n publishAt,\n }),\n cancelSchedule: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"DELETE\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/schedule`),\n // Reviews & approvals\n reviews: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetReviewContract[]> =>\n this.get<ChangeSetReviewContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`,\n undefined,\n signal,\n ),\n requestReview: (project: string, changeSet: string, body: RequestReviewRequest): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews`, body),\n removeReviewer: (project: string, changeSet: string, reviewer: string): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"DELETE\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/reviews/${enc(reviewer)}`,\n ),\n approve: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/approve`, body),\n requestChanges: (project: string, changeSet: string, body: ReviewDecisionRequest = {}): Promise<ChangeSetReviewContract[]> =>\n this.mutate<ChangeSetReviewContract[]>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/request-changes`,\n body,\n ),\n // Comments\n comments: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCommentContract[]> =>\n this.get<ChangeSetCommentContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`,\n undefined,\n signal,\n ),\n comment: (project: string, changeSet: string, body: CreateChangeSetCommentRequest): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments`, body),\n resolveComment: (project: string, changeSet: string, comment: string, resolved = true): Promise<ChangeSetCommentContract> =>\n this.mutate<ChangeSetCommentContract>(\n \"PATCH\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/comments/${enc(comment)}`,\n { resolved },\n ),\n // Automated checks\n checks: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetCheckContract[]> =>\n this.get<ChangeSetCheckContract[]>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks`,\n undefined,\n signal,\n ),\n runChecks: (project: string, changeSet: string): Promise<RunChecksResponse> =>\n this.mutate<RunChecksResponse>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/run`),\n };\n\n // --- Previews -------------------------------------------------------------\n readonly previews = {\n create: (project: string, body: CreatePreviewRequest): Promise<PreviewContract> =>\n this.mutate<PreviewContract>(\"POST\", `/projects/${enc(project)}/previews`, body),\n list: (project: string, signal?: AbortSignal): Promise<PreviewContract[]> =>\n this.get<PreviewContract[]>(`/projects/${enc(project)}/previews`, undefined, signal),\n revoke: (project: string, preview: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/previews/${enc(preview)}`),\n };\n\n // --- Assets ---------------------------------------------------------------\n readonly assets = {\n createUpload: (project: string, body: CreateUploadRequest): Promise<CreateUploadResponse> =>\n this.mutate<CreateUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads`, body),\n completeUpload: (project: string, upload: string): Promise<AssetContract> =>\n this.mutate<CompleteUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads/${enc(upload)}/complete`).then(\n (r) => r.asset,\n ),\n list: (project: string, opts: ListOptions = {}): Promise<Page<AssetContract>> =>\n this.page<AssetContract>(`/projects/${enc(project)}/assets`, opts),\n get: (project: string, asset: string, signal?: AbortSignal): Promise<AssetContract> =>\n this.get<AssetContract>(`/projects/${enc(project)}/assets/${enc(asset)}`, undefined, signal),\n usage: (project: string, asset: string, signal?: AbortSignal): Promise<{ asset: AssetContract; usage: { entryIds: string[] } }> =>\n this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, { usage: \"true\" }, signal),\n update: (project: string, asset: string, body: UpdateAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"PATCH\", `/projects/${enc(project)}/assets/${enc(asset)}`, body),\n replace: (project: string, asset: string, body: ReplaceAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"POST\", `/projects/${enc(project)}/assets/${enc(asset)}/replace`, body),\n delete: (project: string, asset: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/assets/${enc(asset)}`),\n /** Full presigned upload flow: create → PUT bytes → complete. */\n upload: (project: string, input: AssetInput, meta: UploadAssetMeta = {}): Promise<AssetContract> =>\n this.uploadAsset(project, input, meta),\n };\n\n // --- API keys -------------------------------------------------------------\n readonly apiKeys = {\n listForOrganization: (organization: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/organizations/${enc(organization)}/api-keys`, undefined, signal),\n createForOrganization: (organization: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/organizations/${enc(organization)}/api-keys`, body),\n revokeForOrganization: (organization: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/api-keys/${enc(key)}`),\n listForProject: (project: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/projects/${enc(project)}/api-keys`, undefined, signal),\n createForProject: (project: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/projects/${enc(project)}/api-keys`, body),\n revokeForProject: (project: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/api-keys/${enc(key)}`),\n };\n\n // --- Webhooks -------------------------------------------------------------\n readonly webhooks = {\n list: (project: string, signal?: AbortSignal): Promise<WebhookEndpointContract[]> =>\n this.get<WebhookEndpointContract[]>(`/projects/${enc(project)}/webhooks`, undefined, signal),\n create: (project: string, body: CreateWebhookRequest): Promise<CreateWebhookResponse> =>\n this.mutate<CreateWebhookResponse>(\"POST\", `/projects/${enc(project)}/webhooks`, body),\n update: (project: string, webhook: string, body: UpdateWebhookRequest): Promise<WebhookEndpointContract> =>\n this.mutate<WebhookEndpointContract>(\"PATCH\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`, body),\n delete: (project: string, webhook: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`),\n deliveries: (project: string, webhook: string, signal?: AbortSignal): Promise<WebhookDeliveryContract[]> =>\n this.get<WebhookDeliveryContract[]>(`/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries`, undefined, signal),\n retry: (project: string, webhook: string, delivery: string): Promise<{ ok: boolean }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries/${enc(delivery)}/retry`),\n };\n\n // --- Activity -------------------------------------------------------------\n activity(\n project: string,\n opts: ListOptions & { actorType?: string; action?: string; targetType?: string; from?: string; to?: string } = {},\n ): Promise<Page<ActivityEventContract>> {\n return this.page<ActivityEventContract>(`/projects/${enc(project)}/activity`, opts, {\n actorType: opts.actorType,\n action: opts.action,\n targetType: opts.targetType,\n from: opts.from,\n to: opts.to,\n });\n }\n\n // --- Billing --------------------------------------------------------------\n readonly billing = {\n status: (organization: string, signal?: AbortSignal): Promise<BillingResponse> =>\n this.get<BillingResponse>(`/organizations/${enc(organization)}/billing`, undefined, signal),\n checkout: (organization: string, body: CheckoutRequest): Promise<CheckoutResponse> =>\n this.mutate<CheckoutResponse>(\"POST\", `/organizations/${enc(organization)}/billing/checkout`, body),\n portal: (organization: string): Promise<PortalResponse> =>\n this.mutate<PortalResponse>(\"POST\", `/organizations/${enc(organization)}/billing/portal`),\n };\n\n // --- Upload helper --------------------------------------------------------\n private async uploadAsset(project: string, input: AssetInput, meta: UploadAssetMeta): Promise<AssetContract> {\n const { bytes, filename } = await readInput(input, meta.filename);\n const contentType = meta.contentType ?? guessContentType(filename);\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n\n const upload = await this.assets.createUpload(project, {\n filename,\n contentType,\n byteSize: meta.byteSize ?? bytes.byteLength,\n checksum,\n });\n\n // The presigned URL is absolute (storage host) and must bypass the API base.\n const put = await this.fetchImpl(upload.url, {\n method: upload.method,\n headers: upload.headers,\n body: bytes as unknown as BodyInit,\n });\n if (!put.ok) {\n throw new Error(`Asset upload PUT failed with status ${put.status}.`);\n }\n\n return this.assets.completeUpload(project, upload.uploadId);\n }\n}\n\ninterface ValidationIssue {\n resourceType: string;\n resourceId: string;\n path: string;\n message: string;\n code?: string;\n}\n\nasync function readInput(input: AssetInput, filenameOverride?: string): Promise<{ bytes: Uint8Array; filename: string }> {\n if (typeof input === \"string\") {\n const bytes = await readFile(input);\n return { bytes: new Uint8Array(bytes), filename: filenameOverride ?? basename(input) };\n }\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n return { bytes, filename: filenameOverride ?? \"upload.bin\" };\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n pdf: \"application/pdf\",\n json: \"application/json\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n csv: \"text/csv\",\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n};\n\nfunction guessContentType(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"\";\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n\n/** Create a management client. */\nexport function createManagementClient(options: ManagementClientOptions): ManagementClient {\n return new ManagementClient(options);\n}\n\nexport { generateTypes, generateTypesModule } from \"./codegen.js\";\nexport { MynaApiError, isMynaApiError } from \"./errors.js\";\nexport type { FetchLike, RetryOptions } from \"./http.js\";\n","import type {\n CollectionSchema,\n FieldDef,\n ListItem,\n ObjectField,\n} from \"../../schema/src/types.js\";\n\n/**\n * Deterministic TypeScript type generation from canonical collection schemas\n * (SPEC 12). Pure and stable: the same input always yields byte-identical\n * output, and no user-written files are touched. Consumed by `myna types\n * generate`.\n */\nexport function generateTypes(collections: CollectionSchema[]): string {\n const sorted = [...collections].sort((a, b) => a.name.localeCompare(b.name));\n const blocks: string[] = [];\n\n for (const collection of sorted) {\n blocks.push(renderInterface(collection));\n }\n\n const registry = sorted.map((c) => registryEntry(c)).join(\"\\n\");\n\n const header = [\n \"// Generated by `myna types generate`. Do not edit by hand.\",\n \"// This file is safe to commit and regenerate.\",\n \"\",\n ].join(\"\\n\");\n\n return `${header}${blocks.join(\"\\n\\n\")}\\n\\n${REGISTRY_DOC}\\nexport interface MynaCollections {\\n${registry}\\n}\\n`;\n}\n\nconst REGISTRY_DOC = [\n \"/**\",\n \" * Collection registry consumed by `createMyna<MynaCollections>()`.\",\n \" *\",\n \" * `fields` types the entry payload; `sortable` and `reference` carry the\",\n \" * distinctions the field types alone cannot express — a markdown body and a\",\n \" * text title are both `string`, but only one of them can be ordered on.\",\n \" */\",\n].join(\"\\n\");\n\n/**\n * Fields the query engine can order and filter by: scalars, excluding localized\n * fields, which hold one value per locale rather than a comparable value. This\n * mirrors `SCALAR_TYPES` in the API's public content service; the two must agree\n * or the types will promise a query the server rejects.\n */\nconst SORTABLE_TYPES = new Set([\"text\", \"number\", \"boolean\", \"date\", \"datetime\", \"slug\"]);\n\nfunction registryEntry(collection: CollectionSchema): string {\n const sortable = collection.fields\n .filter((f) => SORTABLE_TYPES.has(f.type) && !f.localized)\n .map((f) => JSON.stringify(f.key));\n const references = collection.fields\n .filter((f) => f.type === \"reference\")\n .map((f) => JSON.stringify(f.key));\n return [\n ` ${JSON.stringify(collection.name)}: {`,\n ` fields: ${pascal(collection.name)};`,\n ` sortable: ${sortable.length > 0 ? sortable.join(\" | \") : \"never\"};`,\n ` reference: ${references.length > 0 ? references.join(\" | \") : \"never\"};`,\n ` };`,\n ].join(\"\\n\");\n}\n\nfunction renderInterface(collection: CollectionSchema): string {\n const name = pascal(collection.name);\n const lines = collection.fields.map((f) => renderField(f, 1));\n const label = collection.label ? ` ${collection.label}` : \"\";\n return `/**${label} (${collection.kind}) */\\nexport interface ${name} {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction renderField(field: FieldDef, depth: number): string {\n const indent = \" \".repeat(depth);\n const optional = field.required ? \"\" : \"?\";\n const doc = field.description ? `${indent}/** ${escapeComment(field.description)} */\\n` : \"\";\n const base = fieldType(field, depth);\n // Localized fields store one value per project locale.\n const type = field.localized ? `{ [locale: string]: ${base} }` : base;\n return `${doc}${indent}${safeKey(field.key)}${optional}: ${type};`;\n}\n\nfunction fieldType(field: FieldDef, depth: number): string {\n switch (field.type) {\n case \"text\":\n return field.enum && field.enum.length > 0 ? field.enum.map((v) => JSON.stringify(v)).join(\" | \") : \"string\";\n case \"slug\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"asset\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"reference\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"object\":\n return renderObject(field, depth);\n case \"list\":\n return `${listItemType(field.item, depth)}[]`;\n case \"richText\":\n return \"RichTextDoc\";\n case \"blocks\": {\n // Discriminated union over the allowed block components.\n const inner = \" \".repeat(depth + 1);\n const options = field.blocks.map((b) => {\n const lines = b.fields.map((f) => renderField(f, depth + 2));\n return `{ type: ${JSON.stringify(b.key)}; fields: {\\n${lines.join(\"\\n\")}\\n${inner}} }`;\n });\n return `Array<\\n${inner}${options.join(`\\n${inner}| `)}\\n${\" \".repeat(depth)}>`;\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction renderObject(field: ObjectField, depth: number): string {\n const lines = field.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n}\n\nfunction listItemType(item: ListItem, depth: number): string {\n switch (item.kind) {\n case \"text\":\n return item.enum && item.enum.length > 0 ? `(${item.enum.map((v) => JSON.stringify(v)).join(\" | \")})` : \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"reference\":\n return \"string\";\n case \"asset\":\n return \"string\";\n case \"object\": {\n const lines = item.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n }\n default:\n return \"unknown\";\n }\n}\n\nconst JSON_VALUE = [\n \"export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\",\n \"\",\n \"/** Portable rich-text document tree (never rendered HTML). */\",\n \"export interface RichTextDoc { type: \\\"doc\\\"; content: Array<{ type: string; [key: string]: unknown }>; }\",\n].join(\"\\n\");\n\n/** Generate types plus the shared `JsonValue` helper as a standalone module. */\nexport function generateTypesModule(collections: CollectionSchema[]): string {\n return `${JSON_VALUE}\\n\\n${generateTypes(collections)}`;\n}\n\nfunction pascal(key: string): string {\n return key\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction safeKey(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction escapeComment(text: string): string {\n return text.replace(/\\*\\//g, \"*\\\\/\");\n}\n","import type { MetaResponse, WhoamiResponse } from \"@myna-sh/api-contracts\";\nimport type { TokenSource } from \"./config.js\";\n\n/**\n * Credential and server checks shared by `whoami`, `auth verify`, and `doctor`.\n *\n * The rule these enforce: **a stored credential is not an authenticated one.**\n * Reporting \"authenticated\" because a token file exists is how an agent ends up\n * confidently issuing calls that every endpoint answers with 401. Everything\n * here validates against the API and reports presence and validity as separate\n * facts.\n */\n\nexport interface CredentialStatus {\n apiUrl: string;\n /** A credential was found (flag, environment, or stored). */\n credentialPresent: boolean;\n /** The API accepted it. False whenever it was not verified successfully. */\n credentialValid: boolean;\n source: TokenSource;\n identity: WhoamiResponse | null;\n /** Why validation failed, when it did. */\n error: { code: string; detail: string } | null;\n}\n\ninterface ProblemBody {\n code?: string;\n detail?: string;\n title?: string;\n}\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction timeoutSignal(ms: number): AbortSignal {\n return AbortSignal.timeout(ms);\n}\n\n/**\n * Read the server's capability descriptor. Returns undefined when the API is\n * unreachable or too old to expose `/v1/meta`, which callers report as its own\n * diagnosis rather than conflating with an auth failure.\n */\nexport async function fetchMeta(\n apiUrl: string,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n): Promise<MetaResponse | undefined> {\n try {\n const res = await fetch(`${apiUrl}/v1/meta`, {\n headers: { accept: \"application/json\" },\n signal: timeoutSignal(timeoutMs),\n });\n if (!res.ok) return undefined;\n const body = (await res.json()) as { data?: MetaResponse };\n return body.data;\n } catch {\n return undefined;\n }\n}\n\n/** Validate a credential against the API. Never throws: the failure is the answer. */\nexport async function checkCredential(\n apiUrl: string,\n token: string | undefined,\n source: TokenSource,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n): Promise<CredentialStatus> {\n const base: CredentialStatus = {\n apiUrl,\n credentialPresent: Boolean(token),\n credentialValid: false,\n source,\n identity: null,\n error: null,\n };\n\n if (!token) {\n return { ...base, error: { code: \"NO_CREDENTIAL\", detail: \"No credential found.\" } };\n }\n\n try {\n const res = await fetch(`${apiUrl}/v1/auth/whoami`, {\n headers: { authorization: `Bearer ${token}`, accept: \"application/json\" },\n signal: timeoutSignal(timeoutMs),\n });\n const body = (await res.json().catch(() => ({}))) as { data?: WhoamiResponse } & ProblemBody;\n if (!res.ok || !body.data) {\n return {\n ...base,\n error: {\n code: body.code ?? `HTTP_${res.status}`,\n detail: body.detail ?? body.title ?? `The API rejected the credential (${res.status}).`,\n },\n };\n }\n return { ...base, credentialValid: true, identity: body.data };\n } catch (error) {\n // Unreachable API is not an invalid credential. Say which one it is.\n return {\n ...base,\n error: {\n code: \"UNREACHABLE\",\n detail: `Could not reach ${apiUrl}: ${error instanceof Error ? error.message : String(error)}`,\n },\n };\n }\n}\n\n/** Human-readable one-liner for an identity. */\nexport function describeIdentity(identity: WhoamiResponse): string {\n switch (identity.credential) {\n case \"user\":\n return `user ${identity.user.username ?? identity.user.email}`;\n case \"api_key\":\n return `API key${identity.label ? ` \"${identity.label}\"` : \"\"} (${identity.scopes.length} scope(s))`;\n case \"preview\":\n return \"preview token\";\n }\n}\n\n/** Scopes carried by the credential, or undefined when scopes do not apply. */\nexport function scopesOf(identity: WhoamiResponse | null): string[] | undefined {\n return identity?.credential === \"api_key\" ? identity.scopes : undefined;\n}\n","import { execFileSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync, rmSync } from \"node:fs\";\nimport { homedir, platform } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\n\n/**\n * Configuration resolution and credential storage (SPEC 11).\n *\n * Resolution order for every value: explicit flag > environment variable >\n * linked project (`.myna/project.json`) > user default (`config.json`).\n * Credentials are never written to the linked project file; they live in the OS\n * keychain when possible, otherwise a `0600` config file.\n */\n\nexport const DEFAULT_API_URL = \"https://api.myna.sh\";\nconst KEYCHAIN_SERVICE = \"sh.myna.cli\";\n\nexport interface GlobalFlags {\n apiUrl?: string;\n project?: string;\n organization?: string;\n token?: string;\n json?: boolean;\n interactive?: boolean;\n}\n\nexport interface LinkedProject {\n project: string;\n organization?: string;\n apiUrl?: string;\n}\n\nexport interface UserConfig {\n apiUrl?: string;\n defaultOrganization?: string;\n defaultProject?: string;\n}\n\n/** Where the active credential came from — reported by `whoami` and `doctor`. */\nexport type TokenSource = \"flag\" | \"environment\" | \"stored\" | \"none\";\n\nexport interface ResolvedContext {\n apiUrl: string;\n token: string | undefined;\n tokenSource: TokenSource;\n project: string | undefined;\n organization: string | undefined;\n json: boolean;\n interactive: boolean;\n linked: LinkedProject | undefined;\n linkedRoot: string | undefined;\n}\n\nfunction configDir(): string {\n const base = process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\");\n return join(base, \"myna\");\n}\n\nfunction configFile(): string {\n return join(configDir(), \"config.json\");\n}\n\nfunction credentialsFile(): string {\n return join(configDir(), \"credentials.json\");\n}\n\nexport function readUserConfig(): UserConfig {\n try {\n return JSON.parse(readFileSync(configFile(), \"utf8\")) as UserConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeUserConfig(patch: Partial<UserConfig>): UserConfig {\n const current = readUserConfig();\n const next = { ...current, ...patch };\n ensureDir(configDir());\n writeFileSync(configFile(), JSON.stringify(next, null, 2) + \"\\n\");\n return next;\n}\n\nfunction ensureDir(dir: string): void {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true, mode: 0o700 });\n}\n\n// --- Linked project ---------------------------------------------------------\n\nexport function findLinkedProject(startDir = process.cwd()): { linked: LinkedProject; root: string } | undefined {\n let dir = resolve(startDir);\n for (;;) {\n const file = join(dir, \".myna\", \"project.json\");\n if (existsSync(file)) {\n try {\n const linked = JSON.parse(readFileSync(file, \"utf8\")) as LinkedProject;\n return { linked, root: dir };\n } catch {\n return undefined;\n }\n }\n const parent = dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n\nexport function writeLinkedProject(root: string, linked: LinkedProject): void {\n const dir = join(root, \".myna\");\n ensureDir(dir);\n writeFileSync(join(dir, \"project.json\"), JSON.stringify(linked, null, 2) + \"\\n\");\n}\n\nexport function removeLinkedProject(root: string): boolean {\n const file = join(root, \".myna\", \"project.json\");\n if (existsSync(file)) {\n rmSync(file);\n return true;\n }\n return false;\n}\n\n// --- Credential storage -----------------------------------------------------\n\nfunction isMac(): boolean {\n return platform() === \"darwin\";\n}\n\nfunction keychainAccount(apiUrl: string): string {\n return apiUrl.replace(/\\/+$/, \"\");\n}\n\nexport function storeToken(apiUrl: string, token: string): \"keychain\" | \"file\" {\n const account = keychainAccount(apiUrl);\n if (isMac()) {\n try {\n execFileSync(\n \"security\",\n [\"add-generic-password\", \"-U\", \"-s\", KEYCHAIN_SERVICE, \"-a\", account, \"-w\", token],\n { stdio: \"ignore\" },\n );\n return \"keychain\";\n } catch {\n // Fall through to file storage.\n }\n }\n const file = credentialsFile();\n const store = readCredentialFile();\n store[account] = token;\n ensureDir(configDir());\n writeFileSync(file, JSON.stringify(store, null, 2) + \"\\n\");\n chmodSync(file, 0o600);\n return \"file\";\n}\n\nexport function loadToken(apiUrl: string): string | undefined {\n const account = keychainAccount(apiUrl);\n if (isMac()) {\n try {\n const out = execFileSync(\n \"security\",\n [\"find-generic-password\", \"-s\", KEYCHAIN_SERVICE, \"-a\", account, \"-w\"],\n { stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n const token = out.toString(\"utf8\").trim();\n if (token) return token;\n } catch {\n // Not in keychain; try file.\n }\n }\n return readCredentialFile()[account];\n}\n\nexport function clearToken(apiUrl: string): void {\n const account = keychainAccount(apiUrl);\n if (isMac()) {\n try {\n execFileSync(\"security\", [\"delete-generic-password\", \"-s\", KEYCHAIN_SERVICE, \"-a\", account], {\n stdio: \"ignore\",\n });\n } catch {\n // Ignore.\n }\n }\n const store = readCredentialFile();\n if (account in store) {\n delete store[account];\n writeFileSync(credentialsFile(), JSON.stringify(store, null, 2) + \"\\n\");\n chmodSync(credentialsFile(), 0o600);\n }\n}\n\nfunction readCredentialFile(): Record<string, string> {\n try {\n return JSON.parse(readFileSync(credentialsFile(), \"utf8\")) as Record<string, string>;\n } catch {\n return {};\n }\n}\n\n// --- Resolution -------------------------------------------------------------\n\nexport function resolveContext(flags: GlobalFlags): ResolvedContext {\n const link = findLinkedProject();\n const user = readUserConfig();\n\n const apiUrl =\n flags.apiUrl ??\n process.env.MYNA_API_URL ??\n link?.linked.apiUrl ??\n user.apiUrl ??\n DEFAULT_API_URL;\n\n const stored = loadToken(apiUrl);\n const token = flags.token ?? process.env.MYNA_TOKEN ?? stored;\n const tokenSource: TokenSource = flags.token\n ? \"flag\"\n : process.env.MYNA_TOKEN\n ? \"environment\"\n : stored\n ? \"stored\"\n : \"none\";\n\n const project =\n flags.project ??\n process.env.MYNA_PROJECT ??\n link?.linked.project ??\n user.defaultProject;\n\n const organization =\n flags.organization ??\n process.env.MYNA_ORGANIZATION ??\n link?.linked.organization ??\n user.defaultOrganization;\n\n return {\n apiUrl: apiUrl.replace(/\\/+$/, \"\"),\n token,\n tokenSource,\n project,\n organization,\n json: Boolean(flags.json),\n interactive: flags.interactive !== false && process.stdout.isTTY === true,\n linked: link?.linked,\n linkedRoot: link?.root,\n };\n}\n","import { isMynaApiError } from \"@myna-sh/sdk/management\";\n\n/** Structured output, tables, and exit-code discipline (SPEC 11). */\n\nexport const CLI_JSON_VERSION = 1;\n\n/** Usage error → exit code 2. */\nexport class UsageError extends Error {}\n\n/** Operational error → exit code 1. */\nexport class CliError extends Error {}\n\nexport interface OutputMode {\n json: boolean;\n}\n\nlet mode: OutputMode = { json: false };\n\nexport function setOutputMode(next: OutputMode): void {\n mode = next;\n}\n\nexport function isJson(): boolean {\n return mode.json;\n}\n\n/** Diagnostics go to stderr and are suppressed in JSON mode. */\nexport function diag(message: string): void {\n if (!mode.json) process.stderr.write(message + \"\\n\");\n}\n\n/** Emit the single result value. JSON mode prints one versioned document. */\nexport function emit(value: unknown, human?: () => void): void {\n if (mode.json) {\n process.stdout.write(JSON.stringify({ version: CLI_JSON_VERSION, data: value }) + \"\\n\");\n return;\n }\n if (human) {\n human();\n } else {\n process.stdout.write(prettyValue(value) + \"\\n\");\n }\n}\n\n/** Render an error and return the process exit code. */\nexport function reportError(error: unknown): number {\n if (isMynaApiError(error)) {\n const problem = {\n code: error.code,\n status: error.status,\n title: error.title,\n detail: error.detail,\n requestId: error.requestId,\n fields: error.fields,\n };\n if (mode.json) {\n process.stdout.write(JSON.stringify({ version: CLI_JSON_VERSION, error: problem }) + \"\\n\");\n } else {\n process.stderr.write(`error: ${error.code} — ${error.detail ?? error.title}\\n`);\n for (const f of error.fields ?? []) {\n process.stderr.write(` · ${f.path}: ${f.message}\\n`);\n }\n if (error.requestId) process.stderr.write(` requestId: ${error.requestId}\\n`);\n }\n return 1;\n }\n\n const usage = error instanceof UsageError;\n const message = error instanceof Error ? error.message : String(error);\n if (mode.json) {\n process.stdout.write(\n JSON.stringify({ version: CLI_JSON_VERSION, error: { code: usage ? \"USAGE\" : \"ERROR\", detail: message } }) + \"\\n\",\n );\n } else {\n process.stderr.write(`error: ${message}\\n`);\n }\n return usage ? 2 : 1;\n}\n\n// --- Human tables -----------------------------------------------------------\n\nexport interface Column<T> {\n header: string;\n value: (row: T) => string;\n}\n\nexport function table<T>(rows: T[], columns: Column<T>[]): void {\n if (rows.length === 0) {\n process.stdout.write(\"(none)\\n\");\n return;\n }\n const headers = columns.map((c) => c.header);\n const cells = rows.map((r) => columns.map((c) => c.value(r) ?? \"\"));\n const widths = headers.map((h, i) => Math.max(h.length, ...cells.map((row) => stripLen(row[i] ?? \"\"))));\n const line = (values: string[]): string =>\n values.map((v, i) => pad(v, widths[i] ?? v.length)).join(\" \").replace(/\\s+$/, \"\");\n process.stdout.write(line(headers) + \"\\n\");\n process.stdout.write(widths.map((w) => \"─\".repeat(w)).join(\" \") + \"\\n\");\n for (const row of cells) process.stdout.write(line(row) + \"\\n\");\n}\n\nexport function keyValues(pairs: Array<[string, string]>): void {\n const width = Math.max(...pairs.map(([k]) => k.length));\n for (const [k, v] of pairs) {\n process.stdout.write(`${pad(k + \":\", width + 1)} ${v}\\n`);\n }\n}\n\nfunction pad(value: string, width: number): string {\n const len = stripLen(value);\n return len >= width ? value : value + \" \".repeat(width - len);\n}\n\nfunction stripLen(value: string): number {\n return value.length;\n}\n\nfunction prettyValue(value: unknown): string {\n if (typeof value === \"string\") return value;\n return JSON.stringify(value, null, 2);\n}\n","import { createManagementClient, type ManagementClient } from \"@myna-sh/sdk/management\";\nimport { resolveContext, type GlobalFlags, type ResolvedContext } from \"./config.js\";\nimport { CliError, UsageError } from \"./output.js\";\n\n/** Per-command context: resolved config plus lazily-built API clients. */\nexport interface Ctx extends ResolvedContext {\n management(): ManagementClient;\n requireProject(): string;\n requireOrganization(): string;\n}\n\nexport function buildContext(flags: GlobalFlags): Ctx {\n const resolved = resolveContext(flags);\n let mgmt: ManagementClient | undefined;\n\n return {\n ...resolved,\n management(): ManagementClient {\n if (!resolved.token) {\n throw new CliError(\"Not authenticated. Run `myna login` or pass --token / set MYNA_TOKEN.\");\n }\n mgmt ??= createManagementClient({ token: resolved.token, apiUrl: resolved.apiUrl });\n return mgmt;\n },\n requireProject(): string {\n if (!resolved.project) {\n throw new UsageError(\"No project selected. Pass --project, set MYNA_PROJECT, or run `myna link`.\");\n }\n return resolved.project;\n },\n requireOrganization(): string {\n if (!resolved.organization) {\n throw new UsageError(\"No organization selected. Pass --organization or set a default with `myna organizations use`.\");\n }\n return resolved.organization;\n },\n };\n}\n","import type { Command } from \"commander\";\nimport { buildContext, type Ctx } from \"./client.js\";\nimport type { GlobalFlags } from \"./config.js\";\nimport { reportError, setOutputMode } from \"./output.js\";\n\n/**\n * Wrap a command action: build the resolved context, set the output mode from\n * `--json`, run the handler, and translate thrown errors into exit codes.\n */\nexport function handle(\n fn: (ctx: Ctx, args: unknown[], opts: Record<string, unknown>) => Promise<void>,\n): (...cbArgs: unknown[]) => Promise<void> {\n return async (...cbArgs: unknown[]): Promise<void> => {\n const command = cbArgs[cbArgs.length - 1] as Command;\n const ctx = buildContext(command.optsWithGlobals() as GlobalFlags);\n setOutputMode({ json: ctx.json });\n try {\n await fn(ctx, command.processedArgs as unknown[], command.opts());\n } catch (error) {\n process.exitCode = reportError(error);\n }\n };\n}\n","import { execFile } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { platform } from \"node:os\";\nimport type { ManagementClient } from \"@myna-sh/sdk/management\";\nimport { CliError, UsageError } from \"./output.js\";\n\n/** Parse `--data <json-or-@file>` into an object. */\nexport function parseData(input: string | undefined): Record<string, unknown> {\n if (!input) return {};\n const raw = input.startsWith(\"@\") ? readFileSync(input.slice(1), \"utf8\") : input;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n throw new UsageError(`Invalid JSON for --data: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new UsageError(\"--data must be a JSON object.\");\n }\n return parsed as Record<string, unknown>;\n}\n\n/** Apply `--set path=value` assignments (dot paths, JSON-or-string values). */\nexport function applySets(target: Record<string, unknown>, sets: string[] | undefined): Record<string, unknown> {\n if (!sets) return target;\n for (const assignment of sets) {\n const eq = assignment.indexOf(\"=\");\n if (eq === -1) throw new UsageError(`Invalid --set \"${assignment}\". Expected path=value.`);\n const path = assignment.slice(0, eq);\n const rawValue = assignment.slice(eq + 1);\n let value: unknown;\n try {\n value = JSON.parse(rawValue);\n } catch {\n value = rawValue;\n }\n setPath(target, path.split(\".\"), value);\n }\n return target;\n}\n\nfunction setPath(obj: Record<string, unknown>, parts: string[], value: unknown): void {\n let cursor: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i]!;\n if (typeof cursor[key] !== \"object\" || cursor[key] === null) cursor[key] = {};\n cursor = cursor[key] as Record<string, unknown>;\n }\n cursor[parts[parts.length - 1]!] = value;\n}\n\n/** Open a URL in the default browser (best effort; never throws). */\nexport function openBrowser(url: string): void {\n const cmd = platform() === \"darwin\" ? \"open\" : platform() === \"win32\" ? \"cmd\" : \"xdg-open\";\n const args = platform() === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n execFile(cmd, args, () => undefined);\n}\n\nexport interface EntryRef {\n collection?: string;\n slugOrId: string;\n}\n\n/** Parse `<collection>/<slug-or-id>` or a bare entry id. */\nexport function parseEntryRef(ref: string): EntryRef {\n if (ref.startsWith(\"ent_\") && !ref.includes(\"/\")) return { slugOrId: ref };\n const slash = ref.indexOf(\"/\");\n if (slash === -1) return { slugOrId: ref };\n return { collection: ref.slice(0, slash), slugOrId: ref.slice(slash + 1) };\n}\n\n/** Resolve an entry ref to a concrete entry id, listing by slug when needed. */\nexport async function resolveEntryId(\n mgmt: ManagementClient,\n project: string,\n ref: string,\n): Promise<string> {\n const parsed = parseEntryRef(ref);\n if (parsed.slugOrId.startsWith(\"ent_\")) return parsed.slugOrId;\n if (!parsed.collection) {\n throw new UsageError(`Provide the entry as <collection>/<slug> or an ent_ id (got \"${ref}\").`);\n }\n let cursor: string | undefined;\n for (let guard = 0; guard < 50; guard++) {\n const page = await mgmt.entries.list(project, { collection: parsed.collection, limit: 100, cursor });\n const match = page.data.find((e) => e.slug === parsed.slugOrId || e.id === parsed.slugOrId);\n if (match) return match.id;\n if (!page.nextCursor) break;\n cursor = page.nextCursor;\n }\n throw new CliError(`Entry not found: ${ref}`);\n}\n","import type { Command } from \"commander\";\nimport { isMynaApiError } from \"@myna-sh/sdk/management\";\nimport { checkCredential, describeIdentity } from \"../auth-check.js\";\nimport { clearToken, loadToken, storeToken } from \"../config.js\";\nimport { CliError, diag, emit, keyValues } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\n\ninterface DeviceStart {\n deviceCode: string;\n userCode: string;\n verificationUri: string;\n expiresIn: number;\n interval: number;\n}\n\ninterface DeviceToken {\n status: \"pending\" | \"approved\" | \"denied\" | \"expired\";\n token?: string;\n}\n\nasync function apiPost<T>(apiUrl: string, path: string, body: unknown): Promise<T> {\n const res = await fetch(`${apiUrl}/v1${path}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"application/json\" },\n body: JSON.stringify(body),\n });\n const json = (await res.json().catch(() => ({}))) as { data?: T; detail?: string };\n if (!res.ok) throw new CliError(json.detail ?? `Request failed (${res.status}).`);\n return json.data as T;\n}\n\nconst sleep = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));\n\nfunction startDevice(apiUrl: string): Promise<DeviceStart> {\n return apiPost<DeviceStart>(apiUrl, \"/auth/device\", {});\n}\n\nfunction pollDevice(apiUrl: string, deviceCode: string): Promise<DeviceToken> {\n return apiPost<DeviceToken>(apiUrl, `/auth/device/${deviceCode}/token`, { deviceCode });\n}\n\nexport function registerAuth(program: Command): void {\n const login = program\n .command(\"login\")\n .description(\"Authenticate via the browser device-authorization flow\")\n .action(\n handle(async (ctx) => {\n const start = await startDevice(ctx.apiUrl);\n diag(`\\n To authenticate, open:\\n ${start.verificationUri}\\n and enter the code: ${start.userCode}\\n`);\n if (ctx.interactive) openBrowser(start.verificationUri);\n\n const deadline = Date.now() + start.expiresIn * 1000;\n let token: string | undefined;\n while (Date.now() < deadline) {\n await sleep(Math.max(1, start.interval) * 1000);\n const poll = await pollDevice(ctx.apiUrl, start.deviceCode);\n if (poll.status === \"approved\" && poll.token) {\n token = poll.token;\n break;\n }\n if (poll.status === \"denied\" || poll.status === \"expired\") {\n throw new CliError(`Authorization ${poll.status}.`);\n }\n }\n if (!token) throw new CliError(\"Device authorization timed out.\");\n\n const location = storeToken(ctx.apiUrl, token);\n diag(` Stored credential (${location}).`);\n emit(\n { ok: true, apiUrl: ctx.apiUrl, storage: location },\n () => process.stdout.write(`Logged in to ${ctx.apiUrl}\\n`),\n );\n }),\n );\n\n /**\n * Non-blocking halves of the same flow.\n *\n * `myna login` blocks until a human approves in a browser, which is useless\n * to an automated caller: it cannot surface the code to whoever must approve\n * it, and it cannot do anything else while waiting. Splitting start from poll\n * lets a caller print the verification URI, hand it to a human, and poll on\n * its own schedule.\n */\n login\n .command(\"start\")\n .description(\"Begin device authorization and print the code without waiting\")\n .action(\n handle(async (ctx) => {\n const start = await startDevice(ctx.apiUrl);\n emit(\n {\n deviceCode: start.deviceCode,\n userCode: start.userCode,\n verificationUri: start.verificationUri,\n expiresIn: start.expiresIn,\n interval: start.interval,\n apiUrl: ctx.apiUrl,\n },\n () => {\n process.stdout.write(`${start.verificationUri}\\n`);\n diag(` Enter the code: ${start.userCode}`);\n diag(` Then run: myna login poll ${start.deviceCode}`);\n },\n );\n }),\n );\n\n login\n .command(\"poll\")\n .description(\"Check a pending device authorization once, or wait for it\")\n .argument(\"<device-code>\", \"device code from `myna login start`\")\n .option(\"--wait\", \"keep polling until approved, denied, or expired\", false)\n .option(\"--interval <seconds>\", \"seconds between attempts when waiting\", \"2\")\n .option(\"--timeout <seconds>\", \"give up after this long when waiting\", \"300\")\n .action(\n handle(async (ctx, args, opts) => {\n const deviceCode = args[0] as string;\n const wait = Boolean(opts.wait);\n const interval = Math.max(1, Number(opts.interval)) * 1000;\n const deadline = Date.now() + Math.max(1, Number(opts.timeout)) * 1000;\n\n for (;;) {\n const poll = await pollDevice(ctx.apiUrl, deviceCode);\n\n if (poll.status === \"approved\" && poll.token) {\n const location = storeToken(ctx.apiUrl, poll.token);\n emit(\n { status: \"approved\", stored: true, storage: location, apiUrl: ctx.apiUrl },\n () => process.stdout.write(`Logged in to ${ctx.apiUrl} (stored in ${location})\\n`),\n );\n return;\n }\n\n if (poll.status === \"denied\" || poll.status === \"expired\") {\n // A terminal answer is a result, not a crash: report it in the same\n // shape as success so a caller can branch on `status`.\n emit({ status: poll.status, stored: false, apiUrl: ctx.apiUrl }, () =>\n process.stderr.write(`Authorization ${poll.status}.\\n`),\n );\n process.exitCode = 1;\n return;\n }\n\n if (!wait) {\n emit({ status: \"pending\", stored: false, apiUrl: ctx.apiUrl }, () =>\n process.stdout.write(\"pending\\n\"),\n );\n return;\n }\n\n if (Date.now() + interval > deadline) {\n emit({ status: \"timeout\", stored: false, apiUrl: ctx.apiUrl }, () =>\n process.stderr.write(\"Timed out waiting for approval.\\n\"),\n );\n process.exitCode = 1;\n return;\n }\n await sleep(interval);\n }\n }),\n );\n\n program\n .command(\"logout\")\n .description(\"Remove the stored credential for the current API URL\")\n .action(\n handle(async (ctx) => {\n clearToken(ctx.apiUrl);\n emit({ ok: true }, () => process.stdout.write(`Logged out of ${ctx.apiUrl}\\n`));\n }),\n );\n\n const auth = program.command(\"auth\").description(\"Inspect and verify credentials\");\n\n /**\n * The machine-readable counterpart to `whoami`: always exits 0 with a\n * definite answer, so a caller can branch on `credentialValid` instead of\n * parsing an error.\n */\n auth\n .command(\"verify\")\n .description(\"Check whether the current credential actually works\")\n .action(\n handle(async (ctx) => {\n const status = await checkCredential(ctx.apiUrl, ctx.token, ctx.tokenSource);\n emit(status, () => {\n keyValues([\n [\"API\", status.apiUrl],\n [\"Credential present\", status.credentialPresent ? \"yes\" : \"no\"],\n [\"Credential valid\", status.credentialValid ? \"yes\" : \"no\"],\n [\"Source\", status.source],\n [\"Identity\", status.identity ? describeIdentity(status.identity) : \"—\"],\n ]);\n if (status.error) process.stderr.write(`\\n${status.error.code}: ${status.error.detail}\\n`);\n });\n }),\n );\n\n program\n .command(\"whoami\")\n .description(\"Show the authenticated identity, validating it against the API\")\n .action(\n handle(async (ctx) => {\n const status = await checkCredential(ctx.apiUrl, ctx.token ?? loadToken(ctx.apiUrl), ctx.tokenSource);\n\n let organization: { name: string; role: string; slug: string } | undefined;\n if (status.credentialValid && ctx.organization) {\n organization = await ctx\n .management()\n .organizations.get(ctx.organization)\n .then((o) => ({ name: o.name, role: o.role, slug: o.slug }))\n .catch((e: unknown) => {\n if (isMynaApiError(e)) return undefined;\n throw e;\n });\n }\n\n emit({ ...status, organization: organization ?? null }, () => {\n const pairs: Array<[string, string]> = [\n [\"API\", status.apiUrl],\n [\"Credential present\", status.credentialPresent ? \"yes\" : \"no\"],\n [\"Credential valid\", status.credentialValid ? \"yes\" : \"no\"],\n ];\n if (status.identity) pairs.push([\"Identity\", describeIdentity(status.identity)]);\n if (organization) pairs.push([\"Organization\", `${organization.name} (${organization.role})`]);\n keyValues(pairs);\n if (status.error) {\n process.stderr.write(`\\n${status.error.detail}\\n`);\n if (status.error.code !== \"UNREACHABLE\") {\n process.stderr.write(\"Run `myna login` to authenticate again.\\n\");\n }\n }\n });\n\n // Presence without validity is the failure the old behavior hid.\n if (!status.credentialValid) process.exitCode = 1;\n }),\n );\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport {\n findLinkedProject,\n loadToken,\n removeLinkedProject,\n writeLinkedProject,\n DEFAULT_API_URL,\n} from \"../config.js\";\nimport { CliError, UsageError, diag, emit, keyValues } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\n\nconst EXAMPLE_SCHEMA = `import { collection, field } from \"@myna-sh/sdk/schema\";\n\n/**\n * Example collection. Edit freely, then run:\n * myna schema diff\n * myna schema push\n */\nexport const posts = collection({\n name: \"posts\",\n label: \"Blog posts\",\n visibility: \"public\",\n titleField: \"title\",\n path: \"/blog/{slug}\",\n fields: {\n title: field.text({ required: true, maxLength: 120 }),\n slug: field.slug({ from: \"title\", required: true }),\n description: field.text({ multiline: true }),\n body: field.markdown({ required: true }),\n cover: field.asset({ allowed: [\"image/*\"] }),\n publishedAt: field.datetime(),\n },\n});\n`;\n\nfunction appUrlFor(apiUrl: string): string {\n try {\n const url = new URL(apiUrl);\n if (url.hostname.startsWith(\"api.\")) {\n url.hostname = \"app.\" + url.hostname.slice(4);\n return url.origin;\n }\n return apiUrl;\n } catch {\n return apiUrl;\n }\n}\n\nexport function registerWorkspace(program: Command): void {\n program\n .command(\"init\")\n .description(\"Scaffold a local `myna/` schema directory (and link if a project is set)\")\n .option(\"--schema-dir <dir>\", \"schema directory\", \"myna\")\n .action(\n handle(async (ctx, _args, opts) => {\n const dir = (opts.schemaDir as string) ?? \"myna\";\n mkdirSync(dir, { recursive: true });\n const file = join(dir, \"posts.ts\");\n const created: string[] = [];\n if (!existsSync(file)) {\n writeFileSync(file, EXAMPLE_SCHEMA);\n created.push(file);\n }\n let linked = false;\n if (ctx.project) {\n writeLinkedProject(process.cwd(), {\n project: ctx.project,\n organization: ctx.organization,\n ...(ctx.apiUrl !== DEFAULT_API_URL ? { apiUrl: ctx.apiUrl } : {}),\n });\n created.push(\".myna/project.json\");\n linked = true;\n }\n emit({ schemaDir: dir, created, linked }, () => {\n diag(`Initialized ${dir}/`);\n for (const c of created) process.stdout.write(` created ${c}\\n`);\n if (!linked) process.stdout.write(` run \\`myna link --project <ref>\\` to link a project\\n`);\n });\n }),\n );\n\n program\n .command(\"link\")\n .description(\"Link the current directory to a project (writes .myna/project.json, no secrets)\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const project = (args[0] as string | undefined) ?? ctx.project;\n if (!project) throw new UsageError(\"Provide a project: `myna link <project>` or --project.\");\n // Validate the project exists and capture its organization.\n const resolved = await ctx.management().projects.get(project);\n writeLinkedProject(process.cwd(), {\n project,\n organization: ctx.organization ?? resolved.organizationId,\n ...(ctx.apiUrl !== DEFAULT_API_URL ? { apiUrl: ctx.apiUrl } : {}),\n });\n emit({ linked: true, project: resolved.slug, organizationId: resolved.organizationId }, () =>\n process.stdout.write(`Linked to ${resolved.name} (${resolved.slug})\\n`),\n );\n }),\n );\n\n program\n .command(\"unlink\")\n .description(\"Remove the project link from the current directory tree\")\n .action(\n handle(async () => {\n const found = findLinkedProject();\n if (!found) throw new CliError(\"No linked project found.\");\n removeLinkedProject(found.root);\n emit({ unlinked: true }, () => process.stdout.write(`Unlinked ${found.linked.project}\\n`));\n }),\n );\n\n program\n .command(\"status\")\n .description(\"Show the resolved configuration and project link\")\n .action(\n handle(async (ctx) => {\n // `status` reads local configuration only — it deliberately makes no\n // network call. It therefore reports whether a credential is *present*,\n // never whether it works: use `myna auth verify` or `myna doctor` for\n // that. Calling mere presence \"authenticated\" is what let an expired\n // credential look healthy.\n const credentialPresent = Boolean(ctx.token ?? loadToken(ctx.apiUrl));\n emit(\n {\n apiUrl: ctx.apiUrl,\n credentialPresent,\n credentialSource: ctx.tokenSource,\n project: ctx.project ?? null,\n organization: ctx.organization ?? null,\n linkedRoot: ctx.linkedRoot ?? null,\n },\n () => {\n keyValues([\n [\"API URL\", ctx.apiUrl],\n [\"Credential present\", credentialPresent ? `yes (${ctx.tokenSource})` : \"no\"],\n [\"Project\", ctx.project ?? \"(none)\"],\n [\"Organization\", ctx.organization ?? \"(none)\"],\n [\"Linked at\", ctx.linkedRoot ?? \"(none)\"],\n ]);\n if (credentialPresent) diag(\"\\nNot verified against the API. Run `myna auth verify`.\");\n },\n );\n }),\n );\n\n program\n .command(\"open\")\n .description(\"Open the current project in the dashboard\")\n .action(\n handle(async (ctx) => {\n const app = appUrlFor(ctx.apiUrl);\n const path = ctx.organization && ctx.project ? `/${ctx.organization}/${ctx.project}` : \"\";\n const url = `${app}${path}`;\n if (ctx.interactive) openBrowser(url);\n emit({ url }, () => process.stdout.write(`${url}\\n`));\n }),\n );\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { isMynaApiError, generateTypesModule } from \"@myna-sh/sdk/management\";\nimport type { CollectionSchema } from \"@myna-sh/schema\";\nimport { CliError, UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { canonicalJson, loadLocalSchemas, schemaDirFor } from \"../schema-loader.js\";\nimport { schemaToDsl } from \"../dsl-emit.js\";\nimport type { Ctx } from \"../client.js\";\n\n/** Fetch deployed canonical schemas (latest version per collection). */\nasync function deployedSchemas(ctx: Ctx, project: string): Promise<CollectionSchema[]> {\n const mgmt = ctx.management();\n const collections = await mgmt.schema.collections(project);\n const out: CollectionSchema[] = [];\n for (const c of collections) {\n const versions = await mgmt.schema.versions(project, c.key);\n const latest = versions[0];\n if (latest) out.push(latest.schemaJson as unknown as CollectionSchema);\n }\n return out.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function registerSchema(program: Command): void {\n const schema = program.command(\"schema\").description(\"Inspect and deploy code-owned schemas\");\n\n schema\n .command(\"inspect\")\n .description(\"Show deployed collections, or one collection's fields\")\n .argument(\"[collection]\", \"collection key\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const key = args[0] as string | undefined;\n if (!key) {\n const collections = await ctx.management().schema.collections(project);\n emit(collections, () =>\n table(collections, [\n { header: \"KEY\", value: (c) => c.key },\n { header: \"NAME\", value: (c) => c.displayName },\n { header: \"KIND\", value: (c) => c.kind },\n { header: \"VISIBILITY\", value: (c) => c.visibility },\n ]),\n );\n return;\n }\n const versions = await ctx.management().schema.versions(project, key);\n const latest = versions[0];\n if (!latest) throw new CliError(`Collection ${key} has no versions.`);\n const s = latest.schemaJson as unknown as CollectionSchema;\n emit({ collection: key, version: latest.version, schema: s }, () => {\n diag(`${key} — v${latest.version} (${s.kind}, ${s.visibility})`);\n table(s.fields, [\n { header: \"FIELD\", value: (f) => f.key },\n { header: \"TYPE\", value: (f) => f.type },\n { header: \"REQUIRED\", value: (f) => (f.required ? \"yes\" : \"\") },\n ]);\n });\n }),\n );\n\n schema\n .command(\"pull\")\n .description(\"Write deployed schemas to local DSL files\")\n .option(\"--schema-dir <dir>\", \"target schema directory\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n const schemas = await deployedSchemas(ctx, project);\n mkdirSync(dir, { recursive: true });\n const written: string[] = [];\n for (const s of schemas) {\n const file = join(dir, `${s.name}.ts`);\n writeFileSync(file, schemaToDsl(s));\n written.push(file);\n }\n emit({ pulled: schemas.length, files: written }, () => {\n for (const f of written) process.stdout.write(` wrote ${f}\\n`);\n });\n }),\n );\n\n schema\n .command(\"diff\")\n .description(\"Diff local schemas against the deployed schemas\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n const local = await loadLocalSchemas(dir);\n const result = await ctx.management().schema.diff(project, canonicalJson(local));\n emit(result, () => renderDiff(result));\n }),\n );\n\n schema\n .command(\"drift\")\n .description(\"Show schema drift between this project and another (e.g. staging)\")\n .requiredOption(\"--against <project>\", \"project id or slug to compare with\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const result = await ctx.management().schema.drift(project, opts.against as string);\n emit(result, () => {\n if (result.inSync) diag(\"Schemas are in sync.\");\n else {\n diag(`${result.ops.length} op(s) of drift (${result.classification}):`);\n for (const op of result.ops) {\n process.stderr.write(` ${op.kind} ${op.collection}${op.field ? `.${op.field}` : \"\"} — ${op.detail}\\n`);\n }\n }\n });\n if (!result.inSync) process.exitCode = 1;\n }),\n );\n\n schema\n .command(\"promote\")\n .description(\"Promote another project's deployed schemas into this project\")\n .requiredOption(\"--from <project>\", \"source project id or slug\")\n .option(\"--allow-destructive\", \"permit destructive schema changes\", false)\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const result = await ctx.management().schema.promote(project, opts.from as string, {\n allowDestructive: Boolean(opts.allowDestructive),\n });\n emit(result, () => {\n renderDiff(result.diff);\n diag(result.applied ? `Promoted ${result.versions.length} version(s).` : \"Nothing to promote.\");\n });\n }),\n );\n\n schema\n .command(\"push\")\n .description(\"Apply local schemas, creating immutable versions\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .option(\"--allow-destructive\", \"permit destructive schema changes\", false)\n .option(\"--summary <text>\", \"change summary\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n const local = await loadLocalSchemas(dir);\n const collections = canonicalJson(local);\n const allowDestructive = Boolean(opts.allowDestructive);\n\n const plan = await ctx.management().schema.diff(project, collections);\n if (!ctx.json) renderDiff(plan);\n\n if (plan.hasDestructive && !allowDestructive) {\n throw new UsageError(\n \"This change is destructive. Re-run with --allow-destructive to proceed.\",\n );\n }\n if (plan.ops.length === 0) {\n emit({ applied: false, reason: \"no-changes\", diff: plan }, () => diag(\"No schema changes to apply.\"));\n return;\n }\n\n const pushed = await ctx\n .management()\n .schema.push(project, collections, { allowDestructive, changeSummary: opts.summary as string | undefined })\n .catch((error: unknown) => {\n if (isMynaApiError(error) && error.code === \"SCHEMA_CHANGE_DESTRUCTIVE\") {\n throw new UsageError(\"Destructive schema change rejected. Pass --allow-destructive.\");\n }\n throw error;\n });\n emit(pushed, () =>\n diag(`Applied ${pushed.versions.length} schema version(s) (${pushed.diff.classification}).`),\n );\n }),\n );\n\n const types = program.command(\"types\").description(\"Generate content types\");\n types\n .command(\"generate\")\n .description(\"Generate deterministic TypeScript types from schemas\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .option(\"--deployed\", \"use deployed schemas instead of local files\", false)\n .option(\"--out <file>\", \"write to a file instead of stdout\")\n .action(\n handle(async (ctx, _args, opts) => {\n let schemas: CollectionSchema[];\n if (opts.deployed) {\n schemas = await deployedSchemas(ctx, ctx.requireProject());\n } else {\n const dir = schemaDirFor(ctx.linkedRoot, opts.schemaDir as string | undefined);\n schemas = await loadLocalSchemas(dir);\n }\n const code = generateTypesModule(schemas);\n const out = opts.out as string | undefined;\n if (out) {\n writeFileSync(out, code);\n emit({ written: out, collections: schemas.length }, () => diag(`Wrote ${out}`));\n } else if (ctx.json) {\n emit({ code, collections: schemas.length });\n } else {\n process.stdout.write(code);\n }\n }),\n );\n}\n\ninterface DiffLike {\n ops: Array<{ kind: string; collection: string; field?: string; classification: string; detail: string }>;\n classification: string;\n hasDestructive: boolean;\n contentValidationErrors: Array<{ collection: string; path: string; message: string }>;\n}\n\nfunction renderDiff(diff: DiffLike): void {\n if (diff.ops.length === 0) {\n diag(\"No changes.\");\n return;\n }\n for (const op of diff.ops) {\n const marker = op.classification === \"destructive\" ? \"!\" : op.classification === \"conditionally_destructive\" ? \"~\" : \"+\";\n const target = op.field ? `${op.collection}.${op.field}` : op.collection;\n process.stdout.write(` ${marker} ${op.kind} ${target} — ${op.detail}\\n`);\n }\n process.stdout.write(` classification: ${diff.classification}\\n`);\n for (const err of diff.contentValidationErrors) {\n process.stderr.write(` content error: ${err.collection} ${err.path} — ${err.message}\\n`);\n }\n}\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { build, type Plugin } from \"esbuild\";\nimport { toCanonical, type CollectionSchema } from \"@myna-sh/schema\";\nimport { CliError } from \"./output.js\";\n\n/**\n * Load local schema definitions through a controlled esbuild bundle-to-memory,\n * then import the compiled module (SPEC 7 / 11). Each `.ts`/`.js`/`.mjs` file in\n * the schema directory may default-export a collection, export an array of\n * collections, or export several named collections.\n */\n\nexport const DEFAULT_SCHEMA_DIR = \"myna\";\n\n/**\n * Resolve DSL imports in user schema files to the copy bundled with the CLI\n * (`dsl.ts`, built to a sibling `dsl.js`). Schema loading therefore works\n * without `@myna-sh/sdk` installed, and canonicalization always runs against\n * the exact DSL version this CLI ships.\n */\nfunction dslAliasPlugin(): Plugin {\n let dslPath = fileURLToPath(new URL(\"./dsl.js\", import.meta.url));\n if (!existsSync(dslPath)) dslPath = dslPath.replace(/\\.js$/, \".ts\");\n return {\n name: \"myna-dsl-alias\",\n setup(builder) {\n builder.onResolve({ filter: /^@myna-sh\\/(schema|sdk\\/schema)$/ }, () => ({\n path: dslPath,\n }));\n },\n };\n}\n\nfunction looksLikeCollection(value: unknown): value is CollectionSchema {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { name?: unknown }).name === \"string\" &&\n Array.isArray((value as { fields?: unknown }).fields)\n );\n}\n\nfunction collectFromModule(mod: Record<string, unknown>, out: Map<string, CollectionSchema>): void {\n const consider = (value: unknown): void => {\n if (Array.isArray(value)) {\n for (const v of value) consider(v);\n return;\n }\n if (looksLikeCollection(value)) out.set(value.name, value);\n };\n for (const value of Object.values(mod)) consider(value);\n}\n\nfunction listSchemaFiles(dir: string): string[] {\n const files: string[] = [];\n for (const entry of readdirSync(dir)) {\n if (entry.startsWith(\".\") || entry === \"node_modules\" || entry === \"dist\") continue;\n const full = join(dir, entry);\n const st = statSync(full);\n if (st.isDirectory()) {\n files.push(...listSchemaFiles(full));\n } else if (/\\.(ts|mts|js|mjs)$/.test(entry) && !/\\.d\\.ts$/.test(entry)) {\n files.push(full);\n }\n }\n return files.sort();\n}\n\nexport async function loadLocalSchemas(schemaDir = DEFAULT_SCHEMA_DIR): Promise<CollectionSchema[]> {\n const dir = resolve(schemaDir);\n if (!existsSync(dir)) {\n throw new CliError(`Schema directory not found: ${schemaDir}. Run \\`myna init\\` to scaffold it.`);\n }\n const files = listSchemaFiles(dir);\n if (files.length === 0) {\n throw new CliError(`No schema files found in ${schemaDir}.`);\n }\n\n const collections = new Map<string, CollectionSchema>();\n for (const file of files) {\n const result = await build({\n entryPoints: [file],\n bundle: true,\n write: false,\n format: \"esm\",\n platform: \"node\",\n target: \"node20\",\n logLevel: \"silent\",\n absWorkingDir: process.cwd(),\n plugins: [dslAliasPlugin()],\n }).catch((error: unknown) => {\n throw new CliError(`Failed to compile ${file}: ${error instanceof Error ? error.message : String(error)}`);\n });\n\n const code = result.outputFiles[0]?.text ?? \"\";\n const dataUrl = `data:text/javascript;base64,${Buffer.from(code).toString(\"base64\")}`;\n const mod = (await import(dataUrl)) as Record<string, unknown>;\n collectFromModule(mod, collections);\n }\n\n if (collections.size === 0) {\n throw new CliError(\"No collections were exported from the schema directory.\");\n }\n\n return [...collections.values()]\n .map((c) => toCanonical(c))\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function canonicalJson(schemas: CollectionSchema[]): Record<string, unknown>[] {\n return schemas.map((s) => s as unknown as Record<string, unknown>);\n}\n\n/** Resolve the schema directory relative to the linked project root if set. */\nexport function schemaDirFor(root: string | undefined, override?: string): string {\n if (override) return override;\n if (root) {\n const candidate = join(root, DEFAULT_SCHEMA_DIR);\n if (existsSync(candidate)) return candidate;\n }\n return DEFAULT_SCHEMA_DIR;\n}\n","import type { CollectionSchema } from \"./types.js\";\n\n/**\n * Deterministic JSON serialization: object keys are emitted in sorted order,\n * arrays preserve their order (field order is significant). Produces a stable\n * string suitable for hashing and equality checks.\n */\nexport function canonicalStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortValue);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>).sort()) {\n const v = (value as Record<string, unknown>)[key];\n if (v === undefined) continue;\n out[key] = sortValue(v);\n }\n return out;\n }\n return value;\n}\n\n/**\n * Return a deep-cloned, canonically-ordered copy of a schema. This is the exact\n * shape persisted as `collection_versions.schema_json`.\n */\nexport function toCanonical(schema: CollectionSchema): CollectionSchema {\n return JSON.parse(canonicalStringify(schema)) as CollectionSchema;\n}\n","import type { CollectionSchema, FieldDef, ListItem } from \"@myna-sh/schema\";\n\n/**\n * Emit editable `@myna-sh/sdk/schema` DSL source from a canonical collection schema.\n * Used by `myna schema pull` to materialize deployed schemas as local TS.\n */\nexport function schemaToDsl(schema: CollectionSchema): string {\n const opts: string[] = [\n `name: ${str(schema.name)}`,\n `label: ${str(schema.label)}`,\n ];\n if (schema.kind !== \"collection\") opts.push(`kind: ${str(schema.kind)}`);\n opts.push(`visibility: ${str(schema.visibility)}`);\n if (schema.titleField) opts.push(`titleField: ${str(schema.titleField)}`);\n if (schema.path) opts.push(`path: ${str(schema.path)}`);\n\n const fieldLines = schema.fields.map((f) => ` ${ident(f.key)}: ${emitField(f)},`).join(\"\\n\");\n\n return [\n `import { collection, field, item } from \"@myna-sh/sdk/schema\";`,\n ``,\n `export const ${varName(schema.name)} = collection({`,\n ` ${opts.join(\",\\n \")},`,\n ` fields: {`,\n fieldLines,\n ` },`,\n `});`,\n ``,\n ].join(\"\\n\");\n}\n\nfunction emitField(field: FieldDef): string {\n const o: Record<string, unknown> = {};\n if (field.label && field.label !== field.key) o.label = field.label;\n if (field.description) o.description = field.description;\n if (field.required) o.required = true;\n\n switch (field.type) {\n case \"text\":\n assign(o, { multiline: field.multiline || undefined, minLength: field.minLength, maxLength: field.maxLength, pattern: field.pattern, enum: field.enum, default: field.default });\n return call(\"text\", o);\n case \"slug\":\n assign(o, { from: field.from });\n return call(\"slug\", o);\n case \"markdown\":\n assign(o, { minLength: field.minLength, maxLength: field.maxLength, default: field.default });\n return call(\"markdown\", o);\n case \"number\":\n assign(o, { integer: field.integer || undefined, min: field.min, max: field.max, default: field.default });\n return call(\"number\", o);\n case \"boolean\":\n assign(o, { default: field.default });\n return call(\"boolean\", o);\n case \"date\":\n case \"datetime\":\n assign(o, { min: field.min, max: field.max, default: field.default });\n return call(field.type, o);\n case \"json\":\n assign(o, { default: field.default });\n return call(\"json\", o);\n case \"asset\":\n assign(o, { allowed: field.allowed, multiple: field.multiple || undefined });\n return call(\"asset\", o);\n case \"reference\":\n assign(o, { to: field.target, multiple: field.multiple || undefined });\n return call(\"reference\", o);\n case \"object\": {\n const inner = field.fields.map((f) => ` ${ident(f.key)}: ${emitField(f)}`).join(\",\\n\");\n o.fields = `__RAW__{\\n${inner},\\n }`;\n return call(\"object\", o);\n }\n case \"list\":\n o.of = `__RAW__${emitItem(field.item)}`;\n assign(o, { minItems: field.minItems, maxItems: field.maxItems });\n return call(\"list\", o);\n default:\n return `field.json({})`;\n }\n}\n\nfunction emitItem(item: ListItem): string {\n switch (item.kind) {\n case \"reference\":\n return `item.reference({ to: ${str(item.target)} })`;\n case \"asset\":\n return `item.asset({ allowed: ${JSON.stringify(item.allowed)} })`;\n case \"object\": {\n const inner = item.fields.map((f) => ` ${ident(f.key)}: ${emitField(f)}`).join(\",\\n\");\n return `item.object({ fields: {\\n${inner},\\n } })`;\n }\n default:\n return `item.${item.kind}()`;\n }\n}\n\nfunction call(name: string, opts: Record<string, unknown>): string {\n const entries = Object.entries(opts);\n if (entries.length === 0) return `field.${name}()`;\n const body = entries.map(([k, v]) => `${ident(k)}: ${literal(v)}`).join(\", \");\n return `field.${name}({ ${body} })`;\n}\n\nfunction assign(target: Record<string, unknown>, values: Record<string, unknown>): void {\n for (const [k, v] of Object.entries(values)) {\n if (v !== undefined) target[k] = v;\n }\n}\n\nfunction literal(value: unknown): string {\n if (typeof value === \"string\" && value.startsWith(\"__RAW__\")) return value.slice(\"__RAW__\".length);\n return JSON.stringify(value);\n}\n\nfunction str(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction ident(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction varName(name: string): string {\n const camel = name.replace(/[-_\\s]+(.)/g, (_, c: string) => c.toUpperCase());\n return /^[A-Za-z_$]/.test(camel) ? camel : `_${camel}`;\n}\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport { basename, extname, join } from \"node:path\";\nimport { UsageError } from \"./output.js\";\n\n/**\n * Reading content from files: JSON documents and Markdown-with-frontmatter\n * directories, normalized into the rows the import API accepts.\n *\n * Migrating a site usually means the content already exists as files. Without\n * a reader here, every migration starts by writing a throwaway script to walk a\n * directory and reshape it — which is exactly the orchestration this is meant\n * to remove.\n */\n\nexport interface ContentRow {\n slug?: string;\n data: Record<string, unknown>;\n /** Where the row came from, for error messages that point at a file. */\n source: string;\n}\n\nexport type ContentFormat = \"json\" | \"markdown\";\n\n/** Guess the format from a path: a directory of `.md` files, or a JSON file. */\nexport async function detectFormat(path: string): Promise<ContentFormat> {\n const info = await stat(path).catch(() => undefined);\n if (!info) throw new UsageError(`No such file or directory: ${path}`);\n if (info.isDirectory()) return \"markdown\";\n return extname(path).toLowerCase() === \".json\" ? \"json\" : \"markdown\";\n}\n\n/**\n * Parse a frontmatter block.\n *\n * Deliberately a small subset of YAML — quoted and bare scalars, numbers,\n * booleans, null, and inline `[a, b]` arrays — because that is what content\n * frontmatter actually contains. Anything outside it fails loudly rather than\n * being silently misread, since a value quietly parsed as the wrong type\n * becomes a validation error pointing at the wrong place.\n */\nexport function parseFrontmatter(raw: string, source: string): { meta: Record<string, unknown>; body: string } {\n if (!raw.startsWith(\"---\")) return { meta: {}, body: raw };\n const end = raw.indexOf(\"\\n---\", 3);\n if (end === -1) throw new UsageError(`${source}: unterminated frontmatter block.`);\n const block = raw.slice(raw.indexOf(\"\\n\") + 1, end);\n const body = raw.slice(raw.indexOf(\"\\n\", end + 1) + 1);\n\n const meta: Record<string, unknown> = {};\n for (const [lineNumber, line] of block.split(\"\\n\").entries()) {\n if (!line.trim() || line.trimStart().startsWith(\"#\")) continue;\n const separator = line.indexOf(\":\");\n if (separator === -1) {\n throw new UsageError(`${source}:${lineNumber + 2}: expected \"key: value\" in frontmatter.`);\n }\n const key = line.slice(0, separator).trim();\n meta[key] = parseScalar(line.slice(separator + 1).trim());\n }\n return { meta, body };\n}\n\nfunction parseScalar(value: string): unknown {\n if (value === \"\" || value === \"null\" || value === \"~\") return null;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n const inner = value.slice(1, -1).trim();\n return inner === \"\" ? [] : inner.split(\",\").map((item) => parseScalar(item.trim()));\n }\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n return value.slice(1, -1);\n }\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) return Number(value);\n return value;\n}\n\n/** Read a JSON import file: `{ collection, entries: [...] }` or a bare array. */\nexport async function readJsonRows(\n file: string,\n): Promise<{ collection?: string; rows: ContentRow[] }> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(await readFile(file, \"utf8\"));\n } catch (error) {\n throw new UsageError(`${file}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n const toRow = (value: unknown, index: number): ContentRow => {\n if (typeof value !== \"object\" || value === null) {\n throw new UsageError(`${file}: entry ${index} is not an object.`);\n }\n const record = value as Record<string, unknown>;\n // Accept both `{ slug, data }` and a bare field object.\n if (record.data && typeof record.data === \"object\") {\n return {\n slug: typeof record.slug === \"string\" ? record.slug : undefined,\n data: record.data as Record<string, unknown>,\n source: `${file}#${index}`,\n };\n }\n return {\n slug: typeof record.slug === \"string\" ? record.slug : undefined,\n data: record,\n source: `${file}#${index}`,\n };\n };\n\n if (Array.isArray(parsed)) {\n return { rows: parsed.map(toRow) };\n }\n const doc = parsed as { collection?: unknown; entries?: unknown };\n if (!Array.isArray(doc.entries)) {\n throw new UsageError(`${file}: expected { \"collection\": \"...\", \"entries\": [...] } or a JSON array.`);\n }\n return {\n collection: typeof doc.collection === \"string\" ? doc.collection : undefined,\n rows: doc.entries.map(toRow),\n };\n}\n\n/**\n * Read a directory of Markdown files as rows.\n *\n * The filename becomes the slug and the document body is placed on `bodyField`,\n * so a conventional content directory imports without a mapping file.\n */\nexport async function readMarkdownRows(dir: string, bodyField: string): Promise<ContentRow[]> {\n const info = await stat(dir).catch(() => undefined);\n const files = info?.isDirectory()\n ? (await readdir(dir))\n .filter((name) => [\".md\", \".markdown\"].includes(extname(name).toLowerCase()))\n .sort()\n .map((name) => join(dir, name))\n : [dir];\n\n if (files.length === 0) throw new UsageError(`No .md files found in ${dir}`);\n\n const rows: ContentRow[] = [];\n for (const file of files) {\n const raw = await readFile(file, \"utf8\");\n const { meta, body } = parseFrontmatter(raw, file);\n const slug = typeof meta.slug === \"string\" ? meta.slug : basename(file, extname(file));\n rows.push({\n slug,\n data: { ...meta, slug, [bodyField]: body.trim() },\n source: file,\n });\n }\n return rows;\n}\n\n/** Read rows from a file or directory in the requested (or detected) format. */\nexport async function readContentRows(\n path: string,\n opts: { format?: ContentFormat; bodyField: string },\n): Promise<{ collection?: string; rows: ContentRow[] }> {\n const format = opts.format ?? (await detectFormat(path));\n if (format === \"json\") return readJsonRows(path);\n return { rows: await readMarkdownRows(path, opts.bodyField) };\n}\n","import type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { readContentRows, type ContentFormat } from \"../content-files.js\";\nimport { applySets, parseData, resolveEntryId } from \"../util.js\";\n\n/** Accept the documented spelling and the shorter one people reach for. */\nfunction parseFormat(value: string | undefined): ContentFormat | undefined {\n if (!value) return undefined;\n if (value === \"json\") return \"json\";\n if (value === \"markdown-frontmatter\" || value === \"markdown\" || value === \"md\") return \"markdown\";\n throw new UsageError(\"--format must be json or markdown-frontmatter.\");\n}\n\nexport function registerEntries(program: Command): void {\n const entries = program.command(\"entries\").description(\"Create, read, update, and manage entries\");\n\n entries\n .command(\"list\")\n .description(\"List entries in a collection\")\n .argument(\"<collection>\", \"collection key\")\n .option(\"--status <status>\", \"filter by status\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .option(\"--cursor <cursor>\", \"pagination cursor\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().entries.list(project, {\n collection: args[0] as string,\n status: opts.status as string | undefined,\n limit: Number(opts.limit),\n cursor: opts.cursor as string | undefined,\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (e) => e.id },\n { header: \"SLUG\", value: (e) => e.slug ?? \"\" },\n { header: \"STATUS\", value: (e) => e.status },\n { header: \"UPDATED\", value: (e) => e.updatedAt },\n ]),\n );\n }),\n );\n\n entries\n .command(\"get\")\n .description(\"Get one entry by <collection>/<slug-or-id>\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const entry = await ctx.management().entries.get(project, id);\n emit(entry);\n }),\n );\n\n entries\n .command(\"create\")\n .description(\"Create an entry\")\n .argument(\"<collection>\", \"collection key\")\n .option(\"--data <json-or-@file>\", \"entry data as JSON or @file\")\n .option(\"--set <path=value...>\", \"set individual fields\", collect, [])\n .option(\"--slug <slug>\", \"explicit slug\")\n .option(\"--change-set <id>\", \"attach to a change set\")\n .option(\"--summary <text>\", \"change summary\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const data = applySets(parseData(opts.data as string | undefined), opts.set as string[]);\n const entry = await ctx.management().entries.create(project, {\n collection: args[0] as string,\n data,\n slug: opts.slug as string | undefined,\n changeSetId: opts.changeSet as string | undefined,\n changeSummary: opts.summary as string | undefined,\n });\n emit(entry, () => diag(`Created ${entry.id} (${entry.status}).`));\n }),\n );\n\n entries\n .command(\"update\")\n .description(\"Update an entry\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--data <json-or-@file>\", \"replacement data as JSON or @file\")\n .option(\"--set <path=value...>\", \"set individual fields\", collect, [])\n .option(\"--slug <slug>\", \"new slug\")\n .option(\"--expected-revision <id>\", \"optimistic concurrency guard\")\n .option(\"--change-set <id>\", \"attach to a change set\")\n .option(\"--summary <text>\", \"change summary\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const sets = opts.set as string[];\n let data: Record<string, unknown> | undefined;\n if (opts.data !== undefined || sets.length > 0) {\n const base = opts.data !== undefined ? parseData(opts.data as string) : (await ctx.management().entries.get(project, id)).data;\n data = applySets(base, sets);\n }\n if (!data && !opts.slug) throw new UsageError(\"Nothing to update. Pass --data, --set, or --slug.\");\n const entry = await ctx.management().entries.update(project, id, {\n data,\n slug: opts.slug as string | undefined,\n expectedRevisionId: opts.expectedRevision as string | undefined,\n changeSetId: opts.changeSet as string | undefined,\n changeSummary: opts.summary as string | undefined,\n });\n emit(entry, () => diag(`Updated ${entry.id} (${entry.status}).`));\n }),\n );\n\n entries\n .command(\"delete\")\n .description(\"Stage an entry deletion on a change set\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--confirm-delete\", \"required consequence flag\", false)\n .option(\"--change-set <id>\", \"attach to a change set\")\n .action(\n handle(async (ctx, args, opts) => {\n if (!opts.confirmDelete) throw new UsageError(\"Deletion requires --confirm-delete.\");\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const result = await ctx.management().entries.delete(project, id, opts.changeSet as string | undefined);\n emit(result, () => diag(`Staged delete of ${id} on change set ${result.changeSetId}.`));\n }),\n );\n\n entries\n .command(\"unpublish\")\n .description(\"Stage an entry unpublish on a change set\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--change-set <id>\", \"attach to a change set\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const result = await ctx.management().entries.unpublish(project, id, opts.changeSet as string | undefined);\n emit(result, () => diag(`Staged unpublish of ${id} on change set ${result.changeSetId}.`));\n }),\n );\n\n entries\n .command(\"revisions\")\n .description(\"List an entry's revisions\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const revisions = await ctx.management().entries.revisions(project, id);\n emit(revisions, () =>\n table(revisions, [\n { header: \"ID\", value: (r) => r.id },\n { header: \"#\", value: (r) => String(r.revisionNumber) },\n { header: \"BY\", value: (r) => r.createdByType },\n { header: \"CREATED\", value: (r) => r.createdAt },\n ]),\n );\n }),\n );\n\n entries\n .command(\"duplicate\")\n .description(\"Duplicate an entry into a new draft\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .option(\"--change-set <id>\", \"stage on an explicit change set\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const entry = await ctx.management().entries.duplicate(project, id, opts.changeSet as string | undefined);\n emit(entry, () => diag(`Duplicated into ${entry.id} (${entry.slug ?? \"no slug\"}).`));\n }),\n );\n\n entries\n .command(\"bulk\")\n .description(\"Stage a delete or unpublish for many entries at once\")\n .requiredOption(\"--action <action>\", \"delete or unpublish\")\n .requiredOption(\"--ids <ids>\", \"comma-separated entry ids\")\n .option(\"--change-set <id>\", \"stage on an explicit change set\")\n .action(\n handle(async (ctx, _args, opts) => {\n const action = opts.action as string;\n if (action !== \"delete\" && action !== \"unpublish\") {\n throw new UsageError(\"--action must be delete or unpublish.\");\n }\n const project = ctx.requireProject();\n const result = await ctx.management().entries.bulk(project, {\n action,\n entryIds: (opts.ids as string).split(\",\").map((s) => s.trim()).filter(Boolean),\n changeSetId: opts.changeSet as string | undefined,\n });\n emit(result, () =>\n table(result.results, [\n { header: \"ENTRY\", value: (r) => r.entryId },\n { header: \"OK\", value: (r) => (r.ok ? \"yes\" : \"no\") },\n { header: \"CHANGE SET\", value: (r) => r.changeSetId ?? \"—\" },\n { header: \"ERROR\", value: (r) => r.error ?? \"\" },\n ]),\n );\n if (result.results.some((r) => !r.ok)) process.exitCode = 1;\n }),\n );\n\n entries\n .command(\"import\")\n .description(\"Import entries from JSON or a Markdown directory, with dry-run validation\")\n .argument(\"<path>\", \"JSON file, or a directory of Markdown files with frontmatter\")\n .option(\"--collection <key>\", \"target collection (required unless the JSON file names one)\")\n .option(\"--format <format>\", \"json or markdown-frontmatter (detected from the path by default)\")\n .option(\"--body-field <key>\", \"field that receives the Markdown body\", \"body\")\n .option(\"--change-set <id>\", \"stage onto an existing change set instead of a new one\")\n .option(\"--mode <mode>\", \"upsert (default) updates rows whose slug exists; create rejects them\", \"upsert\")\n .option(\"--dry-run\", \"validate without writing anything\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const format = parseFormat(opts.format as string | undefined);\n const mode = opts.mode as string;\n if (mode !== \"upsert\" && mode !== \"create\") {\n throw new UsageError(\"--mode must be upsert or create.\");\n }\n\n const source = await readContentRows(args[0] as string, {\n format,\n bodyField: opts.bodyField as string,\n });\n const collection = (opts.collection as string | undefined) ?? source.collection;\n if (!collection) {\n throw new UsageError(\"No collection. Pass --collection, or use a JSON file with a `collection` key.\");\n }\n if (source.rows.length === 0) throw new UsageError(\"Nothing to import.\");\n\n const result = await ctx.management().entries.import(project, {\n collection,\n entries: source.rows.map((r) => (r.slug ? { slug: r.slug, data: r.data } : { data: r.data })),\n dryRun: Boolean(opts.dryRun),\n changeSetId: opts.changeSet as string | undefined,\n mode,\n });\n\n emit(result, () => {\n const s = result.summary;\n const counts = `${s.created} created, ${s.updated} updated, ${s.unchanged} unchanged, ${s.invalid} invalid, ${s.skipped} skipped`;\n diag(\n result.dryRun\n ? `Dry run (${result.valid ? \"would apply\" : \"blocked\"}): ${counts}.`\n : `Imported into change set ${result.changeSetId}: ${counts}.`,\n );\n for (const row of result.results.filter((r) => r.outcome === \"invalid\")) {\n const where = source.rows[row.index]?.source ?? `row ${row.index}`;\n for (const e of row.errors ?? []) {\n process.stderr.write(` ${where}: ${e.path || \"(entry)\"} ${e.message}\\n`);\n }\n }\n });\n if (!result.valid) process.exitCode = 1;\n }),\n );\n\n entries\n .command(\"reorder\")\n .description(\"Set a collection's editorial order (applies immediately; not staged)\")\n .argument(\"<collection>\", \"collection key\")\n .option(\"--slugs <list>\", \"comma-separated slugs or ids, in the desired order\")\n .option(\"--move <ref>\", \"reposition a single entry\")\n .option(\"--before <ref>\", \"with --move: place immediately before this entry\")\n .option(\"--after <ref>\", \"with --move: place immediately after this entry\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const collection = args[0] as string;\n const slugs = opts.slugs as string | undefined;\n const move = opts.move as string | undefined;\n if (Boolean(slugs) === Boolean(move)) {\n throw new UsageError(\"Provide either --slugs or --move.\");\n }\n if (!move && (opts.before || opts.after)) {\n throw new UsageError(\"--before and --after only apply with --move.\");\n }\n\n const body = slugs\n ? { order: slugs.split(\",\").map((s) => s.trim()).filter(Boolean) }\n : {\n move: {\n entry: move!,\n ...(opts.before ? { before: opts.before as string } : {}),\n ...(opts.after ? { after: opts.after as string } : {}),\n },\n };\n\n const result = await ctx.management().entries.reorder(project, collection, body);\n emit(result, () => {\n diag(\n `Reordered ${result.collection}: ${result.writes} row(s) written. ` +\n \"Ordering is not staged — this is live for readers now.\",\n );\n table(result.updated, [\n { header: \"ENTRY\", value: (r) => r.slug ?? r.id },\n { header: \"RANK\", value: (r) => r.rank },\n ]);\n });\n }),\n );\n\n entries\n .command(\"references\")\n .description(\"Show which entries reference this one and what it references\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const refs = await ctx.management().entries.references(project, id);\n emit(refs, () => {\n diag(`Referenced by ${refs.referencedBy.length} entr(y/ies):`);\n table(refs.referencedBy, [\n { header: \"ENTRY\", value: (r) => `${r.collectionKey}/${r.slug ?? r.id}` },\n { header: \"IN DRAFT\", value: (r) => (r.inDraft ? \"yes\" : \"no\") },\n { header: \"IN PUBLISHED\", value: (r) => (r.inPublished ? \"yes\" : \"no\") },\n ]);\n diag(`References ${refs.references.length} entr(y/ies):`);\n table(refs.references, [\n { header: \"ENTRY\", value: (r) => (r.collectionKey ? `${r.collectionKey}/${r.slug ?? r.id}` : r.id) },\n { header: \"STATE\", value: (r) => (!r.exists ? \"missing\" : r.published ? \"published\" : \"unpublished\") },\n ]);\n });\n }),\n );\n\n entries\n .command(\"restore\")\n .description(\"Restore a historical revision into a new draft\")\n .argument(\"<ref>\", \"collection/slug or entry id\")\n .requiredOption(\"--revision <id>\", \"revision id to restore\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const id = await resolveEntryId(ctx.management(), project, args[0] as string);\n const result = await ctx.management().entries.restoreRevision(project, id, opts.revision as string);\n emit(result, () => diag(`Restored revision ${opts.revision as string} into ${result.revision.id}.`));\n }),\n );\n}\n\nfunction collect(value: string, previous: string[]): string[] {\n return [...previous, value];\n}\n","import type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\n\nexport function registerChanges(program: Command): void {\n const changes = program.command(\"changes\").description(\"Manage change sets: validate, preview, publish\");\n\n changes\n .command(\"list\")\n .description(\"List change sets\")\n .option(\"--status <status>\", \"filter by status\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().changeSets.list(project, {\n status: opts.status as string | undefined,\n limit: Number(opts.limit),\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (c) => c.id },\n { header: \"TITLE\", value: (c) => c.title },\n { header: \"STATUS\", value: (c) => c.status },\n { header: \"ITEMS\", value: (c) => String(c.items.length) },\n ]),\n );\n }),\n );\n\n changes\n .command(\"create\")\n .description(\"Create a change set\")\n .requiredOption(\"--title <title>\", \"change set title\")\n .option(\"--description <text>\", \"change set description\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const cs = await ctx.management().changeSets.create(project, {\n title: opts.title as string,\n description: opts.description as string | undefined,\n });\n emit(cs, () => diag(`Created change set ${cs.id}.`));\n }),\n );\n\n changes\n .command(\"inspect\")\n .description(\"Show a change set and its items\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const cs = await ctx.management().changeSets.get(project, args[0] as string);\n emit(cs, () => {\n diag(`${cs.title} — ${cs.status}`);\n table(cs.items, [\n { header: \"TYPE\", value: (i) => i.resourceType },\n { header: \"RESOURCE\", value: (i) => i.resourceId },\n { header: \"OP\", value: (i) => i.operation },\n ]);\n });\n }),\n );\n\n changes\n .command(\"validate\")\n .description(\"Validate a change set against deployed schemas\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const result = await ctx.management().changeSets.validate(project, args[0] as string);\n emit(result, () => {\n if (result.valid) {\n diag(\"valid\");\n } else {\n for (const e of result.errors) {\n process.stderr.write(` ${e.resourceId} ${e.path} — ${e.message}\\n`);\n }\n }\n });\n if (!result.valid) process.exitCode = 1;\n }),\n );\n\n changes\n .command(\"preview\")\n .description(\"Create a preview for a change set\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const preview = await ctx.management().previews.create(project, { changeSetId: args[0] as string });\n emit(preview, () => {\n process.stdout.write(`${preview.url}\\n`);\n diag(`fallback: ${preview.fallbackUrl}`);\n });\n }),\n );\n\n changes\n .command(\"publish\")\n .description(\"Atomically publish a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--confirm-publish\", \"required consequence flag\", false)\n .action(\n handle(async (ctx, args, opts) => {\n if (!opts.confirmPublish) throw new UsageError(\"Publishing requires --confirm-publish.\");\n const project = ctx.requireProject();\n const result = await ctx.management().changeSets.publish(project, args[0] as string);\n emit(result, () =>\n diag(`Published ${result.publishedEntryIds.length} entr(y/ies): ${result.publishedEntryIds.join(\", \")}`),\n );\n }),\n );\n\n changes\n .command(\"close\")\n .description(\"Close a change set without publishing\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const cs = await ctx.management().changeSets.close(project, args[0] as string);\n emit(cs, () => diag(`Closed ${cs.id}.`));\n }),\n );\n\n changes\n .command(\"schedule\")\n .description(\"Schedule, reschedule, or cancel a change set's publish\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--at <datetime>\", \"ISO 8601 datetime to publish at\")\n .option(\"--cancel\", \"cancel the scheduled publish\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n if (Boolean(opts.at) === Boolean(opts.cancel)) {\n throw new UsageError(\"Provide exactly one of --at <datetime> or --cancel.\");\n }\n const client = ctx.management();\n const cs = opts.cancel\n ? await client.changeSets.cancelSchedule(project, args[0] as string)\n : await client.changeSets.schedule(project, args[0] as string, new Date(opts.at as string).toISOString());\n emit(cs, () =>\n diag(cs.scheduledAt ? `Scheduled to publish at ${cs.scheduledAt}.` : \"Schedule cancelled.\"),\n );\n }),\n );\n\n changes\n .command(\"reviews\")\n .description(\"List reviews and approvals for a change set\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.reviews(project, args[0] as string);\n emit(reviews, () =>\n table(reviews, [\n { header: \"REVIEWER\", value: (r) => `${r.reviewerType}:${r.reviewerId}` },\n { header: \"STATUS\", value: (r) => r.status },\n { header: \"STALE\", value: (r) => (r.stale ? \"yes\" : \"no\") },\n { header: \"DECIDED\", value: (r) => r.decidedAt ?? \"—\" },\n ]),\n );\n }),\n );\n\n changes\n .command(\"request-review\")\n .description(\"Assign a reviewer to a change set\")\n .argument(\"<id>\", \"change set id\")\n .requiredOption(\"--reviewer <id>\", \"reviewer id (user, api key, or agent id)\")\n .option(\"--reviewer-type <type>\", \"reviewer actor type\", \"user\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.requestReview(project, args[0] as string, {\n reviewerType: opts.reviewerType as \"user\" | \"api_key\" | \"agent\" | \"system\",\n reviewerId: opts.reviewer as string,\n });\n emit(reviews, () => diag(`Requested review from ${opts.reviewer as string}.`));\n }),\n );\n\n changes\n .command(\"approve\")\n .description(\"Approve a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--comment <text>\", \"optional review comment\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.approve(project, args[0] as string, {\n comment: opts.comment as string | undefined,\n });\n emit(reviews, () => diag(\"Approved.\"));\n }),\n );\n\n changes\n .command(\"request-changes\")\n .description(\"Request changes on a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--comment <text>\", \"optional review comment\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const reviews = await ctx.management().changeSets.requestChanges(project, args[0] as string, {\n comment: opts.comment as string | undefined,\n });\n emit(reviews, () => diag(\"Requested changes.\"));\n }),\n );\n\n changes\n .command(\"comments\")\n .description(\"List comments on a change set\")\n .argument(\"<id>\", \"change set id\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const comments = await ctx.management().changeSets.comments(project, args[0] as string);\n emit(comments, () =>\n table(comments, [\n { header: \"AUTHOR\", value: (c) => `${c.authorType}:${c.authorId ?? \"—\"}` },\n { header: \"ANCHOR\", value: (c) => (c.resourceId ? `${c.resourceId}${c.fieldPath ? `#${c.fieldPath}` : \"\"}` : \"—\") },\n { header: \"RESOLVED\", value: (c) => (c.resolvedAt ? \"yes\" : \"no\") },\n { header: \"BODY\", value: (c) => (c.body.length > 60 ? `${c.body.slice(0, 57)}...` : c.body) },\n ]),\n );\n }),\n );\n\n changes\n .command(\"comment\")\n .description(\"Comment on a change set (optionally anchored to a field)\")\n .argument(\"<id>\", \"change set id\")\n .argument(\"<body>\", \"comment body\")\n .option(\"--entry <id>\", \"anchor to an entry in the change set\")\n .option(\"--field <path>\", \"anchor to a field path, e.g. fields.title\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const comment = await ctx.management().changeSets.comment(project, args[0] as string, {\n body: args[1] as string,\n resourceType: opts.entry ? \"entry\" : undefined,\n resourceId: opts.entry as string | undefined,\n fieldPath: opts.field as string | undefined,\n });\n emit(comment, () => diag(`Commented ${comment.id}.`));\n }),\n );\n\n changes\n .command(\"checks\")\n .description(\"Show the latest check run for a change set\")\n .argument(\"<id>\", \"change set id\")\n .option(\"--run\", \"run checks before showing results\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const client = ctx.management();\n const checks = opts.run\n ? (await client.changeSets.runChecks(project, args[0] as string)).checks\n : await client.changeSets.checks(project, args[0] as string);\n emit(checks, () =>\n table(checks, [\n { header: \"CHECK\", value: (c) => c.name },\n { header: \"STATUS\", value: (c) => c.status },\n { header: \"STALE\", value: (c) => (c.stale ? \"yes\" : \"no\") },\n { header: \"ISSUES\", value: (c) => String(c.details?.length ?? 0) },\n ]),\n );\n if (checks.some((c) => c.status === \"failed\")) process.exitCode = 1;\n }),\n );\n}\n","import type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\nimport type { Ctx } from \"../client.js\";\nimport type { CreatePreviewRequest } from \"@myna-sh/api-contracts\";\n\nfunction previewTarget(ref: string): CreatePreviewRequest {\n if (ref.startsWith(\"chs_\")) return { changeSetId: ref };\n if (ref.startsWith(\"ent_\")) return { entryId: ref };\n throw new UsageError(`Preview target must be a change-set (chs_) or entry (ent_) id: ${ref}`);\n}\n\nasync function create(ctx: Ctx, ref: string) {\n return ctx.management().previews.create(ctx.requireProject(), previewTarget(ref));\n}\n\nexport function registerPreviews(program: Command): void {\n const preview = program.command(\"preview\").description(\"Create and manage preview links\");\n\n preview\n .command(\"create\")\n .description(\"Create a preview for a change set or entry\")\n .argument(\"<change-set-or-entry>\", \"chs_ or ent_ id\")\n .action(\n handle(async (ctx, args) => {\n const p = await create(ctx, args[0] as string);\n emit(p, () => {\n process.stdout.write(`${p.url}\\n`);\n diag(`fallback: ${p.fallbackUrl}`);\n });\n }),\n );\n\n preview\n .command(\"open\")\n .description(\"Create a preview and open it in the browser\")\n .argument(\"<change-set-or-entry>\", \"chs_ or ent_ id\")\n .action(\n handle(async (ctx, args) => {\n const p = await create(ctx, args[0] as string);\n if (ctx.interactive) openBrowser(p.url);\n emit(p, () => process.stdout.write(`${p.url}\\n`));\n }),\n );\n\n preview\n .command(\"list\")\n .description(\"List preview tokens for the project\")\n .action(\n handle(async (ctx) => {\n const previews = await ctx.management().previews.list(ctx.requireProject());\n emit(previews, () =>\n table(previews, [\n { header: \"ID\", value: (p) => p.id },\n { header: \"SCOPE\", value: (p) => p.changeSetId ?? p.entryId ?? \"\" },\n { header: \"EXPIRES\", value: (p) => p.expiresAt },\n { header: \"REVOKED\", value: (p) => (p.revokedAt ? \"yes\" : \"\") },\n ]),\n );\n }),\n );\n\n preview\n .command(\"revoke\")\n .description(\"Revoke a preview token\")\n .argument(\"<id>\", \"preview id (prv_)\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().previews.revoke(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Revoked ${args[0] as string}.`));\n }),\n );\n}\n","import type { Command } from \"commander\";\nimport type { AssetContract } from \"@myna-sh/api-contracts\";\nimport { UsageError, diag, emit, keyValues, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\n\nexport function registerAssets(program: Command): void {\n const assets = program.command(\"assets\").description(\"Upload and manage assets\");\n\n assets\n .command(\"upload\")\n .description(\"Upload one or more files via the presigned flow\")\n .argument(\"<path...>\", \"file path(s)\")\n .option(\"--alt <text>\", \"default alt text applied to each asset\")\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const paths = args[0] as string[];\n const uploaded: AssetContract[] = [];\n for (const path of paths) {\n diag(`uploading ${path} …`);\n let asset = await ctx.management().assets.upload(project, path);\n if (opts.alt) asset = await ctx.management().assets.update(project, asset.id, { defaultAlt: opts.alt as string });\n uploaded.push(asset);\n }\n emit(uploaded.length === 1 ? uploaded[0] : uploaded, () =>\n table(uploaded, [\n { header: \"ID\", value: (a) => a.id },\n { header: \"FILENAME\", value: (a) => a.displayFilename },\n { header: \"TYPE\", value: (a) => a.contentType },\n { header: \"SIZE\", value: (a) => String(a.byteSize) },\n { header: \"STATE\", value: (a) => a.state },\n ]),\n );\n }),\n );\n\n assets\n .command(\"list\")\n .description(\"List assets\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .option(\"--cursor <cursor>\", \"pagination cursor\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = ctx.requireProject();\n const page = await ctx.management().assets.list(project, {\n limit: Number(opts.limit),\n cursor: opts.cursor as string | undefined,\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"ID\", value: (a) => a.id },\n { header: \"FILENAME\", value: (a) => a.displayFilename },\n { header: \"TYPE\", value: (a) => a.contentType },\n { header: \"STATE\", value: (a) => a.state },\n ]),\n );\n }),\n );\n\n assets\n .command(\"inspect\")\n .description(\"Show an asset and its usage\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .action(\n handle(async (ctx, args) => {\n const project = ctx.requireProject();\n const result = await ctx.management().assets.usage(project, args[0] as string);\n emit(result, () => {\n keyValues([\n [\"ID\", result.asset.id],\n [\"Filename\", result.asset.displayFilename],\n [\"Type\", result.asset.contentType],\n [\"Size\", String(result.asset.byteSize)],\n [\"State\", result.asset.state],\n [\"URL\", result.asset.url],\n [\"Referenced by\", result.usage.entryIds.join(\", \") || \"(none)\"],\n ]);\n });\n }),\n );\n\n assets\n .command(\"delete\")\n .description(\"Soft-delete an asset\")\n .argument(\"<id>\", \"asset id (ast_)\")\n .option(\"--confirm-delete\", \"required consequence flag\", false)\n .action(\n handle(async (ctx, args, opts) => {\n if (!opts.confirmDelete) throw new UsageError(\"Deletion requires --confirm-delete.\");\n await ctx.management().assets.delete(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Deleted ${args[0] as string}.`));\n }),\n );\n}\n","import { ulid } from \"ulid\";\n\n/**\n * Prefixed, monotonic, URL-safe application identifiers.\n *\n * Every resource has a stable short prefix. The body is a lowercased ULID,\n * which is monotonic (time-ordered), URL-safe (Crockford base32), and globally\n * unique. Example: `usr_01jb& ...` lowercased.\n */\nexport const ID_PREFIXES = {\n user: \"usr\",\n oauthAccount: \"oau\",\n session: \"ses\",\n organization: \"org\",\n organizationMember: \"mem\",\n organizationInvitation: \"inv\",\n project: \"prj\",\n projectOrigin: \"por\",\n apiKey: \"key\",\n collection: \"col\",\n collectionVersion: \"clv\",\n entry: \"ent\",\n entrySlugAlias: \"als\",\n entryRevision: \"rev\",\n changeSet: \"chs\",\n changeSetItem: \"csi\",\n changeSetReview: \"csr\",\n changeSetComment: \"csc\",\n changeSetCheck: \"chk\",\n asset: \"ast\",\n assetUpload: \"upl\",\n savedView: \"viw\",\n previewToken: \"prv\",\n webhookEndpoint: \"whk\",\n webhookEvent: \"whe\",\n webhookDelivery: \"whd\",\n auditEvent: \"aud\",\n job: \"job\",\n idempotencyKey: \"idm\",\n billingCustomer: \"bcu\",\n billingSubscription: \"bsu\",\n billingProviderEvent: \"evt\",\n usagePeriod: \"usp\",\n mcpClient: \"mcl\",\n mcpGrant: \"mgr\",\n mcpAuthorizationCode: \"mac\",\n mcpToken: \"mtk\",\n} as const;\n\nexport type IdResource = keyof typeof ID_PREFIXES;\nexport type IdPrefix = (typeof ID_PREFIXES)[IdResource];\n\n/**\n * A branded string type for prefixed IDs of a given resource.\n * `PrefixedId<\"user\">` narrows to `` `usr_${string}` ``.\n */\nexport type PrefixedId<R extends IdResource> = `${(typeof ID_PREFIXES)[R]}_${string}`;\n\n/** Generate a new prefixed monotonic ID for a resource kind. */\nexport function newId<R extends IdResource>(resource: R): PrefixedId<R> {\n const prefix = ID_PREFIXES[resource];\n return `${prefix}_${ulid().toLowerCase()}` as PrefixedId<R>;\n}\n\n/** Generate a new ID from a raw prefix string (escape hatch). */\nexport function newIdWithPrefix(prefix: string): string {\n return `${prefix}_${ulid().toLowerCase()}`;\n}\n\nconst PREFIX_SET: ReadonlySet<string> = new Set(Object.values(ID_PREFIXES));\n\n/** Split a prefixed ID into `{ prefix, body }`, or `null` if malformed. */\nexport function parseId(id: string): { prefix: string; body: string } | null {\n const idx = id.indexOf(\"_\");\n if (idx <= 0 || idx === id.length - 1) return null;\n return { prefix: id.slice(0, idx), body: id.slice(idx + 1) };\n}\n\n/** True if `id` is a well-formed ID for the given resource kind. */\nexport function isId<R extends IdResource>(resource: R, id: string): id is PrefixedId<R> {\n const parsed = parseId(id);\n return parsed !== null && parsed.prefix === ID_PREFIXES[resource];\n}\n\n/** True if `id` carries any known Myna resource prefix. */\nexport function isKnownId(id: string): boolean {\n const parsed = parseId(id);\n return parsed !== null && PREFIX_SET.has(parsed.prefix);\n}\n","/** UTC / date utilities. All Myna timestamps are UTC. */\n\n/** Current instant. */\nexport function now(): Date {\n return new Date();\n}\n\n/** ISO-8601 UTC string (millisecond precision). */\nexport function toIso(date: Date): string {\n return date.toISOString();\n}\n\n/** Parse an ISO string; returns `null` when invalid. */\nexport function parseIso(value: string): Date | null {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n}\n\nexport function addSeconds(date: Date, seconds: number): Date {\n return new Date(date.getTime() + seconds * 1000);\n}\n\nexport function addDays(date: Date, days: number): Date {\n return addSeconds(date, days * 86_400);\n}\n\nexport function isPast(date: Date, reference: Date = now()): boolean {\n return date.getTime() < reference.getTime();\n}\n\n/** Start of the current UTC calendar month (used for Free-plan usage periods). */\nexport function startOfUtcMonth(date: Date = now()): Date {\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1, 0, 0, 0, 0));\n}\n\n/** Start of the next UTC calendar month. */\nexport function startOfNextUtcMonth(date: Date = now()): Date {\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 1, 0, 0, 0, 0));\n}\n\nexport const SECONDS = 1;\nexport const MINUTES = 60;\nexport const HOURS = 60 * 60;\nexport const DAYS = 24 * 60 * 60;\n","/**\n * Browser origin normalization.\n *\n * An `Origin` request header is always exactly `scheme://host[:port]` — never a\n * trailing slash, never a path. What people configure is whatever their address\n * bar showed them, which usually *does* carry a trailing slash. Comparing the\n * two as raw strings means a perfectly reasonable `https://example.com/` never\n * matches the `https://example.com` the browser sends, and CORS fails with no\n * error anywhere: the API returns 200, the browser discards the response, and\n * the developer sees an unexplained network failure.\n *\n * Normalizing both sides of that comparison is what makes configuration behave\n * the way people expect.\n */\n\n/**\n * Reduce a user-supplied origin to its canonical `scheme://host[:port]` form.\n * Returns undefined for anything that is not an http(s) URL.\n *\n * Paths, queries, and fragments are dropped rather than rejected: someone who\n * pastes `https://example.com/blog` means that site, and refusing it teaches\n * nothing.\n */\nexport function normalizeOrigin(value: string): string | undefined {\n try {\n const url = new URL(value.trim());\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return undefined;\n // `URL.origin` is already the canonical form and drops the default port.\n return url.origin;\n } catch {\n return undefined;\n }\n}\n\n/** Normalize a list, dropping unparseable entries and duplicates, order preserved. */\nexport function normalizeOrigins(values: readonly string[]): string[] {\n const seen = new Set<string>();\n for (const value of values) {\n const normalized = normalizeOrigin(value);\n if (normalized) seen.add(normalized);\n }\n return [...seen];\n}\n","/**\n * Plan and entitlement constants (SPEC section 16).\n *\n * Polar identifiers never drive authorization directly; they map to these\n * internal plan keys and entitlements.\n */\n\nexport const PLAN_KEYS = [\"free\", \"pro\", \"internal\"] as const;\nexport type PlanKey = (typeof PLAN_KEYS)[number];\n\n/** Plans a customer can actually buy. `internal` is not one of them. */\nexport const PURCHASABLE_PLAN_KEYS = [\"free\", \"pro\"] as const;\nexport type PurchasablePlanKey = (typeof PURCHASABLE_PLAN_KEYS)[number];\n\n/** Metered usage metrics tracked per organization. */\nexport const USAGE_METRICS = [\n \"public_api_requests\",\n \"storage_bytes\",\n \"asset_bandwidth_bytes\",\n \"webhook_deliveries\",\n] as const;\nexport type UsageMetric = (typeof USAGE_METRICS)[number];\n\nconst GB = 1024 ** 3;\nconst MB = 1024 ** 2;\n\n/**\n * Sentinel for an allowance that is not enforced.\n *\n * `Infinity` would be the honest value, but every one of these numbers is\n * serialized into a JSON usage report, and `JSON.stringify(Infinity)` is\n * `null` — which a client cannot tell apart from \"no limit tracked for this\n * metric\". A finite ceiling no organization can reach survives the round trip\n * and still compares correctly against real usage.\n */\nexport const UNLIMITED = Number.MAX_SAFE_INTEGER;\n\n/** True when an entitlement value is the unenforced sentinel. */\nexport function isUnlimited(value: number | null): boolean {\n return value === UNLIMITED;\n}\n\nexport interface PlanEntitlements {\n key: PlanKey;\n /** Display price for UI only; billing is owned by Polar. */\n priceEurMonthly: number;\n priceEurYearly: number | null;\n maxProjects: number;\n maxMembers: number;\n /** Hard storage allowance in bytes. */\n storageBytes: number;\n /** Soft monthly asset bandwidth allowance in bytes. */\n monthlyBandwidthBytes: number;\n /** Soft monthly public content API request allowance. */\n monthlyPublicApiRequests: number;\n maxWebhookEndpoints: number;\n /** Revision retention in days; `null` means indefinite. */\n revisionRetentionDays: number | null;\n /** Per-file upload ceiling in bytes. */\n maxUploadBytes: number;\n}\n\nexport const PLANS: Record<PlanKey, PlanEntitlements> = {\n free: {\n key: \"free\",\n priceEurMonthly: 0,\n priceEurYearly: 0,\n maxProjects: 2,\n maxMembers: 2,\n storageBytes: 1 * GB,\n monthlyBandwidthBytes: 25 * GB,\n monthlyPublicApiRequests: 10_000,\n maxWebhookEndpoints: 1,\n revisionRetentionDays: 30,\n maxUploadBytes: 50 * MB,\n },\n pro: {\n key: \"pro\",\n priceEurMonthly: 9,\n priceEurYearly: 90,\n maxProjects: 10,\n maxMembers: 5,\n storageBytes: 10 * GB,\n monthlyBandwidthBytes: 250 * GB,\n monthlyPublicApiRequests: 500_000,\n maxWebhookEndpoints: 10,\n revisionRetentionDays: null,\n maxUploadBytes: 250 * MB,\n },\n /**\n * Myna's own organizations — the changelog, and anything else we run on the\n * product we sell. It is never sold, never offered at checkout, and cannot be\n * reached through the API: `scripts/bootstrap-internal-org.mjs` writes it\n * directly, and billing refuses to move an organization on or off it.\n */\n internal: {\n key: \"internal\",\n priceEurMonthly: 0,\n priceEurYearly: null,\n maxProjects: UNLIMITED,\n maxMembers: UNLIMITED,\n storageBytes: UNLIMITED,\n monthlyBandwidthBytes: UNLIMITED,\n monthlyPublicApiRequests: UNLIMITED,\n maxWebhookEndpoints: UNLIMITED,\n revisionRetentionDays: null,\n maxUploadBytes: UNLIMITED,\n },\n};\n\nexport function planFor(key: PlanKey): PlanEntitlements {\n return PLANS[key];\n}\n\n/** Display name for a plan. One spelling, every surface. */\nexport function planLabel(key: PlanKey): string {\n return { free: \"Free\", pro: \"Pro\", internal: \"Internal\" }[key];\n}\n\n/** Soft-limit warning thresholds for metered usage (SPEC 16). */\nexport const USAGE_THRESHOLDS = {\n warn: 0.8,\n atLimit: 1.0,\n throttle: 1.2,\n} as const;\n\n/** Failed-payment grace windows in days (SPEC 16). */\nexport const DUNNING = {\n fullAccessUntilDay: 7,\n restrictedUntilDay: 14,\n downgradeAtDay: 15,\n} as const;\n\n/** Soft-deletion / recovery windows in days. */\nexport const RETENTION = {\n organizationDeletionDays: 30,\n assetDeletionDays: 30,\n pendingUploadHours: 24,\n previewTokenDefaultHours: 24,\n previewTokenMaxDays: 7,\n sessionDays: 30,\n} as const;\n","/**\n * Fractional ranking for editorial ordering.\n *\n * Ranks are strings compared lexicographically, and between any two of them\n * another can always be generated: `\"a0\" < \"a1\" < \"a1V\" < \"a2\"`. That property\n * is the whole point. A numeric `order` field means moving one entry rewrites\n * the position of every entry after it — reordering twenty projects produces\n * twenty revisions, nineteen of which record no editorial decision and bury the\n * one that does. A subdividable string means one move touches one row.\n *\n * Two invariants make it work, and both are maintained by the generators here:\n *\n * 1. A rank is never empty.\n * 2. A rank never ends in the smallest digit. Without this, `\"0\"` could exist,\n * and nothing sorts before `\"0\"` — inserting at the top would be impossible.\n */\n\nconst DIGITS = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nconst MIN_DIGIT = DIGITS[0]!;\nconst LAST_INDEX = DIGITS.length - 1;\n/** Midpoint digit, used whenever an unconstrained choice is needed. */\nconst MID_DIGIT = DIGITS[Math.floor(DIGITS.length / 2)]!;\n\nexport class RankError extends Error {}\n\nfunction indexOf(digit: string): number {\n const index = DIGITS.indexOf(digit);\n if (index === -1) throw new RankError(`\"${digit}\" is not a valid rank digit.`);\n return index;\n}\n\n/** A rank strictly greater than `after` (which may be an empty suffix). */\nfunction rankAfterSuffix(after: string): string {\n let prefix = \"\";\n for (let i = 0; ; i++) {\n if (i >= after.length) {\n // Everything consumed: any appended digit sorts after a proper prefix.\n return prefix + MID_DIGIT;\n }\n const index = indexOf(after[i]!);\n if (index < LAST_INDEX) {\n // Halfway between this digit and the top; never the smallest digit.\n return prefix + DIGITS[Math.floor((index + DIGITS.length) / 2)]!;\n }\n // Already the largest digit — keep it and decide at the next position.\n prefix += after[i]!;\n }\n}\n\n/** A rank strictly less than `before`. */\nfunction rankBeforeString(before: string): string {\n let prefix = \"\";\n for (let i = 0; ; i++) {\n if (i >= before.length) {\n // Only reachable if `before` is all smallest-digits, which invariant 2\n // forbids. Guard rather than loop forever on corrupted data.\n throw new RankError(`Cannot rank before \"${before}\".`);\n }\n const index = indexOf(before[i]!);\n if (index > 1) return prefix + DIGITS[Math.floor(index / 2)]!;\n if (index === 1) {\n // Anything starting with the smallest digit sorts first; append a\n // non-smallest digit so invariant 2 holds.\n return prefix + MIN_DIGIT + MID_DIGIT;\n }\n prefix += MIN_DIGIT;\n }\n}\n\n/**\n * A rank strictly between `a` and `b`. `null` means unbounded on that side.\n * Throws when `a >= b`, which would have no answer.\n */\nexport function rankBetween(a: string | null, b: string | null): string {\n if (a !== null && b !== null && a >= b) {\n throw new RankError(`Cannot rank between \"${a}\" and \"${b}\": out of order.`);\n }\n if (a === null && b === null) return MID_DIGIT;\n if (a === null) return rankBeforeString(b!);\n if (b === null) return rankAfterSuffix(a);\n\n let prefix = \"\";\n for (let i = 0; ; i++) {\n // A shorter `a` behaves as if padded with the smallest digit.\n const digitA = i < a.length ? a[i]! : MIN_DIGIT;\n const digitB = i < b.length ? b[i] : undefined;\n\n if (digitB !== undefined && digitA === digitB) {\n prefix += digitA;\n continue;\n }\n\n const indexA = indexOf(digitA);\n const indexB = digitB !== undefined ? indexOf(digitB) : DIGITS.length;\n\n if (indexB - indexA > 1) {\n // Room between them: take the middle. It exceeds `a` and precedes `b`,\n // and is never the smallest digit because the gap is at least two.\n return prefix + DIGITS[Math.floor((indexA + indexB) / 2)]!;\n }\n\n // Adjacent digits leave no room here. Stay on `a`'s branch — anything under\n // it sorts before `b` — and go past `a`'s remainder.\n return prefix + digitA + rankAfterSuffix(a.slice(i + 1));\n }\n}\n\n/** Largest width to spread a sequence over; 62^4 stays well inside safe integers. */\nconst MAX_WIDTH = 4;\n\n/**\n * Evenly spaced ranks for `count` items, for a full (re)ordering.\n *\n * Spread across the digit space rather than generated by repeated append:\n * appending halves the remaining room each time, so a 200-item collection would\n * end up with 30-character ranks. Even spacing keeps them at two or three\n * characters and leaves room between every neighbouring pair for later\n * single-item moves.\n */\nexport function rankSequence(count: number): string[] {\n if (count <= 0) return [];\n\n let width = 1;\n while (width < MAX_WIDTH && Math.floor(DIGITS.length ** width / (count + 1)) < 2) {\n width += 1;\n }\n const step = Math.floor(DIGITS.length ** width / (count + 1));\n if (step < 1) {\n // More items than the widest spread can separate: fall back to subdivision,\n // which always works even though the ranks grow longer.\n const ranks: string[] = [];\n let previous: string | null = null;\n for (let i = 0; i < count; i++) {\n previous = rankBetween(previous, null);\n ranks.push(previous);\n }\n return ranks;\n }\n\n const ranks: string[] = [];\n for (let i = 1; i <= count; i++) {\n let value = i * step;\n let encoded = \"\";\n for (let d = 0; d < width; d++) {\n encoded = DIGITS[value % DIGITS.length]! + encoded;\n value = Math.floor(value / DIGITS.length);\n }\n // Fixed-width encoding already sorts correctly; a trailing smallest digit\n // would break invariant 2, and appending keeps it below the next value.\n ranks.push(encoded.endsWith(MIN_DIGIT) ? encoded + MID_DIGIT : encoded);\n }\n return ranks;\n}\n\n/** True when `value` is a well-formed rank. */\nexport function isValidRank(value: string): boolean {\n if (value.length === 0) return false;\n if (value.endsWith(MIN_DIGIT)) return false;\n return [...value].every((digit) => DIGITS.includes(digit));\n}\n","/**\n * Release and compatibility contract.\n *\n * `@myna-sh/sdk`, `@myna-sh/cli`, `@myna-sh/mcp`, and `@myna-sh/react` ship as\n * one lockstep version: they are always published together from the same commit\n * and always carry the same version number. `scripts/check-versions.mjs`\n * enforces that in CI, and `scripts/set-version.mjs` is the only supported way\n * to bump it.\n *\n * The API declares what it speaks through `GET /v1/meta`, so a client never has\n * to guess. `myna doctor` reads it to tell an operator — or an agent — exactly\n * which side is out of date.\n */\n\n/**\n * Dated version of the HTTP API surface. Bump it when request or response\n * shapes change in a way a client can observe. Additive, backward-compatible\n * changes do not need a bump; they are announced through `API_CAPABILITIES`.\n */\nexport const API_VERSION = \"2026-07-24\";\n\n/**\n * Oldest `@myna-sh/{sdk,cli,mcp,react}` release this API still supports. Clients\n * below this must upgrade; the API does not promise correct behavior for them.\n * Raising this is a breaking change and needs an `API_VERSION` bump.\n */\nexport const MIN_CLIENT_VERSION = \"0.2.0\";\n\n/**\n * Feature flags a client can detect before calling. Add an entry the moment a\n * feature ships; never remove one without bumping `API_VERSION`, because\n * clients branch on these.\n */\nexport const API_CAPABILITIES = [\n \"assets\",\n /** `GET /v1/auth/whoami` reports an API key's scopes and label. */\n \"auth.whoami.scopes\",\n \"billing\",\n \"change-sets\",\n \"change-sets.checks\",\n \"change-sets.comments\",\n \"change-sets.ready-for-review\",\n \"change-sets.reviews\",\n \"change-sets.schedule\",\n \"entries.bulk\",\n \"entries.duplicate\",\n \"entries.import\",\n /** Import matches by slug, updates in place, and skips identical rows. */\n \"entries.import.upsert\",\n /** Fractional-rank editorial ordering; a move writes one row. */\n \"entries.reorder\",\n \"entries.references\",\n \"entries.restore\",\n \"localization\",\n /** Hosted MCP server at `/mcp` (streamable HTTP), no local process needed. */\n \"mcp.hosted\",\n /** Myna is an OAuth 2.1 AS for `/mcp`: RFC 7591 registration, PKCE, RFC 8707. */\n \"mcp.oauth\",\n /** `planKey` may be `internal`: an unmetered organization Myna runs itself. */\n \"plans.internal\",\n \"previews\",\n /** `?preview=<token>` on content reads composes published + change-set state. */\n \"previews.overlay\",\n \"projects.cors-check\",\n \"projects.export\",\n \"projects.origins\",\n \"projects.views\",\n \"schema.drift\",\n \"schema.promote\",\n \"schema.push\",\n \"webhooks\",\n] as const;\n\nexport type ApiCapability = (typeof API_CAPABILITIES)[number];\n\n/** Parsed semantic version. Pre-release and build metadata are ignored. */\nexport interface SemVer {\n major: number;\n minor: number;\n patch: number;\n}\n\n/** Parse `1.2.3` (with optional `v` prefix and pre-release suffix). */\nexport function parseSemVer(version: string): SemVer | undefined {\n const match = /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/.exec(version.trim());\n if (!match) return undefined;\n return { major: Number(match[1]), minor: Number(match[2]), patch: Number(match[3]) };\n}\n\n/** Compare two versions: negative if `a` is older, 0 if equal, positive if newer. */\nexport function compareSemVer(a: string, b: string): number {\n const left = parseSemVer(a);\n const right = parseSemVer(b);\n if (!left || !right) throw new Error(`Cannot compare versions \"${a}\" and \"${b}\".`);\n return left.major - right.major || left.minor - right.minor || left.patch - right.patch;\n}\n\n/** True when `version` is at least `minimum`. */\nexport function satisfiesMinimum(version: string, minimum: string): boolean {\n return compareSemVer(version, minimum) >= 0;\n}\n","import type { Command } from \"commander\";\nimport type { ApiKeyScope, OrgRole, UpdateProjectRequest, WebhookEventType } from \"@myna-sh/api-contracts\";\nimport { normalizeOrigin } from \"@myna-sh/shared\";\nimport { writeUserConfig } from \"../config.js\";\nimport { UsageError, diag, emit, keyValues, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { openBrowser } from \"../util.js\";\n\nfunction csv<T extends string>(value: string): T[] {\n return value.split(\",\").map((s) => s.trim()).filter(Boolean) as T[];\n}\n\nexport function registerAdmin(program: Command): void {\n registerOrganizations(program);\n registerProjects(program);\n registerCors(program);\n registerKeys(program);\n registerMembers(program);\n registerWebhooks(program);\n registerActivity(program);\n registerBilling(program);\n}\n\nfunction registerOrganizations(program: Command): void {\n const orgs = program.command(\"organizations\").alias(\"orgs\").description(\"Manage organizations\");\n\n orgs\n .command(\"list\")\n .description(\"List organizations you belong to\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().organizations.list();\n emit(list, () =>\n table(list, [\n { header: \"SLUG\", value: (o) => o.slug },\n { header: \"NAME\", value: (o) => o.name },\n { header: \"ROLE\", value: (o) => o.role },\n { header: \"PLAN\", value: (o) => o.planKey },\n ]),\n );\n }),\n );\n\n orgs\n .command(\"create\")\n .description(\"Create an organization\")\n .requiredOption(\"--name <name>\", \"organization name\")\n .option(\"--slug <slug>\", \"organization slug\")\n .action(\n handle(async (ctx, _args, opts) => {\n const org = await ctx.management().organizations.create({\n name: opts.name as string,\n slug: opts.slug as string | undefined,\n });\n emit(org, () => diag(`Created ${org.slug} (${org.id}).`));\n }),\n );\n\n orgs\n .command(\"use\")\n .description(\"Set the default organization\")\n .argument(\"<slug>\", \"organization slug or id\")\n .action(\n handle(async (_ctx, args) => {\n writeUserConfig({ defaultOrganization: args[0] as string });\n emit({ defaultOrganization: args[0] as string }, () => diag(`Default organization set to ${args[0] as string}.`));\n }),\n );\n}\n\nfunction registerProjects(program: Command): void {\n const projects = program.command(\"projects\").description(\"Manage projects\");\n\n projects\n .command(\"list\")\n .description(\"List projects in the organization\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().projects.list(ctx.requireOrganization());\n emit(list, () =>\n table(list, [\n { header: \"SLUG\", value: (p) => p.slug },\n { header: \"NAME\", value: (p) => p.name },\n { header: \"PUBLIC API\", value: (p) => (p.publicApiEnabled ? \"on\" : \"off\") },\n { header: \"ARCHIVED\", value: (p) => (p.archivedAt ? \"yes\" : \"\") },\n ]),\n );\n }),\n );\n\n projects\n .command(\"create\")\n .description(\"Create a project\")\n .requiredOption(\"--name <name>\", \"project name\")\n .option(\"--slug <slug>\", \"project slug\")\n .option(\"--timezone <tz>\", \"project timezone\")\n .action(\n handle(async (ctx, _args, opts) => {\n const project = await ctx.management().projects.create(ctx.requireOrganization(), {\n name: opts.name as string,\n slug: opts.slug as string | undefined,\n timezone: opts.timezone as string | undefined,\n });\n emit(project, () => diag(`Created ${project.slug} (${project.id}).`));\n }),\n );\n\n projects\n .command(\"inspect\")\n .description(\"Show project details\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n emit(project, () =>\n keyValues([\n [\"ID\", project.id],\n [\"Name\", project.name],\n [\"Slug\", project.slug],\n [\"Timezone\", project.timezone],\n [\"Public API\", project.publicApiEnabled ? \"on\" : \"off\"],\n [\"Origins\", project.origins.join(\", \") || \"(none)\"],\n ]),\n );\n }),\n );\n\n projects\n .command(\"export\")\n .description(\"Export the full project (schemas, entries, asset metadata) as JSON\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const data = await ctx.management().projects.export(ref);\n process.stdout.write(`${JSON.stringify(data, null, 2)}\\n`);\n }),\n );\n\n projects\n .command(\"update\")\n .description(\"Update project settings\")\n .argument(\"[project]\", \"project id or slug\")\n .option(\"--name <name>\", \"project name\")\n .option(\"--timezone <timezone>\", \"IANA timezone\")\n .option(\"--public-api <state>\", \"public API state (on|off)\")\n .option(\"--default-preview-template <template>\", \"default preview URL template\")\n .option(\"--clear-default-preview-template\", \"remove the default preview URL template\")\n .option(\"--origins <urls>\", \"comma-separated allowed origins\")\n .option(\"--clear-origins\", \"remove all allowed origins\")\n .action(\n handle(async (ctx, args, opts) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const patch: UpdateProjectRequest = {};\n if (opts.name !== undefined) patch.name = opts.name as string;\n if (opts.timezone !== undefined) patch.timezone = opts.timezone as string;\n if (opts.publicApi !== undefined) {\n const state = String(opts.publicApi).toLowerCase();\n if (![\"on\", \"off\", \"true\", \"false\"].includes(state)) {\n throw new UsageError(\"--public-api must be on or off.\");\n }\n patch.publicApiEnabled = state === \"on\" || state === \"true\";\n }\n if (opts.defaultPreviewTemplate !== undefined && opts.clearDefaultPreviewTemplate) {\n throw new UsageError(\"Use either --default-preview-template or --clear-default-preview-template, not both.\");\n }\n if (opts.defaultPreviewTemplate !== undefined) {\n patch.defaultPreviewTemplate = opts.defaultPreviewTemplate as string;\n }\n if (opts.clearDefaultPreviewTemplate) patch.defaultPreviewTemplate = null;\n if (opts.origins !== undefined && opts.clearOrigins) {\n throw new UsageError(\"Use either --origins or --clear-origins, not both.\");\n }\n if (opts.origins !== undefined) patch.origins = csv<string>(opts.origins as string);\n if (opts.clearOrigins) patch.origins = [];\n if (Object.keys(patch).length === 0) {\n throw new UsageError(\"Specify at least one project setting to update.\");\n }\n const project = await ctx.management().projects.update(ref, patch);\n emit(project, () => diag(`Updated ${project.slug}.`));\n }),\n );\n\n /**\n * Incremental origin management.\n *\n * `projects update --origins` replaces the whole list, so adding one site\n * means restating every other — and forgetting one silently breaks a live\n * page. These read the current list and write back the change.\n */\n const origins = projects.command(\"origins\").description(\"Manage allowed browser origins\");\n\n origins\n .command(\"list\")\n .description(\"List the project's allowed browser origins\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n emit(project.origins, () =>\n table(\n project.origins.map((origin) => ({ origin })),\n [{ header: \"ORIGIN\", value: (r) => r.origin }],\n ),\n );\n }),\n );\n\n origins\n .command(\"add\")\n .description(\"Allow one or more browser origins\")\n .argument(\"<origins...>\", \"origins, e.g. https://example.com\")\n .option(\"--project <ref>\", \"project id or slug\")\n .action(\n handle(async (ctx, args, opts) => {\n const ref = (opts.project as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n const requested = (args[0] as string[]).map(normalizeOne);\n const next = [...new Set([...project.origins, ...requested])];\n const added = requested.filter((o) => !project.origins.includes(o));\n if (added.length === 0) {\n emit({ origins: project.origins, added: [] }, () => diag(\"Already allowed; nothing to do.\"));\n return;\n }\n const updated = await ctx.management().projects.update(ref, { origins: next });\n emit({ origins: updated.origins, added }, () =>\n diag(`Allowed ${added.join(\", \")} on ${updated.slug}.`),\n );\n }),\n );\n\n origins\n .command(\"remove\")\n .description(\"Stop allowing one or more browser origins\")\n .argument(\"<origins...>\", \"origins to remove\")\n .option(\"--project <ref>\", \"project id or slug\")\n .action(\n handle(async (ctx, args, opts) => {\n const ref = (opts.project as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.get(ref);\n const requested = (args[0] as string[]).map(normalizeOne);\n const next = project.origins.filter((o) => !requested.includes(o));\n const removed = project.origins.filter((o) => requested.includes(o));\n if (removed.length === 0) {\n emit({ origins: project.origins, removed: [] }, () => diag(\"Not configured; nothing to do.\"));\n return;\n }\n const updated = await ctx.management().projects.update(ref, { origins: next });\n emit({ origins: updated.origins, removed }, () =>\n diag(`Removed ${removed.join(\", \")} from ${updated.slug}.`),\n );\n }),\n );\n\n projects\n .command(\"archive\")\n .description(\"Archive a project\")\n .argument(\"[project]\", \"project id or slug\")\n .action(\n handle(async (ctx, args) => {\n const ref = (args[0] as string | undefined) ?? ctx.requireProject();\n const project = await ctx.management().projects.archive(ref);\n emit(project, () => diag(`Archived ${project.slug}.`));\n }),\n );\n}\n\n/** Canonicalize an origin the same way the API does, failing loudly on nonsense. */\nfunction normalizeOne(value: string): string {\n const normalized = normalizeOrigin(value);\n if (!normalized) throw new UsageError(`\"${value}\" is not a valid http(s) origin.`);\n return normalized;\n}\n\nfunction registerCors(program: Command): void {\n program\n .command(\"cors\")\n .description(\"Diagnose browser access to published content\")\n .command(\"check\")\n .description(\"Explain whether a browser at an origin can read this project\")\n .requiredOption(\"--origin <url>\", \"the browser origin to test\")\n .option(\"--collection <key>\", \"also check a specific collection's visibility\")\n .option(\"--project <ref>\", \"project id or slug\")\n .action(\n handle(async (ctx, _args, opts) => {\n const ref = (opts.project as string | undefined) ?? ctx.requireProject();\n const result = await ctx\n .management()\n .projects.corsCheck(ref, opts.origin as string, opts.collection as string | undefined);\n emit(result, () => {\n for (const c of result.checks) {\n process.stdout.write(`${c.ok ? \"✓\" : \"✗\"} ${c.detail}\\n`);\n }\n if (!result.allowed) {\n const failed = result.checks.find((c) => !c.ok);\n if (failed?.id === \"origin\") {\n diag(`\\nAllow it with: myna projects origins add ${result.origin}`);\n } else if (failed?.id === \"publicApi\") {\n diag(\"\\nEnable it with: myna projects update --public-api on\");\n }\n }\n });\n if (!result.allowed) process.exitCode = 1;\n }),\n );\n}\n\nfunction registerKeys(program: Command): void {\n const keys = program.command(\"keys\").description(\"Manage API keys\");\n\n keys\n .command(\"list\")\n .description(\"List API keys for the project (or organization with --org-scope)\")\n .option(\"--org-scope\", \"list organization-scoped keys\", false)\n .action(\n handle(async (ctx, _args, opts) => {\n const list = opts.orgScope\n ? await ctx.management().apiKeys.listForOrganization(ctx.requireOrganization())\n : await ctx.management().apiKeys.listForProject(ctx.requireProject());\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (k) => k.id },\n { header: \"NAME\", value: (k) => k.name },\n { header: \"SCOPES\", value: (k) => k.scopes.join(\",\") },\n { header: \"REVOKED\", value: (k) => (k.revokedAt ? \"yes\" : \"\") },\n ]),\n );\n }),\n );\n\n keys\n .command(\"create\")\n .description(\"Create an API key (project-scoped by default)\")\n .requiredOption(\"--name <name>\", \"key name\")\n .requiredOption(\"--scopes <scopes>\", \"comma-separated scopes\")\n .option(\"--label <label>\", \"agent/integration label\")\n .option(\"--org-scope\", \"create an organization-scoped key\", false)\n .option(\"--expires-at <iso>\", \"expiry (ISO 8601)\")\n .action(\n handle(async (ctx, _args, opts) => {\n const body = {\n name: opts.name as string,\n scopes: csv<ApiKeyScope>(opts.scopes as string),\n label: opts.label as string | undefined,\n expiresAt: opts.expiresAt as string | undefined,\n };\n const result = opts.orgScope\n ? await ctx.management().apiKeys.createForOrganization(ctx.requireOrganization(), body)\n : await ctx.management().apiKeys.createForProject(ctx.requireProject(), body);\n emit(result, () => {\n diag(\"Store this secret now — it will not be shown again.\");\n keyValues([\n [\"ID\", result.key.id],\n [\"Name\", result.key.name],\n [\"Secret\", result.secret],\n ]);\n });\n }),\n );\n\n keys\n .command(\"revoke\")\n .description(\"Revoke an API key\")\n .argument(\"<id>\", \"key id (key_)\")\n .option(\"--org-scope\", \"revoke an organization-scoped key\", false)\n .action(\n handle(async (ctx, args, opts) => {\n if (opts.orgScope) {\n await ctx.management().apiKeys.revokeForOrganization(ctx.requireOrganization(), args[0] as string);\n } else {\n await ctx.management().apiKeys.revokeForProject(ctx.requireProject(), args[0] as string);\n }\n emit({ ok: true }, () => diag(`Revoked ${args[0] as string}.`));\n }),\n );\n}\n\nfunction registerMembers(program: Command): void {\n const members = program.command(\"members\").description(\"Manage organization members\");\n\n members\n .command(\"list\")\n .description(\"List members and pending invitations\")\n .action(\n handle(async (ctx) => {\n const org = ctx.requireOrganization();\n const [list, invites] = await Promise.all([\n ctx.management().members.list(org),\n ctx.management().invitations.list(org).catch(() => []),\n ]);\n emit({ members: list, invitations: invites }, () => {\n table(list, [\n { header: \"USER\", value: (m) => m.username ?? m.userId },\n { header: \"EMAIL\", value: (m) => m.email },\n { header: \"ROLE\", value: (m) => m.role },\n ]);\n if (invites.length > 0) {\n diag(\"\\nPending invitations:\");\n table(invites, [\n { header: \"EMAIL\", value: (i) => i.email },\n { header: \"ROLE\", value: (i) => i.role },\n { header: \"EXPIRES\", value: (i) => i.expiresAt },\n ]);\n }\n });\n }),\n );\n\n members\n .command(\"invite\")\n .description(\"Invite a member by email\")\n .requiredOption(\"--email <email>\", \"invitee email\")\n .requiredOption(\"--role <role>\", \"role (admin|editor|viewer)\")\n .action(\n handle(async (ctx, _args, opts) => {\n const invite = await ctx.management().invitations.create(ctx.requireOrganization(), {\n email: opts.email as string,\n role: opts.role as Exclude<OrgRole, \"owner\">,\n });\n emit(invite, () =>\n diag(\n `Invited ${invite.email} as ${invite.role}. An email with the accept link is on its way; it expires ${invite.expiresAt}.`,\n ),\n );\n }),\n );\n\n members\n .command(\"update\")\n .description(\"Update a member's role\")\n .argument(\"<user>\", \"user id\")\n .requiredOption(\"--role <role>\", \"new role\")\n .action(\n handle(async (ctx, args, opts) => {\n await ctx.management().members.update(ctx.requireOrganization(), args[0] as string, {\n role: opts.role as OrgRole,\n });\n emit({ ok: true }, () => diag(`Updated ${args[0] as string} to ${opts.role as string}.`));\n }),\n );\n\n members\n .command(\"remove\")\n .description(\"Remove a member\")\n .argument(\"<user>\", \"user id\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().members.remove(ctx.requireOrganization(), args[0] as string);\n emit({ ok: true }, () => diag(`Removed ${args[0] as string}.`));\n }),\n );\n}\n\nfunction registerWebhooks(program: Command): void {\n const webhooks = program.command(\"webhooks\").description(\"Manage webhook endpoints\");\n\n webhooks\n .command(\"list\")\n .description(\"List webhook endpoints\")\n .action(\n handle(async (ctx) => {\n const list = await ctx.management().webhooks.list(ctx.requireProject());\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (w) => w.id },\n { header: \"URL\", value: (w) => w.url },\n { header: \"EVENTS\", value: (w) => w.events.join(\",\") },\n { header: \"ENABLED\", value: (w) => (w.enabled ? \"yes\" : \"no\") },\n ]),\n );\n }),\n );\n\n webhooks\n .command(\"create\")\n .description(\"Create a webhook endpoint\")\n .requiredOption(\"--url <url>\", \"endpoint URL\")\n .requiredOption(\"--events <events>\", \"comma-separated event types\")\n .action(\n handle(async (ctx, _args, opts) => {\n const result = await ctx.management().webhooks.create(ctx.requireProject(), {\n url: opts.url as string,\n events: csv<WebhookEventType>(opts.events as string),\n enabled: true,\n });\n emit(result, () => {\n diag(\"Store this signing secret now — it will not be shown again.\");\n keyValues([\n [\"ID\", result.endpoint.id],\n [\"URL\", result.endpoint.url],\n [\"Signing secret\", result.signingSecret],\n ]);\n });\n }),\n );\n\n webhooks\n .command(\"update\")\n .description(\"Update a webhook endpoint\")\n .argument(\"<id>\", \"webhook id\")\n .option(\"--url <url>\", \"new URL\")\n .option(\"--events <events>\", \"comma-separated event types\")\n .option(\"--enabled <bool>\", \"enable/disable (true|false)\")\n .action(\n handle(async (ctx, args, opts) => {\n const patch: { url?: string; events?: WebhookEventType[]; enabled?: boolean } = {};\n if (opts.url) patch.url = opts.url as string;\n if (opts.events) patch.events = csv<WebhookEventType>(opts.events as string);\n if (opts.enabled !== undefined) patch.enabled = opts.enabled === \"true\";\n const endpoint = await ctx.management().webhooks.update(ctx.requireProject(), args[0] as string, patch);\n emit(endpoint, () => diag(`Updated ${endpoint.id}.`));\n }),\n );\n\n webhooks\n .command(\"delete\")\n .description(\"Delete a webhook endpoint\")\n .argument(\"<id>\", \"webhook id\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().webhooks.delete(ctx.requireProject(), args[0] as string);\n emit({ ok: true }, () => diag(`Deleted ${args[0] as string}.`));\n }),\n );\n\n webhooks\n .command(\"deliveries\")\n .description(\"List recent deliveries for a webhook\")\n .argument(\"<id>\", \"webhook id\")\n .action(\n handle(async (ctx, args) => {\n const list = await ctx.management().webhooks.deliveries(ctx.requireProject(), args[0] as string);\n emit(list, () =>\n table(list, [\n { header: \"ID\", value: (d) => d.id },\n { header: \"EVENT\", value: (d) => d.eventType },\n { header: \"ATTEMPT\", value: (d) => String(d.attempt) },\n { header: \"STATUS\", value: (d) => d.status },\n { header: \"HTTP\", value: (d) => (d.responseStatus ? String(d.responseStatus) : \"\") },\n ]),\n );\n }),\n );\n\n webhooks\n .command(\"retry\")\n .description(\"Retry a webhook delivery\")\n .argument(\"<webhook>\", \"webhook id\")\n .argument(\"<delivery>\", \"delivery id\")\n .action(\n handle(async (ctx, args) => {\n await ctx.management().webhooks.retry(ctx.requireProject(), args[0] as string, args[1] as string);\n emit({ ok: true }, () => diag(`Retrying delivery ${args[1] as string}.`));\n }),\n );\n}\n\nfunction registerActivity(program: Command): void {\n program\n .command(\"activity\")\n .description(\"Show the project activity feed\")\n .option(\"--actor-type <type>\", \"filter by actor type\")\n .option(\"--action <action>\", \"filter by action\")\n .option(\"--limit <n>\", \"page size\", \"25\")\n .action(\n handle(async (ctx, _args, opts) => {\n const page = await ctx.management().activity(ctx.requireProject(), {\n actorType: opts.actorType as string | undefined,\n action: opts.action as string | undefined,\n limit: Number(opts.limit),\n });\n emit({ data: page.data, nextCursor: page.nextCursor }, () =>\n table(page.data, [\n { header: \"WHEN\", value: (a) => a.createdAt },\n { header: \"ACTOR\", value: (a) => a.actorType },\n { header: \"ACTION\", value: (a) => a.action },\n { header: \"TARGET\", value: (a) => `${a.targetType ?? \"\"} ${a.targetId ?? \"\"}`.trim() },\n ]),\n );\n }),\n );\n}\n\nfunction registerBilling(program: Command): void {\n const billing = program.command(\"billing\").description(\"Billing status and management\");\n\n billing\n .command(\"status\")\n .description(\"Show the organization's plan and usage\")\n .action(\n handle(async (ctx) => {\n const org = ctx.requireOrganization();\n const [status, usage] = await Promise.all([\n ctx.management().billing.status(org),\n ctx.management().organizations.usage(org).catch(() => undefined),\n ]);\n emit({ billing: status, usage }, () => {\n keyValues([\n [\"Plan\", status.subscription.planKey],\n [\"Status\", status.subscription.status],\n [\"Provider customer\", status.hasProviderCustomer ? \"yes\" : \"no\"],\n ]);\n if (usage) {\n diag(\"\\nUsage:\");\n table(usage.metrics, [\n { header: \"METRIC\", value: (m) => m.metric },\n { header: \"USED\", value: (m) => String(m.quantity) },\n { header: \"LIMIT\", value: (m) => (m.limit === null ? \"∞\" : String(m.limit)) },\n ]);\n }\n });\n }),\n );\n\n billing\n .command(\"upgrade\")\n .description(\"Start a Pro checkout\")\n .option(\"--interval <interval>\", \"month|year\", \"month\")\n .action(\n handle(async (ctx, _args, opts) => {\n const result = await ctx.management().billing.checkout(ctx.requireOrganization(), {\n interval: (opts.interval as \"month\" | \"year\") ?? \"month\",\n });\n if (ctx.interactive) openBrowser(result.checkoutUrl);\n emit(result, () => process.stdout.write(`${result.checkoutUrl}\\n`));\n }),\n );\n\n billing\n .command(\"portal\")\n .description(\"Open the billing portal\")\n .action(\n handle(async (ctx) => {\n const result = await ctx.management().billing.portal(ctx.requireOrganization());\n if (ctx.interactive) openBrowser(result.portalUrl);\n emit(result, () => process.stdout.write(`${result.portalUrl}\\n`));\n }),\n );\n}\n","import { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { generateTypesModule, isMynaApiError } from \"@myna-sh/sdk/management\";\nimport { compareSemVer, normalizeOrigin, parseSemVer } from \"@myna-sh/shared\";\nimport type { CollectionSchema } from \"@myna-sh/schema\";\nimport { checkCredential, describeIdentity, fetchMeta, scopesOf } from \"../auth-check.js\";\nimport type { Ctx } from \"../client.js\";\nimport { diag, emit } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { loadLocalSchemas, schemaDirFor } from \"../schema-loader.js\";\nimport { VERSION } from \"../version.js\";\n\n/**\n * `myna doctor` — one command that answers \"why isn't this working?\".\n *\n * Every check reports the same shape so an agent can act on it without parsing\n * prose: an id, a status, what was observed, and the command that fixes it.\n * Checks never throw; a check that cannot run reports `skip` with the reason,\n * because a diagnostic that dies on the first problem cannot diagnose the rest.\n */\n\ntype Status = \"pass\" | \"warn\" | \"fail\" | \"skip\";\n\ninterface Check {\n id: string;\n title: string;\n status: Status;\n detail: string;\n remedy?: string;\n}\n\nconst NPM_REGISTRY = \"https://registry.npmjs.org\";\nconst SCAN_IGNORE = new Set([\"node_modules\", \".git\", \"dist\", \"build\", \".react-router\", \".turbo\", \"coverage\"]);\n\n/**\n * Both markers must be present to call a file \"generated types\".\n *\n * Matching the header alone also matches any source file that merely mentions\n * it — including this one, which is exactly the false positive that shipped the\n * first time. Requiring the emitted registry interface as well keeps the test\n * on output rather than on prose.\n */\nconst GENERATED_MARKERS = [\n \"// Generated by `myna types generate`. Do not edit by hand.\",\n \"export interface MynaCollections {\",\n];\n\nfunction looksGenerated(contents: string): boolean {\n return GENERATED_MARKERS.every((marker) => contents.includes(marker));\n}\n\nfunction check(id: string, title: string, status: Status, detail: string, remedy?: string): Check {\n return remedy ? { id, title, status, detail, remedy } : { id, title, status, detail };\n}\n\n/** Latest published version, or undefined when npm is unreachable. */\nasync function latestPublished(pkg: string): Promise<string | undefined> {\n try {\n const res = await fetch(`${NPM_REGISTRY}/${pkg}/latest`, {\n headers: { accept: \"application/json\" },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) return undefined;\n const body = (await res.json()) as { version?: string };\n return body.version;\n } catch {\n return undefined;\n }\n}\n\nasync function checkCliVersion(): Promise<Check> {\n if (!parseSemVer(VERSION)) {\n return check(\n \"cli.version\",\n \"CLI version\",\n \"warn\",\n `Running an unreleased build (${VERSION}).`,\n \"Install a published release: npm install -g @myna-sh/cli\",\n );\n }\n const latest = await latestPublished(\"@myna-sh/cli\");\n if (!latest) {\n return check(\"cli.version\", \"CLI version\", \"skip\", `${VERSION} (could not reach npm to compare).`);\n }\n const behind = compareSemVer(VERSION, latest) < 0;\n return behind\n ? check(\n \"cli.version\",\n \"CLI version\",\n \"warn\",\n `${VERSION} is behind the latest release ${latest}.`,\n `npm install -g @myna-sh/cli@${latest}`,\n )\n : check(\"cli.version\", \"CLI version\", \"pass\", `${VERSION} is current.`);\n}\n\nfunction checkApi(meta: Awaited<ReturnType<typeof fetchMeta>>, apiUrl: string): Check[] {\n if (!meta) {\n return [\n check(\n \"api.reachable\",\n \"API reachable\",\n \"fail\",\n `No capability descriptor from ${apiUrl}/v1/meta.`,\n \"Check --api-url / MYNA_API_URL and network access. An API older than 0.2.0 does not serve /v1/meta.\",\n ),\n ];\n }\n\n const checks = [\n check(\"api.reachable\", \"API reachable\", \"pass\", `${apiUrl} speaks API ${meta.apiVersion}.`),\n ];\n\n if (!parseSemVer(VERSION)) {\n checks.push(\n check(\"api.compatibility\", \"Client compatibility\", \"skip\", \"Unreleased CLI build; nothing to compare.\"),\n );\n return checks;\n }\n\n const supported = compareSemVer(VERSION, meta.minClientVersion) >= 0;\n checks.push(\n supported\n ? check(\n \"api.compatibility\",\n \"Client compatibility\",\n \"pass\",\n `CLI ${VERSION} meets the minimum supported client ${meta.minClientVersion}.`,\n )\n : check(\n \"api.compatibility\",\n \"Client compatibility\",\n \"fail\",\n `CLI ${VERSION} is older than the minimum client ${meta.minClientVersion} this API supports.`,\n `npm install -g @myna-sh/cli@latest`,\n ),\n );\n return checks;\n}\n\nasync function checkAuth(ctx: Ctx): Promise<Check[]> {\n const status = await checkCredential(ctx.apiUrl, ctx.token, ctx.tokenSource);\n\n if (!status.credentialPresent) {\n return [\n check(\"auth.credential\", \"Credential\", \"fail\", \"No credential found.\", \"myna login\"),\n ];\n }\n if (!status.credentialValid) {\n return [\n check(\n \"auth.credential\",\n \"Credential\",\n \"fail\",\n // The distinction the old `whoami` collapsed.\n `A credential is present (from ${status.source}) but the API rejected it: ${status.error?.detail ?? \"unknown reason\"}.`,\n status.error?.code === \"UNREACHABLE\" ? undefined : \"myna login\",\n ),\n ];\n }\n\n const checks = [\n check(\"auth.credential\", \"Credential\", \"pass\", `Valid — ${describeIdentity(status.identity!)}.`),\n ];\n\n const scopes = scopesOf(status.identity);\n if (scopes) {\n checks.push(\n scopes.length > 0\n ? check(\"auth.scopes\", \"Key scopes\", \"pass\", scopes.join(\", \"))\n : check(\n \"auth.scopes\",\n \"Key scopes\",\n \"fail\",\n \"The key carries no scopes, so every authorized call will be denied.\",\n \"Mint a scoped key: myna keys create --scopes content:read,content:write\",\n ),\n );\n }\n return checks;\n}\n\nasync function checkProject(ctx: Ctx): Promise<Check[]> {\n if (!ctx.project) {\n return [\n check(\n \"project.link\",\n \"Project\",\n \"warn\",\n \"No project selected.\",\n \"myna link --project <project>, or pass --project\",\n ),\n ];\n }\n try {\n const project = await ctx.management().projects.get(ctx.project);\n const where = ctx.linkedRoot ? ` (linked at ${ctx.linkedRoot})` : \"\";\n return [\n check(\"project.link\", \"Project\", \"pass\", `${project.slug}${where}.`),\n project.publicApiEnabled\n ? check(\"project.publicApi\", \"Public API\", \"pass\", \"Enabled.\")\n : check(\n \"project.publicApi\",\n \"Public API\",\n \"warn\",\n \"Disabled — browser and unauthenticated reads will 404.\",\n \"myna projects update --public-api\",\n ),\n ];\n } catch (error) {\n const detail = isMynaApiError(error)\n ? `${error.code} — ${error.detail ?? error.title}`\n : error instanceof Error\n ? error.message\n : String(error);\n return [\n check(\n \"project.link\",\n \"Project\",\n \"fail\",\n `Cannot read project \"${ctx.project}\": ${detail}`,\n \"Check the project ref and that your credential has access to it.\",\n ),\n ];\n }\n}\n\nasync function checkOrigin(ctx: Ctx, origin: string): Promise<Check> {\n const canonical = normalizeOrigin(origin);\n if (!canonical) {\n return check(\"origins\", \"Browser origin\", \"fail\", `\"${origin}\" is not a valid http(s) origin.`);\n }\n if (!ctx.project) {\n return check(\"origins\", \"Browser origin\", \"skip\", \"No project selected.\");\n }\n try {\n const project = await ctx.management().projects.get(ctx.project);\n // Compare canonical forms: a configured trailing slash is the same origin.\n const allowed = project.origins.some((o) => normalizeOrigin(o) === canonical);\n return allowed\n ? check(\"origins\", \"Browser origin\", \"pass\", `${canonical} is allowed on ${project.slug}.`)\n : check(\n \"origins\",\n \"Browser origin\",\n \"fail\",\n `${canonical} is not allowed on ${project.slug}. A browser will discard responses from it. Configured: ${\n project.origins.length > 0 ? project.origins.join(\", \") : \"(none)\"\n }`,\n `myna projects update --origins ${[...project.origins, canonical].join(\",\")}`,\n );\n } catch {\n return check(\"origins\", \"Browser origin\", \"skip\", \"Could not read the project's origins.\");\n }\n}\n\nasync function checkSchema(ctx: Ctx, schemaDir: string | undefined): Promise<Check> {\n const dir = schemaDirFor(ctx.linkedRoot, schemaDir);\n if (!existsSync(dir)) {\n return check(\"schema.drift\", \"Local schema\", \"skip\", `No schema directory at ${dir}.`);\n }\n if (!ctx.project) {\n return check(\"schema.drift\", \"Local schema\", \"skip\", \"No project selected.\");\n }\n let local: CollectionSchema[];\n try {\n local = await loadLocalSchemas(dir);\n } catch (error) {\n return check(\n \"schema.drift\",\n \"Local schema\",\n \"fail\",\n `Could not load schemas from ${dir}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n if (local.length === 0) {\n return check(\"schema.drift\", \"Local schema\", \"skip\", `No collections defined in ${dir}.`);\n }\n try {\n const diff = await ctx\n .management()\n .schema.diff(ctx.project, local as unknown as Record<string, unknown>[]);\n return diff.ops.length === 0\n ? check(\"schema.drift\", \"Local schema\", \"pass\", `${local.length} collection(s) match the deployed schema.`)\n : check(\n \"schema.drift\",\n \"Local schema\",\n \"warn\",\n `${diff.ops.length} undeployed change(s) (${diff.classification}).`,\n \"myna schema diff, then myna schema push\",\n );\n } catch (error) {\n return check(\n \"schema.drift\",\n \"Local schema\",\n \"skip\",\n `Could not diff against the deployed schema: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/** Shallow scan for a file written by `myna types generate`. */\nfunction findGeneratedTypes(root: string, depth = 4): string | undefined {\n let entries: string[];\n try {\n entries = readdirSync(root);\n } catch {\n return undefined;\n }\n const dirs: string[] = [];\n for (const entry of entries) {\n if (SCAN_IGNORE.has(entry) || entry.startsWith(\".\")) continue;\n const full = join(root, entry);\n let stats;\n try {\n stats = statSync(full);\n } catch {\n continue;\n }\n if (stats.isDirectory()) {\n dirs.push(full);\n continue;\n }\n if (!/\\.(ts|d\\.ts)$/.test(entry)) continue;\n try {\n if (looksGenerated(readFileSync(full, \"utf8\"))) return full;\n } catch {\n // Unreadable file; keep scanning.\n }\n }\n if (depth <= 0) return undefined;\n for (const dir of dirs) {\n const found = findGeneratedTypes(dir, depth - 1);\n if (found) return found;\n }\n return undefined;\n}\n\nasync function checkTypes(ctx: Ctx, explicit: string | undefined, schemaDir: string | undefined): Promise<Check> {\n const root = ctx.linkedRoot ?? process.cwd();\n const file = explicit ?? findGeneratedTypes(root);\n if (!file) {\n return check(\"types.freshness\", \"Generated types\", \"skip\", \"No generated types file found.\");\n }\n if (!existsSync(file)) {\n return check(\"types.freshness\", \"Generated types\", \"fail\", `${file} does not exist.`);\n }\n\n const dir = schemaDirFor(ctx.linkedRoot, schemaDir);\n if (!existsSync(dir)) {\n return check(\"types.freshness\", \"Generated types\", \"skip\", `Found ${file} but no schema directory to compare against.`);\n }\n\n try {\n const expected = generateTypesModule(await loadLocalSchemas(dir));\n // Codegen is deterministic, so an exact match is a real freshness signal.\n return readFileSync(file, \"utf8\") === expected\n ? check(\"types.freshness\", \"Generated types\", \"pass\", `${file} matches the local schema.`)\n : check(\n \"types.freshness\",\n \"Generated types\",\n \"warn\",\n `${file} is out of date with the local schema.`,\n `myna types generate --out ${file}`,\n );\n } catch (error) {\n return check(\n \"types.freshness\",\n \"Generated types\",\n \"skip\",\n `Could not regenerate types for comparison: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nconst ICON: Record<Status, string> = { pass: \"✓\", warn: \"!\", fail: \"✗\", skip: \"–\" };\n\nexport function registerDoctor(program: Command): void {\n program\n .command(\"doctor\")\n .description(\"Diagnose CLI, API, credential, project, schema, and origin configuration\")\n .option(\"--origin <url>\", \"also check whether this browser origin is allowed\")\n .option(\"--schema-dir <dir>\", \"schema directory\")\n .option(\"--types <file>\", \"generated types file to check for freshness\")\n .action(\n handle(async (ctx, _args, opts) => {\n const checks: Check[] = [];\n\n checks.push(await checkCliVersion());\n\n const meta = await fetchMeta(ctx.apiUrl);\n checks.push(...checkApi(meta, ctx.apiUrl));\n\n const auth = await checkAuth(ctx);\n checks.push(...auth);\n\n // Everything below needs a working credential; running it without one\n // produces a wall of failures that all restate the same cause.\n const authed = auth[0]?.status === \"pass\";\n if (authed) {\n checks.push(...(await checkProject(ctx)));\n checks.push(await checkSchema(ctx, opts.schemaDir as string | undefined));\n checks.push(await checkTypes(ctx, opts.types as string | undefined, opts.schemaDir as string | undefined));\n if (opts.origin) checks.push(await checkOrigin(ctx, opts.origin as string));\n } else {\n const deferred: Array<[string, string]> = [\n [\"project.link\", \"Project\"],\n [\"schema.drift\", \"Local schema\"],\n [\"types.freshness\", \"Generated types\"],\n ];\n for (const [id, title] of deferred) {\n checks.push(check(id, title, \"skip\", \"Requires a valid credential.\"));\n }\n }\n\n const failed = checks.filter((c) => c.status === \"fail\").length;\n const warned = checks.filter((c) => c.status === \"warn\").length;\n\n emit({ ok: failed === 0, failed, warned, checks }, () => {\n for (const c of checks) {\n process.stdout.write(`${ICON[c.status]} ${c.title}: ${c.detail}\\n`);\n if (c.remedy && c.status !== \"pass\") process.stdout.write(` → ${c.remedy}\\n`);\n }\n diag(\n failed === 0\n ? warned === 0\n ? \"\\nAll checks passed.\"\n : `\\n${warned} warning(s), no failures.`\n : `\\n${failed} failure(s), ${warned} warning(s).`,\n );\n });\n\n if (failed > 0) process.exitCode = 1;\n }),\n );\n}\n","/**\n * Build-time version stamp.\n *\n * `tsup` substitutes `__MYNA_VERSION__` with the value from `package.json`\n * (see `tsup.config.ts`), so a published binary can never disagree with the\n * package it was published from — the drift class simply stops existing.\n * Running from source (tsx, `turbo dev`) leaves the identifier undefined and\n * falls back to a marker that is obviously not a release.\n */\ndeclare const __MYNA_VERSION__: string | undefined;\n\nexport const VERSION: string =\n typeof __MYNA_VERSION__ === \"string\" ? __MYNA_VERSION__ : \"0.0.0-dev\";\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { UsageError, diag, emit, table } from \"../output.js\";\nimport { handle } from \"../runtime.js\";\nimport { readContentRows, type ContentFormat } from \"../content-files.js\";\nimport type { Ctx } from \"../client.js\";\n\n/**\n * `myna sync` — reconcile a content directory into a collection.\n *\n * Migrating a site otherwise means writing a throwaway script that walks files\n * and drives the API once per entry. This does the whole reconciliation in one\n * staged change set: rows that exist are updated, rows that match byte for byte\n * are left alone, new rows are created, and — only when asked — entries with no\n * corresponding file are staged for deletion.\n *\n * Nothing publishes. The result is a change set to review.\n */\n\ninterface SyncPlanEntry {\n collection: string;\n path: string;\n}\n\nasync function isDirectory(path: string): Promise<boolean> {\n const info = await stat(path).catch(() => undefined);\n return Boolean(info?.isDirectory());\n}\n\n/**\n * Work out what to sync.\n *\n * With `--collection`, the directory is that collection's content. Without it,\n * each immediate subdirectory is a collection named after it — the layout most\n * content repositories already have.\n */\nasync function planDirectories(dir: string, collection: string | undefined): Promise<SyncPlanEntry[]> {\n if (!(await isDirectory(dir))) {\n if (!collection) throw new UsageError(\"Syncing a single file needs --collection.\");\n return [{ collection, path: dir }];\n }\n if (collection) return [{ collection, path: dir }];\n\n const children = await readdir(dir);\n const plan: SyncPlanEntry[] = [];\n for (const name of children.sort()) {\n if (name.startsWith(\".\")) continue;\n const full = join(dir, name);\n if (await isDirectory(full)) plan.push({ collection: name, path: full });\n }\n if (plan.length === 0) {\n throw new UsageError(\n `No collection subdirectories in ${dir}. Pass --collection to sync it as one collection.`,\n );\n }\n return plan;\n}\n\nexport function registerSync(program: Command): void {\n program\n .command(\"sync\")\n .description(\"Reconcile a content directory into collections, staged on one change set\")\n .argument(\"<dir>\", \"content directory\")\n .option(\"--collection <key>\", \"treat the directory as one collection instead of one per subdirectory\")\n .option(\"--format <format>\", \"json or markdown-frontmatter (detected from the files by default)\")\n .option(\"--body-field <key>\", \"field that receives the Markdown body\", \"body\")\n .option(\"--change-set <id>\", \"stage onto an existing change set\")\n .option(\"--dry-run\", \"report what would change without writing\", false)\n .option(\"--delete-missing\", \"also stage deletion of entries with no matching file\", false)\n .option(\"--confirm-delete\", \"required consequence flag for --delete-missing\", false)\n .action(\n handle(async (ctx, args, opts) => {\n const project = ctx.requireProject();\n const dryRun = Boolean(opts.dryRun);\n const deleteMissing = Boolean(opts.deleteMissing);\n if (deleteMissing && !opts.confirmDelete && !dryRun) {\n throw new UsageError(\"--delete-missing removes published content. Add --confirm-delete, or use --dry-run.\");\n }\n\n const plan = await planDirectories(args[0] as string, opts.collection as string | undefined);\n const mgmt = ctx.management();\n\n // One change set for the whole sync, so a migration reviews and\n // publishes as a single decision rather than one per collection.\n let changeSetId = opts.changeSet as string | undefined;\n\n const report: {\n collection: string;\n created: number;\n updated: number;\n unchanged: number;\n invalid: number;\n deleted: number;\n deletedSlugs: string[];\n }[] = [];\n let failed = false;\n\n for (const target of plan) {\n const source = await readContentRows(target.path, {\n format: parseFormat(opts.format as string | undefined),\n bodyField: opts.bodyField as string,\n });\n if (source.rows.length === 0) continue;\n\n const result = await mgmt.entries.import(project, {\n collection: target.collection,\n entries: source.rows.map((r) => (r.slug ? { slug: r.slug, data: r.data } : { data: r.data })),\n dryRun,\n changeSetId,\n mode: \"upsert\",\n });\n if (!result.valid) {\n failed = true;\n for (const row of result.results.filter((r) => r.outcome === \"invalid\")) {\n const where = source.rows[row.index]?.source ?? `row ${row.index}`;\n for (const e of row.errors ?? []) {\n process.stderr.write(` ${where}: ${e.path || \"(entry)\"} ${e.message}\\n`);\n }\n }\n }\n // Reuse the change set the first import created for the rest.\n changeSetId ??= result.changeSetId ?? undefined;\n\n let deleted = 0;\n let deletedSlugs: string[] = [];\n if (deleteMissing && result.valid) {\n const staged = await stageMissingDeletions(\n ctx,\n project,\n target.collection,\n new Set(source.rows.map((r) => r.slug).filter((s): s is string => Boolean(s))),\n changeSetId,\n dryRun,\n );\n deleted = staged.count;\n deletedSlugs = staged.slugs;\n // Deletions can be the only thing a sync does; without capturing\n // their change set the run would report \"nothing to do\" while\n // having staged removals.\n changeSetId ??= staged.changeSetId;\n }\n\n report.push({\n collection: target.collection,\n created: result.summary.created,\n updated: result.summary.updated,\n unchanged: result.summary.unchanged,\n invalid: result.summary.invalid,\n deleted,\n deletedSlugs,\n });\n }\n\n emit({ dryRun, changeSetId: changeSetId ?? null, collections: report, ok: !failed }, () => {\n table(report, [\n { header: \"COLLECTION\", value: (r) => r.collection },\n { header: \"CREATED\", value: (r) => String(r.created) },\n { header: \"UPDATED\", value: (r) => String(r.updated) },\n { header: \"UNCHANGED\", value: (r) => String(r.unchanged) },\n { header: \"DELETED\", value: (r) => String(r.deleted) },\n { header: \"INVALID\", value: (r) => String(r.invalid) },\n ]);\n // A destructive operation must name what it removes. A count alone\n // reads as harmless right up until it is not.\n const removals = report.flatMap((r) => r.deletedSlugs.map((slug) => `${r.collection}/${slug}`));\n if (removals.length > 0) {\n diag(`\\n${dryRun ? \"Would stage\" : \"Staged\"} deletion of ${removals.length} entr(y/ies) with no file:`);\n for (const slug of removals) diag(` − ${slug}`);\n }\n if (dryRun) {\n diag(\"\\nDry run — nothing was written.\");\n } else if (changeSetId) {\n diag(`\\nStaged on change set ${changeSetId}. Review and publish it to go live.`);\n } else {\n diag(\"\\nNothing to do — every file already matches.\");\n }\n });\n\n if (failed) process.exitCode = 1;\n }),\n );\n}\n\n/** Stage deletion of entries whose slug has no file. */\nasync function stageMissingDeletions(\n ctx: Ctx,\n project: string,\n collection: string,\n presentSlugs: Set<string>,\n changeSetId: string | undefined,\n dryRun: boolean,\n): Promise<{ count: number; slugs: string[]; changeSetId: string | undefined }> {\n const mgmt = ctx.management();\n const missing: { id: string; slug: string }[] = [];\n let cursor: string | undefined;\n do {\n const page = await mgmt.entries.list(project, { collection, limit: 100, cursor });\n for (const entry of page.data) {\n if (entry.slug && !presentSlugs.has(entry.slug)) missing.push({ id: entry.id, slug: entry.slug });\n }\n cursor = page.nextCursor ?? undefined;\n } while (cursor);\n\n const slugs = missing.map((m) => m.slug).sort();\n if (missing.length === 0 || dryRun) return { count: missing.length, slugs, changeSetId };\n\n const result = await mgmt.entries.bulk(project, {\n action: \"delete\",\n entryIds: missing.map((m) => m.id),\n changeSetId,\n });\n const succeeded = result.results.filter((r) => r.ok);\n return {\n count: succeeded.length,\n slugs,\n changeSetId: changeSetId ?? succeeded.find((r) => r.changeSetId)?.changeSetId,\n };\n}\n\nfunction parseFormat(value: string | undefined): ContentFormat | undefined {\n if (!value) return undefined;\n if (value === \"json\") return \"json\";\n if (value === \"markdown-frontmatter\" || value === \"markdown\" || value === \"md\") return \"markdown\";\n throw new UsageError(\"--format must be json or markdown-frontmatter.\");\n}\n"],"mappings":"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","names":["resolve","bytes","DEFAULT_API_URL","readFileSync","platform","readFileSync","platform","sleep","existsSync","mkdirSync","writeFileSync","join","mkdirSync","join","existsSync","writeFileSync","DEFAULT_API_URL","mkdirSync","writeFileSync","join","existsSync","join","resolve","existsSync","join","resolve","mkdirSync","join","writeFileSync","readFile","basename","join","readFile","join","basename","mode","existsSync","readFileSync","readdirSync","statSync","join","existsSync","readdirSync","join","statSync","readFileSync","readdir","stat","join","stat","readdir","join","parseFormat"]}
|