@myna-sh/mcp 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +113 -6
- package/dist/main.js.map +1 -1
- package/package.json +3 -3
package/dist/main.js
CHANGED
|
@@ -331,6 +331,16 @@ var ManagementClient = class {
|
|
|
331
331
|
collection ? { origin, collection } : { origin },
|
|
332
332
|
signal
|
|
333
333
|
),
|
|
334
|
+
/**
|
|
335
|
+
* Why a call into this project would be denied: whether the credential
|
|
336
|
+
* holds a capability, whether it is confined to other collections, and
|
|
337
|
+
* whether the collection exists at all.
|
|
338
|
+
*/
|
|
339
|
+
access: (project, opts = {}, signal) => this.get(
|
|
340
|
+
`/projects/${enc(project)}/access`,
|
|
341
|
+
{ capability: opts.capability, collection: opts.collection },
|
|
342
|
+
signal
|
|
343
|
+
),
|
|
334
344
|
views: (project, signal) => this.get(`/projects/${enc(project)}/views`, void 0, signal),
|
|
335
345
|
createView: (project, body) => this.mutate("POST", `/projects/${enc(project)}/views`, body),
|
|
336
346
|
deleteView: (project, view) => this.mutate("DELETE", `/projects/${enc(project)}/views/${enc(view)}`)
|
|
@@ -512,6 +522,19 @@ var ManagementClient = class {
|
|
|
512
522
|
}),
|
|
513
523
|
get: (project, asset, signal) => this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, void 0, signal),
|
|
514
524
|
usage: (project, asset, signal) => this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, { usage: "true" }, signal),
|
|
525
|
+
/**
|
|
526
|
+
* Assets that look like the same picture, by perceptual hash — a resized or
|
|
527
|
+
* re-encoded copy, which `checksum` cannot see. `maxDistance` is in bits out
|
|
528
|
+
* of 64 (default 5, maximum 16).
|
|
529
|
+
*/
|
|
530
|
+
similar: (project, asset, opts = {}, signal) => this.get(
|
|
531
|
+
`/projects/${enc(project)}/assets/${enc(asset)}/similar`,
|
|
532
|
+
{
|
|
533
|
+
maxDistance: opts.maxDistance === void 0 ? void 0 : String(opts.maxDistance),
|
|
534
|
+
limit: opts.limit === void 0 ? void 0 : String(opts.limit)
|
|
535
|
+
},
|
|
536
|
+
signal
|
|
537
|
+
).then((r) => r.similar),
|
|
515
538
|
update: (project, asset, body) => this.mutate("PATCH", `/projects/${enc(project)}/assets/${enc(asset)}`, body),
|
|
516
539
|
replace: (project, asset, body) => this.mutate("POST", `/projects/${enc(project)}/assets/${enc(asset)}/replace`, body),
|
|
517
540
|
delete: (project, asset) => this.mutate("DELETE", `/projects/${enc(project)}/assets/${enc(asset)}`),
|
|
@@ -787,6 +810,51 @@ async function resolveEntryId(client, project, ref) {
|
|
|
787
810
|
throw new Error(`Entry not found: ${ref}`);
|
|
788
811
|
}
|
|
789
812
|
var projectArg = { project: z.string().optional().describe("Project id, slug, or configured name. Omit to use the default.") };
|
|
813
|
+
var TOOL_CAPABILITY = {
|
|
814
|
+
myna_list_projects: null,
|
|
815
|
+
myna_get_project: null,
|
|
816
|
+
myna_list_collections: null,
|
|
817
|
+
myna_explain_denial: null,
|
|
818
|
+
myna_get_collection_schema: "schema:read",
|
|
819
|
+
myna_list_entries: "content:read",
|
|
820
|
+
myna_get_entry: "content:read",
|
|
821
|
+
myna_search_entries: "content:read",
|
|
822
|
+
myna_get_entry_revisions: "content:read",
|
|
823
|
+
myna_get_entry_references: "content:read",
|
|
824
|
+
myna_translation_coverage: "content:read",
|
|
825
|
+
myna_create_entry: "content:write",
|
|
826
|
+
myna_update_entry: "content:write",
|
|
827
|
+
myna_unpublish_entry: "content:write",
|
|
828
|
+
myna_duplicate_entry: "content:write",
|
|
829
|
+
myna_import_entries: "content:write",
|
|
830
|
+
myna_reorder_entries: "content:write",
|
|
831
|
+
myna_delete_entry: "content:delete",
|
|
832
|
+
myna_restore_revision: "content:restore",
|
|
833
|
+
myna_list_change_sets: "content:read",
|
|
834
|
+
myna_get_change_set: "content:read",
|
|
835
|
+
myna_diff_change_set: "content:read",
|
|
836
|
+
myna_validate_change_set: "content:read",
|
|
837
|
+
myna_get_change_set_review: "content:read",
|
|
838
|
+
myna_create_change_set: "content:write",
|
|
839
|
+
myna_update_change_set: "content:write",
|
|
840
|
+
myna_close_change_set: "content:write",
|
|
841
|
+
myna_rebase_change_set: "content:write",
|
|
842
|
+
myna_comment_on_change_set: "content:write",
|
|
843
|
+
myna_request_change_set_review: "content:write",
|
|
844
|
+
myna_run_change_set_checks: "content:write",
|
|
845
|
+
myna_review_change_set: "content:review",
|
|
846
|
+
myna_report_check_result: "content:review",
|
|
847
|
+
myna_publish_change_set: "content:publish",
|
|
848
|
+
myna_schedule_change_set: "content:publish",
|
|
849
|
+
myna_list_releases: "content:read",
|
|
850
|
+
myna_get_release: "content:read",
|
|
851
|
+
myna_revert_release: "content:write",
|
|
852
|
+
myna_create_preview: "preview:write",
|
|
853
|
+
myna_list_assets: "assets:read",
|
|
854
|
+
myna_get_asset: "assets:read",
|
|
855
|
+
myna_upload_asset: "assets:write",
|
|
856
|
+
myna_update_asset: "assets:write"
|
|
857
|
+
};
|
|
790
858
|
function registerTools(server, registry, options = { allowPathUploads: true }) {
|
|
791
859
|
server.registerTool(
|
|
792
860
|
"myna_list_projects",
|
|
@@ -1046,7 +1114,7 @@ function registerTools(server, registry, options = { allowPathUploads: true }) {
|
|
|
1046
1114
|
"myna_upload_asset",
|
|
1047
1115
|
{
|
|
1048
1116
|
title: "Upload asset",
|
|
1049
|
-
description: "Upload an asset from base64 bytes or a local file path via the presigned flow.",
|
|
1117
|
+
description: "Upload an asset from base64 bytes or a local file path via the presigned flow. The result reports any existing image that looks like the same picture (`similar`), including resized or re-encoded copies a checksum cannot match \u2014 reference one of those and delete this upload rather than leaving the library with two.",
|
|
1050
1118
|
inputSchema: {
|
|
1051
1119
|
...projectArg,
|
|
1052
1120
|
filename: z.string().describe("Display filename, e.g. cover.png."),
|
|
@@ -1068,7 +1136,9 @@ function registerTools(server, registry, options = { allowPathUploads: true }) {
|
|
|
1068
1136
|
filename: args.filename,
|
|
1069
1137
|
contentType: args.contentType
|
|
1070
1138
|
});
|
|
1071
|
-
|
|
1139
|
+
const similar = await client.assets.similar(project, asset.id).catch(() => []);
|
|
1140
|
+
const duplicates = similar.length ? ` ${similar.length} existing asset(s) look like the same image: ${similar.map((s) => `${s.asset.id} (${s.asset.displayFilename})`).join(", ")}.` : "";
|
|
1141
|
+
return ok(`Uploaded ${asset.displayFilename} (${asset.id}).${duplicates}`, { asset, similar });
|
|
1072
1142
|
} catch (error) {
|
|
1073
1143
|
return fail(error);
|
|
1074
1144
|
}
|
|
@@ -1315,7 +1385,7 @@ function registerTools(server, registry, options = { allowPathUploads: true }) {
|
|
|
1315
1385
|
"myna_run_change_set_checks",
|
|
1316
1386
|
{
|
|
1317
1387
|
title: "Run change-set checks",
|
|
1318
|
-
description: "Run the built-in automated checks
|
|
1388
|
+
description: "Run the built-in automated checks against a change set and return the results: schema validation, reference integrity, conflicts, duplicate slugs, and the `policy` rules each collection declares for itself. Read a collection's policy with myna_get_collection_schema before writing, so you satisfy the rules rather than discovering them here.",
|
|
1319
1389
|
inputSchema: { ...projectArg, changeSet: z.string() },
|
|
1320
1390
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true }
|
|
1321
1391
|
},
|
|
@@ -1364,7 +1434,7 @@ function registerTools(server, registry, options = { allowPathUploads: true }) {
|
|
|
1364
1434
|
"myna_diff_change_set",
|
|
1365
1435
|
{
|
|
1366
1436
|
title: "Diff a change set",
|
|
1367
|
-
description: "Show what a change set would change, field by field: per item, the operation, the collection and slug, and every changed field with its before and after value. This is what a reviewer reads; use it to summarize your own work or to review someone else's.",
|
|
1437
|
+
description: "Show what a change set would change, field by field: per item, the operation, the collection and slug, and every changed field with its before and after value. Long prose fields also carry `segments` \u2014 an ordered list of equal/insert/delete runs \u2014 so a rewritten body reads as the words that moved rather than as two walls of text. This is what a reviewer reads; use it to summarize your own work or to review someone else's.",
|
|
1368
1438
|
inputSchema: { ...projectArg, changeSet: z.string() },
|
|
1369
1439
|
annotations: { readOnlyHint: true, openWorldHint: true }
|
|
1370
1440
|
},
|
|
@@ -1771,7 +1841,7 @@ function registerTools(server, registry, options = { allowPathUploads: true }) {
|
|
|
1771
1841
|
"myna_update_asset",
|
|
1772
1842
|
{
|
|
1773
1843
|
title: "Update asset metadata",
|
|
1774
|
-
description: "Set an asset's alt text, caption, display filename, or tags. Alt text
|
|
1844
|
+
description: "Set an asset's alt text, caption, display filename, or tags. Alt text matters when a collection declares an `altText` policy: without it the `policy` check fails and the change set cannot publish.",
|
|
1775
1845
|
inputSchema: {
|
|
1776
1846
|
...projectArg,
|
|
1777
1847
|
asset: z.string(),
|
|
@@ -1797,6 +1867,43 @@ function registerTools(server, registry, options = { allowPathUploads: true }) {
|
|
|
1797
1867
|
}
|
|
1798
1868
|
}
|
|
1799
1869
|
);
|
|
1870
|
+
server.registerTool(
|
|
1871
|
+
"myna_explain_denial",
|
|
1872
|
+
{
|
|
1873
|
+
title: "Explain a denial",
|
|
1874
|
+
description: "Explain why a tool call was refused. A 403 and a 404 both mean 'no', and neither says which of three unrelated things is wrong: the credential lacks the capability, the credential is confined to other collections, or the resource does not exist. Only the last is worth another attempt. Call this once after a denial instead of retrying, and act on `remedy`.",
|
|
1875
|
+
inputSchema: {
|
|
1876
|
+
...projectArg,
|
|
1877
|
+
tool: z.string().optional().describe("The tool that was denied, e.g. myna_publish_change_set. Resolves the capability it needs."),
|
|
1878
|
+
capability: z.string().optional().describe("Check a capability directly, e.g. content:publish. Ignored when `tool` names one."),
|
|
1879
|
+
collection: z.string().optional().describe("The collection the denied call touched, if any.")
|
|
1880
|
+
},
|
|
1881
|
+
annotations: { readOnlyHint: true, openWorldHint: true }
|
|
1882
|
+
},
|
|
1883
|
+
async (args) => {
|
|
1884
|
+
try {
|
|
1885
|
+
const { client, project } = registry.clientFor(args.project);
|
|
1886
|
+
if (args.tool && !(args.tool in TOOL_CAPABILITY)) {
|
|
1887
|
+
throw new Error(`Unknown tool "${args.tool}". Pass a myna_* tool name, or a capability directly.`);
|
|
1888
|
+
}
|
|
1889
|
+
const capability = args.tool ? TOOL_CAPABILITY[args.tool] ?? void 0 : args.capability;
|
|
1890
|
+
const access = await client.projects.access(project, {
|
|
1891
|
+
capability,
|
|
1892
|
+
collection: args.collection
|
|
1893
|
+
});
|
|
1894
|
+
const summary = access.allowed ? `Nothing blocks ${capability ?? "this credential"} here. If the call still failed, the resource is missing or the payload was invalid \u2014 check the error's field details rather than retrying.` : `${access.checks.find((c) => !c.ok)?.detail} ${access.remedy}`;
|
|
1895
|
+
return ok(summary, { ...access, tool: args.tool ?? null, capability: capability ?? null });
|
|
1896
|
+
} catch (error) {
|
|
1897
|
+
if (isMynaApiError(error) && error.status === 404) {
|
|
1898
|
+
return ok(
|
|
1899
|
+
"The project reference does not resolve for this credential \u2014 either it does not exist or it belongs to another organization. This is not a missing scope; no capability would change it. Call myna_list_projects to see what this credential can reach.",
|
|
1900
|
+
{ allowed: false, reason: "project_not_found" }
|
|
1901
|
+
);
|
|
1902
|
+
}
|
|
1903
|
+
return fail(error);
|
|
1904
|
+
}
|
|
1905
|
+
}
|
|
1906
|
+
);
|
|
1800
1907
|
server.registerTool(
|
|
1801
1908
|
"myna_translation_coverage",
|
|
1802
1909
|
{
|
|
@@ -1890,7 +1997,7 @@ function registerResources(server, registry) {
|
|
|
1890
1997
|
}
|
|
1891
1998
|
|
|
1892
1999
|
// src/version.ts
|
|
1893
|
-
var VERSION = true ? "0.
|
|
2000
|
+
var VERSION = true ? "0.10.0" : "0.0.0-dev";
|
|
1894
2001
|
|
|
1895
2002
|
// src/server.ts
|
|
1896
2003
|
var SERVER_NAME = "myna";
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/main.ts","../src/server.ts","../src/config.ts","../../sdk/src/errors.ts","../../sdk/src/http.ts","../../sdk/src/management.ts","../../sdk/src/codegen.ts","../src/tools.ts","../src/resources.ts","../src/version.ts","../src/http.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { runHttp } from \"./http.js\";\n\n/** Run over stdio (default) or streamable HTTP (`--http`). */\nexport async function main(argv: string[] = process.argv.slice(2)): Promise<void> {\n const useHttp = argv.includes(\"--http\") || process.env.MYNA_MCP_TRANSPORT === \"http\";\n\n if (useHttp) {\n const port = Number(process.env.MYNA_MCP_PORT ?? process.env.PORT ?? 3333);\n const authToken = process.env.MYNA_MCP_TOKEN ?? process.env.MYNA_TOKEN;\n const allowUnauthenticated = [\"1\", \"true\"].includes(\n process.env.MYNA_MCP_ALLOW_UNAUTHENTICATED ?? \"\",\n );\n await runHttp({ port, authToken, allowUnauthenticated });\n return;\n }\n\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n // Keep the process alive; the transport closes on stdin end.\n process.stderr.write(\"myna-mcp: stdio transport ready\\n\");\n}\n\nexport { createServer, createServerForRegistry, SERVER_NAME, SERVER_VERSION } from \"./server.js\";\nexport { runHttp } from \"./http.js\";\nexport { ProjectRegistry, type RegistryOptions } from \"./config.js\";\nexport { VERSION } from \"./version.js\";\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { registerTools, type ToolOptions } from \"./tools.js\";\nimport { registerResources } from \"./resources.js\";\nimport { VERSION } from \"./version.js\";\n\nexport const SERVER_NAME = \"myna\";\nexport const SERVER_VERSION = VERSION;\n\n/** Build a fully-wired Myna MCP server (tools + resources). */\nexport function createServer(): McpServer {\n return createServerForRegistry(new ProjectRegistry());\n}\n\n/** Internal variant used by the stateless HTTP transport. */\nexport function createServerForRegistry(\n registry: ProjectRegistry,\n toolOptions?: ToolOptions,\n): McpServer {\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n {\n capabilities: { tools: {}, resources: {} },\n instructions:\n \"Myna MCP server: manage content, schemas, assets, change sets, and previews. \" +\n \"The primary flow is: create a change set, apply entry/asset operations, validate, \" +\n \"then create one preview URL. Publishing is a separate, confirmation-gated action.\",\n },\n );\n registerTools(server, registry, toolOptions);\n registerResources(server, registry);\n return server;\n}\n","import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createManagementClient, type ManagementClient } from \"@myna-sh/sdk/management\";\n\n/**\n * Named project configurations (SPEC 13). A default project plus per-call\n * overrides. Configuration comes from the environment and an optional JSON file\n * (`MYNA_MCP_CONFIG` or `~/.config/myna/mcp.json`).\n */\n\nexport interface NamedProject {\n project: string;\n organization?: string;\n apiUrl?: string;\n token?: string;\n}\n\nexport interface McpConfigFile {\n default?: string;\n apiUrl?: string;\n token?: string;\n projects?: Record<string, NamedProject>;\n}\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface RegistryOptions {\n /**\n * Skip the on-disk config file. The hosted server builds one registry per\n * request from the caller's OAuth grant; it must never pick up whatever\n * `~/.config/myna/mcp.json` happens to exist on the host.\n */\n ignoreConfigFile?: boolean;\n /** Replaces the \"set MYNA_PROJECT\" advice, which is meaningless remotely. */\n noProjectHint?: string;\n}\n\nexport class ProjectRegistry {\n private readonly file: McpConfigFile;\n private readonly clients = new Map<string, ManagementClient>();\n private readonly options: RegistryOptions;\n\n constructor(\n private readonly env: NodeJS.ProcessEnv = process.env,\n options: RegistryOptions = {},\n ) {\n this.options = options;\n this.file = options.ignoreConfigFile ? {} : loadConfigFile(env);\n }\n\n /**\n * A registry bound to a single credential, for the hosted (multi-tenant)\n * server. Every request builds its own; nothing is shared between callers.\n */\n static forCredential(input: {\n apiUrl: string;\n token: string;\n organization?: string;\n }): ProjectRegistry {\n return new ProjectRegistry(\n {\n MYNA_API_URL: input.apiUrl,\n MYNA_TOKEN: input.token,\n ...(input.organization ? { MYNA_ORGANIZATION: input.organization } : {}),\n } as NodeJS.ProcessEnv,\n {\n ignoreConfigFile: true,\n noProjectHint:\n \"No project specified. Pass `project` (an id or slug); use myna_list_projects to see them.\",\n },\n );\n }\n\n private get defaultApiUrl(): string {\n return this.env.MYNA_API_URL ?? this.file.apiUrl ?? DEFAULT_API_URL;\n }\n\n private get defaultToken(): string | undefined {\n return this.env.MYNA_TOKEN ?? this.file.token;\n }\n\n /** The named-project key used when a call omits `project`. */\n defaultProjectName(): string | undefined {\n return this.file.default ?? (this.env.MYNA_PROJECT ? \"__env\" : undefined);\n }\n\n /** All configured named projects (env default included). */\n list(): Array<{ name: string; project: string; organization?: string }> {\n const out: Array<{ name: string; project: string; organization?: string }> = [];\n if (this.env.MYNA_PROJECT) {\n out.push({ name: \"__env\", project: this.env.MYNA_PROJECT, organization: this.env.MYNA_ORGANIZATION });\n }\n for (const [name, cfg] of Object.entries(this.file.projects ?? {})) {\n out.push({ name, project: cfg.project, organization: cfg.organization });\n }\n return out;\n }\n\n /**\n * Resolve credentials without demanding a project.\n *\n * Org-scoped calls — listing projects above all — have no project to name\n * yet. A hosted connector is bound to an organization, not a project, so\n * requiring one here made discovery impossible: the tool an agent must call\n * first was the one that could not run.\n */\n resolveCredential(ref?: string): {\n project: string | null;\n organization?: string;\n apiUrl: string;\n token: string | undefined;\n } {\n // A named configuration.\n if (ref && this.file.projects?.[ref]) {\n const cfg = this.file.projects[ref]!;\n return {\n project: cfg.project,\n organization: cfg.organization,\n apiUrl: cfg.apiUrl ?? this.defaultApiUrl,\n token: cfg.token ?? this.defaultToken,\n };\n }\n // The env default named project.\n if ((!ref || ref === \"__env\") && this.env.MYNA_PROJECT) {\n return {\n project: ref && ref !== \"__env\" ? ref : this.env.MYNA_PROJECT,\n organization: this.env.MYNA_ORGANIZATION,\n apiUrl: this.defaultApiUrl,\n token: this.defaultToken,\n };\n }\n // A default named config.\n if (!ref && this.file.default && this.file.projects?.[this.file.default]) {\n return this.resolveCredential(this.file.default);\n }\n return {\n project: ref ?? null,\n organization: this.env.MYNA_ORGANIZATION,\n apiUrl: this.defaultApiUrl,\n token: this.defaultToken,\n };\n }\n\n /** Resolve a project reference: an explicit id/slug, a named config, or the default. */\n resolve(ref?: string): { project: string; organization?: string; apiUrl: string; token: string | undefined } {\n const resolved = this.resolveCredential(ref);\n if (!resolved.project) {\n throw new Error(\n this.options.noProjectHint ??\n \"No project specified and no default is configured (set MYNA_PROJECT or configure a default).\",\n );\n }\n return { ...resolved, project: resolved.project };\n }\n\n private clientFrom(apiUrl: string, token: string | undefined): ManagementClient {\n if (!token) {\n throw new Error(\"No credential available. Set MYNA_TOKEN or configure a token for the project.\");\n }\n const cacheKey = `${apiUrl}::${token}`;\n let client = this.clients.get(cacheKey);\n if (!client) {\n client = createManagementClient({ token, apiUrl });\n this.clients.set(cacheKey, client);\n }\n return client;\n }\n\n /** A management client bound to the resolved project's API + token. */\n clientFor(ref?: string): { client: ManagementClient; project: string; organization?: string } {\n const resolved = this.resolve(ref);\n return {\n client: this.clientFrom(resolved.apiUrl, resolved.token),\n project: resolved.project,\n organization: resolved.organization,\n };\n }\n\n /** A management client for an org-scoped call, where no project is required. */\n clientForOrg(ref?: string): { client: ManagementClient; organization?: string } {\n const resolved = this.resolveCredential(ref);\n return {\n client: this.clientFrom(resolved.apiUrl, resolved.token),\n organization: resolved.organization,\n };\n }\n\n /** Resolve an organization for org-scoped calls. */\n organizationFor(ref?: string, organizationOverride?: string): string {\n const resolved = this.resolveCredential(ref);\n const org = organizationOverride ?? resolved.organization;\n if (!org) throw new Error(\"No organization specified. Provide `organization` or configure one for the project.\");\n return org;\n }\n}\n\nfunction loadConfigFile(env: NodeJS.ProcessEnv): McpConfigFile {\n const explicit = env.MYNA_MCP_CONFIG;\n const candidates = [explicit, join(env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"myna\", \"mcp.json\")].filter(\n (v): v is string => Boolean(v),\n );\n for (const path of candidates) {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as McpConfigFile;\n } catch {\n // Try next candidate.\n }\n }\n return {};\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 ChangeSetDiffResponse,\n ChangeSetReviewContract,\n ProjectCheckContract,\n RebaseChangeSetRequest,\n RebaseChangeSetResponse,\n ReportCheckResultRequest,\n UpsertProjectCheckRequest,\n CreateChangeSetCommentRequest,\n CreateChangeSetRequest,\n RequestReviewRequest,\n ReviewDecisionRequest,\n RunChecksResponse,\n UpdateChangeSetRequest,\n} from \"../../api-contracts/src/change-sets.js\";\nimport type {\n ReleaseContract,\n RevertReleaseRequest,\n RevertReleaseResponse,\n} from \"../../api-contracts/src/releases.js\";\nimport type {\n CollectionContract,\n CollectionVersionContract,\n SchemaDiffResponse,\n SchemaDriftResponse,\n SchemaPushResponse,\n TranslationCoverageResponse,\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 /** What is still untranslated in a collection, per project locale. */\n translations: (project: string, key: string, signal?: AbortSignal): Promise<TranslationCoverageResponse> =>\n this.get<TranslationCoverageResponse>(\n `/projects/${enc(project)}/collections/${enc(key)}/translations`,\n undefined,\n signal,\n ),\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; q?: string } = {},\n ): Promise<Page<EntryContract>> =>\n this.page<EntryContract>(`/projects/${enc(project)}/entries`, opts, {\n collection: opts.collection,\n status: opts.status,\n q: opts.q,\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 /** Report a verdict Myna cannot compute, against the current contents. */\n reportCheck: (\n project: string,\n changeSet: string,\n name: string,\n body: ReportCheckResultRequest,\n ): Promise<ChangeSetCheckContract> =>\n this.mutate<ChangeSetCheckContract>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/${enc(name)}`,\n body,\n ),\n /** Field-level before/after for everything this change set would change. */\n /**\n * Replay the change set's edits on top of what is published now.\n *\n * Refuses by default when a field changed on both sides; pass\n * `onConflict` to take one side, or `dryRun` to see the plan first.\n */\n rebase: (\n project: string,\n changeSet: string,\n body: RebaseChangeSetRequest = {},\n ): Promise<RebaseChangeSetResponse> =>\n this.mutate<RebaseChangeSetResponse>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/rebase`,\n body,\n ),\n diff: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetDiffResponse> =>\n this.get<ChangeSetDiffResponse>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/diff`,\n undefined,\n signal,\n ),\n };\n\n // --- Releases -------------------------------------------------------------\n /**\n * What shipped, and how to take it back.\n *\n * `revert` returns an open change set rather than publishing: it goes through\n * the same review, preview, and gate path as anything written by hand.\n */\n readonly releases = {\n list: (project: string, opts: ListOptions = {}): Promise<Page<ReleaseContract>> =>\n this.page<ReleaseContract>(`/projects/${enc(project)}/releases`, opts),\n /** `release` is a release number or the published change set's id. */\n get: (project: string, release: string | number, signal?: AbortSignal): Promise<ReleaseContract> =>\n this.get<ReleaseContract>(`/projects/${enc(project)}/releases/${enc(String(release))}`, undefined, signal),\n revert: (\n project: string,\n release: string | number,\n body: RevertReleaseRequest = {},\n ): Promise<RevertReleaseResponse> =>\n this.mutate<RevertReleaseResponse>(\n \"POST\",\n `/projects/${enc(project)}/releases/${enc(String(release))}/revert`,\n body,\n ),\n };\n\n // --- Declared external checks ---------------------------------------------\n readonly checks = {\n list: (project: string, signal?: AbortSignal): Promise<ProjectCheckContract[]> =>\n this.get<ProjectCheckContract[]>(`/projects/${enc(project)}/checks`, undefined, signal),\n declare: (project: string, body: UpsertProjectCheckRequest): Promise<ProjectCheckContract> =>\n this.mutate<ProjectCheckContract>(\"POST\", `/projects/${enc(project)}/checks`, body),\n remove: (project: string, name: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/checks/${enc(name)}`),\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: (\n project: string,\n opts: ListOptions & { tag?: string; checksum?: string; orphaned?: boolean } = {},\n ): Promise<Page<AssetContract>> =>\n this.page<AssetContract>(`/projects/${enc(project)}/assets`, opts, {\n tag: opts.tag,\n checksum: opts.checksum,\n orphaned: opts.orphaned ? \"true\" : undefined,\n }),\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 { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ManagementClient } from \"@myna-sh/sdk/management\";\nimport { isMynaApiError } from \"@myna-sh/sdk/management\";\nimport type { ProjectRegistry } from \"./config.js\";\n\n/**\n * The Myna MCP tools (SPEC 13). This module contains no CMS business logic —\n * every tool is a thin adapter over the management SDK.\n */\n\n/**\n * A tool result carrying both a human summary and the data itself.\n *\n * The payload is serialized into a second text block as well as\n * `structuredContent`. That duplication is deliberate: `structuredContent` is\n * only meaningful to hosts that read it, and a host that does not — Claude's\n * remote connector among them — would otherwise receive nothing but the\n * summary. An agent told \"1 project(s)\" with no id, slug, or name cannot make\n * the follow-up call, which strands it on the very tool meant to bootstrap\n * discovery. The MCP specification asks for this fallback for exactly this\n * reason; the cost is some duplicated tokens, and the alternative is a tool\n * that silently returns no data.\n */\nfunction ok(text: string, structured: unknown): CallToolResult {\n return {\n content: [\n { type: \"text\", text },\n { type: \"text\", text: JSON.stringify(structured) },\n ],\n structuredContent: structured as Record<string, unknown>,\n };\n}\n\nfunction fail(error: unknown): CallToolResult {\n const message = isMynaApiError(error)\n ? `${error.code}: ${error.detail ?? error.title}`\n : error instanceof Error\n ? error.message\n : String(error);\n return { content: [{ type: \"text\", text: `Error: ${message}` }], isError: true };\n}\n\nasync function resolveEntryId(client: ManagementClient, project: string, ref: string): Promise<string> {\n if (ref.startsWith(\"ent_\") && !ref.includes(\"/\")) return ref;\n const [collection, slug] = ref.includes(\"/\") ? ref.split(\"/\", 2) : [undefined, ref];\n if (!collection) throw new Error(`Provide the entry as \"<collection>/<slug>\" or an ent_ id (got \"${ref}\").`);\n let cursor: string | undefined;\n for (let i = 0; i < 50; i++) {\n const page = await client.entries.list(project, { collection, limit: 100, cursor });\n const match = page.data.find((e) => e.slug === slug || e.id === slug);\n if (match) return match.id;\n if (!page.nextCursor) break;\n cursor = page.nextCursor;\n }\n throw new Error(`Entry not found: ${ref}`);\n}\n\nconst projectArg = { project: z.string().optional().describe(\"Project id, slug, or configured name. Omit to use the default.\") };\n\nexport interface ToolOptions {\n /**\n * Whether `myna_upload_asset` may read local filesystem paths. True for\n * stdio (the client and server share a machine); false for HTTP, where a\n * remote client must never be able to read the server's filesystem.\n */\n allowPathUploads: boolean;\n}\n\nexport function registerTools(\n server: McpServer,\n registry: ProjectRegistry,\n options: ToolOptions = { allowPathUploads: true },\n): void {\n // 1. list projects\n server.registerTool(\n \"myna_list_projects\",\n {\n title: \"List projects\",\n description: \"List projects in an organization.\",\n inputSchema: {\n organization: z.string().optional().describe(\"Organization id or slug. Omit to use the default.\"),\n ...projectArg,\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n // Org-scoped: this is how an agent discovers projects, so it must not\n // itself require one.\n const { client } = registry.clientForOrg(args.project);\n const org = registry.organizationFor(args.project, args.organization);\n const projects = await client.projects.list(org);\n return ok(`${projects.length} project(s) in ${org}.`, { projects });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 2. get project\n server.registerTool(\n \"myna_get_project\",\n {\n title: \"Get project\",\n description: \"Fetch a single project's details.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.projects.get(project);\n return ok(`Project ${result.name} (${result.slug}).`, { project: result });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 3. list collections\n server.registerTool(\n \"myna_list_collections\",\n {\n title: \"List collections\",\n description: \"List the deployed collections in a project.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const collections = await client.schema.collections(project);\n return ok(`${collections.length} collection(s).`, { collections });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 4. get collection schema\n server.registerTool(\n \"myna_get_collection_schema\",\n {\n title: \"Get collection schema\",\n description: \"Fetch the latest canonical schema for a collection.\",\n inputSchema: { ...projectArg, collection: z.string().describe(\"Collection key.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const versions = await client.schema.versions(project, args.collection);\n const latest = versions[0];\n if (!latest) throw new Error(`Collection ${args.collection} has no versions.`);\n return ok(`${args.collection} schema v${latest.version}.`, { version: latest.version, schema: latest.schemaJson });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 5. list entries\n server.registerTool(\n \"myna_list_entries\",\n {\n title: \"List entries\",\n description: \"List entries in a collection.\",\n inputSchema: {\n ...projectArg,\n collection: z.string().describe(\"Collection key.\"),\n status: z.enum([\"draft\", \"published\", \"changed\", \"unpublished\", \"deleted\"]).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.entries.list(project, {\n collection: args.collection,\n status: args.status,\n limit: args.limit ?? 25,\n cursor: args.cursor,\n });\n return ok(`${page.data.length} entr(y/ies).`, { entries: page.data, nextCursor: page.nextCursor });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 6. get entry\n server.registerTool(\n \"myna_get_entry\",\n {\n title: \"Get entry\",\n description: \"Fetch one entry by \\\"<collection>/<slug>\\\" or entry id.\",\n inputSchema: { ...projectArg, entry: z.string().describe(\"collection/slug or ent_ id.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.get(project, id);\n return ok(`Entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 7. create change set\n server.registerTool(\n \"myna_create_change_set\",\n {\n title: \"Create change set\",\n description: \"Open a new change set to group entry and asset operations.\",\n inputSchema: {\n ...projectArg,\n title: z.string().min(1).max(200),\n description: z.string().max(2000).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.create(project, { title: args.title, description: args.description });\n return ok(`Created change set ${cs.id}.`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 8. get change set\n server.registerTool(\n \"myna_get_change_set\",\n {\n title: \"Get change set\",\n description: \"Fetch a change set and its items.\",\n inputSchema: { ...projectArg, changeSet: z.string().describe(\"Change set id (chs_).\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.get(project, args.changeSet);\n return ok(`Change set ${cs.id} (${cs.status}), ${cs.items.length} item(s).`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 9. create entry\n server.registerTool(\n \"myna_create_entry\",\n {\n title: \"Create entry\",\n description: \"Create a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n collection: z.string(),\n data: z.record(z.string(), z.unknown()).describe(\"Field values.\"),\n slug: z.string().optional(),\n changeSet: z.string().optional().describe(\"Attach to an existing change set (chs_).\"),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const entry = await client.entries.create(project, {\n collection: args.collection,\n data: args.data,\n slug: args.slug,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Created entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 10. update entry\n server.registerTool(\n \"myna_update_entry\",\n {\n title: \"Update entry\",\n description: \"Update a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string().describe(\"collection/slug or ent_ id.\"),\n data: z.record(z.string(), z.unknown()).optional(),\n slug: z.string().optional(),\n expectedRevisionId: z.string().optional().describe(\"Optimistic concurrency guard.\"),\n changeSet: z.string().optional(),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.update(project, id, {\n data: args.data,\n slug: args.slug,\n expectedRevisionId: args.expectedRevisionId,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Updated entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 11. delete entry (destructive)\n server.registerTool(\n \"myna_delete_entry\",\n {\n title: \"Delete entry\",\n description: \"Stage an entry deletion on a change set. Requires confirm=true. Takes effect only on publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n changeSet: z.string().optional(),\n confirm: z.literal(true).describe(\"Must be true to proceed.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.delete(project, id, args.changeSet);\n return ok(`Staged delete of ${id} on ${result.changeSetId}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 12. upload asset\n server.registerTool(\n \"myna_upload_asset\",\n {\n title: \"Upload asset\",\n description: \"Upload an asset from base64 bytes or a local file path via the presigned flow.\",\n inputSchema: {\n ...projectArg,\n filename: z.string().describe(\"Display filename, e.g. cover.png.\"),\n base64: z.string().optional().describe(\"Base64-encoded file bytes.\"),\n path: z.string().optional().describe(\"Local filesystem path (stdio hosts only).\"),\n contentType: z.string().optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n if (!args.base64 && !args.path) throw new Error(\"Provide either `base64` or `path`.\");\n if (args.path && !options.allowPathUploads) {\n throw new Error(\"`path` uploads are only available on stdio transports; send `base64` instead.\");\n }\n const input = args.base64 ? new Uint8Array(Buffer.from(args.base64, \"base64\")) : args.path!;\n const asset = await client.assets.upload(project, input, {\n filename: args.filename,\n contentType: args.contentType,\n });\n return ok(`Uploaded ${asset.displayFilename} (${asset.id}).`, { asset });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 13. validate change set\n server.registerTool(\n \"myna_validate_change_set\",\n {\n title: \"Validate change set\",\n description: \"Validate every changed resource in a change set against the deployed schemas.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.validate(project, args.changeSet);\n return ok(result.valid ? \"Change set is valid.\" : `Invalid: ${result.errors.length} error(s).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 14. create preview\n server.registerTool(\n \"myna_create_preview\",\n {\n title: \"Create preview\",\n description: \"Create one preview URL for a change set (or entry). Never publishes.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string().optional().describe(\"Change set id (chs_).\"),\n entry: z.string().optional().describe(\"Entry id (ent_).\"),\n expiresInSeconds: z.number().int().min(60).max(604800).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.changeSet) === Boolean(args.entry)) {\n throw new Error(\"Provide exactly one of `changeSet` or `entry`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const preview = await client.previews.create(project, {\n changeSetId: args.changeSet,\n entryId: args.entry,\n expiresInSeconds: args.expiresInSeconds,\n });\n return ok(`Preview: ${preview.url}`, { preview });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 15. publish change set (destructive)\n server.registerTool(\n \"myna_publish_change_set\",\n {\n title: \"Publish change set\",\n description: \"Atomically publish a change set. Requires confirm=true and content:publish scope.\",\n inputSchema: { ...projectArg, changeSet: z.string(), confirm: z.literal(true).describe(\"Must be true.\") },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.publish(project, args.changeSet);\n return ok(`Published ${result.publishedEntryIds.length} entr(y/ies).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 16. get entry revisions\n server.registerTool(\n \"myna_get_entry_revisions\",\n {\n title: \"Get entry revisions\",\n description: \"List the immutable revisions of an entry.\",\n inputSchema: { ...projectArg, entry: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const revisions = await client.entries.revisions(project, id);\n return ok(`${revisions.length} revision(s).`, { revisions });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // get entry references (reference integrity)\n server.registerTool(\n \"myna_get_entry_references\",\n {\n title: \"Get entry references\",\n description:\n \"Show reference integrity for an entry: which entries reference it (backlinks) and which entries it references, with publish state. Useful before unpublishing or deleting.\",\n inputSchema: { ...projectArg, entry: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const refs = await client.entries.references(project, id);\n return ok(\n `Referenced by ${refs.referencedBy.length} entr(y/ies); references ${refs.references.length}.`,\n refs,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 17. restore revision (destructive)\n server.registerTool(\n \"myna_restore_revision\",\n {\n title: \"Restore revision\",\n description: \"Restore a historical revision into a new draft revision. Requires confirm=true.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n revision: z.string().describe(\"Revision id (rev_).\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.restoreRevision(project, id, args.revision);\n return ok(`Restored into ${result.revision.id}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // schedule / cancel scheduled publish\n server.registerTool(\n \"myna_schedule_change_set\",\n {\n title: \"Schedule change-set publish\",\n description:\n \"Schedule a change set to publish atomically at a future time, or cancel its schedule. Requires confirm=true and content:publish scope. Schedule status is readable via myna_get_change_set (scheduledAt).\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n publishAt: z.string().optional().describe(\"ISO 8601 datetime to publish at. Omit with cancel=true.\"),\n cancel: z.boolean().optional().describe(\"Cancel the existing schedule instead.\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.publishAt) === Boolean(args.cancel)) {\n throw new Error(\"Provide exactly one of `publishAt` or `cancel`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const cs = args.cancel\n ? await client.changeSets.cancelSchedule(project, args.changeSet)\n : await client.changeSets.schedule(project, args.changeSet, args.publishAt!);\n return ok(cs.scheduledAt ? `Scheduled for ${cs.scheduledAt}.` : \"Schedule cancelled.\", { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 18. get review status (reviews + comments + latest checks)\n server.registerTool(\n \"myna_get_change_set_review\",\n {\n title: \"Get change-set review status\",\n description:\n \"Fetch a change set's reviews, comments, and latest automated check run in one call.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const [reviews, comments, checks] = await Promise.all([\n client.changeSets.reviews(project, args.changeSet),\n client.changeSets.comments(project, args.changeSet),\n client.changeSets.checks(project, args.changeSet),\n ]);\n const approvals = reviews.filter((r) => r.status === \"approved\" && !r.stale).length;\n const failing = checks.filter((c) => c.status === \"failed\").length;\n return ok(\n `${approvals} fresh approval(s), ${comments.length} comment(s), ${checks.length === 0 ? \"no check run\" : `${failing} failing check(s)`}.`,\n { reviews, comments, checks },\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 19. review change set (approve / request changes)\n server.registerTool(\n \"myna_review_change_set\",\n {\n title: \"Review change set\",\n description:\n \"Record an approve or request-changes review decision on a change set. Requires content:review scope.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n decision: z.enum([\"approve\", \"request_changes\"]),\n comment: z.string().optional().describe(\"Optional review comment.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const reviews =\n args.decision === \"approve\"\n ? await client.changeSets.approve(project, args.changeSet, { comment: args.comment })\n : await client.changeSets.requestChanges(project, args.changeSet, { comment: args.comment });\n return ok(`Recorded ${args.decision} review.`, { reviews });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 20. comment on change set\n server.registerTool(\n \"myna_comment_on_change_set\",\n {\n title: \"Comment on change set\",\n description: \"Add a comment to a change set, optionally anchored to an entry field.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n body: z.string().min(1),\n entry: z.string().optional().describe(\"Entry id (ent_) to anchor the comment to.\"),\n fieldPath: z.string().optional().describe(\"Field path within the entry, e.g. fields.title.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const comment = await client.changeSets.comment(project, args.changeSet, {\n body: args.body,\n resourceType: args.entry ? \"entry\" : undefined,\n resourceId: args.entry,\n fieldPath: args.fieldPath,\n });\n return ok(`Commented ${comment.id}.`, { comment });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 21. run automated checks\n server.registerTool(\n \"myna_run_change_set_checks\",\n {\n title: \"Run change-set checks\",\n description:\n \"Run the built-in automated checks (schema, references, slugs, alt-text, SEO) against a change set and return the results.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.runChecks(project, args.changeSet);\n const failing = result.checks.filter((c) => c.status === \"failed\");\n return ok(\n result.passed ? \"All checks passed.\" : `Failing: ${failing.map((c) => c.name).join(\", \")}.`,\n result,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Working with existing change sets ------------------------------------\n\n server.registerTool(\n \"myna_list_change_sets\",\n {\n title: \"List change sets\",\n description:\n \"List change sets in a project, newest first, optionally filtered by status (open, ready, published, closed). Use this to find work already in progress before starting a new change set.\",\n inputSchema: {\n ...projectArg,\n status: z.enum([\"open\", \"ready\", \"published\", \"closed\"]).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.changeSets.list(project, {\n ...(args.status ? { status: args.status } : {}),\n ...(args.limit ? { limit: args.limit } : {}),\n ...(args.cursor ? { cursor: args.cursor } : {}),\n });\n return ok(`${page.data.length} change set(s).`, page);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_diff_change_set\",\n {\n title: \"Diff a change set\",\n description:\n \"Show what a change set would change, field by field: per item, the operation, the collection and slug, and every changed field with its before and after value. This is what a reviewer reads; use it to summarize your own work or to review someone else's.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const diff = await client.changeSets.diff(project, args.changeSet);\n const fields = diff.items.reduce((n, i) => n + i.changes.length, 0);\n return ok(`${diff.items.length} item(s), ${fields} changed field(s).`, diff);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_rebase_change_set\",\n {\n title: \"Rebase a change set\",\n description:\n \"Replay this change set's edits on top of what is published now. An entry can be staged on several open change sets at once, so another change set publishing first leaves yours describing a revision that is no longer current — publish refuses that rather than merging silently. This performs the field-level three-way merge: fields the other side did not touch are replayed automatically, and fields you both changed are reported as conflicts. Refuses by default rather than discarding anyone's work; pass onConflict to take one side. Use dryRun=true first to see what would happen. Rebasing writes new drafts, so existing approvals go stale and the change set needs re-review. The `conflicts` check reports the same information without writing anything.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n onConflict: z\n .enum([\"fail\", \"take-mine\", \"take-theirs\"])\n .optional()\n .describe(\"fail (default) refuses and reports; take-mine keeps your value; take-theirs accepts what was published.\"),\n dryRun: z.boolean().optional().describe(\"Report the plan without writing anything.\"),\n },\n // Destructive: `take-theirs` discards this change set's edit at the\n // conflicted fields, and `take-mine` discards what was published there.\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.rebase(project, args.changeSet, {\n ...(args.onConflict ? { onConflict: args.onConflict } : {}),\n ...(args.dryRun ? { dryRun: true } : {}),\n });\n const conflicts = result.items.reduce((n, i) => n + i.conflicts.length, 0);\n if (result.items.length === 0) {\n return ok(`Nothing to rebase; ${result.upToDate.length} item(s) already on the current head.`, result);\n }\n return ok(\n `${result.dryRun ? \"Would rebase\" : \"Rebased\"} ${result.items.length} entr(y/ies), ${conflicts} conflict(s).` +\n (result.dryRun ? \"\" : \" Approvals are now stale; the change set needs re-review.\"),\n result,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Releases -------------------------------------------------------------\n\n server.registerTool(\n \"myna_list_releases\",\n {\n title: \"List releases\",\n description:\n \"List what has shipped, newest first. Every publish is a numbered release. Each entry says who published it, how many resources it changed, and whether it has since been reverted — or whether it was itself a revert of an earlier release.\",\n inputSchema: { ...projectArg, limit: z.number().int().min(1).max(100).optional() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.releases.list(project, { limit: args.limit });\n return ok(`${page.data.length} release(s).`, { releases: page.data, nextCursor: page.nextCursor });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_get_release\",\n {\n title: \"Get a release\",\n description:\n \"Read one release by its number or by the id of the change set that produced it. Use myna_diff_change_set on the release's id to see field-by-field what it changed.\",\n inputSchema: { ...projectArg, release: z.string().describe(\"Release number, or the published change set id.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const release = await client.releases.get(project, args.release);\n return ok(`Release #${release.number} — ${release.title}, ${release.itemCount} item(s).`, release);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_revert_release\",\n {\n title: \"Revert a release\",\n description:\n \"Generate a change set that restores the state preceding a release. This publishes nothing: it stages drafts on a new change set that goes through validation, preview, review, and the project's publish gates like any other change — call myna_publish_change_set when it has been reviewed. Resources a later release already changed are refused rather than silently skipped; pass force=true to take them back anyway, discarding that later work. Requires confirm=true.\",\n inputSchema: {\n ...projectArg,\n release: z.string().describe(\"Release number, or the published change set id.\"),\n title: z.string().min(1).max(200).optional().describe(\"Title for the generated change set.\"),\n force: z\n .boolean()\n .optional()\n .describe(\"Revert resources a later release already changed, discarding that later work.\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.releases.revert(project, args.release, {\n ...(args.title ? { title: args.title } : {}),\n ...(args.force ? { force: true } : {}),\n });\n const skipped = result.skipped.length > 0 ? `, ${result.skipped.length} skipped` : \"\";\n return ok(\n `Staged ${result.reverted.length} revert(s)${skipped} on change set ${result.changeSet.id}. Not published — review and publish it to take the release back.`,\n result,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_update_change_set\",\n {\n title: \"Update a change set\",\n description:\n \"Rename a change set, change its description, or mark it ready for review. Marking it ready signals that a human is needed and emits change_set.ready_for_review.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n title: z.string().min(1).max(200).optional(),\n description: z.string().max(2000).optional(),\n status: z.enum([\"open\", \"ready\"]).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.update(project, args.changeSet, {\n ...(args.title ? { title: args.title } : {}),\n ...(args.description ? { description: args.description } : {}),\n ...(args.status ? { status: args.status } : {}),\n });\n return ok(`Change set ${cs.id} is ${cs.status}.`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_close_change_set\",\n {\n title: \"Close a change set\",\n description:\n \"Abandon a change set without publishing it. The staged drafts and their revisions remain in history; the set simply stops being work in progress. Use this when a task is cancelled, so open sets do not accumulate. Requires confirm=true.\",\n inputSchema: { ...projectArg, changeSet: z.string(), confirm: z.literal(true).describe(\"Must be true.\") },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.close(project, args.changeSet);\n return ok(`Closed ${cs.id}.`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_request_change_set_review\",\n {\n title: \"Request review\",\n description:\n \"Ask a specific person to review a change set. Pass their user id. Requires content:review scope.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n reviewerId: z.string().describe(\"User id (usr_) to assign as reviewer.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const reviews = await client.changeSets.requestReview(project, args.changeSet, {\n reviewerType: \"user\",\n reviewerId: args.reviewerId,\n });\n return ok(`${reviews.length} reviewer(s) assigned.`, { reviews });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_report_check_result\",\n {\n title: \"Report an external check result\",\n description:\n \"Report the verdict of a check Myna cannot compute itself — a link check, a house-style review, an external build. The check must have been declared on the project first. The result is recorded against the change set's current contents, so later edits mark it stale. A failing required check blocks publish. Requires content:review scope.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n name: z.string().describe(\"The declared check name, e.g. links.\"),\n status: z.enum([\"passed\", \"failed\", \"skipped\"]),\n details: z\n .array(\n z.object({\n resourceId: z.string().optional(),\n path: z.string().optional(),\n message: z.string(),\n }),\n )\n .optional()\n .describe(\"What the check found; shown to the reviewer.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const check = await client.changeSets.reportCheck(project, args.changeSet, args.name, {\n status: args.status,\n ...(args.details ? { details: args.details } : {}),\n });\n return ok(`Reported ${args.name}: ${check.status}.`, { check });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Bulk and editorial operations ----------------------------------------\n\n server.registerTool(\n \"myna_search_entries\",\n {\n title: \"Search entries\",\n description:\n \"Full-text search across every text field of an entry, matching either its draft or its published state. Use this to find the entry a human described in prose (\\\"the pricing page\\\", \\\"the post about webhooks\\\") instead of listing a collection and scanning it.\",\n inputSchema: {\n ...projectArg,\n query: z.string().min(1).describe(\"Words to search for. Supports quoted phrases and -exclusions.\"),\n collection: z.string().optional().describe(\"Restrict to one collection.\"),\n limit: z.number().int().min(1).max(100).optional(),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.entries.list(project, {\n q: args.query,\n ...(args.collection ? { collection: args.collection } : {}),\n limit: args.limit ?? 20,\n });\n return ok(`${page.data.length} match(es) for \"${args.query}\".`, page);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_unpublish_entry\",\n {\n title: \"Unpublish an entry\",\n description:\n \"Stage the removal of an entry from published content. Like every write this is a draft operation: it takes effect when the change set is published. The entry and its history are kept. Requires confirm=true.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n changeSet: z.string().optional(),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.unpublish(project, id, args.changeSet);\n return ok(`Unpublish staged on ${result.changeSetId}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_duplicate_entry\",\n {\n title: \"Duplicate an entry\",\n description:\n \"Copy an entry into a new draft with a fresh slug. Useful as a starting point when a new entry should follow the shape of an existing one.\",\n inputSchema: { ...projectArg, entry: z.string(), changeSet: z.string().optional() },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.duplicate(project, id, args.changeSet);\n return ok(`Created ${entry.id} (${entry.slug ?? \"no slug\"}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_import_entries\",\n {\n title: \"Import entries\",\n description:\n \"Create or update many entries in one collection in a single call, matched by slug: rows that already exist are updated, identical rows are skipped. Use dryRun=true first to see what would happen. Everything lands as drafts on one change set.\",\n inputSchema: {\n ...projectArg,\n collection: z.string(),\n entries: z\n .array(z.object({ slug: z.string().optional(), data: z.record(z.string(), z.unknown()) }))\n .min(1)\n .max(500),\n changeSet: z.string().optional(),\n changeSummary: z.string().optional(),\n dryRun: z.boolean().optional().describe(\"Report what would change without writing.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.entries.import(project, {\n collection: args.collection,\n entries: args.entries,\n ...(args.changeSet ? { changeSetId: args.changeSet } : {}),\n ...(args.changeSummary ? { changeSummary: args.changeSummary } : {}),\n ...(args.dryRun !== undefined ? { dryRun: args.dryRun } : {}),\n });\n const { created, updated, unchanged, invalid } = result.summary;\n return ok(\n `${args.dryRun ? \"Would import\" : \"Imported\"}: ${created} created, ${updated} updated, ${unchanged} unchanged, ${invalid} invalid.`,\n result,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_reorder_entries\",\n {\n title: \"Reorder a collection\",\n description:\n \"Set the editorial order of a collection. Unlike every other write, ordering is arrangement rather than content: it carries no revision, is not staged on a change set, and reaches readers immediately — which is why confirm=true is required. Never use it to change what an entry says.\",\n inputSchema: {\n ...projectArg,\n collection: z.string(),\n order: z.array(z.string()).optional().describe(\"Entry ids in the intended order.\"),\n move: z\n .object({ entry: z.string(), before: z.string().optional(), after: z.string().optional() })\n .optional()\n .describe(\"Move one entry relative to another, instead of listing the whole order.\"),\n confirm: z.literal(true).describe(\"Must be true: this is immediately visible to readers.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.order) === Boolean(args.move)) {\n throw new Error(\"Provide exactly one of `order` or `move`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const result = await client.entries.reorder(project, args.collection, {\n ...(args.order ? { order: args.order } : {}),\n ...(args.move ? { move: args.move } : {}),\n });\n return ok(`Reordered with ${result.writes} write(s).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Assets ---------------------------------------------------------------\n\n server.registerTool(\n \"myna_list_assets\",\n {\n title: \"List assets\",\n description:\n \"List a project's assets, optionally filtered by tag or checksum. Check here before uploading: an asset that already exists should be referenced, not uploaded again.\",\n inputSchema: {\n ...projectArg,\n tag: z.string().optional(),\n checksum: z.string().optional().describe(\"MD5 hex; finds an identical file already uploaded.\"),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.assets.list(project, {\n ...(args.tag ? { tag: args.tag } : {}),\n ...(args.checksum ? { checksum: args.checksum } : {}),\n ...(args.limit ? { limit: args.limit } : {}),\n ...(args.cursor ? { cursor: args.cursor } : {}),\n });\n return ok(`${page.data.length} asset(s).`, page);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_get_asset\",\n {\n title: \"Get an asset\",\n description:\n \"Fetch one asset: its delivery URL, content type, byte size, pixel dimensions, alt text, and tags.\",\n inputSchema: { ...projectArg, asset: z.string().describe(\"Asset id (ast_).\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const asset = await client.assets.get(project, args.asset);\n return ok(`${asset.displayFilename} (${asset.contentType}).`, { asset });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_update_asset\",\n {\n title: \"Update asset metadata\",\n description:\n \"Set an asset's alt text, caption, display filename, or tags. Alt text in particular is what the built-in alt-text check looks for, so filling it in here clears that check.\",\n inputSchema: {\n ...projectArg,\n asset: z.string(),\n defaultAlt: z.string().optional(),\n caption: z.string().optional(),\n displayFilename: z.string().optional(),\n tags: z.array(z.string()).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const asset = await client.assets.update(project, args.asset, {\n ...(args.defaultAlt !== undefined ? { defaultAlt: args.defaultAlt } : {}),\n ...(args.caption !== undefined ? { caption: args.caption } : {}),\n ...(args.displayFilename !== undefined ? { displayFilename: args.displayFilename } : {}),\n ...(args.tags !== undefined ? { tags: args.tags } : {}),\n });\n return ok(`Updated ${asset.id}.`, { asset });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Localization ---------------------------------------------------------\n\n server.registerTool(\n \"myna_translation_coverage\",\n {\n title: \"Translation coverage\",\n description:\n \"Report what is still untranslated in a collection, per project locale: how complete each locale is, which fields are missing most often, and a worklist of entries to fix. Empty when the project has no locales or the collection has no localized fields.\",\n inputSchema: { ...projectArg, collection: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const report = await client.schema.translations(project, args.collection);\n const summary = report.coverage.map((c) => `${c.locale} ${c.percent}%`).join(\", \");\n return ok(summary || \"No localized fields.\", report);\n } catch (error) {\n return fail(error);\n }\n },\n );\n}\n","import { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ProjectRegistry } from \"./config.js\";\n\n/**\n * MCP resources (SPEC 13): project summaries, collection schemas, entry and\n * revision representations, and change-set validation results.\n */\nexport function registerResources(server: McpServer, registry: ProjectRegistry): void {\n const json = (uri: string, value: unknown): ReadResourceResult => ({\n contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify(value, null, 2) }],\n });\n\n // Project summaries for the default organization.\n server.registerResource(\n \"projects\",\n \"myna://projects\",\n { title: \"Projects\", description: \"Projects in the default organization.\", mimeType: \"application/json\" },\n async (uri) => {\n // Org-scoped, like `myna_list_projects`: this is the entry point a client\n // reads to discover projects, so it must not itself demand one. It is the\n // only concrete (non-template) resource, which makes it exactly what a\n // host's resource picker reads first.\n const { client } = registry.clientForOrg();\n const org = registry.organizationFor();\n const projects = await client.projects.list(org);\n return json(uri.href, { organization: org, projects });\n },\n );\n\n // Collection list for a project.\n server.registerResource(\n \"collections\",\n new ResourceTemplate(\"myna://{project}/collections\", { list: undefined }),\n { title: \"Collections\", description: \"Deployed collections for a project.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const project = String(variables.project);\n const { client, project: ref } = registry.clientFor(project);\n const collections = await client.schema.collections(ref);\n return json(uri.href, { project: ref, collections });\n },\n );\n\n // Canonical schema for one collection.\n server.registerResource(\n \"collection-schema\",\n new ResourceTemplate(\"myna://{project}/collection/{key}\", { list: undefined }),\n { title: \"Collection schema\", description: \"Latest canonical schema for a collection.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const versions = await client.schema.versions(project, String(variables.key));\n const latest = versions[0];\n return json(uri.href, { collection: String(variables.key), version: latest?.version ?? null, schema: latest?.schemaJson ?? null });\n },\n );\n\n // Entry representation (by entry id).\n server.registerResource(\n \"entry\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}\", { list: undefined }),\n { title: \"Entry\", description: \"An entry's current representation.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const entry = await client.entries.get(project, String(variables.entry));\n return json(uri.href, { entry });\n },\n );\n\n // Entry revisions.\n server.registerResource(\n \"entry-revisions\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}/revisions\", { list: undefined }),\n { title: \"Entry revisions\", description: \"Immutable revisions for an entry.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const revisions = await client.entries.revisions(project, String(variables.entry));\n return json(uri.href, { entry: String(variables.entry), revisions });\n },\n );\n\n // Change-set validation results.\n server.registerResource(\n \"change-set-validation\",\n new ResourceTemplate(\"myna://{project}/change-set/{changeSet}/validation\", { list: undefined }),\n { title: \"Change-set validation\", description: \"Validation result for a change set.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const result = await client.changeSets.validate(project, String(variables.changeSet));\n return json(uri.href, result);\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 the version advertised in the MCP handshake can\n * never disagree with the package it was published from. Running from source\n * leaves the identifier undefined and falls back to a marker that is obviously\n * 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 { createServer as createHttpServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { createServerForRegistry } from \"./server.js\";\n\nexport interface HttpOptions {\n port: number;\n /** Bearer token required in the `Authorization` header. */\n authToken?: string;\n /** Explicitly serve without endpoint auth. Never enable on a public network. */\n allowUnauthenticated?: boolean;\n path?: string;\n}\n\nfunction readBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (c: Buffer) => chunks.push(c));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if (!raw) return resolve(undefined);\n try {\n resolve(JSON.parse(raw));\n } catch (error) {\n reject(error);\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction bearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n return header?.startsWith(\"Bearer \") ? header.slice(7).trim() : undefined;\n}\n\n/**\n * Streamable HTTP transport (SPEC 13). Stateless: a fresh server + transport per\n * request. Authenticated by a bearer token in the `Authorization` header.\n */\nexport async function runHttp(options: HttpOptions): Promise<void> {\n if (!options.authToken && !options.allowUnauthenticated) {\n throw new Error(\n \"Refusing to serve HTTP without auth. Set MYNA_MCP_TOKEN (or MYNA_TOKEN), \" +\n \"or set MYNA_MCP_ALLOW_UNAUTHENTICATED=1 for trusted-network use only.\",\n );\n }\n const registry = new ProjectRegistry();\n const path = options.path ?? \"/mcp\";\n\n const httpServer = createHttpServer((req: IncomingMessage, res: ServerResponse) => {\n void handle(req, res).catch((error: unknown) => {\n if (!res.headersSent) res.writeHead(500, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32603, message: String(error) }, id: null }));\n });\n });\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n if (url.pathname === \"/health\") {\n res.writeHead(200, { \"content-type\": \"application/json\" }).end(JSON.stringify({ ok: true }));\n return;\n }\n if (url.pathname !== path) {\n res.writeHead(404, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"not found\" }));\n return;\n }\n if (options.authToken && bearer(req) !== options.authToken) {\n res.writeHead(401, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"unauthorized\" }));\n return;\n }\n if (req.method !== \"POST\") {\n // Stateless server: no standalone SSE stream.\n res.writeHead(405, { \"content-type\": \"application/json\", allow: \"POST\" }).end(\n JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32000, message: \"Method not allowed.\" }, id: null }),\n );\n return;\n }\n\n const body = await readBody(req);\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n // Remote clients must never be able to read this machine's filesystem.\n const server = createServerForRegistry(registry, { allowPathUploads: false });\n res.on(\"close\", () => {\n void transport.close();\n void server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, body);\n }\n\n await new Promise<void>((resolve) => httpServer.listen(options.port, resolve));\n process.stderr.write(`myna-mcp: streamable HTTP transport listening on :${options.port}${path}\\n`);\n}\n"],"mappings":"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","names":["McpServer","bytes","DEFAULT_API_URL","McpServer"]}
|
|
1
|
+
{"version":3,"sources":["../src/main.ts","../src/server.ts","../src/config.ts","../../sdk/src/errors.ts","../../sdk/src/http.ts","../../sdk/src/management.ts","../../sdk/src/codegen.ts","../src/tools.ts","../src/resources.ts","../src/version.ts","../src/http.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { runHttp } from \"./http.js\";\n\n/** Run over stdio (default) or streamable HTTP (`--http`). */\nexport async function main(argv: string[] = process.argv.slice(2)): Promise<void> {\n const useHttp = argv.includes(\"--http\") || process.env.MYNA_MCP_TRANSPORT === \"http\";\n\n if (useHttp) {\n const port = Number(process.env.MYNA_MCP_PORT ?? process.env.PORT ?? 3333);\n const authToken = process.env.MYNA_MCP_TOKEN ?? process.env.MYNA_TOKEN;\n const allowUnauthenticated = [\"1\", \"true\"].includes(\n process.env.MYNA_MCP_ALLOW_UNAUTHENTICATED ?? \"\",\n );\n await runHttp({ port, authToken, allowUnauthenticated });\n return;\n }\n\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n // Keep the process alive; the transport closes on stdin end.\n process.stderr.write(\"myna-mcp: stdio transport ready\\n\");\n}\n\nexport { createServer, createServerForRegistry, SERVER_NAME, SERVER_VERSION } from \"./server.js\";\nexport { runHttp } from \"./http.js\";\nexport { ProjectRegistry, type RegistryOptions } from \"./config.js\";\nexport { VERSION } from \"./version.js\";\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { registerTools, type ToolOptions } from \"./tools.js\";\nimport { registerResources } from \"./resources.js\";\nimport { VERSION } from \"./version.js\";\n\nexport const SERVER_NAME = \"myna\";\nexport const SERVER_VERSION = VERSION;\n\n/** Build a fully-wired Myna MCP server (tools + resources). */\nexport function createServer(): McpServer {\n return createServerForRegistry(new ProjectRegistry());\n}\n\n/** Internal variant used by the stateless HTTP transport. */\nexport function createServerForRegistry(\n registry: ProjectRegistry,\n toolOptions?: ToolOptions,\n): McpServer {\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n {\n capabilities: { tools: {}, resources: {} },\n instructions:\n \"Myna MCP server: manage content, schemas, assets, change sets, and previews. \" +\n \"The primary flow is: create a change set, apply entry/asset operations, validate, \" +\n \"then create one preview URL. Publishing is a separate, confirmation-gated action.\",\n },\n );\n registerTools(server, registry, toolOptions);\n registerResources(server, registry);\n return server;\n}\n","import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createManagementClient, type ManagementClient } from \"@myna-sh/sdk/management\";\n\n/**\n * Named project configurations (SPEC 13). A default project plus per-call\n * overrides. Configuration comes from the environment and an optional JSON file\n * (`MYNA_MCP_CONFIG` or `~/.config/myna/mcp.json`).\n */\n\nexport interface NamedProject {\n project: string;\n organization?: string;\n apiUrl?: string;\n token?: string;\n}\n\nexport interface McpConfigFile {\n default?: string;\n apiUrl?: string;\n token?: string;\n projects?: Record<string, NamedProject>;\n}\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface RegistryOptions {\n /**\n * Skip the on-disk config file. The hosted server builds one registry per\n * request from the caller's OAuth grant; it must never pick up whatever\n * `~/.config/myna/mcp.json` happens to exist on the host.\n */\n ignoreConfigFile?: boolean;\n /** Replaces the \"set MYNA_PROJECT\" advice, which is meaningless remotely. */\n noProjectHint?: string;\n}\n\nexport class ProjectRegistry {\n private readonly file: McpConfigFile;\n private readonly clients = new Map<string, ManagementClient>();\n private readonly options: RegistryOptions;\n\n constructor(\n private readonly env: NodeJS.ProcessEnv = process.env,\n options: RegistryOptions = {},\n ) {\n this.options = options;\n this.file = options.ignoreConfigFile ? {} : loadConfigFile(env);\n }\n\n /**\n * A registry bound to a single credential, for the hosted (multi-tenant)\n * server. Every request builds its own; nothing is shared between callers.\n */\n static forCredential(input: {\n apiUrl: string;\n token: string;\n organization?: string;\n }): ProjectRegistry {\n return new ProjectRegistry(\n {\n MYNA_API_URL: input.apiUrl,\n MYNA_TOKEN: input.token,\n ...(input.organization ? { MYNA_ORGANIZATION: input.organization } : {}),\n } as NodeJS.ProcessEnv,\n {\n ignoreConfigFile: true,\n noProjectHint:\n \"No project specified. Pass `project` (an id or slug); use myna_list_projects to see them.\",\n },\n );\n }\n\n private get defaultApiUrl(): string {\n return this.env.MYNA_API_URL ?? this.file.apiUrl ?? DEFAULT_API_URL;\n }\n\n private get defaultToken(): string | undefined {\n return this.env.MYNA_TOKEN ?? this.file.token;\n }\n\n /** The named-project key used when a call omits `project`. */\n defaultProjectName(): string | undefined {\n return this.file.default ?? (this.env.MYNA_PROJECT ? \"__env\" : undefined);\n }\n\n /** All configured named projects (env default included). */\n list(): Array<{ name: string; project: string; organization?: string }> {\n const out: Array<{ name: string; project: string; organization?: string }> = [];\n if (this.env.MYNA_PROJECT) {\n out.push({ name: \"__env\", project: this.env.MYNA_PROJECT, organization: this.env.MYNA_ORGANIZATION });\n }\n for (const [name, cfg] of Object.entries(this.file.projects ?? {})) {\n out.push({ name, project: cfg.project, organization: cfg.organization });\n }\n return out;\n }\n\n /**\n * Resolve credentials without demanding a project.\n *\n * Org-scoped calls — listing projects above all — have no project to name\n * yet. A hosted connector is bound to an organization, not a project, so\n * requiring one here made discovery impossible: the tool an agent must call\n * first was the one that could not run.\n */\n resolveCredential(ref?: string): {\n project: string | null;\n organization?: string;\n apiUrl: string;\n token: string | undefined;\n } {\n // A named configuration.\n if (ref && this.file.projects?.[ref]) {\n const cfg = this.file.projects[ref]!;\n return {\n project: cfg.project,\n organization: cfg.organization,\n apiUrl: cfg.apiUrl ?? this.defaultApiUrl,\n token: cfg.token ?? this.defaultToken,\n };\n }\n // The env default named project.\n if ((!ref || ref === \"__env\") && this.env.MYNA_PROJECT) {\n return {\n project: ref && ref !== \"__env\" ? ref : this.env.MYNA_PROJECT,\n organization: this.env.MYNA_ORGANIZATION,\n apiUrl: this.defaultApiUrl,\n token: this.defaultToken,\n };\n }\n // A default named config.\n if (!ref && this.file.default && this.file.projects?.[this.file.default]) {\n return this.resolveCredential(this.file.default);\n }\n return {\n project: ref ?? null,\n organization: this.env.MYNA_ORGANIZATION,\n apiUrl: this.defaultApiUrl,\n token: this.defaultToken,\n };\n }\n\n /** Resolve a project reference: an explicit id/slug, a named config, or the default. */\n resolve(ref?: string): { project: string; organization?: string; apiUrl: string; token: string | undefined } {\n const resolved = this.resolveCredential(ref);\n if (!resolved.project) {\n throw new Error(\n this.options.noProjectHint ??\n \"No project specified and no default is configured (set MYNA_PROJECT or configure a default).\",\n );\n }\n return { ...resolved, project: resolved.project };\n }\n\n private clientFrom(apiUrl: string, token: string | undefined): ManagementClient {\n if (!token) {\n throw new Error(\"No credential available. Set MYNA_TOKEN or configure a token for the project.\");\n }\n const cacheKey = `${apiUrl}::${token}`;\n let client = this.clients.get(cacheKey);\n if (!client) {\n client = createManagementClient({ token, apiUrl });\n this.clients.set(cacheKey, client);\n }\n return client;\n }\n\n /** A management client bound to the resolved project's API + token. */\n clientFor(ref?: string): { client: ManagementClient; project: string; organization?: string } {\n const resolved = this.resolve(ref);\n return {\n client: this.clientFrom(resolved.apiUrl, resolved.token),\n project: resolved.project,\n organization: resolved.organization,\n };\n }\n\n /** A management client for an org-scoped call, where no project is required. */\n clientForOrg(ref?: string): { client: ManagementClient; organization?: string } {\n const resolved = this.resolveCredential(ref);\n return {\n client: this.clientFrom(resolved.apiUrl, resolved.token),\n organization: resolved.organization,\n };\n }\n\n /** Resolve an organization for org-scoped calls. */\n organizationFor(ref?: string, organizationOverride?: string): string {\n const resolved = this.resolveCredential(ref);\n const org = organizationOverride ?? resolved.organization;\n if (!org) throw new Error(\"No organization specified. Provide `organization` or configure one for the project.\");\n return org;\n }\n}\n\nfunction loadConfigFile(env: NodeJS.ProcessEnv): McpConfigFile {\n const explicit = env.MYNA_MCP_CONFIG;\n const candidates = [explicit, join(env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"myna\", \"mcp.json\")].filter(\n (v): v is string => Boolean(v),\n );\n for (const path of candidates) {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as McpConfigFile;\n } catch {\n // Try next candidate.\n }\n }\n return {};\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 SimilarAssetContract,\n SimilarAssetsResponse,\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 ChangeSetDiffResponse,\n ChangeSetReviewContract,\n ProjectCheckContract,\n RebaseChangeSetRequest,\n RebaseChangeSetResponse,\n ReportCheckResultRequest,\n UpsertProjectCheckRequest,\n CreateChangeSetCommentRequest,\n CreateChangeSetRequest,\n RequestReviewRequest,\n ReviewDecisionRequest,\n RunChecksResponse,\n UpdateChangeSetRequest,\n} from \"../../api-contracts/src/change-sets.js\";\nimport type {\n ReleaseContract,\n RevertReleaseRequest,\n RevertReleaseResponse,\n} from \"../../api-contracts/src/releases.js\";\nimport type {\n CollectionContract,\n CollectionVersionContract,\n SchemaDiffResponse,\n SchemaDriftResponse,\n SchemaPushResponse,\n TranslationCoverageResponse,\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 AccessCheckResponse,\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 /**\n * Why a call into this project would be denied: whether the credential\n * holds a capability, whether it is confined to other collections, and\n * whether the collection exists at all.\n */\n access: (\n project: string,\n opts: { capability?: string; collection?: string } = {},\n signal?: AbortSignal,\n ): Promise<AccessCheckResponse> =>\n this.get<AccessCheckResponse>(\n `/projects/${enc(project)}/access`,\n { capability: opts.capability, collection: opts.collection },\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 /** What is still untranslated in a collection, per project locale. */\n translations: (project: string, key: string, signal?: AbortSignal): Promise<TranslationCoverageResponse> =>\n this.get<TranslationCoverageResponse>(\n `/projects/${enc(project)}/collections/${enc(key)}/translations`,\n undefined,\n signal,\n ),\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; q?: string } = {},\n ): Promise<Page<EntryContract>> =>\n this.page<EntryContract>(`/projects/${enc(project)}/entries`, opts, {\n collection: opts.collection,\n status: opts.status,\n q: opts.q,\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 /** Report a verdict Myna cannot compute, against the current contents. */\n reportCheck: (\n project: string,\n changeSet: string,\n name: string,\n body: ReportCheckResultRequest,\n ): Promise<ChangeSetCheckContract> =>\n this.mutate<ChangeSetCheckContract>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/checks/${enc(name)}`,\n body,\n ),\n /** Field-level before/after for everything this change set would change. */\n /**\n * Replay the change set's edits on top of what is published now.\n *\n * Refuses by default when a field changed on both sides; pass\n * `onConflict` to take one side, or `dryRun` to see the plan first.\n */\n rebase: (\n project: string,\n changeSet: string,\n body: RebaseChangeSetRequest = {},\n ): Promise<RebaseChangeSetResponse> =>\n this.mutate<RebaseChangeSetResponse>(\n \"POST\",\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/rebase`,\n body,\n ),\n diff: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetDiffResponse> =>\n this.get<ChangeSetDiffResponse>(\n `/projects/${enc(project)}/change-sets/${enc(changeSet)}/diff`,\n undefined,\n signal,\n ),\n };\n\n // --- Releases -------------------------------------------------------------\n /**\n * What shipped, and how to take it back.\n *\n * `revert` returns an open change set rather than publishing: it goes through\n * the same review, preview, and gate path as anything written by hand.\n */\n readonly releases = {\n list: (project: string, opts: ListOptions = {}): Promise<Page<ReleaseContract>> =>\n this.page<ReleaseContract>(`/projects/${enc(project)}/releases`, opts),\n /** `release` is a release number or the published change set's id. */\n get: (project: string, release: string | number, signal?: AbortSignal): Promise<ReleaseContract> =>\n this.get<ReleaseContract>(`/projects/${enc(project)}/releases/${enc(String(release))}`, undefined, signal),\n revert: (\n project: string,\n release: string | number,\n body: RevertReleaseRequest = {},\n ): Promise<RevertReleaseResponse> =>\n this.mutate<RevertReleaseResponse>(\n \"POST\",\n `/projects/${enc(project)}/releases/${enc(String(release))}/revert`,\n body,\n ),\n };\n\n // --- Declared external checks ---------------------------------------------\n readonly checks = {\n list: (project: string, signal?: AbortSignal): Promise<ProjectCheckContract[]> =>\n this.get<ProjectCheckContract[]>(`/projects/${enc(project)}/checks`, undefined, signal),\n declare: (project: string, body: UpsertProjectCheckRequest): Promise<ProjectCheckContract> =>\n this.mutate<ProjectCheckContract>(\"POST\", `/projects/${enc(project)}/checks`, body),\n remove: (project: string, name: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/checks/${enc(name)}`),\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: (\n project: string,\n opts: ListOptions & { tag?: string; checksum?: string; orphaned?: boolean } = {},\n ): Promise<Page<AssetContract>> =>\n this.page<AssetContract>(`/projects/${enc(project)}/assets`, opts, {\n tag: opts.tag,\n checksum: opts.checksum,\n orphaned: opts.orphaned ? \"true\" : undefined,\n }),\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 /**\n * Assets that look like the same picture, by perceptual hash — a resized or\n * re-encoded copy, which `checksum` cannot see. `maxDistance` is in bits out\n * of 64 (default 5, maximum 16).\n */\n similar: (\n project: string,\n asset: string,\n opts: { maxDistance?: number; limit?: number } = {},\n signal?: AbortSignal,\n ): Promise<SimilarAssetContract[]> =>\n this.get<SimilarAssetsResponse>(\n `/projects/${enc(project)}/assets/${enc(asset)}/similar`,\n {\n maxDistance: opts.maxDistance === undefined ? undefined : String(opts.maxDistance),\n limit: opts.limit === undefined ? undefined : String(opts.limit),\n },\n signal,\n ).then((r) => r.similar),\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 { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ManagementClient } from \"@myna-sh/sdk/management\";\nimport { isMynaApiError } from \"@myna-sh/sdk/management\";\nimport type { ProjectRegistry } from \"./config.js\";\n\n/**\n * The Myna MCP tools (SPEC 13). This module contains no CMS business logic —\n * every tool is a thin adapter over the management SDK.\n */\n\n/**\n * A tool result carrying both a human summary and the data itself.\n *\n * The payload is serialized into a second text block as well as\n * `structuredContent`. That duplication is deliberate: `structuredContent` is\n * only meaningful to hosts that read it, and a host that does not — Claude's\n * remote connector among them — would otherwise receive nothing but the\n * summary. An agent told \"1 project(s)\" with no id, slug, or name cannot make\n * the follow-up call, which strands it on the very tool meant to bootstrap\n * discovery. The MCP specification asks for this fallback for exactly this\n * reason; the cost is some duplicated tokens, and the alternative is a tool\n * that silently returns no data.\n */\nfunction ok(text: string, structured: unknown): CallToolResult {\n return {\n content: [\n { type: \"text\", text },\n { type: \"text\", text: JSON.stringify(structured) },\n ],\n structuredContent: structured as Record<string, unknown>,\n };\n}\n\nfunction fail(error: unknown): CallToolResult {\n const message = isMynaApiError(error)\n ? `${error.code}: ${error.detail ?? error.title}`\n : error instanceof Error\n ? error.message\n : String(error);\n return { content: [{ type: \"text\", text: `Error: ${message}` }], isError: true };\n}\n\nasync function resolveEntryId(client: ManagementClient, project: string, ref: string): Promise<string> {\n if (ref.startsWith(\"ent_\") && !ref.includes(\"/\")) return ref;\n const [collection, slug] = ref.includes(\"/\") ? ref.split(\"/\", 2) : [undefined, ref];\n if (!collection) throw new Error(`Provide the entry as \"<collection>/<slug>\" or an ent_ id (got \"${ref}\").`);\n let cursor: string | undefined;\n for (let i = 0; i < 50; i++) {\n const page = await client.entries.list(project, { collection, limit: 100, cursor });\n const match = page.data.find((e) => e.slug === slug || e.id === slug);\n if (match) return match.id;\n if (!page.nextCursor) break;\n cursor = page.nextCursor;\n }\n throw new Error(`Entry not found: ${ref}`);\n}\n\nconst projectArg = { project: z.string().optional().describe(\"Project id, slug, or configured name. Omit to use the default.\") };\n\n/**\n * The capability each tool's underlying route requires, so `myna_explain_denial`\n * can answer in terms of the tool that was actually refused rather than making\n * the caller guess which scope it needed.\n *\n * This lives beside the registrations on purpose: it is knowledge about this\n * surface, not about the CMS, and a tool added below without an entry here is\n * one this file can be read to notice. `null` means the route needs nothing\n * beyond reaching the project.\n */\nconst TOOL_CAPABILITY: Record<string, string | null> = {\n myna_list_projects: null,\n myna_get_project: null,\n myna_list_collections: null,\n myna_explain_denial: null,\n myna_get_collection_schema: \"schema:read\",\n myna_list_entries: \"content:read\",\n myna_get_entry: \"content:read\",\n myna_search_entries: \"content:read\",\n myna_get_entry_revisions: \"content:read\",\n myna_get_entry_references: \"content:read\",\n myna_translation_coverage: \"content:read\",\n myna_create_entry: \"content:write\",\n myna_update_entry: \"content:write\",\n myna_unpublish_entry: \"content:write\",\n myna_duplicate_entry: \"content:write\",\n myna_import_entries: \"content:write\",\n myna_reorder_entries: \"content:write\",\n myna_delete_entry: \"content:delete\",\n myna_restore_revision: \"content:restore\",\n myna_list_change_sets: \"content:read\",\n myna_get_change_set: \"content:read\",\n myna_diff_change_set: \"content:read\",\n myna_validate_change_set: \"content:read\",\n myna_get_change_set_review: \"content:read\",\n myna_create_change_set: \"content:write\",\n myna_update_change_set: \"content:write\",\n myna_close_change_set: \"content:write\",\n myna_rebase_change_set: \"content:write\",\n myna_comment_on_change_set: \"content:write\",\n myna_request_change_set_review: \"content:write\",\n myna_run_change_set_checks: \"content:write\",\n myna_review_change_set: \"content:review\",\n myna_report_check_result: \"content:review\",\n myna_publish_change_set: \"content:publish\",\n myna_schedule_change_set: \"content:publish\",\n myna_list_releases: \"content:read\",\n myna_get_release: \"content:read\",\n myna_revert_release: \"content:write\",\n myna_create_preview: \"preview:write\",\n myna_list_assets: \"assets:read\",\n myna_get_asset: \"assets:read\",\n myna_upload_asset: \"assets:write\",\n myna_update_asset: \"assets:write\",\n};\n\nexport interface ToolOptions {\n /**\n * Whether `myna_upload_asset` may read local filesystem paths. True for\n * stdio (the client and server share a machine); false for HTTP, where a\n * remote client must never be able to read the server's filesystem.\n */\n allowPathUploads: boolean;\n}\n\nexport function registerTools(\n server: McpServer,\n registry: ProjectRegistry,\n options: ToolOptions = { allowPathUploads: true },\n): void {\n // 1. list projects\n server.registerTool(\n \"myna_list_projects\",\n {\n title: \"List projects\",\n description: \"List projects in an organization.\",\n inputSchema: {\n organization: z.string().optional().describe(\"Organization id or slug. Omit to use the default.\"),\n ...projectArg,\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n // Org-scoped: this is how an agent discovers projects, so it must not\n // itself require one.\n const { client } = registry.clientForOrg(args.project);\n const org = registry.organizationFor(args.project, args.organization);\n const projects = await client.projects.list(org);\n return ok(`${projects.length} project(s) in ${org}.`, { projects });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 2. get project\n server.registerTool(\n \"myna_get_project\",\n {\n title: \"Get project\",\n description: \"Fetch a single project's details.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.projects.get(project);\n return ok(`Project ${result.name} (${result.slug}).`, { project: result });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 3. list collections\n server.registerTool(\n \"myna_list_collections\",\n {\n title: \"List collections\",\n description: \"List the deployed collections in a project.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const collections = await client.schema.collections(project);\n return ok(`${collections.length} collection(s).`, { collections });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 4. get collection schema\n server.registerTool(\n \"myna_get_collection_schema\",\n {\n title: \"Get collection schema\",\n description: \"Fetch the latest canonical schema for a collection.\",\n inputSchema: { ...projectArg, collection: z.string().describe(\"Collection key.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const versions = await client.schema.versions(project, args.collection);\n const latest = versions[0];\n if (!latest) throw new Error(`Collection ${args.collection} has no versions.`);\n return ok(`${args.collection} schema v${latest.version}.`, { version: latest.version, schema: latest.schemaJson });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 5. list entries\n server.registerTool(\n \"myna_list_entries\",\n {\n title: \"List entries\",\n description: \"List entries in a collection.\",\n inputSchema: {\n ...projectArg,\n collection: z.string().describe(\"Collection key.\"),\n status: z.enum([\"draft\", \"published\", \"changed\", \"unpublished\", \"deleted\"]).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.entries.list(project, {\n collection: args.collection,\n status: args.status,\n limit: args.limit ?? 25,\n cursor: args.cursor,\n });\n return ok(`${page.data.length} entr(y/ies).`, { entries: page.data, nextCursor: page.nextCursor });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 6. get entry\n server.registerTool(\n \"myna_get_entry\",\n {\n title: \"Get entry\",\n description: \"Fetch one entry by \\\"<collection>/<slug>\\\" or entry id.\",\n inputSchema: { ...projectArg, entry: z.string().describe(\"collection/slug or ent_ id.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.get(project, id);\n return ok(`Entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 7. create change set\n server.registerTool(\n \"myna_create_change_set\",\n {\n title: \"Create change set\",\n description: \"Open a new change set to group entry and asset operations.\",\n inputSchema: {\n ...projectArg,\n title: z.string().min(1).max(200),\n description: z.string().max(2000).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.create(project, { title: args.title, description: args.description });\n return ok(`Created change set ${cs.id}.`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 8. get change set\n server.registerTool(\n \"myna_get_change_set\",\n {\n title: \"Get change set\",\n description: \"Fetch a change set and its items.\",\n inputSchema: { ...projectArg, changeSet: z.string().describe(\"Change set id (chs_).\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.get(project, args.changeSet);\n return ok(`Change set ${cs.id} (${cs.status}), ${cs.items.length} item(s).`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 9. create entry\n server.registerTool(\n \"myna_create_entry\",\n {\n title: \"Create entry\",\n description: \"Create a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n collection: z.string(),\n data: z.record(z.string(), z.unknown()).describe(\"Field values.\"),\n slug: z.string().optional(),\n changeSet: z.string().optional().describe(\"Attach to an existing change set (chs_).\"),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const entry = await client.entries.create(project, {\n collection: args.collection,\n data: args.data,\n slug: args.slug,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Created entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 10. update entry\n server.registerTool(\n \"myna_update_entry\",\n {\n title: \"Update entry\",\n description: \"Update a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string().describe(\"collection/slug or ent_ id.\"),\n data: z.record(z.string(), z.unknown()).optional(),\n slug: z.string().optional(),\n expectedRevisionId: z.string().optional().describe(\"Optimistic concurrency guard.\"),\n changeSet: z.string().optional(),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.update(project, id, {\n data: args.data,\n slug: args.slug,\n expectedRevisionId: args.expectedRevisionId,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Updated entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 11. delete entry (destructive)\n server.registerTool(\n \"myna_delete_entry\",\n {\n title: \"Delete entry\",\n description: \"Stage an entry deletion on a change set. Requires confirm=true. Takes effect only on publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n changeSet: z.string().optional(),\n confirm: z.literal(true).describe(\"Must be true to proceed.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.delete(project, id, args.changeSet);\n return ok(`Staged delete of ${id} on ${result.changeSetId}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 12. upload asset\n server.registerTool(\n \"myna_upload_asset\",\n {\n title: \"Upload asset\",\n description:\n \"Upload an asset from base64 bytes or a local file path via the presigned flow. The result reports any existing image that looks like the same picture (`similar`), including resized or re-encoded copies a checksum cannot match — reference one of those and delete this upload rather than leaving the library with two.\",\n inputSchema: {\n ...projectArg,\n filename: z.string().describe(\"Display filename, e.g. cover.png.\"),\n base64: z.string().optional().describe(\"Base64-encoded file bytes.\"),\n path: z.string().optional().describe(\"Local filesystem path (stdio hosts only).\"),\n contentType: z.string().optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n if (!args.base64 && !args.path) throw new Error(\"Provide either `base64` or `path`.\");\n if (args.path && !options.allowPathUploads) {\n throw new Error(\"`path` uploads are only available on stdio transports; send `base64` instead.\");\n }\n const input = args.base64 ? new Uint8Array(Buffer.from(args.base64, \"base64\")) : args.path!;\n const asset = await client.assets.upload(project, input, {\n filename: args.filename,\n contentType: args.contentType,\n });\n // Asked here rather than left to the caller: the moment to notice a\n // duplicate is before it is referenced, and an agent that has to\n // remember a second call will not make it.\n const similar = await client.assets.similar(project, asset.id).catch(() => []);\n const duplicates = similar.length\n ? ` ${similar.length} existing asset(s) look like the same image: ${similar\n .map((s) => `${s.asset.id} (${s.asset.displayFilename})`)\n .join(\", \")}.`\n : \"\";\n return ok(`Uploaded ${asset.displayFilename} (${asset.id}).${duplicates}`, { asset, similar });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 13. validate change set\n server.registerTool(\n \"myna_validate_change_set\",\n {\n title: \"Validate change set\",\n description: \"Validate every changed resource in a change set against the deployed schemas.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.validate(project, args.changeSet);\n return ok(result.valid ? \"Change set is valid.\" : `Invalid: ${result.errors.length} error(s).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 14. create preview\n server.registerTool(\n \"myna_create_preview\",\n {\n title: \"Create preview\",\n description: \"Create one preview URL for a change set (or entry). Never publishes.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string().optional().describe(\"Change set id (chs_).\"),\n entry: z.string().optional().describe(\"Entry id (ent_).\"),\n expiresInSeconds: z.number().int().min(60).max(604800).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.changeSet) === Boolean(args.entry)) {\n throw new Error(\"Provide exactly one of `changeSet` or `entry`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const preview = await client.previews.create(project, {\n changeSetId: args.changeSet,\n entryId: args.entry,\n expiresInSeconds: args.expiresInSeconds,\n });\n return ok(`Preview: ${preview.url}`, { preview });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 15. publish change set (destructive)\n server.registerTool(\n \"myna_publish_change_set\",\n {\n title: \"Publish change set\",\n description: \"Atomically publish a change set. Requires confirm=true and content:publish scope.\",\n inputSchema: { ...projectArg, changeSet: z.string(), confirm: z.literal(true).describe(\"Must be true.\") },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.publish(project, args.changeSet);\n return ok(`Published ${result.publishedEntryIds.length} entr(y/ies).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 16. get entry revisions\n server.registerTool(\n \"myna_get_entry_revisions\",\n {\n title: \"Get entry revisions\",\n description: \"List the immutable revisions of an entry.\",\n inputSchema: { ...projectArg, entry: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const revisions = await client.entries.revisions(project, id);\n return ok(`${revisions.length} revision(s).`, { revisions });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // get entry references (reference integrity)\n server.registerTool(\n \"myna_get_entry_references\",\n {\n title: \"Get entry references\",\n description:\n \"Show reference integrity for an entry: which entries reference it (backlinks) and which entries it references, with publish state. Useful before unpublishing or deleting.\",\n inputSchema: { ...projectArg, entry: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const refs = await client.entries.references(project, id);\n return ok(\n `Referenced by ${refs.referencedBy.length} entr(y/ies); references ${refs.references.length}.`,\n refs,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 17. restore revision (destructive)\n server.registerTool(\n \"myna_restore_revision\",\n {\n title: \"Restore revision\",\n description: \"Restore a historical revision into a new draft revision. Requires confirm=true.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n revision: z.string().describe(\"Revision id (rev_).\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.restoreRevision(project, id, args.revision);\n return ok(`Restored into ${result.revision.id}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // schedule / cancel scheduled publish\n server.registerTool(\n \"myna_schedule_change_set\",\n {\n title: \"Schedule change-set publish\",\n description:\n \"Schedule a change set to publish atomically at a future time, or cancel its schedule. Requires confirm=true and content:publish scope. Schedule status is readable via myna_get_change_set (scheduledAt).\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n publishAt: z.string().optional().describe(\"ISO 8601 datetime to publish at. Omit with cancel=true.\"),\n cancel: z.boolean().optional().describe(\"Cancel the existing schedule instead.\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.publishAt) === Boolean(args.cancel)) {\n throw new Error(\"Provide exactly one of `publishAt` or `cancel`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const cs = args.cancel\n ? await client.changeSets.cancelSchedule(project, args.changeSet)\n : await client.changeSets.schedule(project, args.changeSet, args.publishAt!);\n return ok(cs.scheduledAt ? `Scheduled for ${cs.scheduledAt}.` : \"Schedule cancelled.\", { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 18. get review status (reviews + comments + latest checks)\n server.registerTool(\n \"myna_get_change_set_review\",\n {\n title: \"Get change-set review status\",\n description:\n \"Fetch a change set's reviews, comments, and latest automated check run in one call.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const [reviews, comments, checks] = await Promise.all([\n client.changeSets.reviews(project, args.changeSet),\n client.changeSets.comments(project, args.changeSet),\n client.changeSets.checks(project, args.changeSet),\n ]);\n const approvals = reviews.filter((r) => r.status === \"approved\" && !r.stale).length;\n const failing = checks.filter((c) => c.status === \"failed\").length;\n return ok(\n `${approvals} fresh approval(s), ${comments.length} comment(s), ${checks.length === 0 ? \"no check run\" : `${failing} failing check(s)`}.`,\n { reviews, comments, checks },\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 19. review change set (approve / request changes)\n server.registerTool(\n \"myna_review_change_set\",\n {\n title: \"Review change set\",\n description:\n \"Record an approve or request-changes review decision on a change set. Requires content:review scope.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n decision: z.enum([\"approve\", \"request_changes\"]),\n comment: z.string().optional().describe(\"Optional review comment.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const reviews =\n args.decision === \"approve\"\n ? await client.changeSets.approve(project, args.changeSet, { comment: args.comment })\n : await client.changeSets.requestChanges(project, args.changeSet, { comment: args.comment });\n return ok(`Recorded ${args.decision} review.`, { reviews });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 20. comment on change set\n server.registerTool(\n \"myna_comment_on_change_set\",\n {\n title: \"Comment on change set\",\n description: \"Add a comment to a change set, optionally anchored to an entry field.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n body: z.string().min(1),\n entry: z.string().optional().describe(\"Entry id (ent_) to anchor the comment to.\"),\n fieldPath: z.string().optional().describe(\"Field path within the entry, e.g. fields.title.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const comment = await client.changeSets.comment(project, args.changeSet, {\n body: args.body,\n resourceType: args.entry ? \"entry\" : undefined,\n resourceId: args.entry,\n fieldPath: args.fieldPath,\n });\n return ok(`Commented ${comment.id}.`, { comment });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 21. run automated checks\n server.registerTool(\n \"myna_run_change_set_checks\",\n {\n title: \"Run change-set checks\",\n description:\n \"Run the built-in automated checks against a change set and return the results: schema validation, reference integrity, conflicts, duplicate slugs, and the `policy` rules each collection declares for itself. Read a collection's policy with myna_get_collection_schema before writing, so you satisfy the rules rather than discovering them here.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.runChecks(project, args.changeSet);\n const failing = result.checks.filter((c) => c.status === \"failed\");\n return ok(\n result.passed ? \"All checks passed.\" : `Failing: ${failing.map((c) => c.name).join(\", \")}.`,\n result,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Working with existing change sets ------------------------------------\n\n server.registerTool(\n \"myna_list_change_sets\",\n {\n title: \"List change sets\",\n description:\n \"List change sets in a project, newest first, optionally filtered by status (open, ready, published, closed). Use this to find work already in progress before starting a new change set.\",\n inputSchema: {\n ...projectArg,\n status: z.enum([\"open\", \"ready\", \"published\", \"closed\"]).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.changeSets.list(project, {\n ...(args.status ? { status: args.status } : {}),\n ...(args.limit ? { limit: args.limit } : {}),\n ...(args.cursor ? { cursor: args.cursor } : {}),\n });\n return ok(`${page.data.length} change set(s).`, page);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_diff_change_set\",\n {\n title: \"Diff a change set\",\n description:\n \"Show what a change set would change, field by field: per item, the operation, the collection and slug, and every changed field with its before and after value. Long prose fields also carry `segments` — an ordered list of equal/insert/delete runs — so a rewritten body reads as the words that moved rather than as two walls of text. This is what a reviewer reads; use it to summarize your own work or to review someone else's.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const diff = await client.changeSets.diff(project, args.changeSet);\n const fields = diff.items.reduce((n, i) => n + i.changes.length, 0);\n return ok(`${diff.items.length} item(s), ${fields} changed field(s).`, diff);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_rebase_change_set\",\n {\n title: \"Rebase a change set\",\n description:\n \"Replay this change set's edits on top of what is published now. An entry can be staged on several open change sets at once, so another change set publishing first leaves yours describing a revision that is no longer current — publish refuses that rather than merging silently. This performs the field-level three-way merge: fields the other side did not touch are replayed automatically, and fields you both changed are reported as conflicts. Refuses by default rather than discarding anyone's work; pass onConflict to take one side. Use dryRun=true first to see what would happen. Rebasing writes new drafts, so existing approvals go stale and the change set needs re-review. The `conflicts` check reports the same information without writing anything.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n onConflict: z\n .enum([\"fail\", \"take-mine\", \"take-theirs\"])\n .optional()\n .describe(\"fail (default) refuses and reports; take-mine keeps your value; take-theirs accepts what was published.\"),\n dryRun: z.boolean().optional().describe(\"Report the plan without writing anything.\"),\n },\n // Destructive: `take-theirs` discards this change set's edit at the\n // conflicted fields, and `take-mine` discards what was published there.\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.rebase(project, args.changeSet, {\n ...(args.onConflict ? { onConflict: args.onConflict } : {}),\n ...(args.dryRun ? { dryRun: true } : {}),\n });\n const conflicts = result.items.reduce((n, i) => n + i.conflicts.length, 0);\n if (result.items.length === 0) {\n return ok(`Nothing to rebase; ${result.upToDate.length} item(s) already on the current head.`, result);\n }\n return ok(\n `${result.dryRun ? \"Would rebase\" : \"Rebased\"} ${result.items.length} entr(y/ies), ${conflicts} conflict(s).` +\n (result.dryRun ? \"\" : \" Approvals are now stale; the change set needs re-review.\"),\n result,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Releases -------------------------------------------------------------\n\n server.registerTool(\n \"myna_list_releases\",\n {\n title: \"List releases\",\n description:\n \"List what has shipped, newest first. Every publish is a numbered release. Each entry says who published it, how many resources it changed, and whether it has since been reverted — or whether it was itself a revert of an earlier release.\",\n inputSchema: { ...projectArg, limit: z.number().int().min(1).max(100).optional() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.releases.list(project, { limit: args.limit });\n return ok(`${page.data.length} release(s).`, { releases: page.data, nextCursor: page.nextCursor });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_get_release\",\n {\n title: \"Get a release\",\n description:\n \"Read one release by its number or by the id of the change set that produced it. Use myna_diff_change_set on the release's id to see field-by-field what it changed.\",\n inputSchema: { ...projectArg, release: z.string().describe(\"Release number, or the published change set id.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const release = await client.releases.get(project, args.release);\n return ok(`Release #${release.number} — ${release.title}, ${release.itemCount} item(s).`, release);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_revert_release\",\n {\n title: \"Revert a release\",\n description:\n \"Generate a change set that restores the state preceding a release. This publishes nothing: it stages drafts on a new change set that goes through validation, preview, review, and the project's publish gates like any other change — call myna_publish_change_set when it has been reviewed. Resources a later release already changed are refused rather than silently skipped; pass force=true to take them back anyway, discarding that later work. Requires confirm=true.\",\n inputSchema: {\n ...projectArg,\n release: z.string().describe(\"Release number, or the published change set id.\"),\n title: z.string().min(1).max(200).optional().describe(\"Title for the generated change set.\"),\n force: z\n .boolean()\n .optional()\n .describe(\"Revert resources a later release already changed, discarding that later work.\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.releases.revert(project, args.release, {\n ...(args.title ? { title: args.title } : {}),\n ...(args.force ? { force: true } : {}),\n });\n const skipped = result.skipped.length > 0 ? `, ${result.skipped.length} skipped` : \"\";\n return ok(\n `Staged ${result.reverted.length} revert(s)${skipped} on change set ${result.changeSet.id}. Not published — review and publish it to take the release back.`,\n result,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_update_change_set\",\n {\n title: \"Update a change set\",\n description:\n \"Rename a change set, change its description, or mark it ready for review. Marking it ready signals that a human is needed and emits change_set.ready_for_review.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n title: z.string().min(1).max(200).optional(),\n description: z.string().max(2000).optional(),\n status: z.enum([\"open\", \"ready\"]).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.update(project, args.changeSet, {\n ...(args.title ? { title: args.title } : {}),\n ...(args.description ? { description: args.description } : {}),\n ...(args.status ? { status: args.status } : {}),\n });\n return ok(`Change set ${cs.id} is ${cs.status}.`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_close_change_set\",\n {\n title: \"Close a change set\",\n description:\n \"Abandon a change set without publishing it. The staged drafts and their revisions remain in history; the set simply stops being work in progress. Use this when a task is cancelled, so open sets do not accumulate. Requires confirm=true.\",\n inputSchema: { ...projectArg, changeSet: z.string(), confirm: z.literal(true).describe(\"Must be true.\") },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.close(project, args.changeSet);\n return ok(`Closed ${cs.id}.`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_request_change_set_review\",\n {\n title: \"Request review\",\n description:\n \"Ask a specific person to review a change set. Pass their user id. Requires content:review scope.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n reviewerId: z.string().describe(\"User id (usr_) to assign as reviewer.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const reviews = await client.changeSets.requestReview(project, args.changeSet, {\n reviewerType: \"user\",\n reviewerId: args.reviewerId,\n });\n return ok(`${reviews.length} reviewer(s) assigned.`, { reviews });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_report_check_result\",\n {\n title: \"Report an external check result\",\n description:\n \"Report the verdict of a check Myna cannot compute itself — a link check, a house-style review, an external build. The check must have been declared on the project first. The result is recorded against the change set's current contents, so later edits mark it stale. A failing required check blocks publish. Requires content:review scope.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string(),\n name: z.string().describe(\"The declared check name, e.g. links.\"),\n status: z.enum([\"passed\", \"failed\", \"skipped\"]),\n details: z\n .array(\n z.object({\n resourceId: z.string().optional(),\n path: z.string().optional(),\n message: z.string(),\n }),\n )\n .optional()\n .describe(\"What the check found; shown to the reviewer.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const check = await client.changeSets.reportCheck(project, args.changeSet, args.name, {\n status: args.status,\n ...(args.details ? { details: args.details } : {}),\n });\n return ok(`Reported ${args.name}: ${check.status}.`, { check });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Bulk and editorial operations ----------------------------------------\n\n server.registerTool(\n \"myna_search_entries\",\n {\n title: \"Search entries\",\n description:\n \"Full-text search across every text field of an entry, matching either its draft or its published state. Use this to find the entry a human described in prose (\\\"the pricing page\\\", \\\"the post about webhooks\\\") instead of listing a collection and scanning it.\",\n inputSchema: {\n ...projectArg,\n query: z.string().min(1).describe(\"Words to search for. Supports quoted phrases and -exclusions.\"),\n collection: z.string().optional().describe(\"Restrict to one collection.\"),\n limit: z.number().int().min(1).max(100).optional(),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.entries.list(project, {\n q: args.query,\n ...(args.collection ? { collection: args.collection } : {}),\n limit: args.limit ?? 20,\n });\n return ok(`${page.data.length} match(es) for \"${args.query}\".`, page);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_unpublish_entry\",\n {\n title: \"Unpublish an entry\",\n description:\n \"Stage the removal of an entry from published content. Like every write this is a draft operation: it takes effect when the change set is published. The entry and its history are kept. Requires confirm=true.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n changeSet: z.string().optional(),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.unpublish(project, id, args.changeSet);\n return ok(`Unpublish staged on ${result.changeSetId}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_duplicate_entry\",\n {\n title: \"Duplicate an entry\",\n description:\n \"Copy an entry into a new draft with a fresh slug. Useful as a starting point when a new entry should follow the shape of an existing one.\",\n inputSchema: { ...projectArg, entry: z.string(), changeSet: z.string().optional() },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.duplicate(project, id, args.changeSet);\n return ok(`Created ${entry.id} (${entry.slug ?? \"no slug\"}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_import_entries\",\n {\n title: \"Import entries\",\n description:\n \"Create or update many entries in one collection in a single call, matched by slug: rows that already exist are updated, identical rows are skipped. Use dryRun=true first to see what would happen. Everything lands as drafts on one change set.\",\n inputSchema: {\n ...projectArg,\n collection: z.string(),\n entries: z\n .array(z.object({ slug: z.string().optional(), data: z.record(z.string(), z.unknown()) }))\n .min(1)\n .max(500),\n changeSet: z.string().optional(),\n changeSummary: z.string().optional(),\n dryRun: z.boolean().optional().describe(\"Report what would change without writing.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.entries.import(project, {\n collection: args.collection,\n entries: args.entries,\n ...(args.changeSet ? { changeSetId: args.changeSet } : {}),\n ...(args.changeSummary ? { changeSummary: args.changeSummary } : {}),\n ...(args.dryRun !== undefined ? { dryRun: args.dryRun } : {}),\n });\n const { created, updated, unchanged, invalid } = result.summary;\n return ok(\n `${args.dryRun ? \"Would import\" : \"Imported\"}: ${created} created, ${updated} updated, ${unchanged} unchanged, ${invalid} invalid.`,\n result,\n );\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_reorder_entries\",\n {\n title: \"Reorder a collection\",\n description:\n \"Set the editorial order of a collection. Unlike every other write, ordering is arrangement rather than content: it carries no revision, is not staged on a change set, and reaches readers immediately — which is why confirm=true is required. Never use it to change what an entry says.\",\n inputSchema: {\n ...projectArg,\n collection: z.string(),\n order: z.array(z.string()).optional().describe(\"Entry ids in the intended order.\"),\n move: z\n .object({ entry: z.string(), before: z.string().optional(), after: z.string().optional() })\n .optional()\n .describe(\"Move one entry relative to another, instead of listing the whole order.\"),\n confirm: z.literal(true).describe(\"Must be true: this is immediately visible to readers.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.order) === Boolean(args.move)) {\n throw new Error(\"Provide exactly one of `order` or `move`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const result = await client.entries.reorder(project, args.collection, {\n ...(args.order ? { order: args.order } : {}),\n ...(args.move ? { move: args.move } : {}),\n });\n return ok(`Reordered with ${result.writes} write(s).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Assets ---------------------------------------------------------------\n\n server.registerTool(\n \"myna_list_assets\",\n {\n title: \"List assets\",\n description:\n \"List a project's assets, optionally filtered by tag or checksum. Check here before uploading: an asset that already exists should be referenced, not uploaded again.\",\n inputSchema: {\n ...projectArg,\n tag: z.string().optional(),\n checksum: z.string().optional().describe(\"MD5 hex; finds an identical file already uploaded.\"),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.assets.list(project, {\n ...(args.tag ? { tag: args.tag } : {}),\n ...(args.checksum ? { checksum: args.checksum } : {}),\n ...(args.limit ? { limit: args.limit } : {}),\n ...(args.cursor ? { cursor: args.cursor } : {}),\n });\n return ok(`${page.data.length} asset(s).`, page);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_get_asset\",\n {\n title: \"Get an asset\",\n description:\n \"Fetch one asset: its delivery URL, content type, byte size, pixel dimensions, alt text, and tags.\",\n inputSchema: { ...projectArg, asset: z.string().describe(\"Asset id (ast_).\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const asset = await client.assets.get(project, args.asset);\n return ok(`${asset.displayFilename} (${asset.contentType}).`, { asset });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n server.registerTool(\n \"myna_update_asset\",\n {\n title: \"Update asset metadata\",\n description:\n \"Set an asset's alt text, caption, display filename, or tags. Alt text matters when a collection declares an `altText` policy: without it the `policy` check fails and the change set cannot publish.\",\n inputSchema: {\n ...projectArg,\n asset: z.string(),\n defaultAlt: z.string().optional(),\n caption: z.string().optional(),\n displayFilename: z.string().optional(),\n tags: z.array(z.string()).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const asset = await client.assets.update(project, args.asset, {\n ...(args.defaultAlt !== undefined ? { defaultAlt: args.defaultAlt } : {}),\n ...(args.caption !== undefined ? { caption: args.caption } : {}),\n ...(args.displayFilename !== undefined ? { displayFilename: args.displayFilename } : {}),\n ...(args.tags !== undefined ? { tags: args.tags } : {}),\n });\n return ok(`Updated ${asset.id}.`, { asset });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // --- Diagnostics ----------------------------------------------------------\n\n server.registerTool(\n \"myna_explain_denial\",\n {\n title: \"Explain a denial\",\n description:\n \"Explain why a tool call was refused. A 403 and a 404 both mean 'no', and neither says which of three unrelated things is wrong: the credential lacks the capability, the credential is confined to other collections, or the resource does not exist. Only the last is worth another attempt. Call this once after a denial instead of retrying, and act on `remedy`.\",\n inputSchema: {\n ...projectArg,\n tool: z\n .string()\n .optional()\n .describe(\"The tool that was denied, e.g. myna_publish_change_set. Resolves the capability it needs.\"),\n capability: z\n .string()\n .optional()\n .describe(\"Check a capability directly, e.g. content:publish. Ignored when `tool` names one.\"),\n collection: z.string().optional().describe(\"The collection the denied call touched, if any.\"),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n if (args.tool && !(args.tool in TOOL_CAPABILITY)) {\n throw new Error(`Unknown tool \"${args.tool}\". Pass a myna_* tool name, or a capability directly.`);\n }\n const capability = args.tool ? (TOOL_CAPABILITY[args.tool] ?? undefined) : args.capability;\n const access = await client.projects.access(project, {\n capability,\n collection: args.collection,\n });\n const summary = access.allowed\n ? `Nothing blocks ${capability ?? \"this credential\"} here. If the call still failed, the resource is missing or the payload was invalid — check the error's field details rather than retrying.`\n : `${access.checks.find((c) => !c.ok)?.detail} ${access.remedy}`;\n return ok(summary, { ...access, tool: args.tool ?? null, capability: capability ?? null });\n } catch (error) {\n // A project that does not resolve is itself the answer, and the one an\n // agent is least able to infer: it looks identical to a scope problem.\n if (isMynaApiError(error) && error.status === 404) {\n return ok(\n \"The project reference does not resolve for this credential — either it does not exist or it belongs to another organization. This is not a missing scope; no capability would change it. Call myna_list_projects to see what this credential can reach.\",\n { allowed: false, reason: \"project_not_found\" },\n );\n }\n return fail(error);\n }\n },\n );\n\n // --- Localization ---------------------------------------------------------\n\n server.registerTool(\n \"myna_translation_coverage\",\n {\n title: \"Translation coverage\",\n description:\n \"Report what is still untranslated in a collection, per project locale: how complete each locale is, which fields are missing most often, and a worklist of entries to fix. Empty when the project has no locales or the collection has no localized fields.\",\n inputSchema: { ...projectArg, collection: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const report = await client.schema.translations(project, args.collection);\n const summary = report.coverage.map((c) => `${c.locale} ${c.percent}%`).join(\", \");\n return ok(summary || \"No localized fields.\", report);\n } catch (error) {\n return fail(error);\n }\n },\n );\n}\n","import { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ProjectRegistry } from \"./config.js\";\n\n/**\n * MCP resources (SPEC 13): project summaries, collection schemas, entry and\n * revision representations, and change-set validation results.\n */\nexport function registerResources(server: McpServer, registry: ProjectRegistry): void {\n const json = (uri: string, value: unknown): ReadResourceResult => ({\n contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify(value, null, 2) }],\n });\n\n // Project summaries for the default organization.\n server.registerResource(\n \"projects\",\n \"myna://projects\",\n { title: \"Projects\", description: \"Projects in the default organization.\", mimeType: \"application/json\" },\n async (uri) => {\n // Org-scoped, like `myna_list_projects`: this is the entry point a client\n // reads to discover projects, so it must not itself demand one. It is the\n // only concrete (non-template) resource, which makes it exactly what a\n // host's resource picker reads first.\n const { client } = registry.clientForOrg();\n const org = registry.organizationFor();\n const projects = await client.projects.list(org);\n return json(uri.href, { organization: org, projects });\n },\n );\n\n // Collection list for a project.\n server.registerResource(\n \"collections\",\n new ResourceTemplate(\"myna://{project}/collections\", { list: undefined }),\n { title: \"Collections\", description: \"Deployed collections for a project.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const project = String(variables.project);\n const { client, project: ref } = registry.clientFor(project);\n const collections = await client.schema.collections(ref);\n return json(uri.href, { project: ref, collections });\n },\n );\n\n // Canonical schema for one collection.\n server.registerResource(\n \"collection-schema\",\n new ResourceTemplate(\"myna://{project}/collection/{key}\", { list: undefined }),\n { title: \"Collection schema\", description: \"Latest canonical schema for a collection.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const versions = await client.schema.versions(project, String(variables.key));\n const latest = versions[0];\n return json(uri.href, { collection: String(variables.key), version: latest?.version ?? null, schema: latest?.schemaJson ?? null });\n },\n );\n\n // Entry representation (by entry id).\n server.registerResource(\n \"entry\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}\", { list: undefined }),\n { title: \"Entry\", description: \"An entry's current representation.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const entry = await client.entries.get(project, String(variables.entry));\n return json(uri.href, { entry });\n },\n );\n\n // Entry revisions.\n server.registerResource(\n \"entry-revisions\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}/revisions\", { list: undefined }),\n { title: \"Entry revisions\", description: \"Immutable revisions for an entry.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const revisions = await client.entries.revisions(project, String(variables.entry));\n return json(uri.href, { entry: String(variables.entry), revisions });\n },\n );\n\n // Change-set validation results.\n server.registerResource(\n \"change-set-validation\",\n new ResourceTemplate(\"myna://{project}/change-set/{changeSet}/validation\", { list: undefined }),\n { title: \"Change-set validation\", description: \"Validation result for a change set.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const result = await client.changeSets.validate(project, String(variables.changeSet));\n return json(uri.href, result);\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 the version advertised in the MCP handshake can\n * never disagree with the package it was published from. Running from source\n * leaves the identifier undefined and falls back to a marker that is obviously\n * 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 { createServer as createHttpServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { createServerForRegistry } from \"./server.js\";\n\nexport interface HttpOptions {\n port: number;\n /** Bearer token required in the `Authorization` header. */\n authToken?: string;\n /** Explicitly serve without endpoint auth. Never enable on a public network. */\n allowUnauthenticated?: boolean;\n path?: string;\n}\n\nfunction readBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (c: Buffer) => chunks.push(c));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if (!raw) return resolve(undefined);\n try {\n resolve(JSON.parse(raw));\n } catch (error) {\n reject(error);\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction bearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n return header?.startsWith(\"Bearer \") ? header.slice(7).trim() : undefined;\n}\n\n/**\n * Streamable HTTP transport (SPEC 13). Stateless: a fresh server + transport per\n * request. Authenticated by a bearer token in the `Authorization` header.\n */\nexport async function runHttp(options: HttpOptions): Promise<void> {\n if (!options.authToken && !options.allowUnauthenticated) {\n throw new Error(\n \"Refusing to serve HTTP without auth. Set MYNA_MCP_TOKEN (or MYNA_TOKEN), \" +\n \"or set MYNA_MCP_ALLOW_UNAUTHENTICATED=1 for trusted-network use only.\",\n );\n }\n const registry = new ProjectRegistry();\n const path = options.path ?? \"/mcp\";\n\n const httpServer = createHttpServer((req: IncomingMessage, res: ServerResponse) => {\n void handle(req, res).catch((error: unknown) => {\n if (!res.headersSent) res.writeHead(500, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32603, message: String(error) }, id: null }));\n });\n });\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n if (url.pathname === \"/health\") {\n res.writeHead(200, { \"content-type\": \"application/json\" }).end(JSON.stringify({ ok: true }));\n return;\n }\n if (url.pathname !== path) {\n res.writeHead(404, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"not found\" }));\n return;\n }\n if (options.authToken && bearer(req) !== options.authToken) {\n res.writeHead(401, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"unauthorized\" }));\n return;\n }\n if (req.method !== \"POST\") {\n // Stateless server: no standalone SSE stream.\n res.writeHead(405, { \"content-type\": \"application/json\", allow: \"POST\" }).end(\n JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32000, message: \"Method not allowed.\" }, id: null }),\n );\n return;\n }\n\n const body = await readBody(req);\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n // Remote clients must never be able to read this machine's filesystem.\n const server = createServerForRegistry(registry, { allowPathUploads: false });\n res.on(\"close\", () => {\n void transport.close();\n void server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, body);\n }\n\n await new Promise<void>((resolve) => httpServer.listen(options.port, resolve));\n process.stderr.write(`myna-mcp: streamable HTTP transport listening on :${options.port}${path}\\n`);\n}\n"],"mappings":"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","names":["McpServer","bytes","DEFAULT_API_URL","McpServer"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@myna-sh/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
"@types/node": "24.13.3",
|
|
32
32
|
"eslint": "9.39.5",
|
|
33
33
|
"typescript": "5.9.3",
|
|
34
|
-
"@myna-sh/config": "0.0.0",
|
|
35
34
|
"@myna-sh/api-contracts": "0.0.0",
|
|
36
|
-
"@myna-sh/
|
|
35
|
+
"@myna-sh/config": "0.0.0",
|
|
36
|
+
"@myna-sh/sdk": "0.10.0"
|
|
37
37
|
},
|
|
38
38
|
"scripts": {
|
|
39
39
|
"build": "tsup",
|