{"version":3,"file":"update.mjs","names":[],"sources":["../../../../../../../../src/astro/routes/api/admin/plugins/registry/[id]/update.ts"],"sourcesContent":["/**\n * Registry plugin update endpoint (experimental)\n *\n * POST /_emdash/api/admin/plugins/registry/:id/update — Update a\n * registry-source plugin to a newer release. Mirrors the marketplace\n * update route's escalation gates: `CAPABILITY_ESCALATION` if the new\n * version declares new capabilities and `confirmCapabilityChanges` is\n * absent, and `ROUTE_VISIBILITY_ESCALATION` if it newly exposes public\n * routes and `confirmRouteVisibilityChanges` is absent.\n */\n\nimport { hostEnvFromVersions } from \"@premium-cms/registry-client/env\";\nimport type { APIRoute } from \"astro\";\nimport { z } from \"zod\";\n\nimport { requirePerm } from \"#api/authorize.js\";\nimport { apiError, handleError, unwrapResult } from \"#api/error.js\";\nimport { handleRegistryUpdate } from \"#api/index.js\";\nimport { checkMediaUsageActivationWriteFence } from \"#api/media-usage-write-fence.js\";\nimport { isParseError, parseOptionalBody } from \"#api/parse.js\";\n\nimport { VERSION } from \"../../../../../../../version.js\";\n\nexport const prerender = false;\n\nconst updateBodySchema = z.object({\n\t/** Optional explicit target version. Defaults to the aggregator's latest. */\n\tversion: z.string().min(1).max(64).optional(),\n\t/**\n\t * Set by the admin's capability re-consent dialog when the new version\n\t * declares capabilities the installed version did not. Without this,\n\t * the handler returns `CAPABILITY_ESCALATION` carrying the diff.\n\t */\n\tconfirmCapabilityChanges: z.boolean().optional(),\n\t/**\n\t * Set by the admin's route-visibility re-consent dialog when the new\n\t * version newly exposes a public (unauthenticated) route.\n\t */\n\tconfirmRouteVisibilityChanges: z.boolean().optional(),\n\tconfirmMcpTools: z.boolean().optional(),\n});\n\nexport const POST: APIRoute = async ({ params, request, locals }) => {\n\ttry {\n\t\tconst { emdash, user } = locals;\n\t\tconst { id } = params;\n\n\t\tif (!emdash?.db) {\n\t\t\treturn apiError(\"NOT_CONFIGURED\", \"EmDash is not initialized\", 500);\n\t\t}\n\n\t\tconst denied = requirePerm(user, \"plugins:manage\");\n\t\tif (denied) return denied;\n\n\t\tconst activationFence = await checkMediaUsageActivationWriteFence(emdash.db);\n\t\tif (activationFence) return activationFence;\n\n\t\tif (!id) {\n\t\t\treturn apiError(\"INVALID_REQUEST\", \"Plugin ID required\", 400);\n\t\t}\n\n\t\tconst body = await parseOptionalBody(request, updateBodySchema, {});\n\t\tif (isParseError(body)) return body;\n\n\t\tconst result = await handleRegistryUpdate(\n\t\t\temdash.db,\n\t\t\temdash.storage,\n\t\t\temdash.getSandboxRunner(),\n\t\t\temdash.config.experimental?.registry,\n\t\t\tid,\n\t\t\t{\n\t\t\t\tversion: body.version,\n\t\t\t\tconfirmCapabilityChanges: body.confirmCapabilityChanges,\n\t\t\t\tconfirmRouteVisibilityChanges: body.confirmRouteVisibilityChanges,\n\t\t\t\tconfirmMcpTools: body.confirmMcpTools,\n\t\t\t\thostEnv: hostEnvFromVersions(VERSION, emdash.config.astroVersion),\n\t\t\t},\n\t\t);\n\n\t\tif (!result.success) return unwrapResult(result);\n\n\t\tawait emdash.syncRegistryPlugins();\n\n\t\treturn unwrapResult(result);\n\t} catch (error) {\n\t\tconsole.error(\"[registry-update] Unhandled error:\", error);\n\t\treturn handleError(error, \"Failed to update plugin from registry\", \"UPDATE_FAILED\");\n\t}\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,YAAY;AAEzB,MAAM,mBAAmB,EAAE,OAAO;CAEjC,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,UAAU;CAM7C,0BAA0B,EAAE,SAAS,CAAC,UAAU;CAKhD,+BAA+B,EAAE,SAAS,CAAC,UAAU;CACrD,iBAAiB,EAAE,SAAS,CAAC,UAAU;CACvC,CAAC;AAEF,MAAa,OAAiB,OAAO,EAAE,QAAQ,SAAS,aAAa;AACpE,KAAI;EACH,MAAM,EAAE,QAAQ,SAAS;EACzB,MAAM,EAAE,OAAO;AAEf,MAAI,CAAC,QAAQ,GACZ,QAAO,SAAS,kBAAkB,6BAA6B,IAAI;EAGpE,MAAM,SAAS,YAAY,MAAM,iBAAiB;AAClD,MAAI,OAAQ,QAAO;EAEnB,MAAM,kBAAkB,MAAM,oCAAoC,OAAO,GAAG;AAC5E,MAAI,gBAAiB,QAAO;AAE5B,MAAI,CAAC,GACJ,QAAO,SAAS,mBAAmB,sBAAsB,IAAI;EAG9D,MAAM,OAAO,MAAM,kBAAkB,SAAS,kBAAkB,EAAE,CAAC;AACnE,MAAI,aAAa,KAAK,CAAE,QAAO;EAE/B,MAAM,SAAS,MAAM,qBACpB,OAAO,IACP,OAAO,SACP,OAAO,kBAAkB,EACzB,OAAO,OAAO,cAAc,UAC5B,IACA;GACC,SAAS,KAAK;GACd,0BAA0B,KAAK;GAC/B,+BAA+B,KAAK;GACpC,iBAAiB,KAAK;GACtB,SAAS,oBAAoB,SAAS,OAAO,OAAO,aAAa;GACjE,CACD;AAED,MAAI,CAAC,OAAO,QAAS,QAAO,aAAa,OAAO;AAEhD,QAAM,OAAO,qBAAqB;AAElC,SAAO,aAAa,OAAO;UACnB,OAAO;AACf,UAAQ,MAAM,sCAAsC,MAAM;AAC1D,SAAO,YAAY,OAAO,yCAAyC,gBAAgB"}